추론의 기하학

분류기나 언어 모델을 크로스 엔트로피로 학습할 때 줄이는 것은, 데이터의 분포와 모델의 분포 사이의 KL 발산에 상수를 더한 값이다. KL 발산은 한 분포를 다른 분포로 대신할 때 치르는 손해를 재는 양이다. 그런데 같은 두 분포를 KL의 두 인자 자리에 바꿔 넣어, KL(p‖q) 대신 KL(q‖p)를 줄이는 학습도 있다. 변분 추론이 그렇다.

모델이 다룰 수 있는 분포의 모임을 모델이라 하자. 모델 밖의 복잡한 분포 p를 모델 위의 한 점으로 옮기고 싶다. 「가장 가까운 점」을 KL의 어느 방향으로 재느냐에 따라 답이 달라지지 않는가?

달라진다. KL(p‖q)를 줄이면 q는 p의 봉우리를 넓게 덮고, KL(q‖p)를 줄이면 q는 p가 거의 0인 곳에 확률을 걸지 않으려 좁아진다. 어느 방향도 그것만으로 「올바른」 추론은 아니다.

그러면 어느 방향을 써야 하는가? 이 물음에 답하기 전에, 먼저 사영이란 무엇인지를 정확히 하자. 어디에 내려찍히는지, 왜 거기인지, 그리고 내려찍힌 자리에서 무엇이 직각인지.

사영: 큰 세계를 작은 세계에 옮기기

평균을 맞추고, 로그정규화자를 미분하고, 닫힌꼴로 답을 내는 도구는 대부분 지수족 위에서 만들어졌다. 지수족은 정규분포·이항분포처럼 log p = θ·t(x) − F(θ) 꼴로 쓰이는 분포 모임이다(θ는 여기서 자연 파라미터를 적는다). 그런데 실제 데이터의 분포는 봉우리가 여럿이거나 꼬리가 길어서 이 꼴에 들어맞는 일이 드물다. 실제 분포가 지수족에 속하지 않으면 어떻게 하나? 도구를 분포에 그대로 쓸 수 없다면, 분포 쪽을 다루기 쉬운 모델 위로 옮겨 오는 수밖에 없다.

그림자: 비추는 각도가 모양을 정한다

3D 물체의 2D 그림자를 떠올리자. 같은 물체라도 빛을 비추는 각도에 따라 바닥에 떨어지는 자리와 모양이 다르듯이, 사영도 같은 분포를 같은 모델에 옮겨도 「가까움」을 재는 방향이 다르면 떨어지는 점이 다르다.

모델 M 밖의 현실 p를 모델 위로 옮기는 두 방법: KL(p‖q)를 가장 작게 하는 m-사영점 qₘ과 KL(q‖p)를 가장 작게 하는 e-사영점 qₑ은 서로 다른 점이다
모델 M 밖의 현실 p를 모델 위로 옮기는 두 방법: KL(p‖q)를 가장 작게 하는 m-사영점 qₘ과 KL(q‖p)를 가장 작게 하는 e-사영점 qₑ은 서로 다른 점이다

정의

모델 M은 우리가 다룰 수 있는 분포들의 모임이다. 정규분포족, 이항분포족 같은 것. 현실 p가 M 밖에 있을 때, M 안에서 p에 「가장 가까운」 점을 고르는 방법은 KL의 방향에 따라 둘이다.

