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

의문

DPO는 네 부품으로 이루어져 있다. 마진을 손실로 바꾸는 바깥 함수(링크 함수), 레퍼런스(학습을 시작할 때 복사해 얼려 둔 모델), 같은 프롬프트에 대한 좋은 답과 나쁜 답의 짝(선호쌍), 그리고 응답을 이루는 토큰 로그확률의 합이다. 이 부품을 하나씩 빼거나 바꾸면 어떻게 될까?

DPO(2023)가 나온 뒤 2년 동안 연구자들은 정확히 이 질문 — “이 부품을 빼면? 바꾸면?” — 을 던졌고, 답 하나하나가 새 알고리즘이 되었다. 이 장은 DPO의 약점 다섯을 차례로 짚고, 그 약점을 고친 변형들을 따라간 뒤, 마지막에 그 변형들을 한 장의 지도로 그린다. 약점에 붙인 번호는 이 장이 설명하는 순서이고, 논문이 나온 순서가 아니다.

링크 함수: 마진을 손실로 바꾸는 함수

DPO는 마진이 커질수록 손실이 줄어드는 한 줄짜리 식이다. 선호 데이터로 학습을 여러 바퀴(에폭) 돌리면 모델은 같은 쌍을 거듭 보고, 그때마다 그 쌍의 마진을 또 벌린다. 그렇다면 마진이 이미 충분히 벌어진 뒤에도 모델은 계속 마진을 벌려야 할까? 선호 라벨이 가끔 틀린다면, 그 라벨을 끝까지 믿고 벌리는 것이 옳을까? 가계도의 첫 가지들은 바로 이 물음에서 나왔다.

역사: 라벨을 끝까지 믿으면 목줄이 풀린다

DPO 이전의 RLHF(사람의 선호로 보상 모델을 학습하고, 그 보상으로 PPO 강화학습을 하는 방식)는 모델 네 개를 함께 돌렸다. 응답을 뽑는 학습 중인 모델(정책), 출발점을 기억하는 레퍼런스, 응답에 점수를 매기는 보상 모델, 그리고 앞으로 받을 보상을 어림하는 가치 모델(비평가)이다. 메모리가 많이 들고, 구현이 복잡하고, 맞춰야 할 하이퍼파라미터가 많아 튜닝이 고됐다.

2023년 5월 라파일로프(Rafael Rafailov)와 동료들의 DPO는 보상을 정책과 레퍼런스의 로그비율로 바꿔 적어, 보상 모델을 식에서 지웠다. 남는 모델은 정책과 레퍼런스 둘이다. 손실 함수가 몇 줄이라 기존 SFT(정답 응답을 그대로 따라 쓰게 하는 지도 학습) 코드에 그대로 붙일 수 있었고, 학계와 오픈소스가 빠르게 받아들였다. 2023년 10월 허깅페이스의 H4 팀은 공개 모델 Mistral 7B에 UltraFeedback(프롬프트 약 6만 4천 개마다 여러 언어모델이 쓴 답 네 개를 GPT-4가 채점한 데이터)으로 DPO를 걸어 Zephyr-7B를 만들었다. A100 GPU 16장에서 몇 시간이 걸렸고, MT-Bench(질문 80개에 GPT-4가 1~10점을 매기는 평가)에서 파라미터 700억 개짜리 Llama 2-Chat을 넘었다. 한 달 뒤 앨런 AI 연구소의 Tulu 2는 700억 파라미터 모델에 DPO를 건 결과를 내며, 이 크기에서 DPO가 안정적으로 돈다는 것을 처음 보였다고 적었다.

같은 달 구글 딥마인드의 아자르(Mohammad Gheshlaghi Azar)와 동료들은 DPO가 기대는 가정을 따져 보았다. DPO는 BT(브래들리-테리 모델: 두 응답의 점수 차의 시그모이드를 승률로 보는 모델)를 믿는다. 그런데 어떤 쌍에서 한쪽이 언제나 이긴다면, BT가 승률 1을 내려면 두 점수 차가 무한대여야 한다. 그러면 KL 벌점의 강도를 아무리 키워도 최적 정책은 진 응답에 확률 0을 준다. 목줄이 아무 일도 하지 않는 것이다. 실제 승률이 0.8인 쌍이라도 데이터에 몇 번밖에 없으면 우연히 매번 같은 쪽이 이겨, 데이터 속 승률은 쉽게 1이 된다. 그들은 이것을 언어모델처럼 응답의 가짓수가 엄청나게 많은 곳에서 실제로 문제가 되는 과적합이라고 보았다(arXiv 2023년 10월, AISTATS 2024).

