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

DPO 손실: 레퍼런스 대비 선호 마진을 벌린다

나쁜 예로 나쁜 답에서 멀어지고, KL 목줄로 레퍼런스 근처에 머문다. 이 두 걸음을 손실 하나에 어떻게 담을까? 두 걸음을 합치는 세 번째 걸음이 DPO다.

역사: 2023년의 지름길

DPO는 2023년 스탠퍼드 대학의 라파일로프(Rafael Rafailov), 샤르마(Archit Sharma), 미첼(Eric Mitchell), 에르몬(Stefano Ermon), 매닝(Christopher Manning), 핀(Chelsea Finn)이 발표했다. 논문 첫머리에 적힌 고민은 이렇다. 사람이 쓴 방대한 글로 학습한 언어모델은 사람들의 절반이 믿는 흔한 오해까지 배운다. 모델이 그 오해를 아는 것은 괜찮지만, 그 오해를 묻는 질문의 절반에서 오해가 옳다고 답해서는 안 된다. 모델이 이미 가진 넓은 지식 가운데 바라는 답과 행동을 골라내야 한다는 것이다. 데이터를 그대로 흉내 내는 학습만으로는 이 골라내기가 되지 않는다. 당시 골라내는 방법은 여러 단계를 거쳤고, 논문은 그 절차를 「복잡하고 자주 불안정하다」고 적었다. 연구진은 같은 목표를 분류 문제처럼 간단한 손실 하나로 풀 수 있음을 보였다. 논문은 그해 NeurIPS에 실렸고, 학회가 뽑은 우수 논문 준우승(Outstanding Main Track Runner-Up) 두 편 가운데 하나가 되었다. 이름의 "직접(Direct)"은 보상 모델을 따로 학습하는 단계를 거치지 않는다는 뜻이다. 그 단계가 무엇이었는지는 이 장 끝에서 다시 묻는다.

