Part I: 출발점


Chapter 1: DPO 맛보기 — 한 줄 수식이 하는 일

의문

“이 답변이 저 답변보다 낫다.” 전문가가 아니어도 내릴 수 있는 판단이다. DPO(Direct Preference Optimization, 선호를 직접 최적화하기)는 이 판단만으로 언어모델을 정렬(사람이 바라는 방식으로 답하게 맞추기)하는 방법이고, 손실함수는 한 줄이다. 기존 학습 코드에 몇 줄만 붙이면 돌아간다. 그 단순함 덕분에 2023년 이후 오픈소스 정렬의 기본 도구가 됐다.

그 한 줄은 무엇을 하는가? 식의 기호 하나하나는 무엇을 재고, 그 식은 SFT(정답 응답을 보여 주며 그대로 따라 쓰게 하는 학습)와 무엇이 다른가?

KL의 방향: SFT는 남의 답에서, RL은 내 답에서 배운다

좋은 답만 보여 주며 가르친 모델은 왜 어느 수준에서 더 나아지지 않을까? 이미 아는 것에서 세 걸음만 가 보자. SFT(Supervised Finetuning, 지도 미세조정)에서 출발한다.

출발점 — SFT. 데이터는 (프롬프트, 좋은 응답) 쌍이다. 좋은 응답의 확률을 올린다. 손실은 −log⁡πθ(y∣x)-\log\pi_\theta(y \mid x) 다. πθ(y∣x)\pi_\theta(y \mid x) 는 파라미터가 θ\theta(세타) 인 모델 π\pi(파이, pi)가 프롬프트 xx 를 받고 응답 yy 를 낼 확률이다. 이것만으로도 모델은 꽤 잘 작동하지만, 흔히 어느 수준에서 정체한다. SFT는 "무엇이 좋은가"만 가르치고 "무엇이 나쁜가"는 가르치지 않기 때문이다. 열 번 중 한 번은 같은 말을 되풀이하거나 엉뚱한 답을 내는데, 그 실수를 콕 집어 억제할 방법이 없다.

첫 번째 걸음 — 나쁜 예제를 추가한다. 데이터를 (프롬프트, 좋은 응답, 나쁜 응답)으로 바꾼다. "대한민국의 수도는?"에 대해 "서울입니다"의 확률은 올리고 "부산입니다"의 확률은 내린다. 나쁜 예(negative example)가 들어오는 순간, 학습은 "정답 흉내 내기"에서 "좋고 나쁨을 구분하기"로 바뀐다. SFT와 강화학습의 경계가 사실 여기다.

두 번째 걸음 — 학습 전 모델에 목줄을 묶는다. 좋은 것을 올리고 나쁜 것을 내리는 일을 끝없이 하면, 모델은 원래 갖고 있던 능력을 잊는다. "서울"만 강화하다 다른 질문에도 "서울"이라 답하는 식이다. 그래서 학습을 시작할 때 복사해 얼려 둔 모델 πref\pi_\text{ref}(레퍼런스)에서 너무 멀어지면 벌점을 준다. 두 분포의 거리는 KL 발산 KL(πθ ∥ πref)\mathrm{KL}(\pi_\theta \,\|\, \pi_\text{ref})으로 잰다. KL은 이 양을 처음 정의한 두 사람, 쿨백(Kullback)과 라이블러(Leibler)의 성 머리글자다. 곱셈이 아니라 한 덩어리 이름이고, 가운데 ‖ 는 두 분포를 가르는 구분선이다. KL(πθ ∥ πref)\mathrm{KL}(\pi_\theta \,\|\, \pi_\text{ref}) 는 「πθ\pi_\theta 쪽에서 본 πref\pi_\text{ref} 와의 거리」라고 읽는다.

나쁜 예: “나쁜 것에서 멀어져라.”
KL 제약: “하지만 레퍼런스에서 너무 멀어지진 마라.”

"나쁜 예를 넣으면 RL이 된다"는 말은 절반만 맞다. 두 학습의 차이는 데이터에 나쁜 예가 있느냐보다 더 깊은 곳, 기대값을 누구의 분포에서 취하느냐에 있다. 이것을 보면 SFT가 왜 제 실수를 억제하지 못하는지가 한 줄로 설명된다.