DPO에는 이렇게 숨은 약점이 있었고, 각 약점을 발견하고 고치는 과정이 곧 변형 알고리즘의 역사다. 이 장은 그 가운데 다섯을 다룬다. 첫 두 약점은 이론에서 나왔고, 고친 결과는 둘 다 링크 함수(link function) — 마진을 손실로 바꾸는 함수 — 를 바꾼다. IPO는 함수의 모양을 직접 바꾸고, cDPO는 라벨을 믿는 정도를 바꿔서 결과적으로 마진에 대한 손실의 모양이 달라진다.

아래 그림이 바꾸기 전의 링크 함수, DPO의 −log⁡σ(βz)-\log\sigma(\beta z) 다. 가로축은 마진, 세로축은 손실이다.

0 1 2 0 4 8 12 16 레퍼런스 대비 마진 z 손실 0.693 0.313 0.127 0.018 DPO: −log σ(βz), β = 0.25 0에 닿는 곳이 없다
약점 1: BT 과적합 — IPO

BT 과적합은 위 이야기의 그 문제다. BT를 믿는 DPO 손실은 라벨이 늘 한쪽이면 마진을 끝없이 벌려야 바닥에 닿는다. DPO 손실 −log⁡σ(βz)-\log\sigma(\beta z) 에서 z=Δθ−Δrefz = \Delta_\theta - \Delta_\text{ref} 는 학습 모델이 선호 응답과 비선호 응답 사이에 벌린 로그확률 차가 레퍼런스의 차보다 얼마나 큰지다. β=0.25\beta = 0.25 로 두고 마진을 두 배씩 키워 보자.

마진 zz 0 4 8 16
DPO 손실 −log⁡σ(βz)-\log\sigma(\beta z) 0.693 0.313 0.127 0.018
손실의 기울기 −β σ(−βz)-\beta\,\sigma(-\beta z) −0.125 −0.067 −0.030 −0.0045

마진을 두 배로 늘릴 때마다 기울기는 줄지만 0이 되지 않는다. 손실이 0에 닿는 마진이 없으니, 학습이 계속되는 한 모델은 데이터 속 쌍마다 마진을 더 벌리려 하고, 선호 응답과 비선호 응답에 점점 극단적인 확률을 준다. 학습 데이터의 선호 패턴을 달달 외우는 과적합이다.

아자르와 동료들의 IPO는 시그모이드를 버리고, 마진이 정해 둔 목표에서 얼마나 떨어졌는지의 제곱(평균제곱오차, MSE)을 손실로 쓴다.

