13. DPO의 진화 — 하나의 알고리즘이 낳은 가계도

생성과 맞춘 보상: SimPO의 평균 로그확률

DPO가 "좋다"고 배운 응답은 실제로 생성할 때 더 잘 나올까? DPO가 올리는 값과 모델이 생성할 때 쓰는 값이 같다면 그렇겠지만, 두 값은 같지 않다. 마지막 약점은 이 어긋남이다.

약점 5: 학습 목표와 생성 목표가 다르다

DPO가 키우는 것은 응답의 레퍼런스 대비 로그비율의 합 βlog⁡πθ(y)πref(y)\beta\log\frac{\pi_\theta(y)}{\pi_\text{ref}(y)} 이다. 그런데 모델이 답을 만들 때는 레퍼런스를 보지 않는다. 자기 로그확률 log⁡πθ(y)\log\pi_\theta(y) 가 높은 쪽, 여러 후보 가운데 하나를 고를 때는 흔히 길이로 나눈 평균 로그확률이 높은 쪽이 나온다. 두 잣대가 어긋나는 경우를 숫자로 보자(β=0.1\beta = 0.1).

응답 토큰 수 레퍼런스 로그확률 합 정책 로그확률 합 DPO의 보상 βlog⁡πθπref\beta\log\frac{\pi_\theta}{\pi_\text{ref}} 정책의 평균 로그확률
선호 ywy_w 20 −30 −28 +0.2 −1.4
비선호 yly_l 10 −11 −12 −0.1 −1.2

DPO의 잣대로는 ywy_w 가 이기고 있다. 레퍼런스보다 올랐고 yly_l 은 내려갔다. 하지만 정책이 지금 주는 확률로는 합으로도(−28 대 −12), 평균으로도(−1.4 대 −1.2) yly_l 이 앞선다. 학습에서 "좋다"고 판단한 응답이 실제 생성에서는 나오지 않을 수 있다. DPO가 매기는 암묵적 보상이 생성할 때의 지표와 따로 노는 것이다.

SimPO 팀이 본 증상

2024년 버지니아 대학과 프린스턴 대학의 멍(Yu Meng), 샤(Mengzhou Xia), 천(Danqi Chen)은 이 어긋남을 실제로 재 보았다. DPO로 학습한 모델에서 훈련 데이터의 (프롬프트, 선호 응답, 비선호 응답) 묶음 가운데, DPO의 보상 순위와 평균 로그확률의 순위가 일치하는 것은 약 50%뿐이었다. 동전 던지기와 다름없다. 그들의 SimPO(NeurIPS 2024)는 보상을 생성할 때 쓰는 그 양, 토큰당 평균 로그확률로 바꿨다.

