모델 위로 옮기는 「가장 가까운 점」은 KL의 방향에 따라 둘이었다. 현실 p를 KL의 첫 인자에 두면(KL(p‖q) 최소) m-사영, 둘째 인자에 두면(KL(q‖p) 최소) e-사영이다. 학습 방법을 고르는 일은 m-사영과 e-사영 가운데 하나를 고르는 일이기도 하다. 같은 분포를 같은 모델에 맞추는데, 답이 왜 두 개인가? 그리고 둘은 얼마나 다른가?
봉우리 둘을 정규분포 하나로
하루 동안 도로를 지나는 차의 수를 시간별로 그리면 출근 시간과 퇴근 시간에 봉우리가 둘 선다. 이 두 봉우리 분포를 정규분포 하나로 요약해야 한다고 하자. 두 봉우리를 다 덮는 넓은 정규분포는 차가 거의 없는 한낮에도 확률을 주고, 한 봉우리에 앉는 좁은 정규분포는 한낮을 피하지만 다른 봉우리를 아예 잊는다. 현실(봉우리가 여럿인 분포)은 정규분포가 아니므로, 정규분포족 위에서 가장 가까운 점, 곧 사영점을 찾아야 한다. 그런데 「가장 가까운」을 KL의 어느 방향으로 재느냐에 따라 넓은 정규분포가 나올 수도, 좁은 정규분포가 나올 수도 있다.
폭 1인 두 봉우리를 간격 5로 섞은 p(분홍)를 정규분포 하나로 맞춘 두 결과: m-사영(빨간 점선)은 두 봉우리를 다 덮느라 넓어져 골짜기에도 확률을 주고, e-사영의 후보 하나(파랑)는 오른쪽 봉우리에 좁게 앉아 왼쪽 봉우리를 잊는다
p와 q의 역할
p는 현실(진짜 분포), q는 모델 위의 분포라 하면, 두 사영은 무엇을 벌하느냐가 다르다.
m-사영
e-사영
줄이는 것
KL(p‖q)
KL(q‖p)
누구의 눈으로 심판하나
현실 p
모델 q
벌이 큰 곳
p가 높은데 q가 낮은 곳
q가 높은데 p가 낮은 곳
q가 하려는 일
p의 봉우리를 빠짐없이 덮는다
p가 거의 0인 골짜기에 확률을 걸지 않는다
정규분포족에서의 답
평균과 분산을 맞춘 정규분포. 늘 하나
봉우리 사이의 거리에 달려 있다
m-사영의 결과는 q가 넓어지는 것, 곧 「빠뜨리지 않겠다」이지만, e-사영의 결과는 얼마나 떨어진 봉우리냐에 따라 달라진다.
표준편차(폭)가 1인 봉우리 두 개를 간격 d로 반반 섞은 p를 생각하자. 간격이 좁으면 골짜기가 얕아서 e-사영도 가운데에 걸친 정규분포 하나를 고른다. 간격을 벌리면 어느 순간 봉우리 하나에 앉는 좁은 정규분포가 국소해(그 둘레에서만 가장 좋은 답, local minimum)로 새로 생긴다.
e-사영의 후보는 하나가 아닐 수 있고, 그때 어느 후보에 닿는지는 최적화의 출발점이 정한다.
직접 움직여 보기
불러오는 중…
파이썬
import numpy as np
x = np.linspace(-15, 15, 3001)
dx = x[1] - x[0]
def normal(m, s):
return np.exp(-0.5 * ((x - m) / s)**2) / (s * np.sqrt(2 * np.pi))
def fits(d):
p = 0.5 * normal(-d / 2, 1) + 0.5 * normal(d / 2, 1) # 두 봉우리, 폭 1, 간격 d
# m-사영: KL(p‖q) 최소 = 평균과 분산을 맞춘 정규분포
m_sd = np.sqrt(np.sum(x**2 * p) * dx)
# e-사영: KL(q‖p) 를 (μ, σ) 격자 위에서 전부 재고, 국소 최소를 모두 찾는다
mus, sds = np.arange(-4, 4.001, 0.02), np.arange(0.5, 4.001, 0.02)
logp = np.log(p)
K = np.array([[np.sum((q := normal(m, s)) * (np.log(q + 1e-300) - logp)) * dx for s in sds] for m in mus])
mins = [(mus[i], sds[j], K[i, j]) for i in range(1, len(mus) - 1) for j in range(1, len(sds) - 1)
if K[i, j] == K[i - 1:i + 2, j - 1:j + 2].min()]
return m_sd, mins
for d in [3, 5]:
m_sd, mins = fits(d)
sols = " ".join(f"N({m:+.2f}, {s:.2f}²) KL {k:.3f}" for m, s, k in mins)
print(f"간격 {d}: m-사영 N(0, {m_sd:.2f}²) | e-사영 국소해 {sols}")
# 간격 3: m-사영 N(0, 1.80²) | e-사영 국소해 N(+0.00, 1.72²) KL 0.074
# 간격 5: m-사영 N(0, 2.69²) | e-사영 국소해 N(-2.38, 1.14²) KL 0.666 N(+0.00, 2.40²) KL 0.481 N(+2.38, 1.14²) KL 0.666
간격 3에서는 e-사영도 가운데에 앉고, m-사영보다 조금 좁을 뿐이다. 간격 5에서는 KL(q‖p)의 그래디언트가 0인 극소점이 가운데 하나와 봉우리 쪽 둘, 모두 셋이다. 그 가운데 KL이 가장 작은 것은 여전히 가운데(0.481)이고, 봉우리 쪽(0.666)은 그 둘레에서만 가장 좋은 국소해다. 봉우리 쪽에서 출발한 최적화는 그 국소해에 멈춘다. 그러니 「e-사영은 봉우리 하나를 고른다」는 흔한 말은 간격 5에서는 틀렸고, 간격을 더 벌리면 어떻게 되는지는 아래 문제 4에서 따진다.
이 절의 결론
「KL(p‖q)를 줄이는 m-사영과 KL(q‖p)를 줄이는 e-사영은 서로 다른 추론이다. 정규분포족 위로의 m-사영은 늘 하나이고, e-사영은 여럿일 수 있다.」
문제 4. 봉우리를 고르는 순간
표준편차(폭)가 1인 두 봉우리를 간격 d로 반반 섞은 p에 정규분포 q를 KL(q‖p)로 맞춘다. (가) d = 6에서 KL(q‖p)의 국소해를 모두 구하고, 어느 것이 e-사영(전역 최적)인지 가려라. (나) 봉우리 하나에 앉는 국소해가 처음 생기는 간격과, 그 해가 전역 최적이 되는 간격을 구하라. (위 위젯의 「문제 4 불러오기」 단추로 d = 6을 불러올 수 있다.)
폭 1인 봉우리 두 개를 간격 6으로 반반 섞은 분포 p. 여기에 정규분포 q 하나를 KL(q‖p)로 맞춘다
함께 풀기
이서연
간격 5에서도 가운데가 이겼잖아. 게다가 문제가 좌우 대칭이니까, 최적해가 유일하면 그 해도 대칭이어야 해. μ = 0. 간격이 6이어도 답은 가운데일 거야.
김민준
저는 왼쪽 봉우리에서 출발해서 최적화했어요. N(−2.98, 1.02²), KL 0.689가 나왔어요. 봉우리 하나를 골랐으니 이게 e-사영이에요.
이서연
간격 5 때처럼 그건 국소해겠지. 가운데에서 출발해 봐.
김민준
N(0, 2.74²), KL 0.841이에요. …가운데가 더 커요. 이번에는 봉우리 쪽이 이겨요.
선생님
서연 학생, 오른쪽 봉우리에서 출발하면요?
이서연
N(+2.98, 1.02²), KL 0.689. 왼쪽 해와 똑같아요. 대칭인 문제인데 가운데가 최적이 아니에요.
선생님
서연 학생의 논증에서 어느 가정이 깨졌어요?
이서연
「최적해가 유일하면」이요. 해가 두 개면 대칭은 두 해를 서로 바꿔 줄 뿐이고, 각각은 대칭일 필요가 없어요. 대칭인 문제가 비대칭인 해 한 쌍을 가질 수 있어요.
선생님
물리에서는 그걸 대칭 깨짐이라고 불러요. 민준 학생은 답은 맞았어요. 그게 답이라는 건 어떻게 알았어요?
김민준
몰랐어요. 출발점 하나만 보고 끝냈는데 마침 그게 전역 최적이었던 거예요. 가운데 해와 비교해 보기 전에는 알 수 없었어요.
선생님
그럼 (나)는요?
김민준
이번에는 출발점을 셋 두고 d를 촘촘히 훑었어요. 약 4.8에서 봉우리 쪽 국소해가 처음 생기고, 약 5.6에서 가운데 해와 KL이 같아져요. 그 뒤로는 봉우리 해가 이겨요.
이서연
가운데 해는 그 뒤에도 국소해로 남아 있고요. 그러니까 d = 6에는 해가 셋이에요.
김민준
팀플에서 제가 처음 낸 안을 아무도 반박 안 해서 최선인 줄 알았는데, 다른 사람이 처음부터 다시 짜 보니 더 나은 게 있던 거랑 같네요.
이서연
해석학에서 극값 판정할 때 「임계점을 전부 찾고 비교해라」던 게 이래서였네요. 대칭은 후보를 줄여 줄 뿐 답을 정해 주지 않아요.
풀어 본 뒤 위젯에서 확인 → 위 정규분포 맞추기 위젯의 「문제 4 불러오기 (d = 6)」 단추
문제 5. 장애물 앞에서 좌우로 갈린 시연
자율주행 시연 데이터에서, 길 한가운데 놓인 장애물 앞에서 운전자의 절반은 핸들을 왼쪽으로 20°, 절반은 오른쪽으로 20° 꺾었다. 꺾은 각도는 저마다 표준편차 5°로 흩어진다(설명을 위해 정한 숫자다). 정책 모델은 꺾을 각도를 정규분포 하나로 낸다. (가) 시연의 우도를 최대로 하는 정책, 곧 KL(p‖q)를 줄이는 정책을 구하라. 그 정책이 핸들을 ±5° 안으로만 꺾을(장애물로 곧장 갈) 확률을 시연 분포의 같은 확률과 비교하라. (나) 정책이 스스로 뽑은 각도를 시연 분포의 로그확률로 채점하고 엔트로피 보너스를 더한 값, 곧 𝔼q[log p] + H(q)를 키우는 학습은 무엇을 줄이는가? 그렇게 학습한 정책은 어떻게 운전하는가?
장애물 앞 시연에서 핸들을 꺾은 각도의 분포: 절반은 왼쪽 20°, 절반은 오른쪽 20°, 봉우리마다 표준편차 5°. 가운데 ±5° 띠는 장애물로 곧장 가는 각도
함께 풀기
김민준
(가)는 평균과 분산을 맞추면 되니까 평균 0°, 분산은 5² + 20² = 425, 표준편차 20.6°예요. 평균이 시연과 같으니까 잘 배운 거죠. 평균적으로 똑바로 가고요.
선생님
±5° 안으로 꺾을 확률은요?
김민준
정책은 0.19예요. 시연은… 0.0013이요. 백사십 배쯤이에요. 시연한 사람 가운데 장애물로 곧장 간 사람은 거의 없는데, 정책은 다섯 번에 한 번꼴로 들이받아요.
이서연
평균을 맞춘 게 문제야. m-사영(KL(p‖q) 최소)은 p가 높은 곳을 빠뜨리지 않으려고 넓게 덮으니까, 두 봉우리 사이 골짜기까지 덮었어.
선생님
(나)로 가죠. 무엇을 줄이는 학습이에요?
이서연
𝔼q[log p] + H(q) = Σ q log p − Σ q log q = −KL(q‖p). 이걸 키우는 건 KL(q‖p)를 줄이는 거예요. e-사영이요.
김민준
그럼 문제 4(봉우리를 고르는 순간)를 처음부터 다시 돌려야겠네요. 이번엔 봉우리 폭이 1이 아니라 5°고 간격은 40°니까요.
이서연
안 돌려도 될 것 같아. 각도를 5°로 나눠서 재면 폭 1, 간격 8인 문제잖아.
김민준
단위를 바꾸면 KL도 바뀌지 않아?
이서연
각도의 단위를 바꿔도 KL은 그대로야. 그러니까 그 문제의 답을 5배 하면 돼. 간격 8은 봉우리 해가 전역 최적이 되는 5.6보다 훨씬 넓으니까 봉우리 하나에 앉는 해가 이겨.
김민준
돌려서 확인해 보니 N(±20.0°, 5.0²), KL 0.693이에요. 가운데 해 N(0°, 17.4²)는 KL 1.871로 국소해로만 남고요. 왼쪽 해를 고른 정책이 오른쪽으로 꺾을 확률은 0.00003이에요.
선생님
그럼 어느 정책이 나아요?
김민준
장애물을 들이받지 않으니 (나)가 낫죠. 대신 시연에 있던 오른쪽 길은 잊어버려요.
이서연
KL(p‖q)로 넓게 덮느냐, KL(q‖p)로 한 곳에 확실히 앉느냐네요. 어느 사영이 좋은지는 무엇을 더 피해야 하느냐가 정해요. 골짜기가 위험하면 e-사영, 봉우리를 하나라도 잃으면 안 되면 m-사영이요.
김민준
조별 과제에서 두 사람이 서로 다른 주제를 냈을 때, 두 주제를 반씩 섞은 보고서를 내면 아무 주제도 아닌 게 되는 거랑 같네요.