log가 나온 여섯 자리가 곱을 합으로 바꾸는 성질 하나로 모였는데, 분포 사이의 "거리"에도 비슷한 일이 있을까? 모델을 학습시킬 때는 손실 속의 KL 발산으로, 볼록함수의 그림을 그릴 때는 브레그만 발산으로, 한 걸음의 길이를 잴 때는 피셔 계량으로, 이 책은 자리마다 다른 거리를 꺼내 썼다. 같은 두 분포를 놓고도 KL, 브레그만, 피셔 가운데 무엇으로 잴지 매번 골라야 했다. 세 이름은 사실 하나의 구조를 가리키고 있지 않을까? 적어도 지수족 안에서는 그래서, KL·브레그만·피셔는 모두 로그정규화자 F라는 볼록함수 하나에서 나온다.
세 거리를 다시 적기
KL 발산부터 다시 적자. KL(p‖q)는 "현실 p로 살면서 모델 q를 믿을 때 치르는 추가 비용"이다. p와 q의 자리를 바꾸면 값이 달라지는 비대칭 발산이고, 어떤 두 분포 사이에서도 정의된다.
브레그만 발산은 "볼록함수와 접선 사이의 높이 차이"다. 볼록함수 F의 한 점 b에서 접선을 긋고, 다른 점 a에서 곡선이 접선보다 얼마나 위에 있는지를 잰다. 그 높이를 BF(a : b)로 적는다.
볼록함수 F(θ)와, 점 b에서 그은 접선, 점 a에서 곡선과 접선 사이의 간격 B_F(a : b)를 그린 그림. 접선에 b에서의 두 번 미분으로 만든 이차 항을 더한 점선은 b 가까이에서만 곡선과 겹친다
지수족 안에서는 이 높이가 KL과 같았다. 단, KL에서 앞에 오는 분포와 뒤에 오는 분포의 순서를 뒤집어서.
KL = 브레그만 식에서 인자의 순서를 눈여겨보자. KL(p₁‖p₂)를 θ 좌표의 브레그만으로 쓰면 BF(θ₂ : θ₁)로 순서가 뒤집히고, η 좌표의 브레그만으로 쓰면 BF*(η₁ : η₂)로 순서가 바뀌지 않는다. 지수족을 벗어나면 KL은 여전히 있지만 그것을 낳는 F가 없어서, KL = 브레그만 등식도 없다.
피셔 계량(곳마다 작은 걸음의 길이를 재는 규칙)은 "두 점이 가까워지면 비대칭이 사라지며 드러나는 대칭 거리"다.
두 분포가 아주 가까울 때 KL을 2차까지 근사해도, 브레그만을 2차까지 근사해도 같은 행렬이 나타난다. 로그정규화자 F를 두 번 미분한 ∇²F(볼록함수 F가 휘어진 정도)다. 위 그림의 점선이 ∇²F로 만든 이차식인데, b 가까이에서는 곡선에 붙어 있다가 멀어지면 떨어진다.
KL, 브레그만, 피셔가 여기서 만난다. KL과 브레그만은 떨어진 두 점 사이의 발산이고, 피셔는 한 점 둘레의 국소적 계량이다. 두 점을 아주 가깝게 붙여 2차 근사를 보면 셋이 하나가 된다.
직접 움직여 보기
불러오는 중…
이 절의 결론
“KL 발산은 어떤 두 분포 사이에서나, 브레그만 발산은 볼록함수가 있는 곳에서, 피셔 계량은 두 분포가 아주 가까울 때(2차 근사) 쓴다. 지수족 안에서는 셋이 모두 로그정규화자 F 하나에서 나오지만, KL과 브레그만이 같다고 말할 때는 언제나 인자의 순서를 함께 말한다.”
문제 4. 예상 점수와 실제 점수의 간격
시험 점수를 예상해 놓고 얼마나 빗나갔는지 잴 때 흔히 (실제 − 예상)²을 쓴다. (가) 볼록함수 f(x) = x²로 브레그만 발산 Bf(70 : 65)를 계산하라(실제 70점, 예상 65점). (나) 두 인자를 바꾼 Bf(65 : 70)은? (다) f(x) = eˣ로 Bf(3 : 2)와 Bf(2 : 3)을 계산하고, 왜 (가)(나)와 다른지 말하라.
왼쪽은 f(x) = x² 위의 두 점 x = 65, 70, 오른쪽은 f(x) = eˣ 위의 두 점 x = 2, 3. 접선과 높이 차는 그리지 않았다
접선과 곡선 사이의 높이는 곡선이 얼마나 휘었느냐로 정해지죠. x²와 eˣ는 어디서 얼마나 휘어 있어요?
이서연
x²는 두 번 미분하면 어디서나 2예요. 어느 점에서 접선을 그어도 곡선이 똑같은 모양으로 벌어지니까 순서를 바꿔도 같아요. eˣ는 두 번 미분해도 eˣ라 오른쪽으로 갈수록 더 휘어요. 그래서 접선을 어디에 긋느냐에 따라 높이가 달라져요.
김민준
오차 제곱은 어느 점수대에서나 같은 기준으로 깎는 조교고, eˣ는 점수대마다 깎는 기준이 다른 조교네요. KL을 낳는 로그정규화자 F는 어느 쪽인지 다음 문제에서 보면 되겠어요.
문제 5. 브레그만과 KL, 순서까지
베르누이 분포는 t(x) = x, F(θ) = log(1 + eθ), η = F′(θ) = 성공 확률인 지수족이다. 성공 확률 0.2인 분포 p₁과 0.6인 분포 p₂에 대해 (가) KL(p₁‖p₂)를 정의대로 계산하라. (나) BF(θ₂ : θ₁)와 BF(θ₁ : θ₂)를 계산해 (가)와 비교하라. (다) F*(η) = η log η + (1 − η) log(1 − η)로 BF*(η₁ : η₂)를 계산하라. (위 위젯의 「문제 5 불러오기」로 두 분포를 불러와 자기 계산과 견줄 수 있다.)
성공 확률 0.2 인 분포 p₁ 과 0.6 인 분포 p₂ 의 막대, 그리고 로그정규화자 F(θ) = log(1 + e^θ) 곡선 위에서 두 분포에 해당하는 두 점
θ 쪽에서는 순서가 뒤집히고 η 쪽에서는 그대로네요. 선형대수에서 쌍대공간의 벡터를 원래 공간의 벡터 자리에 넣으면 안 되는 거랑 같아요. 넣을 수는 있어도 뜻이 없어요.
김민준
보고서 표의 열 이름만 보고 단위를 확인 안 한 거랑 비슷하네요. 같은 "F"여도 들어가는 게 달라요.
위젯에서 확인 → 위 KL·브레그만·피셔 위젯의 「문제 5 불러오기 (성공 확률 0.2, 0.6)」 단추로 두 분포를 불러와, 세 거리를 자기 계산과 견줄 수 있다.
문제 6. 교사 모델의 로짓, 학생 모델의 로짓
분류기의 로짓(소프트맥스에 넣기 전의 점수)은 결과가 셋인 범주분포의 자연 파라미터 θ다. 이때 로그정규화자는 F(θ) = log(eθ₁ + eθ₂ + eθ₃)이고, 기댓값 파라미터 η = ∇F(θ)는 소프트맥스 확률이다. 큰 교사 모델의 로짓이 θT = (2, 1, 0), 작은 학생 모델의 로짓이 θS = (0, 1, 1)이다. 학생이 교사를 흉내 내도록 KL(pT‖pS)를 줄이며 학습한다(증류). (가) KL(pT‖pS)를 정의대로, 그리고 브레그만 발산으로 계산하라. (나) 이 KL을 학생 로짓 θS로 미분한 그래디언트를 구하라. (다) 학생 로짓 셋에 모두 5를 더하면 KL과 그래디언트는 어떻게 되는가?
교사 로짓 (2, 1, 0), 학생 로짓 (0, 1, 1), (다)의 학생 로짓 + 5 = (5, 6, 6)을 막대로 그린 그림. 소프트맥스 확률은 그리지 않았다
함께 풀기
김민준
소프트맥스를 돌리면 pT = (0.665, 0.245, 0.090), pS = (0.155, 0.422, 0.422)예요. 정의대로 하면 0.6948. 브레그만은 KL에서 앞에 온 pT 쪽에 접선을 그어야 하니까 BF(θS : θT)이고, 이것도 0.6948이에요.
김민준
(나)는 학생 분포가 KL에서 뒤에 오니까 브레그만에서도 뒤 인자라고 보고, 뒤 인자 b로 미분하는 공식 −∇²F(b)(a − b)에 넣었어요. (−0.328, −0.047, 0.375)요.
선생님
학생 로짓을 하나씩 아주 조금 움직여서 KL이 얼마나 변하는지 직접 재 봤어요?
김민준
유한차분으로 하면… (−0.510, 0.178, 0.332)예요. 안 맞아요. 아, 학생 분포는 KL에서는 뒤에 오는데 BF(θS : θT)에서는 앞 인자 a예요. 순서가 뒤집힌다는 걸 계산할 때는 써 놓고 미분할 때는 잊었어요.
김민준
앞 인자 a로 미분하면 접선 쪽 θT는 고정이니까 ∇F(θS) − ∇F(θT) = ηS − ηT = pS − pT. (−0.510, 0.178, 0.332), 유한차분이랑 같아요.
이서연
(다)는 로짓에 같은 수를 더해도 소프트맥스가 그대로니까 KL도 0.6948 그대로일 거야. 그런데 브레그만 식으로 보면 F(θS)가 5만큼 커지는데, 그건 어디로 가지?
선생님
식의 셋째 항 ηT · (θS − θT)는 그때 얼마나 바뀌어요?
이서연
ηT의 성분을 다 더하면 1이니까… 셋째 항도 정확히 5 늘어나요. 빼면 상쇄되네요.
김민준
그래디언트는? pS − pT였잖아.
이서연
소프트맥스가 그대로니까 그것도 그대로야. 성분을 다 더하면 1 − 1 = 0이고.
선생님
그래디언트 성분의 합이 0이라는 건, 어느 방향으로 그래디언트가 0이라는 뜻이에요?
이서연
로짓을 다 같이 올리는 방향이요. 그쪽으로는 KL이 꿈쩍도 안 하니까요.
김민준
정답이 원-핫인 보통 학습에서 크로스 엔트로피의 그래디언트가 「예측 확률 − 정답」인 것도 이거였네요. PyTorch 과제에서 softmax − onehot을 외우기만 했는데, 브레그만을 앞 인자로 미분한 거였어요.