rSimPO(x,y)=β∣y∣∑t=1∣y∣log⁡πθ(yt∣x,y<t),LSimPO=−log⁡σ(rSimPO(x,yw)−rSimPO(x,yl)−γ)\textcolor{#d9670b}{r_\text{SimPO}}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y}) = \frac{\textcolor{#536020}{\beta}}{\textcolor{#915a08}{|y|}} \sum_{t=1}^{\textcolor{#915a08}{|y|}} \log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y_t} \mid \textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y_{<t}}), \qquad \textcolor{#d62728}{\mathcal{L}_\text{SimPO}} = -\log\sigma\big(\textcolor{#d9670b}{r_\text{SimPO}}(\textcolor{#0093b8}{x}, \textcolor{#e000a5}{y_w}) - \textcolor{#d9670b}{r_\text{SimPO}}(\textcolor{#0093b8}{x}, \textcolor{#e000a5}{y_l}) - \textcolor{#206049}{\gamma}\big)
rSimPOSimPO의 보상: 토큰당 평균 로그확률에 크기 계수를 곱한 값LSimPOSimPO 손실β크기 계수: 보상 차이를 몇 배로 키울지 (레퍼런스가 없으므로 KL 강도가 아니다)∣y∣응답의 토큰 수γ목표 마진: 보상 차가 최소한 이만큼은 벌어지게πθ학습 중인 정책 (레퍼런스 없음)x, y, yt프롬프트, 응답, 응답의 t 번째 토큰yw, yl선호 응답, 비선호 응답 \small\begin{array}{ll} \textcolor{#d9670b}{r_\text{SimPO}} & \text{SimPO의 보상: 토큰당 평균 로그확률에 크기 계수를 곱한 값} \\ \textcolor{#d62728}{\mathcal{L}_\text{SimPO}} & \text{SimPO 손실} \\ \textcolor{#536020}{\beta} & \text{크기 계수: 보상 차이를 몇 배로 키울지 (레퍼런스가 없으므로 KL 강도가 아니다)} \\ \textcolor{#915a08}{|y|} & \text{응답의 토큰 수} \\ \textcolor{#206049}{\gamma} & \text{목표 마진: 보상 차가 최소한 이만큼은 벌어지게} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 정책 (레퍼런스 없음)} \\ \textcolor{#0093b8}{x},\ \textcolor{#1c9c60}{y},\ \textcolor{#1c9c60}{y_t} & \text{프롬프트, 응답, 응답의 } t \text{ 번째 토큰} \\ \textcolor{#e000a5}{y_w},\ \textcolor{#e000a5}{y_l} & \text{선호 응답, 비선호 응답} \end{array}

이 한 번의 바꿈으로 세 가지가 함께 풀린다. 첫째, 학습이 키우는 값이 생성할 때의 지표와 같아진다. 둘째, 토큰 수 ∣y∣\textcolor{#915a08}{|y|} 로 나누므로 긴 응답이 길다는 이유만으로 로그확률 합에서 지는 길이 편향이 사라진다. 셋째, 식에 레퍼런스가 없으니 약점 4의 메모리 부담도 함께 사라진다. 레퍼런스가 하던 "어디까지 벌리면 충분한가"는 목표 마진 γ\textcolor{#206049}{\gamma} 가 일부 대신한다. "최소 이만큼은 벌려라"는 하한이다.

결과도 컸다. 저자들은 AlpacaEval 2(지시문 805개에 대한 답을 GPT-4 Turbo의 답과 견주어 GPT-4 Turbo가 이긴 쪽을 고르는 평가. 길이 보정 승률은 응답 길이의 영향을 걸러 낸 승률이다)에서 DPO보다 최대 6.4점, Arena-Hard(Chatbot Arena에 올라온 질문 가운데 어려운 500개를 골라 같은 방식으로 견주는 평가)에서 최대 7.5점 높았다고 보고했다. 구글의 공개 모델 Gemma 2(파라미터 90억 개)를 지시를 따르게 다듬은 Gemma-2-9B-it에 SimPO를 건 모델은, 익명의 두 모델이 낸 답을 사용자가 보고 투표해 순위를 매기는 Chatbot Arena에서 36위에서 25위로 올라 파라미터 100억 개 미만 모델 가운데 1위에 올랐다(논문 발표 시점).

문제 8 — 레퍼런스보다 올랐는데 아직 진다

한 쌍에서 선호 응답 yw\textcolor{#e000a5}{y_w} 는 8토큰, 비선호 응답 yl\textcolor{#e000a5}{y_l} 은 4토큰이다. 학습 중인 정책의 로그확률 합은 yw\textcolor{#e000a5}{y_w} 가 −8, yl\textcolor{#e000a5}{y_l} 이 −3.2이고, 레퍼런스의 합은 yw\textcolor{#e000a5}{y_w} 가 −10, yl\textcolor{#e000a5}{y_l} 이 −3이다. (가) DPO의 레퍼런스 대비 마진 zz 와 손실을 구하시오(KL 강도 0.1). (나) 모델이 평균 로그확률로 응답을 고른다면 어느 응답이 앞서는가? (다) SimPO(β=2\textcolor{#536020}{\beta} = 2, γ=0.5\textcolor{#206049}{\gamma} = 0.5)의 손실은 얼마이고, 이 쌍에서 무엇을 하라고 미는가?

김민준 (자신만만)
김민준
z=(−8+3.2)−(−10+3)=−4.8+7=2.2z = (-8 + 3.2) - (-10 + 3) = -4.8 + 7 = 2.2. 레퍼런스보다 2.2나 더 벌렸으니 모델은 yw\textcolor{#e000a5}{y_w} 를 더 잘 만들게 된 거죠. 손실도 −log⁡σ(0.22)≈0.589-\log\sigma(0.22) \approx 0.589 로 출발점 0.693보다 낮고요.
선생님 (질문)
선생님
민준 학생, 모델이 답을 만들 때 레퍼런스를 보나요?
김민준 (당황)
김민준
아뇨, 자기 확률만 보죠. 평균 로그확률은 yw\textcolor{#e000a5}{y_w} 가 −8/8=−1.0-8/8 = -1.0, yl\textcolor{#e000a5}{y_l} 이 −3.2/4=−0.8-3.2/4 = -0.8. yl\textcolor{#e000a5}{y_l} 이 앞서요.
이서연 (평상)
이서연
DPO가 본 건 "레퍼런스보다 얼마나 나아졌나"고, 생성이 보는 건 "지금 확률이 얼마인가"네. yw\textcolor{#e000a5}{y_w} 는 레퍼런스에서 많이 올랐지만 아직 yl\textcolor{#e000a5}{y_l} 보다 낮은 거야.
선생님 (평상)
선생님
그래요. 그럼 SimPO는 이 쌍을 어떻게 볼까요?
이서연 (평상)
이서연
마진이 2×(−1.0−(−0.8))−0.5=−0.92 \times (-1.0 - (-0.8)) - 0.5 = -0.9 라서 손실은 −log⁡σ(−0.9)≈1.241-\log\sigma(-0.9) \approx 1.241. 아직 지고 있으니 yw\textcolor{#e000a5}{y_w} 의 평균 로그확률을 yl\textcolor{#e000a5}{y_l} 보다 올리라고 세게 밀어요.
이서연 (깨달음)
이서연
해석학에서 수열이 증가한다는 것과 어떤 값보다 크다는 게 다른 말인 거랑 같네요. 올랐다고 앞선 건 아니에요.

정리 (가) z=2.2z = 2.2, DPO 손실 약 0.589. (나) 평균 로그확률은 yw\textcolor{#e000a5}{y_w} −1.0, yl\textcolor{#e000a5}{y_l} −0.8 로 yl\textcolor{#e000a5}{y_l} 이 앞선다. DPO는 만족해 가는데 생성은 yl\textcolor{#e000a5}{y_l} 쪽이다. (다) SimPO 마진 −0.9, 손실 약 1.241. 평균 로그확률에서 yw\textcolor{#e000a5}{y_w} 가 yl\textcolor{#e000a5}{y_l} 을 γ\textcolor{#206049}{\gamma} 이상 앞서도록 민다.