이미지와 글을 같은 공간에 놓는 모델의 학습 루프는 뜻밖에 짧습니다.
logits = (img_emb @ txt_emb.T) / temperature # N × N 점수 행렬
labels = torch.arange(N) # 정답은 대각선
loss = (ce(logits, labels) + ce(logits.T, labels)) / 2
배치 안의 이미지 개와 글 개로 점수 행렬을 만들고, 각 행에서 자기 짝을 골라내는 분류 문제를 풉니다. 대각선에 선 짝이 진짜 짝이고, 나머지 칸의 어긋난 짝은 음성 표본이라 부르는 가짜 짝입니다. 진짜 짝을 가짜 짝들과 맞대어 가려내게 하는 이런 학습을 대조학습(contrastive learning)이라 하고, 이 손실을 InfoNCE라 부릅니다.
이 방식에는 널리 알려진 경험칙이 하나 붙어 있습니다. 배치가 클수록 잘 된다는 것입니다. 큰 모델들이 배치를 3만 개씩 쓰는 이유이기도 합니다. 그런데 왜 그런지는 「음성 표본이 많아서」쯤에서 멈추는 일이 많습니다.
이 글에서 저 한 줄이 실제로 최대화하는 양을 정의하고, 배치 크기가 그 양의 천장을 정한다는 것을 유도합니다. 지난 글의 KL 발산이 그대로 다시 나옵니다.
조건부 엔트로피
결합분포와 주변분포
먼저 도구 하나가 필요합니다. 두 확률변수 , 를 함께 다루는 분포를 결합분포 라 하고, 한쪽만 남기고 다른 쪽을 모두 더해 없앤 것을 주변분포 라 합니다. 표로 적으면 결합분포는 칸 하나하나의 값이고, 주변분포는 그 표의 행 합계나 열 합계입니다.
엔트로피는 엔트로피 글에서처럼 한 사건의 놀람 를 확률로 가중해 평균 낸 값 입니다. 이 글에서 로그의 밑은 2로 두고 단위를 비트라 부릅니다. 밑을 로 바꾸면 단위가 내트가 되고 값이 배가 될 뿐, 아래의 모든 관계는 그대로입니다.
이제 의 값을 알고 난 뒤에도 에 남아 있는 불확실성을 재고 싶습니다. 라는 것을 알았으면 의 분포는 조건부분포 로 바뀌고, 그 분포의 엔트로피가 입니다. 이것을 가 나올 확률로 평균 냅니다.
정의. 조건부 엔트로피는 이다.
와 다른 곳은 로그 안쪽뿐입니다. 대신 를 쓰니 「 를 알고 나서의 놀람」이 되고, 바깥의 가 그것을 평균 냅니다.
사슬 규칙
조건부분포의 정의 에 로그를 씌우면 곱이 합으로 갈라집니다.
양변에 을 곱하고 로 평균 내면 왼쪽은 결합 엔트로피 이고, 오른쪽 첫 항은 를 더해 없애면 , 둘째 항은 방금 정의한 입니다.
이것을 엔트로피의 사슬 규칙이라 합니다. 두 변수를 함께 알아내는 데 드는 놀람은, 먼저 를 알아내는 놀람에 를 안 뒤 를 마저 알아내는 놀람을 더한 것과 같다는 말입니다. 순서를 바꿔 로 적어도 성립합니다. 실용적으로는 두 엔트로피만 알면 나머지 하나가 뺄셈으로 나온다는 뜻이라, 뒤의 계산에서 를 직접 세는 대신 로 구합니다.
평균에서만 서는 부등식
를 알면 에 대한 놀람은 평균적으로 줄거나 그대로이지 늘지 않습니다.
등호는 와 가 독립일 때, 곧 를 알아도 의 분포가 전혀 안 바뀔 때뿐입니다. 증명은 다음 절에서 KL 발산 한 줄로 끝납니다.
그런데 이 부등식에는 「평균적으로」라는 단서가 붙어 있고, 그 단서가 빈말이 아닙니다. 수로 확인합니다. 가 1일 확률이 0.8이고 그때 는 언제나 , 가 2일 확률이 0.2이고 그때 는 와 가 반반이라고 합시다. 결합분포의 세 칸은 0.8, 0.1, 0.1이고 의 주변분포는 입니다.
- 아무것도 모를 때: 비트
- 을 알았을 때: 가 확정되므로
- 를 알았을 때: 가 반반이 되므로 비트
라는 소식을 들은 뒤의 놀람 1비트는 아무것도 모를 때의 0.469비트보다 큽니다. 「대개 」라고 믿고 있다가 「이번은 드문 경우」라는 말을 들으면 오히려 더 헷갈리는 것입니다. 평균을 내면 비트로 아래에 섭니다. 사슬 규칙으로도 맞춰 봅니다. 비트이고 결합 엔트로피는 세 칸에서 비트이니 로 같습니다.
상호정보량
줄어든 놀람
를 알고 나서 의 불확실성이 얼마나 줄었는가. 그 차이가 두 변수가 공유하는 정보의 양입니다.
정의. 상호정보량(mutual information)은 이다.
바로 위의 예에서는 비트입니다. 사슬 규칙을 쓰면 이므로 로도 적힙니다. 두 엔트로피를 따로 더한 것이 함께 잰 엔트로피보다 큰 만큼, 그 겹친 몫이 상호정보량입니다.
KL 발산으로 읽기
같은 양을 적는 방법이 셋입니다. 정의를 펼쳐 보면 셋이 하나로 모입니다.
첫 항의 를 로 바꿔 두 항의 바깥을 맞추고, 를 넣으면
가 나옵니다. 이 식은 와 를 바꿔도 그대로이므로 입니다. 그리고 오른쪽을 자세히 보면 지난 글의 그 식입니다.
상호정보량은 결합분포와 「독립이었다면 그랬을 분포」 사이의 KL 발산입니다. 이 한 줄에서 성질 셋이 공짜로 따라옵니다.
- 입니다. KL 발산이 음수가 될 수 없기 때문이고, 앞 절에서 미뤄 둔 가 바로 이것입니다.
- 인 것과 , 가 독립인 것이 같은 말입니다. KL의 등호 조건이 이기 때문입니다.
- 대칭입니다. KL 자체는 대칭이 아니지만, 여기서는 두 인자에 넣는 것이 와 를 바꿔도 같은 짝이라 결과가 대칭이 됩니다.
자기 자신과 함수
정의에 극단적인 짝을 넣어 보면 이 양이 무엇을 세는지가 더 분명해집니다. 먼저 자리에 자신을 넣습니다. 를 알면 에 남는 놀람이 없으므로 이고
입니다. 엔트로피는 자기 자신과의 상호정보량이고, 한 변수가 다른 변수와 나눌 수 있는 정보는 제 엔트로피를 넘지 못합니다. 가 여기서 나옵니다.
다음은 가 의 결정적 함수 인 경우입니다. 를 알면 가 확정되므로 이번에는 이고, 대칭인 쪽의 정의를 쓰면
입니다. 주의할 것은 답이 가 아니라 라는 점입니다. 가 서로 다른 둘을 같은 값으로 보내면 그 구별은 에서 사라지고, 사라진 몫만큼 공유하는 정보도 작아집니다. 다음 절의 예가 정확히 그런 경우입니다.
눈금 불변성
연속 변수에서는 합 대신 적분을 쓰고, 엔트로피 자리에 미분 엔트로피 가 들어섭니다. 이 값은 이산 엔트로피와 달리 눈금에 따라 바뀝니다. 키를 미터로 재다가 센티미터로 바꾸면 가 가 되고, 밀도는 100배 넓게 퍼지면서 높이가 로 낮아지므로
입니다. 표준정규분포의 미분 엔트로피는 2.047비트인데, 같은 양을 100배 눈금으로 적으면 비트가 더해져 8.691비트가 됩니다. 값이 음수가 되는 일도 흔합니다. 절대값에 뜻이 없다는 말입니다.
상호정보량은 이 문제를 비켜 갑니다. 에서 두 항이 똑같이 만큼 움직여 서로 지워지기 때문입니다. KL 쪽으로 봐도 로그 안의 에서 눈금 인자가 분자와 분모에 한 번씩 들어가 약분됩니다. 상관계수가 인 두 정규변수의 상호정보량은 이고, 이면 비트입니다. 미터로 재든 센티미터로 재든 0.737비트입니다. 임베딩처럼 눈금이 정해져 있지 않은 연속값 사이에서 이 양을 목표로 삼을 수 있는 까닭이 여기 있습니다.
표로 세어 보기
2×2 결합분포
와 가 각각 값을 둘씩 갖는 표로 확인합니다.
| 0.4 | 0.1 | 0.5 | |
| 0.1 | 0.4 | 0.5 | |
| 0.5 | 0.5 |
주변분포가 둘 다 반반이므로 비트입니다. 결합 엔트로피는
이고, 이므로
입니다. KL 쪽으로도 세어 봅니다. 독립이었다면 네 칸이 모두 였을 것입니다.
같은 수입니다. 를 알면 에 대한 놀람이 1비트에서 0.72비트로, 0.28비트만큼 줄어듭니다. 이 표에서는 어느 를 알든 조건부 엔트로피가 똑같이 비트라 평균과 개별 값이 일치하지만, 앞 절의 예처럼 마다 다른 것이 보통입니다. 완전히 알려 주지도 않고 전혀 무관하지도 않은 관계가 이런 숫자로 적힙니다.
결정적인 표
대각선의 0.4를 0.5로 밀고 어긋난 칸의 0.1을 0으로 내리면 표가 완전히 결정적이 됩니다. 이면 반드시 , 이면 반드시 입니다. 주변분포는 여전히 반반이라 비트이고, 결합 엔트로피는 0.5짜리 두 칸만 남아 비트입니다.
를 알면 의 놀람이 1비트에서 0으로 전부 사라집니다. 앞 절의 가 표 위에서 선 것이고, 이진 변수 둘이 공유할 수 있는 최대치입니다. 0.4에서 0.28비트였던 것이 0.5에서 1비트로 차니, 대각선 칸을 0.1 옮기는 사이에 공유 정보가 세 배 넘게 뛴 셈입니다. 상호정보량이 칸 값에 선형으로 따라가지 않는다는 것도 여기서 보입니다.
상관과 정보
두 변수가 얼마나 얽혀 있는지를 재는 더 익숙한 도구가 있습니다. 상관계수는 두 변수가 한 직선을 따라 함께 오르내리는 정도를 에서 사이로 적은 값입니다. 그런데 상관계수가 0이라고 두 변수가 무관한 것은 아닙니다.
가 을 각각 의 확률로 갖고 이라 합시다.
| 0 | 1/3 | 0 | 1/3 | |
| 1/3 | 0 | 1/3 | 2/3 |
공분산은 인데 이고 이므로 0이고, 상관계수도 0입니다. 가 의 함수인데도 직선으로 보면 아무 관계가 없습니다. 반면 는 의 결정적 함수이므로 앞 절에서 본 대로 비트입니다. 비트에 못 미치는 것은 과 의 구별이 제곱에서 사라졌기 때문입니다.
상관계수는 직선 관계만 보고, 상호정보량은 어떤 모양이든 「한쪽을 알면 다른 쪽의 분포가 바뀌는가」를 봅니다. 표에서 가 와 다른 칸이 하나라도 있으면 0이 아닙니다. 이미지와 글처럼 관계가 직선일 리 없는 짝을 맞춰야 할 때 목표가 상관이 아니라 상호정보량인 이유입니다.
코드로 맞대기
세 정의가 같은 수를 주는지, 독립인 표에서 0이 나오는지, 그리고 제곱 예가 0.918비트인지 한 번에 확인합니다.
import numpy as np
H = lambda v: float(-(v[v > 0] * np.log2(v[v > 0])).sum())
def mi(P):
px, py = P.sum(1), P.sum(0)
m = P > 0
return float((P[m] * np.log2(P[m] / np.outer(px, py)[m])).sum())
P = np.array([[0.4, 0.1],
[0.1, 0.4]])
px, py = P.sum(1), P.sum(0)
print(round(H(px) + H(py) - H(P.ravel()), 4)) # 0.2781
print(round(H(px) - (H(P.ravel()) - H(py)), 4)) # 0.2781
print(round(mi(P), 4)) # 0.2781
print(round(mi(np.outer(px, py)), 4)) # 0.0 (독립)
print(round(mi(np.array([[.5, 0], [0, .5]])), 4)) # 1.0 (결정적)
S = np.array([[0, 1/3, 0], # 행: Y=0, Y=1
[1/3, 0, 1/3]]) # 열: X=-1, 0, 1
print(round(mi(S), 4)) # 0.9183
고차원 추정
칸 수의 폭발
정의는 깔끔한데 실제로 재려고 하면 벽에 부딪힙니다. 위의 계산에서 우리가 쓴 것은 의 칸 값 전부였습니다. 표가 있으니 셀 수 있었던 것입니다.
512차원짜리 이미지 임베딩과 글 임베딩의 결합분포에는 그런 표가 없습니다. 가진 것은 짝지어진 표본 몇 백만 개뿐이고, 도 도 모릅니다.
칸을 나눠 세는 방법이 왜 안 되는지는 한 줄로 보입니다. 축 하나를 10칸으로만 쪼개도 512차원의 칸 수는 개이고, 두 변수를 함께 놓으면 개입니다. 표본을 우주의 원자 수만큼 모아도 칸 하나에 표본이 하나 들어갈 일이 없습니다. 상호정보량이 결합분포와 주변분포의 곱을 비교하는 양이라 이 문제가 특히 아픕니다. 둘 다 필요한데 둘 다 모릅니다.
그래서 재는 대신 아래에서 받치는 값을 만듭니다. 젠센 부등식 글에서 세운 발상 그대로입니다. 구할 수 없는 값은 하한으로 바꿔 최대화합니다.
데이터 처리 부등식
하한을 무엇에 대고 올릴지 정하기 전에, 올릴 수 있는 한계부터 봐 둡니다. 에서 를 만들고 에서 다시 를 만드는데 가 만 보고 만들어진다면, 곧 의 사슬이면
입니다. 이것을 데이터 처리 부등식이라 합니다. 사슬 규칙을 상호정보량에 한 번 더 적용하면 를 두 순서로 풀 수 있고, 가 만 보고 만들어졌다는 조건이 을 주어 부등식이 떨어집니다.
학습에 옮기면 뜻이 분명합니다. 원본 이미지 를 인코더에 넣어 임베딩 를 얻으면 가 원본에 대해 아는 것은 원본 자신이 아는 것을 넘지 못합니다. 인코더가 아무리 깊어도 정보를 새로 만들어 내지는 못하고, 층을 지날 때마다 잃거나 지키거나 둘 중 하나입니다. 그래서 표현 학습은 정보를 늘리는 일이 아니라 고르는 일입니다. 잃어도 되는 것(조명, 잡음, 해상도)을 잃고, 짝이 된 글과 공유하는 것을 남기도록 인코더를 미는 것이 대조학습의 목표입니다.
세 변수의 겹침
두 변수에서는 벤 그림이 정확했습니다. 원 두 개의 넓이가 엔트로피이고 겹친 넓이가 상호정보량이며, 넓이는 음수가 될 수 없으니 과도 맞습니다. 변수가 셋이 되면 이 그림이 깨집니다.
와 가 서로 독립인 동전이고 가 두 동전이 같으면 0, 다르면 1인 값이라 합시다.
| 확률 | |||
|---|---|---|---|
| 0 | 0 | 0 | 1/4 |
| 0 | 1 | 1 | 1/4 |
| 1 | 0 | 1 | 1/4 |
| 1 | 1 | 0 | 1/4 |
와 는 독립이므로 입니다. 그런데 를 알고 나면 를 보는 순간 가 확정되므로 비트입니다. 원 셋이 모두 겹친 가운데 자리는 로 정의되는데, 이 값이 비트입니다. 이 가운데 자리의 값을 상호작용 정보라 부르고, 이렇게 음수가 될 수 있으므로 넓이로 그릴 수 없습니다. 세 변수 이상에서 벤 그림은 외우는 요령으로만 쓰고 계산의 근거로 쓰지 않습니다.
상한 추정
하한 말고 위에서 누르는 상한을 만드는 길도 있습니다. 아무 분포 를 골라도 가 성립합니다. 다만 이 식은 조건부분포 를 알아야 계산되고, 대조학습에서는 그것을 모르므로 쓸 수 없습니다. 그래서 이 글은 하한 쪽으로 갑니다.
InfoNCE 하한
손실의 정의
배치에 짝 개가 있습니다. 이 결합분포에서 나온 진짜 짝이고, 서로 어긋난 개가 음성 표본입니다. 두 입력에 점수를 매기는 점수함수 를 하나 둡니다. 처음 코드에서는 두 임베딩의 내적을 온도로 나눈 값이 그것이었고, 짝이 맞을수록 크게 나오도록 학습됩니다. 이 점수로 각 행에서 진짜 짝을 골라내는 분류 문제를 풉니다.
정의. InfoNCE 손실은 이다.
모양이 낯익습니다. softmax 유도 글의 그 함수를 한 행의 점수 개에 씌우고, 정답 자리 하나에 를 취한 값, 곧 클래스가 개인 교차엔트로피입니다. 실제로 코드가 ce(logits, arange(N)) 한 줄인 이유가 이것입니다.
처음 코드에서 손실을 두 번 계산해 평균 낸 것도 여기서 읽힙니다. 위 정의는 행 방향으로만 뽑았습니다. 이미지 하나에 글 개를 댄 것이고, 그러면 쪽 가짜 짝만 벌을 받습니다. ce(logits.T, labels)는 같은 행렬을 열 방향으로 다시 읽어 글 하나에 이미지 개를 대는 문제로 만든 것입니다. 상호정보량은 대칭인데 InfoNCE 손실은 대칭이 아니므로, 양쪽으로 재서 평균 내는 것이 자연스러운 선택이 됩니다.
하한의 유도
이 손실과 상호정보량이 부등호로 이어집니다.
InfoNCE 하한.
유도의 뼈대만 봅니다. 점수함수가 최선으로 학습되면 그것이 재는 것은 밀도비
입니다. 결합분포가 독립 분포보다 몇 배 짙은가를 적은 값이고, KL 쪽 정의의 로그 안에 있던 바로 그 비입니다. 그러니 이 값의 로그를 진짜 짝에 대해 평균 낸 것이 정확히 입니다. 최선의 점수함수를 손실에 넣으면 분모에 진짜 짝의 비 하나와 가짜 짝의 비 개가 들어가는데, 가짜 짝은 와 를 따로 뽑은 것이라 그 비의 기댓값이 정확히 1입니다.
그래서 분모가 대략 이 되고, 로그를 쪼개면 쪽이 를, 나머지가 쪽을 만듭니다. 젠센 부등식이 그 어림을 부등호로 굳혀 줍니다.
온도
점수함수 안의 온도 는 코사인 유사도를 점수로 옮기는 눈금입니다. 코사인은 에서 사이에 갇혀 있으므로 의 폭은 이고, 진짜 짝과 가짜 짝의 점수 차는 아무리 벌어져도 입니다. 그러면 손실은 모든 가짜 짝이 가장 먼 곳에 선 경우에도
아래로 못 내려갑니다. 에서 수를 넣어 봅니다. 이면 이 바닥이 3.570내트라 하한은 내트, 곧 2.85비트에서 멈춥니다. 이면 5.50비트, 이면 이 쯤이라 바닥이 사실상 0이 되어 천장 8비트까지 닿습니다. 온도가 높으면 임베딩이 아무리 좋아도 점수 차를 충분히 못 벌려 하한이 팽팽해질 수 없다는 뜻입니다.
반대로 온도를 너무 낮추면 점수 차가 조금만 나도 softmax가 한 칸에 몰려 그래디언트가 가장 헷갈리는 가짜 짝 몇 개에만 쏠립니다. 그래서 CLIP은 온도를 손으로 고르지 않고 학습 파라미터로 둡니다. 0.07에 해당하는 값에서 시작해 역수의 로그를 학습하고, 점수 배율이 100을 넘지 않도록 잘라 둡니다.
하한의 단서
손실 값을 보고 「상호정보량이 적어도 이만큼」이라고 읽을 때 붙는 단서가 둘 있습니다.
첫째, 부등식은 어떤 점수함수를 넣어도 성립하지만 가장 팽팽한 것은 최선의 점수함수, 곧 밀도비의 로그를 넣었을 때입니다. 실제로 쓰는 것은 유한한 데이터로 학습된 내적 점수이고, 그것이 밀도비를 정확히 재지 못한 만큼 하한과 참값 사이가 벌어집니다. 손실이 내려가서 하한이 올랐다면 상호정보량이 적어도 그만큼인 것은 맞지만, 손실이 멈췄다고 상호정보량이 거기서 멈춘 것은 아닙니다.
둘째, 유도에서 가짜 짝의 비가 기댓값 1이 된 것은 음성 표본 가 와 무관하게 에서 따로 뽑혔다는 가정 덕분이었습니다. 실제 배치는 그렇지 않습니다. 같은 캡션 「고양이 사진」이 한 배치에 두 번 들어오면 어긋난 칸 하나가 사실은 진짜 짝이고, 그 칸의 비는 1보다 훨씬 큽니다. 이렇게 섞여 든 진짜 짝은 벌을 받아 좋은 표현을 밀어내고, 부등식이 기대던 기댓값 계산도 그 칸에서 어긋납니다. 데이터에서 중복을 걸러 내는 일이 대조학습의 전처리에서 빠지지 않는 까닭입니다.
log N 천장
천장의 크기
부등식을 다시 봅니다. 손실 은 교차엔트로피이므로 0보다 작아질 수 없습니다. 따라서
입니다. 점수함수가 아무리 완벽해도 이 하한이 증언할 수 있는 값은 을 넘지 못합니다. 반대쪽 끝도 읽힙니다. 점수함수가 아무것도 모르면 각 행에서 개를 고르게 찍으므로 이고 하한은 0이 됩니다. 하한이 움직일 수 있는 범위 전체가 입니다.
숫자로 옮기면 경험칙의 정체가 드러납니다.
| 배치 크기 | (내트) | 천장 (비트) |
|---|---|---|
| 256 | 5.55 | 8 |
| 1,024 | 6.93 | 10 |
| 4,096 | 8.32 | 12 |
| 32,768 | 10.40 | 15 |
배치를 두 배로 늘리면 천장이 정확히 1비트 오릅니다. 로그라서 그렇습니다. 배치 256에서 학습하는 모델은 이미지와 글이 아무리 강하게 얽혀 있어도 8비트어치까지만 목적식으로 밀어붙일 수 있고, 그 위로는 손실이 더 내려갈 자리가 없어 신호가 사라집니다. 「배치가 클수록 잘 된다」는 관찰의 절반이 여기서 설명됩니다.
한 가지 덧붙여 둘 것이 있습니다. 이 천장은 InfoNCE만의 사정이 아닙니다. 표본 개만 보고 상호정보량을 아래에서 받치는 어떤 방법도 을 넘게 증언할 수 없다는 것이 알려져 있습니다. 큰 상호정보량을 재는 일 자체가 표본 수에 묶여 있는 문제라는 뜻이라, 배치를 키우는 것은 요령이 아니라 정보를 더 사 오는 일에 가깝습니다.
import numpy as np
for N in [256, 1024, 4096, 32768, 65536]:
print(N, round(np.log(N), 2), round(np.log2(N), 2))
# 256 5.55 8.0 / 1024 6.93 10.0 / 4096 8.32 12.0
# 32768 10.4 15.0 / 65536 11.09 16.0
print(round(np.log2(2 * 4096) - np.log2(4096), 4)) # 1.0
for tau in [1.0, 0.5, 0.07]: # N=256에서 온도가 거는 바닥
floor = np.log(1 + 255 * np.exp(-2 / tau))
print(tau, round((np.log(256) - floor) / np.log(2), 2))
# 1.0 2.85 / 0.5 5.5 / 0.07 8.0
메모리 뱅크와 큐
배치를 키우는 데는 GPU 메모리라는 값이 붙습니다. 음성 표본만 늘리고 싶다면 배치 전체를 키울 필요는 없고, 가짜 짝으로 쓸 임베딩만 따로 모아 두면 됩니다. 지난 스텝들에서 계산한 임베딩을 저장해 두고 음성 표본으로 다시 꺼내 쓰는 저장소를 메모리 뱅크라 하고, 그것을 먼저 들어온 것부터 밀어내는 큐로 굴리는 방식이 MoCo입니다. MoCo의 기본 큐 길이 65,536이면 배치가 256이어도 천장이 비트까지 올라갑니다.
대가는 표현이 낡는다는 것입니다. 큐에 든 임베딩은 몇 백 스텝 전의 인코더가 만든 것이라, 지금 인코더가 만든 진짜 짝과 같은 눈금 위에 있지 않습니다. 가짜 짝이 옛 눈금에서 왔다는 것만으로 쉽게 가려지면 분류가 싱거워지고 학습 신호가 약해집니다. MoCo는 큐에 넣을 임베딩을 만드는 인코더를 따로 두고 그 가중치를 본 인코더 쪽으로 아주 천천히(매 스텝 0.1%씩) 끌어와, 큐 안의 임베딩들이 서로 비슷한 눈금에 머물게 해서 이 문제를 줄입니다.
미는 힘
천장이 8비트인데 이미지와 글이 실제로 공유하는 정보가 그보다 훨씬 크다면, 배치 256짜리 학습은 헛일일까요. 그렇지 않습니다. 학습에서 하한은 재는 값으로 쓰이지 않고 미는 힘으로 쓰입니다. 손실의 그래디언트는 진짜 짝의 점수를 올리고 가짜 짝의 점수를 내리는 방향을 가리키고, 그 방향은 천장 근처에 가기 전까지 계속 살아 있습니다. 표현이 좋아지는 것은 그 방향으로 여러 번 밀린 결과이지, 손실이 증언하는 비트 수가 커진 결과가 아닙니다.
실제로 하한을 더 팽팽하게 만드는 추정량으로 바꿔도 표현이 꼭 좋아지지는 않는다는 실험 보고가 있습니다. 상호정보량은 대조학습을 설명하는 틀이고 천장이 어디에 걸리는지를 알려 주지만, 그 수치 자체를 올리는 것이 목표는 아니라는 뜻입니다. 그래서 천장은 「배치를 늘리면 무엇이 바뀌는가」를 설명하는 데 쓰고, 「우리 모델이 몇 비트를 배웠는가」를 읽는 데는 쓰지 않습니다.
정리
핵심 요약
- 조건부 엔트로피 는 를 알고 난 뒤에 에 남는 놀람의 평균이고, 사슬 규칙 로 결합 엔트로피와 이어진다. 평균은 를 넘지 않지만 특정 하나에서는 넘을 수 있다.
- 상호정보량은 그 줄어든 양 이고, 와 같다. 비음수성·「0이면 독립」·대칭이 KL에서 따라온다.
- 이고 이면 다. 연속 변수에서도 눈금을 바꿔 값이 달라지지 않는다.
- 상관계수가 0이어도 상호정보량은 0이 아닐 수 있다. 예에서 0.918비트다.
- 고차원에서는 표본만으로 잴 수 없고, 인코더를 지나며 정보가 늘지 않는다. 그래서 하한을 만들어 대신 최대화한다.
- 이며, 손실이 0 아래로 못 가므로 하한의 천장이 이다. 온도가 높으면 그 천장에도 못 닿는다.
대조 손실 다시 읽기
loss = ce(logits, arange(N)) 한 줄로 돌아갑니다. 저 줄은 이제 「배치 안에서 짝을 맞히는 분류」가 아니라 이미지와 글이 공유하는 정보량의 하한을 밀어 올리는 일로 읽힙니다. 하한인 이상 천장이 있고, 그 천장을 정하는 손잡이가 배치 크기입니다. temperature는 그 천장에 실제로 닿을 수 있는지를 정하는 두 번째 손잡이이고, 대각선 바깥의 칸들이 정말 가짜 짝인지가 부등식이 서는 조건입니다.
5단원이 여기서 닫힙니다. 정보량 하나에서 시작해 엔트로피, 교차엔트로피, KL 발산, 상호정보량까지 왔고, 사전학습 손실·라벨 스무딩·RLHF 페널티·증류 손실·대조 손실이 전부 같은 틀에서 나온 값이라는 것을 확인했습니다. 무엇을 최소화하는가에 대한 답은 여기까지입니다.
다음 단원은 어떻게 최소화하는가로 갑니다. 손실이 정해졌으니 이제 그 값을 내리는 방향을 찾아야 하고, 그 방향은 미분이 알려 줍니다.
읽어주셔서 감사합니다. 😊