역사: 쿨백과 라이블러

두 분포 사이의 이 "거리"는 1951년 미국의 수학자 솔로몬 쿨백(Solomon Kullback)과 리처드 라이블러(Richard Leibler)가 논문 「On Information and Sufficiency」에서 정의했다. 두 사람은 미국 정부에서 암호 해독을 하던 수학자였고, 둘 다 뒤에 국가안보국(NSA)에서 일했다(논문에는 소속이 조지워싱턴 대학과 워싱턴 D.C.라고만 적혀 있다). 논문 첫머리에 두 사람은 이렇게 적었다. 통계학자에게 두 집단이 얼마나 다른가는, 가장 좋은 검정으로도 둘을 가려내기가 얼마나 어려운가로 정해진다. 두 사람은 한 분포에서 나온 관측이 다른 분포와 얼마나 잘 구별되는지를 재는 정보량으로 이 양을 만들었고, 그래서 식이 처음부터 비대칭이다. 붙인 이름부터 「분포 1에서 나온 관측 하나가 가설 1과 가설 2를 가르는 평균 정보」였다. 그런데 두 사람이 「발산(divergence)」이라고 부른 것은 이 한 방향 양이 아니라, 두 방향을 더해 대칭으로 만든 양이었다(통계학자 해럴드 제프리스(Harold Jeffreys)가 먼저 쓴 양). 오늘날 「KL 발산」이라는 이름은 한 방향 양이 물려받았다. 어느 분포 쪽에서 보느냐에 따라 값이 달라진다는 이 성질이 아래에서 SFT와 RL을 가르는 열쇠다.

기대값을 누구의 분포에서 취하나

SFT는 순방향 KL(forward KL)을 줄인다. SFT 손실은 데이터에서 뽑은 정답의 음의 로그확률, 즉 크로스 엔트로피다. 크로스 엔트로피는 데이터 자체의 엔트로피(상수)와 KL 발산의 합으로 쪼개진다.

