실습 · 연습문제 2개
점수 행렬에서 InfoNCE 계산하기 infonce-bound
짝지어진 표본 쌍 에 대해 critic이 매긴 점수 행렬 scores(shape (K, K))가 주어진다. scores[i, j] 이고, 대각선이 진짜 짝의 점수다.
infonce(scores)를 완성해 다음 값을 반환한다(nat).
점수가 수백 단위로 커질 수 있으므로 np.exp를 그대로 쓰면 overflow가 난다. 행마다 최댓값을 빼고 계산하는 log-sum-exp 기법을 쓴다.
테스트는 다음을 확인한다.
- 모든 점수가 같으면 0이다(critic이 진짜 짝을 구별하지 못함).
- 어떤 점수 행렬에서도 를 넘지 않고, 대각선이 압도적으로 크면 에 다가간다.
- 점수가 1000 단위여도
inf나nan없이 계산된다. - 점수 행렬의 각 행에 같은 상수를 더해도 값이 변하지 않는다.
- 행마다 진짜 짝을 정답으로 하는 softmax cross-entropy 평균을 이라 하면 이다. contrastive 손실 을 줄이는 것이 MI 하한을 올리는 것과 같은 이유다.
도수표에서 plug-in 상호정보량 계산하기 plugin-mi
두 이산 변수(또는 bin으로 나눈 연속 변수)의 결합 도수표 counts(shape (A, B), 음이 아닌 정수)가 주어진다. counts[a, b]는 가 번째 값, 가 번째 값인 관측의 수다.
plugin_mi(counts)를 완성해, 상대도수 을 확률로 보고 계산한 상호정보량을 nat 단위로 반환한다.
도수가 0인 칸은 합에서 뺀다(). 결과에 nan이 나오면 안 된다.
테스트는 다음을 확인한다.
- 독립인 결합분포의 정확한 도수표(예: 바깥곱)에서는 0이다.
- 가 의 함수인 표에서는 와 같다.
- 0 이상이고, 행과 열을 바꿔도(전치) 같다.
- 편향: 독립인 두 변수에서 표본 100개를 뽑아 표를 만들면, 추정값의 평균이 0보다 뚜렷하게 크다. 근사 편향 과 같은 자릿수인지 확인한다.
힌트: 로 계산해도 되고, 정의식으로 계산해도 된다.