14.2 상호정보량과 표현

실습 · 연습문제 2개

점수 행렬에서 InfoNCE 계산하기 infonce-bound

짝지어진 표본 KK쌍 (xi,yi)(x_i, y_i)에 대해 critic이 매긴 점수 행렬 scores(shape (K, K))가 주어진다. scores[i, j] =f(xi,yj)= f(x_i, y_j)이고, 대각선이 진짜 짝의 점수다.

infonce(scores)를 완성해 다음 값을 반환한다(nat).

INCE=1K∑i=1K[f(xi,yi)−log⁡(1K∑j=1Kef(xi,yj))].I_{\text{NCE}} = \frac{1}{K}\sum_{i=1}^{K}\left[f(x_i, y_i) - \log\Big(\frac{1}{K}\sum_{j=1}^{K} e^{f(x_i, y_j)}\Big)\right].

점수가 수백 단위로 커질 수 있으므로 np.exp를 그대로 쓰면 overflow가 난다. 행마다 최댓값을 빼고 계산하는 log-sum-exp 기법을 쓴다.

log⁡∑jesj=m+log⁡∑jesj−m,m=max⁡jsj.\log\sum_j e^{s_j} = m + \log\sum_j e^{s_j - m}, \qquad m = \max_j s_j.

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

  • 모든 점수가 같으면 0이다(critic이 진짜 짝을 구별하지 못함).
  • 어떤 점수 행렬에서도 log⁡K\log K를 넘지 않고, 대각선이 압도적으로 크면 log⁡K\log K에 다가간다.
  • 점수가 1000 단위여도 inf나 nan 없이 계산된다.
  • 점수 행렬의 각 행에 같은 상수를 더해도 값이 변하지 않는다.
  • 행마다 진짜 짝을 정답으로 하는 softmax cross-entropy 평균을 LL이라 하면 INCE=log⁡K−LI_{\text{NCE}} = \log K - L이다. contrastive 손실 LL을 줄이는 것이 MI 하한을 올리는 것과 같은 이유다.

도수표에서 plug-in 상호정보량 계산하기 plugin-mi

두 이산 변수(또는 bin으로 나눈 연속 변수)의 결합 도수표 counts(shape (A, B), 음이 아닌 정수)가 주어진다. counts[a, b]는 XX가 aa번째 값, YY가 bb번째 값인 관측의 수다.

plugin_mi(counts)를 완성해, 상대도수 p^(a,b)=counts[a,b]/N\hat p(a, b) = \text{counts}[a, b] / N을 확률로 보고 계산한 상호정보량을 nat 단위로 반환한다.

I^=∑a,bp^(a,b)log⁡p^(a,b)p^(a) p^(b),p^(a)=∑bp^(a,b),  p^(b)=∑ap^(a,b).\hat I = \sum_{a, b} \hat p(a, b)\log\frac{\hat p(a, b)}{\hat p(a)\,\hat p(b)}, \qquad \hat p(a) = \sum_b \hat p(a, b),\ \ \hat p(b) = \sum_a \hat p(a, b).

도수가 0인 칸은 합에서 뺀다(0log⁡0=00 \log 0 = 0). 결과에 nan이 나오면 안 된다.

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

  • 독립인 결합분포의 정확한 도수표(예: 바깥곱)에서는 0이다.
  • YY가 XX의 함수인 표에서는 H(Y)H(Y)와 같다.
  • 0 이상이고, 행과 열을 바꿔도(전치) 같다.
  • 편향: 독립인 두 변수에서 표본 100개를 뽑아 10×1010 \times 10 표를 만들면, 추정값의 평균이 0보다 뚜렷하게 크다. 근사 편향 (A−1)(B−1)/(2N)(A-1)(B-1)/(2N)과 같은 자릿수인지 확인한다.

힌트: I^=H(X)+H(Y)−H(X,Y)\hat I = H(X) + H(Y) - H(X, Y)로 계산해도 되고, 정의식으로 계산해도 된다.