14.1 엔트로피·교차엔트로피·KL

실습 · 연습문제 2개

이산 KL과 교차엔트로피 구현하기 discrete-kl

같은 결과 집합 위의 두 이산분포 p, q(shape (K,), 각각 합이 1)에 대해 두 함수를 완성한다. 로그는 자연로그(nat)를 쓴다.

  • cross_entropy(p, q): H(p,q)=−∑kpklog⁡qkH(p, q) = -\sum_k p_k \log q_k
  • kl_divergence(p, q): DKL(p ∥ q)=∑kpklog⁡pkqkD_{\mathrm{KL}}(p \,\|\, q) = \sum_k p_k \log \dfrac{p_k}{q_k}

두 규약을 지켜야 한다.

  1. pk=0p_k = 0인 항은 0으로 둔다(0log⁡0=00 \log 0 = 0, 0log⁡(0/q)=00 \log(0/q) = 0). 이때 qkq_k가 0이어도 된다.
  2. pk>0p_k > 0인데 qk=0q_k = 0인 kk가 있으면 두 함수 모두 np.inf를 반환한다.

테스트는 다음을 확인한다.

  • H(p,q)=H(p)+DKL(p ∥ q)H(p, q) = H(p) + D_{\mathrm{KL}}(p \,\|\, q) (여기서 H(p)=H(p,p)H(p) = H(p, p))
  • DKL(p ∥ p)=0D_{\mathrm{KL}}(p \,\|\, p) = 0, DKL≥0D_{\mathrm{KL}} \ge 0
  • 비대칭: 일반적으로 DKL(p ∥ q)≠DKL(q ∥ p)D_{\mathrm{KL}}(p \,\|\, q) \neq D_{\mathrm{KL}}(q \,\|\, p)
  • 위의 두 규약, 그리고 결과에 nan이 나오지 않는 것

힌트: np.log(0)은 -inf이고 0 * -inf는 nan이다. 먼저 p > 0인 위치만 골라 계산한다.

두 가우시안 사이의 KL gaussian-kl

1차원 가우시안 p=N(μ1,σ12)p = \mathcal{N}(\mu_1, \sigma_1^2), q=N(μ2,σ22)q = \mathcal{N}(\mu_2, \sigma_2^2) 사이의 KL divergence는 닫힌 형태로 쓸 수 있다.

DKL(p ∥ q)=log⁡σ2σ1+σ12+(μ1−μ2)22σ22−12.D_{\mathrm{KL}}(p \,\|\, q) = \log\frac{\sigma_2}{\sigma_1} + \frac{\sigma_1^2 + (\mu_1 - \mu_2)^2}{2\sigma_2^2} - \frac12.

gaussian_kl(mu1, sigma1, mu2, sigma2)를 완성해 DKL(p ∥ q)D_{\mathrm{KL}}(p \,\|\, q)를 nat 단위로 반환한다. 인자는 스칼라이거나 같은 shape의 배열일 수 있다(배열이면 원소별로 계산한다). σ\sigma는 표준편차이고 양수다.

테스트는 다음을 확인한다.

  • 수치적분으로 계산한 KL과 일치한다.
  • p=qp = q이면 0이다.
  • 비대칭이다: 좁은 pp와 넓은 qq의 DKL(p ∥ q)D_{\mathrm{KL}}(p \,\|\, q)와 DKL(q ∥ p)D_{\mathrm{KL}}(q \,\|\, p)가 다르고, 이 경우 넓은 분포에서 좁은 분포로 재는 쪽이 더 크다.
  • 단위 불변성: 평균과 표준편차를 모두 같은 상수배 하면 값이 변하지 않는다.

이어서 생각해 본다. σ1=0.1\sigma_1 = 0.1, σ2=1\sigma_2 = 1(평균은 같음)일 때 두 방향의 값을 계산하고, 어느 방향이 "qq가 pp를 덮지 못함"을 더 크게 벌하는지 본문의 forward·reverse 설명과 연결한다.