한 줄 수식
LDPO=−log⁡σ(β (Δθ−Δref))\textcolor{#d62728}{\mathcal{L}_\text{DPO}} = -\log\sigma\big(\textcolor{#827717}{\beta}\,(\textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}})\big)
Δθ=log⁡πθ(yw∣x)−log⁡πθ(yl∣x),Δref=log⁡πref(yw∣x)−log⁡πref(yl∣x)\textcolor{#1565c0}{\Delta_\theta} = \log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_w} \mid \textcolor{#0093b8}{x}) - \log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_l} \mid \textcolor{#0093b8}{x}), \qquad \textcolor{#6f6f78}{\Delta_\text{ref}} = \log\textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_w} \mid \textcolor{#0093b8}{x}) - \log\textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_l} \mid \textcolor{#0093b8}{x})
LDPODPO 손실Δθ학습 모델의 선호 마진(Δ는 델타): 좋은 답과 나쁜 답의 로그확률 차Δref레퍼런스 모델의 같은 마진πθ학습 중인 모델πref레퍼런스 모델: 학습 전 모델 (고정)βKL 강도: 레퍼런스 쪽으로 당기는 목줄x, yw, yl프롬프트, 선호 응답, 비선호 응답 \small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_\text{DPO}} & \text{DPO 손실} \\ \textcolor{#1565c0}{\Delta_\theta} & \text{학습 모델의 선호 마진(}\Delta\text{는 델타): 좋은 답과 나쁜 답의 로그확률 차} \\ \textcolor{#6f6f78}{\Delta_\text{ref}} & \text{레퍼런스 모델의 같은 마진} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 모델} \\ \textcolor{#6f6f78}{\pi_\text{ref}} & \text{레퍼런스 모델: 학습 전 모델 (고정)} \\ \textcolor{#827717}{\beta} & \text{KL 강도: 레퍼런스 쪽으로 당기는 목줄} \\ \textcolor{#0093b8}{x},\ \textcolor{#e000a5}{y_w},\ \textcolor{#e000a5}{y_l} & \text{프롬프트, 선호 응답, 비선호 응답} \end{array}

yw\textcolor{#e000a5}{y_w}는 선호 응답(winner), yl\textcolor{#e000a5}{y_l}은 비선호 응답(loser)이다. 한국어로 읽으면:

  1. Δθ\textcolor{#1565c0}{\Delta_\theta} — 지금 모델이 좋은 답과 나쁜 답 사이에 두는 차이. 선호 마진이라 부르자.
  2. Δref\textcolor{#6f6f78}{\Delta_\text{ref}} — 레퍼런스 모델이 두던 선호 마진.
  3. z=Δθ−Δref\textcolor{#d9670b}{z} = \textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}} — 레퍼런스보다 마진을 얼마나 더 벌렸는가. 이 값을 z\textcolor{#d9670b}{z} 라 부르자.
  4. 이 값을 시그모이드 σ\sigma(시그마)에 넣고 −log⁡-\log를 취한다. 더 벌렸으면 손실이 작고, 오히려 좁혔으면 손실이 크다.
  5. β\textcolor{#827717}{\beta}는 KL 강도, 곧 레퍼런스 쪽으로 당기는 목줄이다. β\textcolor{#827717}{\beta} 를 키우면 목줄이 길어질까, 짧아질까? 괄호 앞에 곱해진 β\textcolor{#827717}{\beta} 가 모델을 얼마나 멀리 보내는지는 아래 문제 6에서 계산해 본다.
레퍼런스 대비
선호 마진을 벌린다

로그확률의 눈금 위에 올려 보면 이 구호가 그림이 된다. 레퍼런스가 "서울"과 "부산"에 0.5와 0.25를, 학습 모델이 0.6과 0.1을 주는 쌍이다. 두 점 사이의 간격이 각 모델의 선호 마진이고, 학습 모델의 간격 가운데 레퍼런스의 간격을 넘어선 부분이 z\textcolor{#d9670b}{z} 다.

레퍼런스 πref 학습 모델 πθ 서울 0.5 부산 0.25 서울 0.6 부산 0.1 Δref ≈ 0.69 Δθ ≈ 1.79 Δref 만큼 z ≈ 1.10 세로: 확률의 로그 눈금 (위로 갈수록 확률이 크다)
가장 짧은 예제

학습을 막 시작한 순간을 보자. 모델은 아직 레퍼런스와 똑같다(πθ=πref\textcolor{#1565c0}{\pi_\theta} = \textcolor{#6f6f78}{\pi_\text{ref}}). 그러면 Δθ=Δref\textcolor{#1565c0}{\Delta_\theta} = \textcolor{#6f6f78}{\Delta_\text{ref}}이고, 괄호 안은 0이다.

L=−log⁡σ(0)=−log⁡0.5≈0.693\textcolor{#d62728}{\mathcal{L}} = -\log\sigma(0) = -\log 0.5 \approx 0.693
L학습 시작 순간의 DPO 손실 (두 모델이 같아 σ 안이 0)\small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}} & \text{학습 시작 순간의 DPO 손실 (두 모델이 같아 }\sigma\text{ 안이 0)} \end{array}

손실이 0이 아니다. 레퍼런스와 똑같이 구분하는 것은 "잘하는 것"이 아니라 "출발선"이다. 레퍼런스가 이미 90 대 10으로 구분하던 쌍이라면, 지금 모델도 90 대 10이면 아직 한 일이 없다.

그렇다면 흔히 하는 요약 — “좋은 답의 확률은 올리고 나쁜 답은 내린다” — 은 이 손실을 제대로 말하는가? 좋은 답과 나쁜 답의 확률이 함께 움직이면 손실은 어느 쪽으로 갈까? 아래 문제들에서 따져 보자.

문제 4 — 떡볶이가 끼어든 급식 투표

작년 급식 메뉴 투표에서 짜장면이 60표, 짬뽕이 20표를 받았다. 올해는 떡볶이가 새 후보로 들어와 표가 나뉘었고, 짜장면 30표, 짬뽕 10표, 떡볶이 40표가 나왔다. (가) 올해 학생들은 짬뽕에 견주어 짜장면을 덜 좋아하게 되었는가? (나) 올해 짬뽕이 10표가 아니라 5표였다면?

김민준 (자신만만)
김민준
짜장면이 60표에서 30표로 반토막 났으니 인기가 떨어졌죠.
선생님 (질문)
선생님
민준 학생, 물은 건 짬뽕에 견주어서예요. 짬뽕은 어떻게 됐죠?
김민준 (생각)
김민준
짬뽕도 20표에서 10표로 반이에요. 작년에도 올해도 짜장면이 짬뽕의 세 배네요. 떡볶이가 둘에게서 똑같은 비율로 표를 가져갔을 뿐이고요.
이서연 (평상)
이서연
(나)면 짜장면이 짬뽕의 여섯 배야. 짜장면 표는 줄었는데 짬뽕보다는 오히려 더 앞선 거지.
선생님 (평상)
선생님
그래요. "몇 표가 줄었나"와 "상대의 몇 배인가"는 서로 다른 물음이에요.

정리 (가) 아니다. 작년 60 : 20도, 올해 30 : 10도 3배다. 떡볶이가 두 메뉴의 표를 같은 비율로 가져갔다. (나) 30 : 5는 6배라서 짜장면이 짬뽕보다 더 앞선다. 짜장면 표 자체는 줄었어도 그렇다.

문제 5 — 둘 다 반으로 떨어지면

레퍼런스 모델이 "서울"과 "부산"에 0.6, 0.2의 확률을 준다. 학습 도중의 지금 모델은 “서울” 0.3, “부산” 0.1을 준다(나머지 확률은 다른 답들로 옮겨 갔다). 좋은 답 "서울"의 확률이 반으로 줄었다. (가) 이 쌍의 DPO 손실은 학습을 시작할 때보다 커졌는가? 값을 구하시오. (나) 이 손실만으로 학습하면 "서울"의 확률이 줄어드는 것을 막을 수 있는가?

김민준 (자신만만)
김민준
정답 확률이 0.6에서 0.3으로 반토막 났으니 손실이 커졌겠죠. 학습이 뒤로 간 거잖아요.
선생님 (질문)
선생님
민준 학생, 손실 식에 들어가는 건 "서울"의 확률 하나인가요?
김민준 (평상)
김민준
아니요, Δθ−Δref\textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}} 요. Δθ=log⁡(0.3/0.1)=log⁡3\textcolor{#1565c0}{\Delta_\theta} = \log(0.3/0.1) = \log 3 이고 Δref=log⁡(0.6/0.2)=log⁡3\textcolor{#6f6f78}{\Delta_\text{ref}} = \log(0.6/0.2) = \log 3…
김민준 (당황)
김민준
똑같네요. 괄호 안이 0이라 손실은 −log⁡σ(0)≈0.693-\log\sigma(0) \approx 0.693, 학습을 시작할 때와 같아요.
이서연 (평상)
이서연
둘 다 반이 되면 비율은 3 대 1 그대로니까. 로그확률의 차이는 두 확률의 비율만 보고, 둘이 함께 얼마나 올라가고 내려갔는지는 못 봐.
선생님 (질문)
선생님
그럼 (나)는요? 이 손실이 "서울"의 확률 자체를 지켜 주나요?
이서연 (생각)
이서연
못 지켜요. 서울과 부산이 같은 비율로 계속 떨어져도 손실은 그대로예요. 0.03과 0.01로 떨어져도 같아요. 선호 쌍 바깥의 다른 답으로 확률이 새어 나가도 이 손실은 모르는 거예요.
김민준 (평상)
김민준
아까 급식 투표 문제랑 같네요. 짜장면 표가 반으로 줄어도 짬뽕보다 세 배 인기인 건 그대로였잖아요.

정리 (가) Δθ=log⁡(0.3/0.1)=log⁡3=Δref\textcolor{#1565c0}{\Delta_\theta} = \log(0.3/0.1) = \log 3 = \textcolor{#6f6f78}{\Delta_\text{ref}} 이므로 z=0\textcolor{#d9670b}{z} = 0, 손실은 −log⁡σ(0)=log⁡2≈0.693-\log\sigma(0) = \log 2 \approx 0.693 으로 학습을 시작할 때와 같다. (나) 막지 못한다. DPO 손실은 좋은 답과 나쁜 답의 확률의 비율만 보므로, 둘이 같은 비율로 줄어 확률이 선호 쌍 바깥으로 새어 나가도 손실은 변하지 않는다.

문제 6 — β가 크면 목줄은

레퍼런스보다 마진을 z=Δθ−Δref\textcolor{#d9670b}{z} = \textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}} 만큼 더 벌렸다. (가) z=2\textcolor{#d9670b}{z} = 2 일 때 β=0.1\textcolor{#827717}{\beta} = 0.1 과 β=1\textcolor{#827717}{\beta} = 1 에서 손실은 각각 얼마인가? (나) 손실을 0.2까지 낮추려면 두 β\textcolor{#827717}{\beta} 에서 z\textcolor{#d9670b}{z} 가 각각 얼마여야 하는가? (다) β\textcolor{#827717}{\beta} 를 크게 하면 학습된 모델은 레퍼런스 근처에 머무는가, 멀리 가는가?

선생님 (질문)
선생님
서연 학생, (가)부터 볼까요. 같은 z=2\textcolor{#d9670b}{z} = 2 인데 손실이 같던가요?
이서연 (평상)
이서연
β=0.1\textcolor{#827717}{\beta} = 0.1 이면 σ 안이 0.2라서 −log⁡σ(0.2)≈0.598-\log\sigma(0.2) \approx 0.598, β=1\textcolor{#827717}{\beta} = 1 이면 −log⁡σ(2)≈0.127-\log\sigma(2) \approx 0.127 이에요. β가 괄호 앞에 곱해지니까, 마진을 조금만 벌려도 σ 안의 값이 커져서 손실이 금방 0에 가까워져요. 그러니까… 조금만 움직여도 만족하니까 레퍼런스 근처에 머물 거예요.
김민준 (평상)
김민준
난 반대로 생각했어. β가 크면 그래디언트도 β배로 커지니까 더 많이 움직이지 않을까?
선생님 (질문)
선생님
둘 다 식의 한 부분씩을 보고 있어요. 민준 학생, (나)를 계산해 보죠. 손실을 0.2까지 낮추려면 z\textcolor{#d9670b}{z} 가 얼마나 필요해요?
김민준 (생각)
김민준
−log⁡σ(βz)=0.2-\log\sigma(\textcolor{#827717}{\beta}\textcolor{#d9670b}{z}) = 0.2 면 σ(βz)=e−0.2≈0.819\sigma(\textcolor{#827717}{\beta}\textcolor{#d9670b}{z}) = e^{-0.2} \approx 0.819 라서 βz≈1.51\textcolor{#827717}{\beta}\textcolor{#d9670b}{z} \approx 1.51 이에요. β=1\textcolor{#827717}{\beta} = 1 이면 z≈1.5\textcolor{#d9670b}{z} \approx 1.5, β=0.1\textcolor{#827717}{\beta} = 0.1 이면 z≈15\textcolor{#d9670b}{z} \approx 15…
김민준 (아하)
김민준
큰 β는 1.5만 벌리면 끝나요. 거기서부터는 σ가 1에 붙어서 −log σ의 기울기도 0으로 사라지니까, 처음 몇 걸음만 크고 금방 멈춰요. 작은 β는 15까지, 확률의 비율로 치면 레퍼런스보다 약 350만 배를 더 벌려야 하고요.
선생님 (평상)
선생님
그래요. 그래서 큰 β는 "짧은 목줄"이에요. 레퍼런스 근처의 작은 차이로도 손실이 채워지니까요. 작은 β는 그 반대고요. KL로 묶은 RL의 최적 정책 π* ∝ π_ref·exp(R/β) 에서도 보여요. β가 크면 지수가 0에 가까워져 π*가 π_ref 에 붙거든요.
김민준 (평상)
김민준
리포트 분량 제한 같네요. 제한이 빡빡하면 금방 다 채우고 더 쓸 게 없는.

정리 (가) β=0.1\textcolor{#827717}{\beta} = 0.1: −log⁡σ(0.2)≈0.598-\log\sigma(0.2) \approx 0.598, β=1\textcolor{#827717}{\beta} = 1: −log⁡σ(2)≈0.127-\log\sigma(2) \approx 0.127. (나) βz≈1.51\textcolor{#827717}{\beta}\textcolor{#d9670b}{z} \approx 1.51 이어야 하므로 β=1\textcolor{#827717}{\beta} = 1 이면 z≈1.5\textcolor{#d9670b}{z} \approx 1.5, β=0.1\textcolor{#827717}{\beta} = 0.1 이면 z≈15.1\textcolor{#d9670b}{z} \approx 15.1. (다) 큰 β\textcolor{#827717}{\beta} → 작은 마진 변화로도 손실이 포화 → 레퍼런스 근처에 머문다(짧은 목줄). 작은 β\textcolor{#827717}{\beta} → 멀리 가야 손실이 줄어든다(긴 목줄).

문제 7 — (킬러) 확률은 올랐는데

지금 모델이 “서울” 0.8, “부산” 0.1을 준다. 레퍼런스는 “서울” 0.5, “부산” 0.01이었다. 좋은 답의 확률은 0.5에서 0.8로 올랐고 나쁜 답도 겨우 0.09 올랐다. 이 쌍의 손실은 0.693보다 작은가, 큰가?

김민준 (자신만만)
김민준
앞에서 배웠죠, 손실은 비율만 봐요. 지금 모델은 서울이 부산의 0.8/0.1 = 8배예요. 8배나 앞서니까 잘 구분하는 거고, 손실은 0.693보다 작아요.
선생님 (질문)
선생님
민준 학생, 손실 식에서 그 8배는 무엇과 견주어지죠?
김민준 (생각)
김민준
Δ_θ − Δ_ref 니까… 레퍼런스의 비율과요. 레퍼런스는 0.5/0.01 = 50배였네요.
이서연 (평상)
이서연
50배이던 격차를 8배로 줄인 거네. 확률의 "차이"로 보면 서울은 0.3이나 오르고 부산은 0.09만 올라 개선처럼 보이지만, 비율로 보면 서울은 0.5 → 0.8로 1.6배, 부산은 0.01 → 0.1로 10배 올랐어.
김민준 (놀람)
김민준
부산이 열 배? 0.09밖에 안 올랐는데?
이서연 (평상)
이서연
원래가 0.01이었으니까. Δ_ref = log(0.5/0.01) = log 50 ≈ 3.91. Δ_θ = log(0.8/0.1) = log 8 ≈ 2.08. 뺄셈하면 −1.83이야.
선생님 (질문)
선생님
그럼 손실은요?
이서연 (평상)
이서연
σ 안이 음수니까 0.5보다 작고, 손실은 0.693보다 커요. 개선이 아니라 후퇴예요.
이서연 (평상)
이서연
그런데 선생님, 반대로 레퍼런스가 부산에 0.0001을 줬다면 0.001로만 올라도 10배잖아요. 그렇게 작은 확률 변화에 이렇게 민감한 게 맞나요?
선생님 (미소)
선생님
좋은 질문이에요. 그 민감함이 DPO의 힘이자 약점이에요. 로그 눈금에서는 작은 확률일수록 조금만 움직여도 크게 변하니까, 거의 안 나오던 답 하나가 손실을 좌우할 수 있어요.
김민준 (평상)
김민준
학점 평균 같네요. 원래 C 받던 과목이 B로 오르는 거랑, A 받던 과목이 A+로 오르는 거랑 체감이 다른.

정리 Δref=log⁡(0.5/0.01)≈3.91\textcolor{#6f6f78}{\Delta_\text{ref}} = \log(0.5/0.01) \approx 3.91, Δθ=log⁡(0.8/0.1)≈2.08\textcolor{#1565c0}{\Delta_\theta} = \log(0.8/0.1) \approx 2.08, 레퍼런스보다 더 벌린 마진 z=Δθ−Δref≈−1.83\textcolor{#d9670b}{z} = \textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}} \approx -1.83. 손실은 0.693보다 크다. 로그는 차이가 아니라 비율을 본다 — 부산은 10배, 서울은 1.6배 올랐다.