18. 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에 충분하다"고 적었다.

레퍼런스를 빼면 모델을 레퍼런스 근처에 묶어 두던 KL 제약이 사라지므로, CPO와 ORPO는 KL 제약 대신 선호 응답의 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} 를 붙잡는 닻 역할을 한다.