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

레퍼런스 덜어내기: CPO와 ORPO

쌍을 덜어내도 레퍼런스는 남는다. DPO는 매 스텝 학습 중인 모델 πθ\pi_\theta 와 함께, 얼려 둔 레퍼런스 πref\pi_\text{ref} 도 메모리에 올려 두고 순전파를 한 번 더 돌려야 한다. 70억 파라미터 모델이면 가중치만 bf16(숫자 하나에 2바이트)으로 약 14GB가 한 벌 더 든다. GPU가 넉넉하지 않은 곳에서는 이 한 벌이 학습을 막는다. 레퍼런스 없이 DPO처럼 배울 수는 없을까?

약점 4: 레퍼런스 모델이 메모리를 잡아먹는다 — CPO와 ORPO

2024년 1월 쉬(Haoran Xu)와 동료들의 CPO(Contrastive Preference Optimization, ICML 2024)는 번역 모델에서 출발했다. 그들은 DPO가 두 정책을 함께 담느라 메모리가 두 배 들고, 두 모델을 차례로 돌리느라 처리 시간도 두 배 든다고 적었다(130억 파라미터 번역 모델에 작은 추가 파라미터만 학습하는 LoRA 설정). 해법은 레퍼런스를 모든 응답에 같은 확률을 주는 균일 분포로 두는 것이다. 그러면 DPO 손실 속의 두 레퍼런스 항이 서로 지워져 식에서 사라진다. 대신 선호 응답을 그대로 따라 쓰게 하는 SFT 손실을 더했다.