LSFT=Ey∼pdata[−log⁡πθ(y∣x)]=H(pdata)+KL(pdata ∥ πθ)\textcolor{#d62728}{\mathcal{L}_\text{SFT}} = \mathbb{E}_{\textcolor{#1c9c60}{y} \sim \textcolor{#2e7d32}{p_\text{data}}}\big[-\log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y} \mid \textcolor{#0093b8}{x})\big] = \textcolor{#8c564b}{H}(\textcolor{#2e7d32}{p_\text{data}}) + \textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#2e7d32}{p_\text{data}} \,\|\, \textcolor{#1565c0}{\pi_\theta})
LSFTSFT 손실 (크로스 엔트로피)pdata목표 분포: 데이터셋의 정답 응답 분포πθ학습 중인 모델H(pdata)데이터의 엔트로피 — 모델과 무관한 상수KL(pdata ∥ πθ)순방향 KL: 데이터 쪽에서 본 모델과의 거리 \small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_\text{SFT}} & \text{SFT 손실 (크로스 엔트로피)} \\ \textcolor{#2e7d32}{p_\text{data}} & \text{목표 분포: 데이터셋의 정답 응답 분포} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 모델} \\ \textcolor{#8c564b}{H}(\textcolor{#2e7d32}{p_\text{data}}) & \text{데이터의 엔트로피 — 모델과 무관한 상수} \\ \textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#2e7d32}{p_\text{data}} \,\|\, \textcolor{#1565c0}{\pi_\theta}) & \text{순방향 KL: 데이터 쪽에서 본 모델과의 거리} \end{array}

세 이름을 숫자 하나로 붙여 보자. "고마워요"에 대한 답이 데이터에 "천만에요"와 "별말씀을요"로 반반 들어 있고, 모델은 두 답에 0.8과 0.2를 준다고 하자. 데이터에서 정답을 하나 뽑아 모델이 그 답에 준 확률의 −log⁡-\log 를 매기면 0.223(“천만에요”)과 1.609(“별말씀을요”)이고, 그 평균 0.916이 크로스 엔트로피다. 이 가운데 0.693(=log⁡2= \log 2)은 정답이 두 가지로 갈려 있다는 데이터 자체의 불확실성, 곧 엔트로피다. 모델이 무엇을 하든 이 몫은 남는다. 나머지 0.223이 모델이 데이터와 어긋난 만큼, 곧 KL 발산이다. 모델이 데이터와 똑같아지면 이 몫만 0이 된다.

그러니 SFT는 순방향 KL KL(pdata ∥ πθ)=∑ypdata(y)log⁡pdata(y)πθ(y)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#2e7d32}{p_\text{data}} \,\|\, \textcolor{#1565c0}{\pi_\theta}) = \sum_{\textcolor{#1c9c60}{y}} \textcolor{#2e7d32}{p_\text{data}}(\textcolor{#1c9c60}{y}) \log \frac{\textcolor{#2e7d32}{p_\text{data}}(\textcolor{#1c9c60}{y})}{\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y})} 를 줄인다(∑(시그마)는 모든 응답 y\textcolor{#1c9c60}{y} 에 걸쳐 더한다는 기호). 합의 각 항에 곱해진 가중치(곱하는 수 — 신경망 파라미터가 아니다)가 pdata(y)\textcolor{#2e7d32}{p_\text{data}}(\textcolor{#1c9c60}{y}) 라는 점을 보자. 데이터에 있는 응답에서 모델 확률이 0에 가까우면 벌점이 무한대로 커진다 — 그래서 모델은 데이터의 모든 봉우리를 덮으려 한다(mode-covering). 반대로 데이터에 없는 응답(pdata(y)=0\textcolor{#2e7d32}{p_\text{data}}(\textcolor{#1c9c60}{y}) = 0)에 모델이 확률을 얼마나 두든 그 항은 0이다. 모델이 스스로 만들어 내는 반복 루프나 엉뚱한 답은 데이터에 없으므로, 손실이 그것을 직접 보지 못한다. 확률 합이 1이라서 간접적으로 줄어들 뿐이다.

KL로 묶은 RL은 역방향 KL(reverse KL)을 줄인다. 두 번째 걸음까지 온 목표 — 보상을 올리되 레퍼런스에서 멀어지지 말 것 — 는 식 하나로 정리된다. 유도는 건너뛰고 결과만 보자. 아래의 정책(policy)은 프롬프트를 받아 답을 고르는 규칙, 곧 언어모델 자체다.

Jβ=Ey∼πθ[R(x,y)]−β KL(πθ ∥ πref)=−β KL(πθ ∥ π∗)+상수,π∗(y)∝πref(y) eR(x,y)/β\textcolor{#d62728}{J_\beta} = \mathbb{E}_{\textcolor{#1c9c60}{y} \sim \textcolor{#1565c0}{\pi_\theta}}\big[\textcolor{#d9670b}{R}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y})\big] - \textcolor{#827717}{\beta}\,\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#6f6f78}{\pi_\text{ref}}) = -\textcolor{#827717}{\beta}\,\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#2e7d32}{\pi^*}) + \text{상수}, \qquad \textcolor{#2e7d32}{\pi^*}(\textcolor{#1c9c60}{y}) \propto \textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#1c9c60}{y})\, e^{\textcolor{#d9670b}{R}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y})/\textcolor{#827717}{\beta}}
JβKL로 묶은 RL의 목적함수 (최대화)R(x,y)응답의 보상πθ학습 중인 모델 — 기대값도 이 모델이 뽑은 응답 위에서πref레퍼런스 모델 (학습 전 모델, 고정)βKL 강도(베타): 레퍼런스 쪽으로 당기는 목줄π∗목표 분포: 레퍼런스에 보상의 지수를 곱해 다시 맞춘 최적 정책KL(πθ ∥ π∗)역방향 KL: 모델 쪽에서 본 목표와의 거리 \small\begin{array}{ll} \textcolor{#d62728}{J_\beta} & \text{KL로 묶은 RL의 목적함수 (최대화)} \\ \textcolor{#d9670b}{R}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y}) & \text{응답의 보상} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 모델 — 기대값도 이 모델이 뽑은 응답 위에서} \\ \textcolor{#6f6f78}{\pi_\text{ref}} & \text{레퍼런스 모델 (학습 전 모델, 고정)} \\ \textcolor{#827717}{\beta} & \text{KL 강도(베타): 레퍼런스 쪽으로 당기는 목줄} \\ \textcolor{#2e7d32}{\pi^*} & \text{목표 분포: 레퍼런스에 보상의 지수를 곱해 다시 맞춘 최적 정책} \\ \textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#2e7d32}{\pi^*}) & \text{역방향 KL: 모델 쪽에서 본 목표와의 거리} \end{array}

유도 대신 숫자로 확인해 보자. 답이 셋뿐인 질문에서 레퍼런스가 세 답에 (0.5, 0.3, 0.2)(0.5,\ 0.3,\ 0.2) 를 주고, 보상이 1, 0, −11,\ 0,\ -1 이며, β=1\textcolor{#827717}{\beta} = 1 이라 하자. 그러면 목표 분포는 π∗=(0.784, 0.173, 0.043)\textcolor{#2e7d32}{\pi^*} = (0.784,\ 0.173,\ 0.043) 이다. 모델 셋을 두 식으로 재 보면:

모델 πθ\textcolor{#1565c0}{\pi_\theta} 보상의 기대값 KL(πθ ∣ πref)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,|\, \textcolor{#6f6f78}{\pi_\text{ref}}) Jβ\textcolor{#d62728}{J_\beta} −β KL(πθ ∣ π∗)-\textcolor{#827717}{\beta}\,\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,|\, \textcolor{#2e7d32}{\pi^*})
레퍼런스 그대로 (0.5, 0.3, 0.2)(0.5,\ 0.3,\ 0.2) 0.300 0.000 0.300 −0.250
(0.7, 0.2, 0.1)(0.7,\ 0.2,\ 0.1) 0.600 0.085 0.515 −0.035
(0.9, 0.08, 0.02)(0.9,\ 0.08,\ 0.02) 0.880 0.377 0.503 −0.047

두 칸의 차이는 세 모델 모두 0.550으로 같다. 식의 「상수」가 이것이고, 그래서 Jβ\textcolor{#d62728}{J_\beta} 로 매긴 순위와 역방향 KL로 매긴 순위가 같다. 셋째 모델은 보상을 가장 많이 받지만 레퍼런스에서 멀리 간 벌점이 커서 둘째 모델에 진다.

보상을 최대화하는 일이 역방향 KL KL(πθ ∥ π∗)=∑yπθ(y)log⁡πθ(y)π∗(y)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#2e7d32}{\pi^*}) = \sum_{\textcolor{#1c9c60}{y}} \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y}) \log \frac{\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y})}{\textcolor{#2e7d32}{\pi^*}(\textcolor{#1c9c60}{y})} 을 줄이는 일과 같다. 이번에는 가중치가 πθ(y)\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y}) — 모델이 실제로 내놓는 응답이다. 모델이 보상이 낮은 곳(π∗(y)≈0\textcolor{#2e7d32}{\pi^*}(\textcolor{#1c9c60}{y}) \approx 0)에 확률을 두면 그 항이 크게 벌점을 받는다. 제 실수를 정확히 그 자리에서 억제하는 것이다. 대신 목표에 봉우리가 여럿이어도 모델이 그중 하나만 차지하면 나머지를 비워 둔 데 대한 벌점은 없다. 그래서 역방향 KL은 좋은 봉우리 하나를 고른다(mode-seeking).

두 성향을 그림으로 보면 이렇다. 목표는 봉우리가 둘(비중 7 대 3)이고, 모델은 봉우리를 하나만 만들 수 있다.

순방향 KL (SFT) — 두 봉우리를 덮는다 역방향 KL (KL로 묶은 RL) — 한 봉우리를 고른다 ↑ 골짜기 ■ 목표 분포 (봉우리 둘) ━ 모델 (봉우리 하나)

두 방향을 헷갈리지 않게 외우는 법이 있다. KL(A‖B)는 기대값을 A에서 취한다 — A가 말한 문장을 B가 듣고 평균적으로 얼마나 못 알아듣는가다. 그러니 앞이 말하는 쪽, 뒤가 듣는 쪽이다. 순방향 KL(pdata ∥ πθ)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#2e7d32}{p_\text{data}} \,\|\, \textcolor{#1565c0}{\pi_\theta}) 에서는 데이터가 말하고 모델이 듣는다. 데이터가 한 말을 모델이 "그런 말이 나올 리 없다"며 못 알아들으면 벌점이 붙는다. 역방향 KL(πθ ∥ π∗)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#2e7d32}{\pi^*}) 에서는 모델이 말하고 목표가 듣는다. 모델이 목표가 알아듣지 못할 엉뚱한 말을 하면 벌점이 붙는다. 순방향은 못 알아들으면 혼나는 훈련, 역방향은 엉뚱한 말을 하면 혼나는 훈련이다. 어느 쪽이든 결과물은 모델 하나이고 그 모델은 듣기도 말하기도 한다. 두 방향이 가르는 것은 모델의 두 가지 능력이 아니라 훈련이 어떤 실수에 벌점을 주느냐다.

SFT KL로 묶은 RL
기대값을 취하는 분포 데이터 pdata\textcolor{#2e7d32}{p_\text{data}} — 남이 만든 답 모델 πθ\textcolor{#1565c0}{\pi_\theta} — 내가 만든 답
줄이는 것 순방향 KL KL(pdata ∣ πθ)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#2e7d32}{p_\text{data}} \,|\, \textcolor{#1565c0}{\pi_\theta}) 역방향 KL KL(πθ ∣ π∗)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,|\, \textcolor{#2e7d32}{\pi^*})
성향 덮기 — 모든 정답 봉우리에 확률을 나눠 둔다 고르기 — 좋은 봉우리에 모인다
모델 자신의 실수 손실에 직접 나타나지 않는다 바로 그 자리에서 벌점을 받는다
말하는 쪽 → 듣는 쪽 데이터 → 모델: 못 알아들으면 벌점 모델 → 목표: 엉뚱한 말을 하면 벌점
부작용 봉우리 사이 "골짜기"까지 퍼져 흐릿한 답 다양성이 줄어든다 — 여러 번 뽑아도 비슷한 답

위젯에서 목표는 봉우리가 둘이고, 모델은 봉우리 하나밖에 만들지 못한다. 봉우리 간격과 비중을 바꿔 가며 두 방식으로 맞춘 모델이 각각 어디에 자리 잡는지, 목표가 거의 0인 골짜기에 확률을 얼마나 두는지 보라. 모델의 표현력이 목표를 다 담지 못할 때 — 현실의 언어모델이 늘 그렇다 — 두 방향의 차이가 드러난다. 봉우리 간격을 2.2, 비중을 반반으로 두면 아래 문제 2와 같아지니, 문제를 푼 뒤 돌아와 수치판과 견주어 보라.

ML에서: 나쁜 예는 역방향 KL을 흉내 낸다

세 걸음을 이 눈으로 다시 보면, 나쁜 예를 넣는 첫 걸음은 "모델이 저지를 법한 실수"를 데이터에 끌어와 역방향 KL이 하던 일을 흉내 내는 것이다. 그리고 그 실수가 지금 모델의 실수인지, 남이 만든 데이터 속 실수인지가 DPO를 쓸 때 늘 따라다니는 쟁점이다. DPO의 식은 역방향 KL 목적함수에서 나왔지만 데이터는 여전히 남이 만든 것이기 때문이다.

문제 1 — 빠뜨리면 감점, 틀리면 감점

퀴즈 한 문항: 「주사위 눈 가운데 짝수를 모두 적으시오.」(정답은 2, 4, 6) 조교가 고를 수 있는 채점 방식이 둘이다. 채점 A는 빠뜨린 정답 하나마다 1점을 깎고, 채점 B는 적어 낸 것 가운데 틀린 것 하나마다 1점을 깎는다. 갑은 「2」 하나만 적었고, 을은 「1, 2, 3, 4, 5, 6」을 모두 적었다. (가) 두 채점 방식에서 갑과 을은 각각 몇 점이 깎이는가? (나) 한 학기 내내 채점 A로만 채점받은 학생들은 답안을 어떻게 쓰게 되겠는가?

선생님 (질문)
선생님
민준 학생, 두 채점표로 매겨 봤죠? 누가 이기던가요?
김민준 (평상)
김민준
채점 A에서는 갑이 4와 6을 빠뜨려서 2점, 을은 다 적었으니 0점이 깎여요. 을은 정답을 다 아는 거니까 채점 B로 매겨도 을이 이기겠죠.
선생님 (질문)
선생님
채점 B가 세는 건 무엇이죠? 을이 적은 여섯 개 가운데 그건 몇 개예요?
김민준 (당황)
김민준
틀린 걸 세죠… 1, 3, 5, 세 개라 3점이 깎여요. 갑은 적은 2가 맞았으니 0점. 순위가 뒤집히네요.
이서연 (평상)
이서연
채점이 무엇을 세느냐에 따라 유리한 답안이 달라지는 거야. A에서는 일단 다 적는 게, B에서는 확실한 것 하나만 적는 게 이득이고.
선생님 (질문)
선생님
채점 A만 받아 온 학생이 틀린 것을 적어서 손해 본 적이 있을까요?
이서연 (생각)
이서연
한 번도 없어요. 그러니 아는 것 모르는 것 다 적어 내는 버릇이 들겠네요. 답안에 틀린 게 섞여도 채점이 한 번도 잡아 주지 않았으니까요.

정리 (가) 채점 A: 갑 2점, 을 0점 깎임 → 을이 이긴다. 채점 B: 갑 0점, 을 3점 깎임 → 갑이 이긴다. 같은 두 답안의 순위가 채점 방식에 따라 뒤집힌다. (나) 빠뜨린 것만 세는 채점 아래서는 무엇이든 다 적어 내는 버릇이 들고, 그 답안에는 틀린 것이 섞인다.

문제 2 — 봉우리 둘, 모델은 하나

목표 분포에 봉우리가 둘 있다(중심 −2.2와 +2.2, 각각 표준편차 0.55인 가우스 봉우리, 비중 반반). 모델은 봉우리가 하나뿐인 가우스 분포다. (가) SFT처럼 순방향 KL로 맞추면 모델의 중심은 어디인가? (나) KL로 묶은 RL처럼 역방향 KL로 맞추면? (다) "수도는?"에 정답이 "서울입니다"와 “서울이에요” 두 가지일 때, 두 방식의 모델은 각각 어떤 답을 내겠는가?

선생님 (질문)
선생님
민준 학생, 두 방향 다 돌려 봤죠? 답이 같던가요?
김민준 (평상)
김민준
가우스를 분포에 맞추는 건 평균이랑 분산 구하면 끝이잖아요. scipy norm.fit 으로 돌렸더니 중심 0, 표준편차 2.27이요. 방향이 달라도 거리는 거리니까 같을 거예요.
선생님 (평상)
선생님
서연 학생, KL은 대칭인가요?
이서연 (평상)
이서연
아니요, 두 방향 값이 달라요. 그래도 중심은 0일 것 같아요. 목표가 좌우 대칭이니까 최적해도 대칭이어야 하잖아요.
선생님 (질문)
선생님
그럼 역방향 KL로 중심을 0에 둬 볼까요. 모델이 확률을 가장 많이 두는 곳은 어디고, 거기서 목표 밀도는 얼마죠?
이서연 (생각)
이서연
0 근처요. 거긴 골짜기라서 목표 밀도가 거의 0이고… 역방향 KL은 모델이 확률을 두는 곳마다 log⁡(πθ/p)\log(\textcolor{#1565c0}{\pi_\theta}/\textcolor{#2e7d32}{p}) 를 더하니까 그 항이 폭발해요.
이서연 (아하)
이서연
대칭인 건 최소점들의 집합이지, 최소점 하나하나가 아니구나. −2.2에 붙은 해와 +2.2에 붙은 해가 서로의 거울상이고, 가운데는 오히려 최악이에요.
선생님 (평상)
선생님
그래요. 해석학 시간에 본 것과 같죠.
이서연 (평상)
이서연
x2=4x^2 = 4 의 해 집합 {−2,2}\{-2, 2\} 는 대칭이지만 0은 해가 아닌 것처럼요.
김민준 (난처함)
김민준
그럼 제 norm.fit 은… 최대우도(데이터가 나올 확률을 가장 크게 맞추기)니까 데이터 쪽 기대값, 순방향 KL만 푼 거네요. 역방향 KL은 모델이 뽑은 샘플로 재야 해서 애초에 그 함수로는 못 구하고요.
선생님 (평상)
선생님
맞아요. 그럼 (다)는요?
김민준 (평상)
김민준
SFT 모델은 두 정답 사이에 퍼지니까, 두 형식이 섞인 답도 꽤 내겠네요. 과제 보고서를 두 양식 중 아무거나 내라 했는데 둘을 반씩 섞어 내면 조교님이 둘 다 아니라고 하는 것처럼요. RL 모델은 한쪽, 예컨대 "서울입니다"만 내고요.
선생님 (흐뭇함)
선생님
정답은 둘 다 맞으니 RL 쪽이 손해 볼 건 없어요. 다만 창작처럼 다양함이 가치인 곳에서는 그 "고르기"가 대가가 되죠.
이서연 (궁금함)
이서연
선생님, 문제에서 모델을 봉우리 하나짜리로 묶었잖아요. 모델이 봉우리를 둘 만들 수 있으면 어떻게 돼요?
선생님 (질문)
선생님
그럼 모델이 목표와 똑같아질 수 있죠. 그때 두 방향의 KL은 각각 얼마예요?
이서연 (평상)
이서연
둘 다 0이에요. KL은 두 분포가 같을 때만 0이니까, 어느 방향으로 재도 최소점은 목표 그 자체예요.
이서연 (아하)
이서연
방향이 답을 가르는 건 모델이 목표를 다 담지 못할 때뿐이구나. 다 담을 수 없으니 무엇을 버릴지를 방향이 정하는 거네요.
김민준 (평상)
김민준
과제랑 같네요. 시간이 넉넉하면 어느 채점표로 매겨도 다 맞힌 답안이 만점인데, 시간이 모자랄 때만 채점표에 따라 전략이 갈리잖아요.

정리 (가) 순방향 KL 최적은 평균·분산 맞추기: 중심 0, 표준편차 약 2.27 — 확률의 약 30%가 두 봉우리 사이 골짜기에 놓인다. (나) 역방향 KL 최적은 봉우리 하나를 고른다: 중심 ±2.2, 표준편차 약 0.55. 대칭인 문제의 해는 집합으로 대칭일 뿐이다. (다) SFT 모델은 두 정답 사이로 퍼지고, RL 모델은 한 정답에 모인다. 위젯에서 확인해 보라. 모델이 봉우리를 둘 만들 수 있다면 두 방향 모두 목표 자체가 최적이다. 방향은 모델이 목표를 다 담지 못할 때 무엇을 버릴지를 정한다.

문제 3 — 세 토큰, 순위가 뒤집힌다

목표 분포가 세 토큰에 p=(0.499, 0.002, 0.499)\textcolor{#2e7d32}{p} = (0.499,\ 0.002,\ 0.499) 를 준다. 양 끝이 정답이고, 가운데는 거의 나오지 않는 말이다. 모델 후보는 둘이다. 한쪽에 몰아 준 qA=(0.98, 0.01, 0.01)\textcolor{#1565c0}{q_A} = (0.98,\ 0.01,\ 0.01) 과 셋에 고르게 나눈 qB=(1/3, 1/3, 1/3)\textcolor{#1565c0}{q_B} = (1/3,\ 1/3,\ 1/3). (가) 순방향 KL KL(p ∥ q)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#2e7d32}{p} \,\|\, \textcolor{#1565c0}{q}) 로 재면 어느 후보가 나은가? (나) 역방향 KL KL(q ∥ p)\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{q} \,\|\, \textcolor{#2e7d32}{p}) 로 재면? (다) 어떤 모델이 데이터에 전혀 없는 이상한 문장을 자주 만든다. 어느 방향으로 학습했을 가능성이 큰가?

목표 p 0.499 0.002 0.499 후보 qA 0.98 0.01 0.01 후보 qB 1/3 1/3 1/3 토큰 1 토큰 2 토큰 3
선생님 (질문)
선생님
민준 학생, 두 방향으로 다 계산해 봤죠? 한 후보가 두 잣대에서 다 이기던가요?
김민준 (평상)
김민준
numpy로 돌렸어요. 순방향은 q_A 1.61, q_B 0.39라서 q_B가 이겨요. q_A는 첫 토큰에 0.98이나 몰아서, 너무 자신만만해서 진 거고요.
선생님 (질문)
선생님
합을 항별로 쪼개 볼까요. 1.61 가운데 어느 항이 제일 크죠?
김민준 (생각)
김민준
첫 항은 0.499·log(0.499/0.98) ≈ −0.34, 오히려 음수네요. 큰 건 셋째 항 0.499·log(0.499/0.01) ≈ 1.95예요.
김민준 (아하)
김민준
자신만만해서 진 게 아니라, 데이터가 절반이나 말하는 셋째 토큰을 0.01로 버려서 진 거네요. 데이터가 한 말을 못 알아들은 벌점이요.
이서연 (평상)
이서연
그럼 역방향도 q_B가 이기겠네. 고른 분포는 어디에도 확률 0을 두지 않으니까 어느 방향으로 재도 안전하잖아.
선생님 (질문)
선생님
서연 학생, 역방향에서는 누가 말하는 쪽이죠? q_B는 가운데 토큰에서 무슨 말을 하고 있나요?
이서연 (난처함)
이서연
모델이 말하는 쪽이에요. q_B는 가운데 토큰을 1/3이나 말하는데, 목표 p는 거기에 0.002밖에 안 줘요. 그 항만 (1/3)·log(166.7) ≈ 1.71이에요.
이서연 (평상)
이서연
합하면 역방향은 q_A 0.64, q_B 1.44. 순위가 뒤집혀요. 확률 0을 안 두는 것만으로는 안전하지 않았어요. 순방향에서 무서운 건 목표가 말하는 곳에 0을 두는 것이고, 역방향에서 무서운 건 목표가 거의 안 하는 말을 크게 하는 거예요.
선생님 (흐뭇함)
선생님
그래요. 위험한 자리가 방향마다 달라요. 그럼 (다)는요?
이서연 (평상)
이서연
데이터에 없는 말을 자주 한다는 건 목표가 0에 가까운 골짜기에 확률을 깔아 뒀다는 뜻이에요. q_B 같은 모델, 곧 순방향으로 학습한 모델이요. 무엇이든 알아들으려고 넓게 깔았더니, 막상 말할 때 아무도 안 쓰는 말이 튀어나오는 거죠.
김민준 (평상)
김민준
아까 조교 채점 문제랑 같네요. 순방향은 "빠진 항목"만 감점하는 채점 A라서 이것저것 다 적어 내는 게 유리하고, 역방향은 "틀린 항목"만 감점하는 채점 B라서 확실한 것 하나만 적는 게 유리했잖아요.
이서연 (평상)
이서연
측도론에서 KL(p‖q)가 유한하려면 p가 q에 대해 절대연속이어야 했던 것과 같아요. 어느 쪽이 어느 쪽을 덮어야 하는지가 방향마다 반대예요.

정리 (가) 순방향: qA\textcolor{#1565c0}{q_A} 1.61, qB\textcolor{#1565c0}{q_B} 0.39 → qB\textcolor{#1565c0}{q_B}. qA\textcolor{#1565c0}{q_A} 의 벌점 대부분(1.95)은 목표가 절반을 주는 셋째 토큰을 0.01로 버린 데서 나온다. (나) 역방향: qA\textcolor{#1565c0}{q_A} 0.64, qB\textcolor{#1565c0}{q_B} 1.44 → qA\textcolor{#1565c0}{q_A}. qB\textcolor{#1565c0}{q_B} 의 벌점 대부분(1.71)은 목표가 0.002만 주는 가운데 토큰에 1/3을 둔 데서 나온다. 같은 두 후보의 순위가 방향에 따라 뒤집힌다. (다) 순방향(SFT식). 데이터가 말하는 곳을 빠짐없이 덮으려다 골짜기에도 확률을 깔아 둔 모델이다.