6. DPO의 재등장 — 보상 모델을 수식으로 지우다

DPO의 그래디언트: 틀린 만큼 세게 민다

DPO에는 응답 샘플링도, 로그 미분 트릭(∇π=π ∇log⁡π\nabla\pi = \pi\,\nabla\log\pi 로 바꿔 쓰는 요령)도 보이지 않는다. 정책 그래디언트에서 각 응답의 ∇log⁡πθ\nabla\log\textcolor{#1565c0}{\pi_\theta} 앞에 보상을 곱하던 자리(이 책이 빈칸 Φ\textcolor{#8e44ad}{\Phi} 라 부르는 자리)는 어디로 갔을까?

손실을 미분하면

DPO 손실을 미분해 보자. z=Δθ−Δref\textcolor{#d9670b}{z} = \textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}}라 두면 ddz[−log⁡σ(βz)]=−β σ(−βz)\frac{d}{d\textcolor{#d9670b}{z}}[-\log\sigma(\textcolor{#827717}{\beta} \textcolor{#d9670b}{z})] = -\textcolor{#827717}{\beta}\,\textcolor{#8e44ad}{\sigma(-\beta z)} 이므로

∇θLDPO=−β σ(−βz)⏟가중치 [∇θlog⁡πθ(yw)−∇θlog⁡πθ(yl)]\nabla_\theta \textcolor{#d62728}{\mathcal{L}_\text{DPO}} = -\textcolor{#827717}{\beta}\,\underbrace{\textcolor{#8e44ad}{\sigma(-\beta z)}}_{\text{가중치}}\,\Big[\nabla_\theta\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_w}) - \nabla_\theta\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_l})\Big]
σ(−βz)쌍마다 달라지는 가중치(곱하는 수, 신경망 파라미터가 아니다) — 정책 그래디언트의 빈칸 Φ 자리zΔθ−Δrefπθ학습 중인 정책βKL 강도 \small\begin{array}{ll} \textcolor{#8e44ad}{\sigma(-\beta z)} & \text{쌍마다 달라지는 가중치(곱하는 수, 신경망 파라미터가 아니다) — 정책 그래디언트의 빈칸 }\textcolor{#8e44ad}{\Phi}\text{ 자리} \\ \textcolor{#d9670b}{z} & \textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 정책} \\ \textcolor{#827717}{\beta} & \text{KL 강도} \end{array}

정책 그래디언트 Φ⋅∇log⁡πθ(y)\textcolor{#8e44ad}{\Phi} \cdot \nabla\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y})와 나란히 놓으면 대응이 선명하다.

정책 그래디언트 DPO
미분하는 것 ∇log⁡πθ(y)\nabla\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y}), 한 응답 ∇log⁡πθ(yw)−∇log⁡πθ(yl)\nabla\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_w}) - \nabla\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_l}), 두 응답의 차
앞에 곱해지는 가중치 Φ\textcolor{#8e44ad}{\Phi} 외부 보상에서 온 R\textcolor{#d9670b}{R} 또는 A^\textcolor{#8e44ad}{\hat A} β σ(−βz)\textcolor{#827717}{\beta}\,\textcolor{#8e44ad}{\sigma(-\beta z)} — 암묵적 보상이 틀린 정도
샘플 출처 πθ\textcolor{#1565c0}{\pi_\theta} 자신 (필수) 고정 데이터셋
분산 줄이는 장치 베이스라인, 비평가 쌍의 차이 자체가 베이스라인 역할

로그 미분 트릭이 필요했던 까닭은 기대값을 내는 분포가 학습 중인 정책 자신이라서였다. 정책을 바꾸면 어떤 응답이 뽑히는지부터 바뀌므로, 그 변화를 ∇log⁡πθ\nabla\log\textcolor{#1565c0}{\pi_\theta} 로 바꿔 샘플 평균으로 쓸 요령이 필요했다. DPO의 기대값은 이미 모아 둔 선호 쌍에 대한 평균이라 그 분포가 θ\theta 에 달려 있지 않다. 그래서 요령 없이 손실을 곧바로 미분하면 된다. 그런데 나온 모양은 같다. ∇log⁡πθ\nabla\log\textcolor{#1565c0}{\pi_\theta} 앞에 곱하는 수가 있고, 외부 보상이 앉던 그 자리를 가중치 σ(−βz)\textcolor{#8e44ad}{\sigma(-\beta z)} 가 차지했다. 암묵적 보상이 이미 yw\textcolor{#e000a5}{y_w}를 충분히 높게 보고 있으면(z\textcolor{#d9670b}{z}가 크면) 가중치가 0으로 줄고, 순서를 틀리게 보고 있으면 1에 가까워진다. 쌍으로 비교하기 때문에 yw\textcolor{#e000a5}{y_w}와 yl\textcolor{#e000a5}{y_l}에 공통으로 들어 있는 부분 — 예를 들어 둘 다 같은 문장으로 시작한다면 그 토큰들의 그래디언트 — 은 서로 상쇄된다. 정책 그래디언트에서 베이스라인이 하던 일을 쌍 구조가 대신 한다.

쌍마다 곱하는 가중치 σ(−βz) (β = 0.5) z = 0 → 0.5 1 0 −6 −3 0 3 6 레퍼런스 대비 마진 z ← 순서를 틀리게 봄: 세게 민다 이미 맞힘: 거의 안 민다 →
장난감 예제: 왜 "절대 확률"이 아니라 "상대 마진"인가

"대한민국의 수도는?"에 대해 yw\textcolor{#e000a5}{y_w} = 서울, yl\textcolor{#e000a5}{y_l} = 부산. 세 가지 상황을 보자. (β=0.5\textcolor{#827717}{\beta} = 0.5)

상황 πref\textcolor{#6f6f78}{\pi_\text{ref}} (서울, 부산) πθ\textcolor{#1565c0}{\pi_\theta} (서울, 부산) Δref\textcolor{#6f6f78}{\Delta_\text{ref}} Δθ\textcolor{#1565c0}{\Delta_\theta} z\textcolor{#d9670b}{z} 손실 가중치 σ(−βz)\textcolor{#8e44ad}{\sigma(-\beta z)}
A: 레퍼런스도 잘 구분 0.90, 0.10 0.95, 0.05 2.20 2.94 +0.75 0.52 0.41
B: 둘 다 구분 못함 0.50, 0.50 0.50, 0.50 0 0 0 0.693 0.50
C: 확률은 올랐지만 0.70, 0.01 0.80, 0.05 4.25 2.77 −1.48 1.13 0.68
레퍼런스 마진 vs 학습 모델 마진 0 1.5 3 4.5 마진 Δ 2.20 2.94 상황 A z = +0.75 둘 다 0 상황 B z = 0, 손실 0.693 4.25 2.77 상황 C z = −1.48 Δ_ref (레퍼런스) Δ_θ (학습 모델)

손실 곡선 위에서 직접 움직여 보자. 위의 세 상황이 단추로 들어 있고, β\textcolor{#827717}{\beta} 도 슬라이더로 바꿀 수 있다.

문제 4 — β\beta를 바꾸면 누가 세게 밀리나

위 표에서 β=0.5\textcolor{#827717}{\beta} = 0.5 일 때 가중치 σ(−βz)\textcolor{#8e44ad}{\sigma(-\beta z)} 는 상황 C가 가장 컸다. (가) β\textcolor{#827717}{\beta}를 0.1로 낮추면 세 쌍의 가중치 차이는 어떻게 변하는가? (나) β\textcolor{#827717}{\beta}를 2로 올리면? 위젯에서 상황 단추를 누른 뒤 β\textcolor{#827717}{\beta} 슬라이더를 옮겨 풀이와 견주어 보라.

김민준 (평상)
김민준
가중치는 σ(−βz). 표대로 β=0.5에서 A 0.41, B 0.50, C 0.68. 틀린 걸 제일 세게 고치는 거죠.
선생님 (평상)
선생님
β를 0.1로 낮추면요?
김민준 (자신만만)
김민준
β가 작으면 목줄이 길어지니까 더 과감해지잖아요. 틀린 C를 훨씬 더 세게 고치고, 셋의 차이도 더 벌어질 거예요.
선생님 (평상)
선생님
돌려볼까요?
김민준 (놀람)
김민준
A 0.48, B 0.50, C 0.54… 오히려 셋이 거의 같아졌어요.
이서연 (평상)
이서연
z에 β가 곱해져서 시그모이드 안의 값이 전부 0 근처로 모이니까 그렇네. 시그모이드는 0 근처에서 거의 직선이고 기울기가 1/4이니까, σ(−βz) ≈ 1/2 − βz/4 가 돼.
선생님 (미소)
선생님
그렇다면 β가 작을 때 DPO는 "틀린 정도"에 따라 쌍을 구분해서 대하나요?
이서연 (평상)
이서연
거의 안 해요. 모든 쌍을 비슷하게 밀어요. 대신 전체 그래디언트 앞에 β가 곱해지니까 걸음은 작아지고요.
김민준 (당황)
김민준
"과감하다"는 건 최종적으로 얼마나 멀리 갈 수 있느냐였지, 쌍별로 얼마나 차별해서 미느냐가 아니었네요.
선생님 (질문)
선생님
그럼 반대로 β를 2로 올리면요?
김민준 (평상)
김민준
A 0.18, B 0.50, C 0.95. 이번엔 차이가 확 벌어져요. 이미 맞힌 쌍은 거의 안 밀고, 틀린 쌍만 밀어요.
이서연 (평상)
이서연
βz가 커져서 시그모이드의 평평한 두 끝으로 밀려난 거네. 맞힌 쪽은 0에, 틀린 쪽은 1에 붙고.
김민준 (평상)
김민준
β가 작을 때는 채점 기준표가 느슨한 조교 같아요. 점수 차이를 거의 안 두니까 잘한 보고서나 못한 보고서나 비슷한 코멘트를 받는.

정리 (가) β=0.1\textcolor{#827717}{\beta} = 0.1이면 A 0.48, B 0.50, C 0.54로 차이가 거의 사라진다(σ\sigma가 원점 근처에서 선형, σ(−βz)≈1/2−βz/4\textcolor{#8e44ad}{\sigma(-\beta z)} \approx 1/2 - \textcolor{#827717}{\beta}\textcolor{#d9670b}{z}/4). 작은 β\textcolor{#827717}{\beta} 는 모든 쌍을 비슷하게 민다. (나) β=2\textcolor{#827717}{\beta} = 2 이면 0.18, 0.50, 0.95로 차이가 벌어진다. 큰 β\textcolor{#827717}{\beta} 는 틀린 쌍을 골라 민다.