LCPO=−log⁡σ(βlog⁡πθ(yw∣x)−βlog⁡πθ(yl∣x))  − log⁡πθ(yw∣x)⏟LSFT(yw)\textcolor{#d62728}{\mathcal{L}_\text{CPO}} = -\log\sigma\Big(\textcolor{#827717}{\beta}\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_w} \mid \textcolor{#0093b8}{x}) - \textcolor{#827717}{\beta}\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_l} \mid \textcolor{#0093b8}{x})\Big) \;\underbrace{-\,\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_w} \mid \textcolor{#0093b8}{x})}_{\textcolor{#d62728}{\mathcal{L}_\text{SFT}}(\textcolor{#e000a5}{y_w})}
LCPOCPO 손실: 레퍼런스를 지운 선호 항 + 선호 응답의 SFT 손실LSFT선호 응답의 음의 로그확률 (정답을 그대로 따라 쓰게 하는 손실)βKL 강도 (레퍼런스를 균일 분포로 둔 DPO에서 물려받음)πθ학습 중인 정책x프롬프트yw, yl선호 응답, 비선호 응답 \small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_\text{CPO}} & \text{CPO 손실: 레퍼런스를 지운 선호 항 + 선호 응답의 SFT 손실} \\ \textcolor{#d62728}{\mathcal{L}_\text{SFT}} & \text{선호 응답의 음의 로그확률 (정답을 그대로 따라 쓰게 하는 손실)} \\ \textcolor{#827717}{\beta} & \text{KL 강도 (레퍼런스를 균일 분포로 둔 DPO에서 물려받음)} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 정책} \\ \textcolor{#0093b8}{x} & \text{프롬프트} \\ \textcolor{#e000a5}{y_w},\ \textcolor{#e000a5}{y_l} & \text{선호 응답, 비선호 응답} \end{array}

뒤의 SFT 항이 "원래 잘하던 것을 유지해라"는 역할, 곧 레퍼런스 대신 걸린 암묵적 목줄이다.

두 달 뒤 KAIST의 홍지우(Jiwoo Hong)와 동료들이 낸 ORPO도 레퍼런스를 쓰지 않는다. 토큰당 평균 로그확률을 다시 확률로 되돌린 값에 오즈(일어날 확률 ÷ 일어나지 않을 확률)를 씌우고, 선호 응답과 비선호 응답의 오즈 비를 벌리는 항을 선호 응답의 SFT 손실에 작은 계수로 더한다. 따로 하던 SFT 단계와 선호 정렬(사람이 바라는 방식으로 답하게 맞추기) 단계를 한 번의 학습으로 합친 것이라, 논문 제목은 이것을 한 덩어리(monolithic)라 불렀다. 저자들은 "비선호 응답의 말투에 약한 벌점만 주어도 선호에 맞춘 SFT에 충분하다"고 적었다.

레퍼런스를 빼면 모델을 레퍼런스 쪽으로 당기던 목줄이 사라진다. CPO와 ORPO는 그 자리에 선호 응답의 SFT 손실을 넣었다. 왜 하필 SFT 손실이어야 하는지는, DPO 손실만 줄였을 때 선호 응답 자체에 무슨 일이 생기는지 보면 드러난다.

문제 6 — 차이는 벌어졌는데 1등 점수가 떨어졌다

중간고사에서 A는 80점, B는 70점이었다. 기말고사에서 A는 76점, B는 60점이다. (가) 두 시험에서 두 학생의 점수 차는? (나) "차이가 벌어졌으니 A가 더 잘하게 되었다"는 말은 맞는가? (다) 두 학생의 점수는 기록하지 않고 점수 차만 기록했다면, A의 점수가 내려간 것을 알 수 있는가?

김민준 (자신만만)
김민준
차이가 10점에서 16점이 됐으니 A가 더 잘하게 됐죠.
선생님 (질문)
선생님
민준 학생, A의 점수만 따로 보면요?
김민준 (당황)
김민준
80에서 76… 내려갔네요. B가 더 많이 내려갔을 뿐이에요.
이서연 (평상)
이서연
(다)는 알 수 없어. 차이 16은 96점과 80점에서도, 76점과 60점에서도 나오니까. 차이만 적어 두면 두 점수가 함께 내려간 건 안 보여.

정리 (가) 10점 → 16점. (나) 아니다. A의 점수는 4점 내려갔고 B가 10점 내려갔을 뿐이다. (다) 알 수 없다. 차이만 보는 기록은 두 값이 함께 내려가는 것을 잡지 못한다.

문제 7 — (킬러) 마진은 벌어졌는데 선호 응답이 사라졌다

DPO 학습 전 레퍼런스에서 log⁡πref(yw)=−10\log\textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_w}) = -10, log⁡πref(yl)=−12\log\textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_l}) = -12 였다. 학습 후 정책에서는 log⁡πθ(yw)=−14\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_w}) = -14, log⁡πθ(yl)=−20\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_l}) = -20 이다 (β=0.5\textcolor{#827717}{\beta} = 0.5). (가) DPO 손실은 줄었는가? (나) 선호 응답 yw\textcolor{#e000a5}{y_w} 의 확률은 어떻게 되었는가? (다) 확률 합이 1이라면 줄어든 확률은 어디로 갔으며, 어떤 변형이 이 문제를 겨냥하는가?

민준이 학습 기록을 가져왔다. loss 곡선은 보기 좋게 내려가 있다.
선생님 (평상)
선생님
먼저 (가). 손실은 줄었나요?
김민준 (평상)
김민준
Δθ = −14 − (−20) = 6, Δref = −10 − (−12) = 2, z = 4. 손실은 −log⁡σ(0.5×4)≈0.127-\log\sigma(0.5 \times 4) \approx 0.127이에요. 시작할 때 0.693이었으니까 확 줄었죠.
선생님 (질문)
선생님
그럼 (나). 좋은 답 yw\textcolor{#e000a5}{y_w}는 더 잘 나오게 됐나요?
김민준 (자신만만)
김민준
당연하죠. 손실이 줄었으니까 좋은 답이 올라간 거예요.
이서연 (평상)
이서연
숫자를 봐. yw\textcolor{#e000a5}{y_w}의 로그확률이 −10에서 −14로 내려갔어. e−4e^{-4}배, 대략 원래의 1.8%야.
김민준 (놀람)
김민준
어? 내려갔는데 손실이 줄었다고?
이서연 (평상)
이서연
손실은 차이만 보니까. yl\textcolor{#e000a5}{y_l}이 −12에서 −20으로 더 많이 내려갔잖아. 둘 다 떨어졌는데 yl\textcolor{#e000a5}{y_l}이 더 빨리 떨어진 거야.
김민준 (좌절)
김민준
"좋은 건 올리고 나쁜 건 내린다"고만 외웠더니…
김민준 (평상)
김민준
아까 시험 점수 문제랑 같은 거네요. 차이만 보면 둘 다 떨어진 게 안 보였잖아요.
선생님 (평상)
선생님
맞아요, 민준 학생은 "손실 감소 = 좋은 답 증가"로 읽었어요. 그럼 (다). 서연 학생, 두 응답이 다 줄었으면 그 확률은 어디로 갔을까요?
이서연 (평상)
이서연
확률 합은 1이니까 다른 응답들로 옮겨갔겠죠. 그 응답들이 yw\textcolor{#e000a5}{y_w}랑 비슷한 좋은 답이면 괜찮고요. 사실 yw\textcolor{#e000a5}{y_w} 하나에 몰리는 것보다 비슷한 좋은 답들로 퍼지는 게 일반화겠네요.
선생님 (질문)
선생님
그 "다른 응답들"은 데이터셋에 있나요?
이서연 (생각)
이서연
…없어요. 데이터에는 yw\textcolor{#e000a5}{y_w}랑 yl\textcolor{#e000a5}{y_l}뿐이니까, 옮겨간 곳이 좋은 데인지 나쁜 데인지 손실은 아무것도 말해주지 않아요. 좋은 데로 갔을 거라는 건 제 희망이었네요.
이서연 (깨달음)
이서연
확률론 수업에서 조건부로만 제약을 걸면 나머지 확률은 아무 데나 가도 된다는 거랑 같아요. 제약이 없는 곳은 보장도 없죠.
선생님 (평상)
선생님
그래요. 이 현상을 우도 변위(likelihood displacement — 모델이 데이터의 응답에 주는 확률, 곧 우도가 오히려 밀려나는 현상)라고 불러요. 그래서 CPO와 ORPO는 yw\textcolor{#e000a5}{y_w}에 SFT 손실을 더해 "좋은 답의 확률 자체는 올려라"는 닻을 내리죠.

정리 (가) z=4\textcolor{#d9670b}{z} = 4, 손실 0.693 → 0.127로 감소. (나) yw\textcolor{#e000a5}{y_w} 의 확률은 e−4≈0.018e^{-4} \approx 0.018배로 줄었다. yl\textcolor{#e000a5}{y_l} 이 더 많이 줄었을 뿐이다. (다) 줄어든 확률은 데이터에 없는 응답으로 간다. 그것이 좋은 답이라는 보장은 없다. 마진이 벌어지는데도 선호 응답의 우도(모델이 그 응답에 주는 확률)가 밀려나는 이 현상을 우도 변위라 부른다. CPO·ORPO의 SFT 항이 yw\textcolor{#e000a5}{y_w} 를 붙잡는 닻 역할을 한다.