qm=arg⁡min⁡q∈MKL(p ∥ q),qe=arg⁡min⁡q∈MKL(q ∥ p)\textcolor{#7f8f10}{q}_{\mathrm{m}} = \arg\min_{\textcolor{#7f8f10}{q} \in \textcolor{#407050}{M}} \textcolor{#c2398a}{\mathrm{KL}}(\textcolor{#d6479f}{p}\,\|\,\textcolor{#7f8f10}{q}), \qquad \textcolor{#7f8f10}{q}_{\mathrm{e}} = \arg\min_{\textcolor{#7f8f10}{q} \in \textcolor{#407050}{M}} \textcolor{#c2398a}{\mathrm{KL}}(\textcolor{#7f8f10}{q}\,\|\,\textcolor{#d6479f}{p})
p현실 분포 (모델 밖)q모델 M 안의 분포qmm-사영점: 현실이 심판하는 KL 을 최소로qee-사영점: 모델이 심판하는 KL 을 최소로KLKL 발산M모델 (분포들의 모임)\begin{array}{ll} \textcolor{#d6479f}{p} & \text{현실 분포 (모델 밖)} \\ \textcolor{#7f8f10}{q} & \text{모델 } M \text{ 안의 분포} \\ \textcolor{#7f8f10}{q}_{\mathrm{m}} & \text{m-사영점: 현실이 심판하는 KL 을 최소로} \\ \textcolor{#7f8f10}{q}_{\mathrm{e}} & \text{e-사영점: 모델이 심판하는 KL 을 최소로} \\ \textcolor{#c2398a}{\mathrm{KL}} & \text{KL 발산} \\ \textcolor{#407050}{M} & \text{모델 (분포들의 모임)} \end{array}

이름의 m과 e가 어디서 왔는지는 p에서 사영점까지 그은 측지선의 종류를 보면 알 수 있다. p와 m-사영점 qm을 잇는 선은 확률을 그대로 섞는 m-측지선(혼합의 측지선)이고, p와 e-사영점 qe를 잇는 선은 로그 확률을 섞는 e-측지선(지수의 측지선)이다. 측지선은 정해진 규칙(접속)으로 가장 곧게 가는 경로다. 사영의 이름을 왜 하필 이 측지선에서 땄는지는 사영점에서 측지선이 모델과 어떤 각도로 만나는지를 볼 때 드러나고, 이 장의 「사영의 피타고라스」 절에서 따진다.

최대우도추정은 사영이다

데이터 x1, …, xn이 있을 때, 각 값이 나온 비율을 그대로 적은 분포를 경험분포 p̂라 부른다. 로그우도(우도, 곧 모델이 관측에 준 확률의 로그)의 평균을 경험분포로 다시 쓰면 이렇다.

1n∑i=1nlog⁡q(xi)=−H(p^)−KL(p^ ∥ q)\frac{1}{\textcolor{#a05000}{n}} \sum_{i=1}^{\textcolor{#a05000}{n}} \log \textcolor{#7f8f10}{q}(\textcolor{#6f8fa6}{x}_i) = -\textcolor{#9467bd}{H}(\textcolor{#d6479f}{\hat p}) - \textcolor{#c2398a}{\mathrm{KL}}(\textcolor{#d6479f}{\hat p}\,\|\,\textcolor{#7f8f10}{q})
q모델 안의 분포xii 번째 데이터p^경험분포: 각 값이 데이터에 나온 비율H엔트로피 (모델과 무관한 상수)KLKL 발산n데이터 개수\begin{array}{ll} \textcolor{#7f8f10}{q} & \text{모델 안의 분포} \\ \textcolor{#6f8fa6}{x}_i & i \text{ 번째 데이터} \\ \textcolor{#d6479f}{\hat p} & \text{경험분포: 각 값이 데이터에 나온 비율} \\ \textcolor{#9467bd}{H} & \text{엔트로피 (모델과 무관한 상수)} \\ \textcolor{#c2398a}{\mathrm{KL}} & \text{KL 발산} \\ \textcolor{#a05000}{n} & \text{데이터 개수} \end{array}

H(p̂)는 경험분포의 엔트로피(평균적 놀라움)로, 모델과 상관없는 상수다. 그러니 로그우도를 최대로 하는 것은 KL(p̂‖q)를 최소로 하는 것과 같다. 최대우도추정(MLE, maximum likelihood estimation: 우도를 가장 크게 하는 파라미터를 고르는 방법)은 경험분포의 m-사영이다.

모델이 지수족이면 m-사영에는 이름이 하나 더 붙는다. 모멘트 일치(평균 같은 기댓값을 데이터와 맞추기, moment matching)다.

η(qm)=Eqm[t(x)]=1n∑i=1nt(xi)\textcolor{#e0504a}{\eta}(\textcolor{#7f8f10}{q}_{\mathrm{m}}) = \mathbb{E}_{\textcolor{#7f8f10}{q}_{\mathrm{m}}}\big[\textcolor{#0e93b0}{t}(\textcolor{#6f8fa6}{x})\big] = \frac{1}{n} \sum_{i=1}^{n} \textcolor{#0e93b0}{t}(\textcolor{#6f8fa6}{x}_i)
η기댓값 파라미터qmm-사영점 = 최대우도 추정된 분포t충분통계량x, xi샘플, i 번째 데이터\begin{array}{ll} \textcolor{#e0504a}{\eta} & \text{기댓값 파라미터} \\ \textcolor{#7f8f10}{q}_{\mathrm{m}} & \text{m-사영점 = 최대우도 추정된 분포} \\ \textcolor{#0e93b0}{t} & \text{충분통계량} \\ \textcolor{#6f8fa6}{x},\ \textcolor{#6f8fa6}{x}_i & \text{샘플, } i \text{ 번째 데이터} \end{array}

모델이 기대하는 충분통계량 t(x)(모델이 데이터에서 보는 요약값)의 평균을 데이터의 평균에 맞추면 그것이 답이다. 이 평균 η가 기댓값 파라미터다. 파라미터는 분포를 정하는 숫자이고, 기댓값 파라미터는 충분통계량의 기댓값으로 분포를 정한 숫자다. 정규분포이면 평균과 분산을, 이항분포면 성공 횟수의 평균을 맞추는데, 이런 모멘트 일치는 지수족일 때의 이야기다. 지수족이 아닌 모델에서는 MLE가 여전히 m-사영이지만, 평균이 맞는다는 보장은 없다(아래 문제 2).

아래 계산의 모델은 앞면이 나올 확률이 θ인 동전을 두 번 던져 앞면 수 k = 0, 1, 2를 세는 이항분포 B(2, θ)다. 이 모델은 결과가 셋이라 모든 분포를 삼각형 하나 위의 점으로 그릴 수 있고(이 삼각형을 심플렉스라 부른다), 파라미터가 θ 하나라 모델이 그 삼각형 안의 곡선 한 줄로 보이기 때문에 골랐다. 지수족 가운데 그림으로 볼 수 있는 가장 작은 예다.

파이썬

import numpy as np

def q(th):                                  # 모델: 이항분포 B(2, θ), 결과 k = 0, 1, 2
    return np.array([(1 - th)**2, 2 * th * (1 - th), th**2])

def kl(a, b):
    return np.sum(a * np.log(a / b))

counts = np.array([50, 10, 40])             # 데이터 100개의 개수
p_hat = counts / counts.sum()               # 경험분포
ths = np.linspace(0.001, 0.999, 9981)

loglik = [np.sum(counts * np.log(q(t))) for t in ths]
m_proj = [kl(p_hat, q(t)) for t in ths]
print(f"로그우도 최대   θ = {ths[np.argmax(loglik)]:.3f}")
print(f"KL(p̂‖q) 최소   θ = {ths[np.argmin(m_proj)]:.3f}")
print(f"모멘트 일치     θ = 평균 k / 2 = {p_hat @ [0, 1, 2] / 2:.3f}")
# 로그우도 최대   θ = 0.450
# KL(p̂‖q) 최소   θ = 0.450
# 모멘트 일치     θ = 평균 k / 2 = 0.450

세 가지 방법이 같은 점에 떨어진다.

이 절의 결론

「최대우도추정은 경험분포 p̂를 모델 위로 m-사영(KL(p̂‖q) 최소)하는 일이다. 모델이 지수족이면 이 사영은 충분통계량의 평균을 맞추는 모멘트 일치가 된다.」

문제 1. 자유투 기록에 맞는 카드

농구 선수가 자유투 10개 가운데 7개를 넣었다. 코치의 카드 묶음에는 성공률이 0.5, 0.6, 0.8, 0.9인 선수 카드만 있다. 이 기록을 가장 잘 설명하는 카드를 고르려 한다. (가) 카드마다 이 기록(넣고 놓친 순서까지 정해진 기록 하나)이 나올 확률을 구하고, 가장 큰 카드를 골라라. (나) 0.6과 0.8은 0.7에서 똑같이 0.1 떨어져 있는데도 왜 한쪽이 이기는지를, 기록의 비율 (0.7, 0.3)과 카드의 (성공률, 실패율) 사이의 KL로 설명하라. (다) 카드 묶음에 아무 성공률이나 다 있다면 어느 카드가 이기는가?

자유투 10개 가운데 7개를 넣은 기록 하나와, 성공률 0.5·0.6·0.8·0.9 카드 네 장의 자리. 0.6과 0.8은 기록 비율 0.7에서 똑같이 0.1 떨어져 있다
자유투 10개 가운데 7개를 넣은 기록 하나와, 성공률 0.5·0.6·0.8·0.9 카드 네 장의 자리. 0.6과 0.8은 기록 비율 0.7에서 똑같이 0.1 떨어져 있다

함께 풀기

김민준 M01
김민준

0.6 카드는 0.6⁷ × 0.4³ = 0.00179, 0.8 카드는 0.8⁷ × 0.2³ = 0.00168이에요. 0.5는 0.00098, 0.9는 0.00048이고요. 0.6이 이겨요.

김민준 M05
김민준

그런데 이상해요. 0.6이나 0.8이나 0.7에서 0.1씩 떨어졌으니까 비겨야 하는 거 아니에요? 계산이 틀렸나요?

선생님 T01
선생님

두 카드의 차이 「0.1」은 무엇의 차이로 잰 거였어요?

이서연 S01
이서연

성공률 숫자 하나의 차이요. 그런데 이 기록이 나올 확률은 실패 쪽도 봐요.

선생님 T01
선생님

실패 쪽에서는 두 카드가 어때요?

이서연 S01
이서연

0.8 카드는 실패율이 0.2라서 기록의 실패 비율 0.3보다 모자라고, 0.6 카드는 실패율 0.4라서 넉넉해요. 아, 실제로 일어난 일에 확률을 모자라게 준 쪽이 더 비싸게 치르는 거네요.

선생님 T01
선생님

그걸 KL로 재 보면요?

이서연 S01
이서연

KL((0.7, 0.3)‖(0.6, 0.4)) = 0.0216, KL((0.7, 0.3)‖(0.8, 0.2)) = 0.0282예요. 0.6 카드가 더 가까워요.

김민준 M01
김민준

그게 내 계산이랑 무슨 상관이야? 나는 기록이 나올 확률을 구했잖아.

이서연 S07
이서연

로그 확률의 차이를 내 볼게. ln(0.00179 / 0.00168) = 0.066. KL 차이 0.0066의 꼭 10배네. 자유투가 10개니까.

이서연 S01
이서연

그럼 기록이 나올 확률이 큰 카드가 KL(기록‖카드)로 가까운 카드예요.

김민준 M01
김민준

(다)는 쉬워요. 아무 카드나 있으면 0.7이요. 기록의 비율 그대로요.

선생님 T01
선생님

그래요. 고를 수 있는 카드가 정해져 있으면 그 안에서 가장 가까운 카드를, 다 있으면 기록 그대로를 골라요. 「가장 가까운」은 기록을 첫 인자로 둔 KL(기록‖카드)로 재고요.

김민준 M01
김민준

옷을 한 치수 크게 사는 것과 작게 사는 게 같은 「한 치수」가 아닌 거랑 같네요. 작은 옷은 아예 못 입으니까요.

문제 2. 최대우도는 평균을 맞추는가

결과가 0, 1, 2인 데이터 100개가 각각 55, 10, 35번 나왔다. (가) 이항 모델 B(2, θ)의 최대우도 추정값을 구하고, 그것이 경험분포의 m-사영임을 확인하라. (나) KL(q‖p̂)를 최소로 하는 θ도 구해 비교하라. (다) 모델을 q(θ) = (1 − θ − θ², θ, θ²)로 바꾸면 최대우도 추정된 분포의 평균이 데이터 평균 0.8과 같은가?

결과 0, 1, 2가 55, 10, 35번 나온 데이터 100개(평균 0.8)와, 맞춰 볼 두 모델 B(2, θ)와 (1 − θ − θ², θ, θ²)
결과 0, 1, 2가 55, 10, 35번 나온 데이터 100개(평균 0.8)와, 맞춰 볼 두 모델 B(2, θ)와 (1 − θ − θ², θ, θ²)

함께 풀기

김민준 M01
김민준

사영이 KL 최소화라고 해서 scipy로 KL을 최소화했어요. θ = 0.147, 분포는 (0.728, 0.250, 0.022)요.

이서연 S01
이서연

그건 평균이 0.29밖에 안 되잖아. 데이터 평균은 0.8인데. 이항분포는 지수족이니까 MLE는 평균을 맞춰야 해. θ = 0.8 / 2 = 0.4.

선생님 T01
선생님

민준 학생, KL의 두 인자 자리에 뭘 넣었어요?

김민준 M04
김민준

kl(q(θ), p_hat)이요. …반대네요. 로그우도가 Σ p̂ log q니까 p̂가 앞에 와야 해요. 문제 1에서 자유투 카드를 고를 때 KL(기록‖카드)로 기록을 앞에 뒀던 것처럼요. 고쳐서 돌리면 0.400이에요. 로그우도를 직접 최대화해도 0.400이고요.

선생님 T01
선생님

0.147은 뭐였을까요?

김민준 M01
김민준

e-사영이요. 모델이 심판하니까, 데이터에 10%밖에 없는 1이 모델에서 크게 나오는 걸 피하려고 한쪽으로 쏠린 거예요.

김민준 M01
김민준

조교님이 채점 기준 두 개를 헷갈려서 올리신 적 있는데, 점수가 다 이상하게 나왔거든요. 그거랑 같네요. 기준이 바뀌면 답이 바뀌어요.

이서연 S01
이서연

(다)는 쉬워요. MLE는 언제나 평균을 맞추니까 평균 0.8이에요.

선생님 T01
선생님

계산해 봤어요?

이서연 S06
이서연

…MLE는 θ = 0.385이고, 분포는 (0.468, 0.385, 0.148)이에요. 평균이 0.680이에요. 안 맞아요.

선생님 T01
선생님

평균을 맞추는 θ는요?

이서연 S01
이서연

θ + 2θ² = 0.8을 풀면 θ = 0.430이에요. 그런데 거기서는 로그우도가 MLE보다 1.74 낮아요. 평균을 맞추는 게 최대우도가 아니에요.

이서연 S07
이서연

아, 모멘트 일치는 지수족이라서 나온 거예요.

선생님 T01
선생님

지수족의 어떤 성질 때문이었죠?

이서연 S01
이서연

로그우도를 θ로 미분하면 충분통계량이 튀어나오는 건 log q가 θ에 대해 선형일 때뿐이에요. 이 모델은 θ²가 섞여서 지수족이 아니고요.

김민준 M01
김민준

그럼 MLE가 m-사영이라는 것도 깨져?

이서연 S01
이서연

그건 그대로야. m-사영이 평균을 맞춘다는 게 지수족 위로 사영할 때만이고.

이서연 S01
이서연

선형대수에서 「정사영의 좌표는 내적으로 구한다」가 정규직교 기저일 때만 맞는 것과 비슷해요. 성질이 사영 자체에서 오는 게 아니라 기저에서 와요.

문제 3. 파라미터 하나짜리 분류기의 loss 하한

리뷰 100개에 긍정·중립·부정 라벨이 70, 10, 20개 붙어 있다. 분류기의 로짓을 (w, 0, −w)로 묶어, 수 하나 w가 「얼마나 긍정 쪽인가」만 정하게 하고, 이 분류기를 크로스 엔트로피 loss로 학습한다. (가) 학습이 끝난 모델이 세 라벨에 주는 확률과 loss를 구하라. loss가 하한 H(p̂)에 닿는가? (나) 학습이 끝난 모델은 데이터의 무엇을 맞추었는가?

긍정·중립·부정 라벨 70, 10, 20개와, 로짓을 (w, 0, −w)로 묶어 수 하나 w만 학습하는 분류기
긍정·중립·부정 라벨 70, 10, 20개와, 로짓을 (w, 0, −w)로 묶어 수 하나 w만 학습하는 분류기

함께 풀기

김민준 M01
김민준

크로스 엔트로피를 줄이면 모델이 라벨 비율을 그대로 배우니까 (0.7, 0.1, 0.2)이고, loss는 하한 H(p̂) = 0.802예요.

선생님 T01
선생님

돌려 봤어요?

김민준 M05
김민준

…w = 0.834에서 멈추고, 확률은 (0.616, 0.268, 0.116), loss는 0.901이에요. 학습률을 바꿔 더 돌려도 0.901에서 안 내려가요.

선생님 T01
선생님

w를 움직이면 세 확률이 어떻게 움직여요?

이서연 S01
이서연

긍정과 부정이 서로 반대로 움직이고, 중립은 둘 사이에서 따라가기만 해요. 중립만 따로 0.1로 내릴 파라미터가 없어요. (0.7, 0.1, 0.2)는 이 모델이 낼 수 있는 분포가 아니에요.

김민준 M01
김민준

문제 1(자유투)에서 카드 묶음에 0.7 카드가 없었던 거랑 같네요. 모델이 낼 수 있는 분포 가운데서 고른 거예요.

선생님 T01
선생님

그럼 학습은 그 대신 데이터의 무엇을 맞췄을까요?

이서연 S01
이서연

모델 식을 지수족 꼴로 써 볼게요. log q = w·t − log Z(w)이고 t는 긍정이면 +1, 중립이면 0, 부정이면 −1이에요. 지수족이네요.

선생님 T01
선생님

지수족이면 최대우도는 무엇을 맞추죠?

이서연 S08
이서연

t의 평균이요. 데이터는 0.7 − 0.2 = 0.5이고, 모델도 0.616 − 0.116 = 0.500이에요. 맞춘 건 「긍정 비율 빼기 부정 비율」 하나뿐이에요.

김민준 M01
김민준

loss가 하한 0.802에 못 닿은 건 학습이 덜 돼서가 아니라, 모델 밖에 있는 데이터를 모델이 낼 수 있는 분포 위로 옮겼기 때문이네요. 남은 0.901 − 0.802 = 0.099가 KL(p̂‖q)고요.

김민준 M01
김민준

조교님이 「총점만 맞으면 된다」고 하신 과제에서, 문항별 점수는 엉망이어도 총점은 정확히 맞췄던 거랑 같네요.