LIPO=(z−12β)2\textcolor{#d62728}{\mathcal{L}_\text{IPO}} = \Big(\textcolor{#d9670b}{z} - \frac{1}{2\textcolor{#827717}{\beta}}\Big)^2
LIPOIPO 손실z레퍼런스 대비 마진 Δθ−ΔrefβKL 강도: 클수록 목표 마진 1/(2β) 이 작다Δθ, Δref학습 모델과 레퍼런스가 선호⋅비선호 응답 사이에 벌린 로그확률 차 \small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_\text{IPO}} & \text{IPO 손실} \\ \textcolor{#d9670b}{z} & \text{레퍼런스 대비 마진 } \textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}} \\ \textcolor{#827717}{\beta} & \text{KL 강도: 클수록 목표 마진 } 1/(2\textcolor{#827717}{\beta}) \text{ 이 작다} \\ \textcolor{#1565c0}{\Delta_\theta},\ \textcolor{#6f6f78}{\Delta_\text{ref}} & \text{학습 모델과 레퍼런스가 선호·비선호 응답 사이에 벌린 로그확률 차} \end{array}

손실은 z\textcolor{#d9670b}{z} 가 목표 마진 1/(2β)1/(2\textcolor{#827717}{\beta}) 에 닿을 때 0이다. 위의 β=0.25\textcolor{#827717}{\beta} = 0.25 라면 목표는 2다. "충분히 벌렸으면 그만"이 손실 안에 들어 있는 셈이고, BT를 가정하지 않으므로 이론으로도 더 일반적이다. DPO가 "항상 더 벌려!"라면, IPO는 "딱 이만큼만 벌려."다.

약점 2: 노이즈 라벨 — cDPO

현실의 선호 데이터에는 노이즈가 있다. 평가자가 실수로 비선호 응답을 선호로 표기하기도 하고, 두 응답이 거의 같은 품질인데 억지로 순서를 매기기도 하고, 평가자끼리 의견이 갈리기도 한다(한 명은 A, 다른 한 명은 B). DPO는 이런 노이즈까지 그대로 학습한다. 모든 쌍의 라벨을 똑같이 믿기 때문이다.

DPO 논문의 저자 가운데 한 사람인 에릭 미첼(Eric Mitchell)은 2023년 11월의 짧은 기술 노트에서, 라벨이 작은 확률 ε\textcolor{#cc00ff}{\varepsilon} 로 뒤집혀 있다고 보고 목표 승률을 1 대신 1−ε1 - \textcolor{#cc00ff}{\varepsilon} 으로 낮추자고 했다. 분류에서 정답 라벨을 조금 덜 확신하게 만드는 라벨 스무딩(smoothing)과 같은 생각이다. 노트에서는 이것을 보수적인 DPO라는 뜻으로 cDPO(conservative DPO)라 불렀다.

LcDPO=(1−ε)[−log⁡σ(βz)]+ε[−log⁡σ(−βz)]\textcolor{#d62728}{\mathcal{L}_\text{cDPO}} = (1-\textcolor{#cc00ff}{\varepsilon})\big[-\log\sigma(\textcolor{#827717}{\beta}\textcolor{#d9670b}{z})\big] + \textcolor{#cc00ff}{\varepsilon}\big[-\log\sigma(-\textcolor{#827717}{\beta}\textcolor{#d9670b}{z})\big]
LcDPOcDPO 손실ε이 쌍의 라벨이 뒤집혀 있을 확률 (예: 0.1)βKL 강도z레퍼런스 대비 마진 \small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_\text{cDPO}} & \text{cDPO 손실} \\ \textcolor{#cc00ff}{\varepsilon} & \text{이 쌍의 라벨이 뒤집혀 있을 확률 (예: 0.1)} \\ \textcolor{#827717}{\beta} & \text{KL 강도} \\ \textcolor{#d9670b}{z} & \text{레퍼런스 대비 마진} \end{array}

앞 항은 라벨대로 yw\textcolor{#e000a5}{y_w} 가 이겼다고 볼 때의 DPO 손실이고, 뒤 항은 라벨이 뒤집혀 yl\textcolor{#e000a5}{y_l} 이 이겼다고 볼 때의 DPO 손실이다. 둘을 1−ε1-\textcolor{#cc00ff}{\varepsilon} 대 ε\textcolor{#cc00ff}{\varepsilon} 으로 섞었다. 그래서 cDPO의 링크 함수는 −log⁡σ-\log\sigma 하나가 아니라 둘을 섞은 함수다. DPO가 "모든 증인의 증언을 100% 믿는 판사"라면, cDPO는 "증인이 잘못 말했을 확률을 고려하는 판사"다.

링크 함수를 직접 바꿔보기

같은 마진에 대해 링크 함수들이 어떻게 다른지 겹쳐 보자. 위젯이 그리는 넷은 DPO, IPO, 힌지(마진이 1/β1/\textcolor{#827717}{\beta} 에 닿으면 손실과 그래디언트가 0이 되는 꺾인 직선. SLiC-HF라는 방법이 이 꼴을 썼다), 그리고 목표 마진 γ를 넣은 DPO(DPO 곡선을 γ/β\textcolor{#827717}{\beta} 만큼 오른쪽으로 민 것)다.

차이는 곡선의 오른쪽 끝에서 드러난다. DPO는 "이미 충분히 벌렸다"는 판단을 내리지 못한다. 손실이 0에 다가가기만 하므로 그래디언트가 약해질 뿐 끝까지 남는다. 목표 마진 γ를 넣은 곡선도 DPO 곡선을 옆으로 옮긴 것이라 마찬가지다. IPO와 힌지는 유한한 지점에서 멈추는 장치를 들여온 것이다. cDPO도 그런 장치를 들였는데, 위젯에는 cDPO 곡선이 없으므로 아래 문제 3에서 멈추는 지점을 직접 구한다. 이 첫 변형들이 고친 "과적합"의 정체가 바로 이 오른쪽 꼬리다.

문제 1 — 보고서 분량을 매기는 두 교수

두 교수가 보고서 점수를 다르게 매긴다. A 교수는 쪽수가 nn 이면 10×(1−0.5n)10 \times (1 - 0.5^n) 점을 준다. 쪽수가 늘수록 오르지만 오르는 폭이 반씩 준다. B 교수는 10−(n−5)210 - (n-5)^2 점을 준다. 5쪽이 만점이다. 이미 8쪽을 쓴 학생이 한 쪽을 더 쓴다. (가) 두 교수의 점수는 각각 얼마에서 얼마로 바뀌는가? (나) 각 교수 밑에서 점수가 가장 높은 쪽수는?

김민준 (자신만만)
김민준
한 쪽 더 쓰면 둘 다 조금은 오르겠죠. 더 열심히 쓴 거니까요.
선생님 (질문)
선생님
민준 학생, B 교수 식에 8과 9를 넣어 볼까요?
김민준 (당황)
김민준
10−9=110 - 9 = 1 점에서 10−16=−610 - 16 = -6 점이요. 떨어지네요. A 교수는 9.961점에서 9.980점, 0.02점 올라요.
이서연 (평상)
이서연
A 교수 점수는 10점에 닿지 않으니까 몇 쪽을 쓰든 한 쪽 더 쓰는 게 이득이야. 가장 좋은 쪽수가 없어. B 교수는 5쪽이 만점이라 8쪽이면 오히려 세 쪽을 지워야 하고.
김민준 (평상)
김민준
A 교수 밑에서는 끝없이 늘려 쓰게 되겠네요. 오르는 건 쥐꼬리만큼인데.

정리 (가) A 교수 9.961 → 9.980점(+0.02), B 교수 1 → −6점. (나) A 교수는 없다(쓸수록 아주 조금씩 오른다). B 교수는 5쪽. 목표가 정해진 규칙은 넘친 만큼 깎고, 목표가 없는 규칙은 끝없이 늘리게 만든다.

문제 2 — IPO는 되돌리고, DPO는 계속 민다

β=0.5\textcolor{#827717}{\beta} = 0.5 인 IPO의 목표 마진 z∗\textcolor{#d9670b}{z}^* 는 얼마인가? 현재 마진이 z=3\textcolor{#d9670b}{z} = 3 일 때, IPO와 DPO 손실을 각각 z\textcolor{#d9670b}{z} 로 미분하시오. 두 손실은 마진을 어느 쪽으로, 어느 쪽이 몇 배 세게 미는가? 위젯에서 β\textcolor{#827717}{\beta} 를 0.5로 두고 z=3\textcolor{#d9670b}{z} = 3 근처에서 두 곡선이 얼마나 가파른지 견주어 보라.

김민준 (자신만만)
김민준
z∗=1/(2β)=1\textcolor{#d9670b}{z}^* = 1/(2\textcolor{#827717}{\beta}) = 1 이요. 지금 z\textcolor{#d9670b}{z} 가 3이라 둘 다 목표를 넘었으니, 이제는 둘 다 힘이 거의 없겠죠. 꼬리니까요.
선생님 (질문)
선생님
꼬리에서 힘이 약해지는 건 DPO 곡선 얘기였죠. 두 손실을 z\textcolor{#d9670b}{z} 로 미분해 볼래요?
김민준 (평상)
김민준
IPO는 2(z−1)=42(\textcolor{#d9670b}{z}-1) = 4. 양수니까… 손실을 줄이려면 z\textcolor{#d9670b}{z} 를 줄여야 하네요. 그것도 꽤 세게요.
이서연 (평상)
이서연
DPO는 −β σ(−βz)=−0.5×σ(−1.5)≈−0.091-\textcolor{#827717}{\beta}\,\sigma(-\textcolor{#827717}{\beta} \textcolor{#d9670b}{z}) = -0.5 \times \sigma(-1.5) \approx -0.091. 음수라서 z\textcolor{#d9670b}{z} 를 계속 키우는 쪽이야. 크기로는 IPO가 40배 넘게 세고.
김민준 (놀람)
김민준
IPO는 넘어선 만큼 되돌리는데, 멀리 넘을수록 더 세게 당기네요.
선생님 (평상)
선생님
맞아요. 민준 학생은 목표를 넘은 뒤를 DPO의 꼬리처럼 생각했어요. 제곱 손실의 기울기는 목표에서 멀어질수록 커지고, −log⁡σ-\log\sigma 의 기울기는 멀어질수록 작아지지만 0이 되지는 않아요.
김민준 (평상)
김민준
아까 보고서 분량 문제랑 같네요. A 교수 밑에서는 늘려 쓰면 쥐꼬리만큼이라도 오르고, B 교수 밑에서는 많이 넘칠수록 크게 깎이고요.

정리 z∗=1\textcolor{#d9670b}{z}^* = 1. IPO의 그래디언트 2(z−1)=4>02(\textcolor{#d9670b}{z}-1) = 4 > 0 → 마진을 줄이는 쪽. DPO의 그래디언트 ≈ −0.091 → 여전히 늘리는 쪽. 크기는 IPO가 약 44배다. IPO는 목표에서 멀수록 세게 되돌리고, DPO에는 멈출 지점이 없다.

문제 3 — cDPO의 최적점

cDPO의 손실은 라벨이 뒤집혔을 확률 ε\textcolor{#cc00ff}{\varepsilon} 를 섞은 L=(1−ε) [−log⁡σ(h)]+ε [−log⁡σ(−h)]\textcolor{#d62728}{\mathcal{L}} = (1-\textcolor{#cc00ff}{\varepsilon})\,[-\log\sigma(\textcolor{#0033ff}{h})] + \textcolor{#cc00ff}{\varepsilon}\,[-\log\sigma(-\textcolor{#0033ff}{h})] 이다 (h=βz\textcolor{#0033ff}{h} = \textcolor{#827717}{\beta} \textcolor{#d9670b}{z} — 계산을 짧게 하려고 두 글자의 곱을 한 글자로 줄여 적었다). ε=0.1\textcolor{#cc00ff}{\varepsilon} = 0.1 일 때 손실을 최소로 만드는 h\textcolor{#0033ff}{h} 를 구하시오.

김민준 (평상)
김민준
ε가 0.1이면 원래 DPO 손실에 0.9 곱하고 약간 섞은 거니까, 결국 DPO랑 똑같이 계속 벌리는 거 아니에요?
이서연 (의심)
이서연
섞은 항이 −log⁡σ(−h)-\log\sigma(-\textcolor{#0033ff}{h}) 야. 이건 h가 커질수록 커져. 반대 방향으로 당기는 항이 있으니까 어딘가에서 균형이 맞을 것 같은데.
선생님 (평상)
선생님
그럼 미분해서 0으로 놓아 볼까요?
이서연 (평상)
이서연
−(1−ε)σ(−h)+ε σ(h)=0-(1-\textcolor{#cc00ff}{\varepsilon})\sigma(-\textcolor{#0033ff}{h}) + \textcolor{#cc00ff}{\varepsilon}\,\sigma(\textcolor{#0033ff}{h}) = 0 이니까 σ(h)=1−ε\sigma(\textcolor{#0033ff}{h}) = 1-\textcolor{#cc00ff}{\varepsilon}. 그러면 h∗=log⁡1−εε=log⁡9≈2.20\textcolor{#0033ff}{h}^* = \log\frac{1-\textcolor{#cc00ff}{\varepsilon}}{\varepsilon} = \log 9 \approx 2.20.
김민준 (당황)
김민준
0.9를 곱한 게 아니라, 반대로 당기는 스프링이 하나 달린 거였네요.
선생님 (평상)
선생님
그래요. "이 라벨이 10% 확률로 틀렸다"고 믿으면, 90% 확신 이상으로 벌리는 건 과신이라는 뜻이에요. σ(h*) = 0.9 라는 숫자가 바로 그 믿음이죠.
김민준 (평상)
김민준
조교님이 채점할 때 "이 문제는 답안지가 틀렸을 수도 있으니 만점 대신 90%만 확신하고 채점하자"는 거랑 같네요.

정리 σ(h∗)=1−ε\sigma(\textcolor{#0033ff}{h}^*) = 1-\textcolor{#cc00ff}{\varepsilon} → h∗=log⁡9≈2.20\textcolor{#0033ff}{h}^* = \log 9 \approx 2.20. cDPO도 IPO처럼 유한한 최적점을 가진다. 라벨 노이즈를 인정하는 순간 과신이 벌점을 받는다.