Chapter 7: 선호 쌍의 조건 — 어떤 데이터가 DPO를 움직이는가

의문

선호 쌍을 만 개 모았다고 하자. 같은 질문에 붙은 두 답과 "이쪽이 낫다"는 표시가 만 개다. 이 만 개는 모두 똑같이 쓸모 있을까?

DPO는 RLHF(사람의 선호로 학습한 보상 모델의 점수를 강화학습으로 올리는 절차) 목표의 최적해를 뒤집어 보상을 정책(프롬프트를 받아 답을 고르는 언어모델) 비율로 적은 것이다. 그러면 보상 모델 없이 한 줄짜리 손실이 남는다.

LDPO=−log⁡σ ⁣(β⋅[log⁡πθ(yw)−log⁡πθ(yl)⏟Δθ−(log⁡πref(yw)−log⁡πref(yl))⏟Δref])\textcolor{#d62728}{\mathcal{L}_\text{DPO}} = -\log \sigma\!\Big(\textcolor{#827717}{\beta} \cdot \big[\underbrace{\log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_w}) - \log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_l})}_{\textcolor{#1565c0}{\Delta_\theta}} - \underbrace{\big(\log \textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_w}) - \log \textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_l})\big)}_{\textcolor{#6f6f78}{\Delta_\text{ref}}}\big]\Big)
LDPODPO 손실βKL 강도 (클수록 짧은 목줄)πθ학습 중인 정책πref레퍼런스 정책 (학습 전 모델을 고정한 비교 기준)Δθ학습 모델의 선호 마진Δref레퍼런스의 선호 마진yw, yl선호 응답, 비선호 응답 \small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_\text{DPO}} & \text{DPO 손실} \\ \textcolor{#827717}{\beta} & \text{KL 강도 (클수록 짧은 목줄)} \\ \textcolor{#1565c0}{\pi_\theta} & \text{학습 중인 정책} \\ \textcolor{#6f6f78}{\pi_\text{ref}} & \text{레퍼런스 정책 (학습 전 모델을 고정한 비교 기준)} \\ \textcolor{#1565c0}{\Delta_\theta} & \text{학습 모델의 선호 마진} \\ \textcolor{#6f6f78}{\Delta_\text{ref}} & \text{레퍼런스의 선호 마진} \\ \textcolor{#e000a5}{y_w},\ \textcolor{#e000a5}{y_l} & \text{선호 응답, 비선호 응답} \end{array}

이 한 줄은 여러 부품으로 되어 있다. 부품마다 두 가지를 물을 수 있다. 빼면 어떻게 되는가? 그리고 다른 것으로 바꾸면? 답이 "빼면 안 된다"이면 왜 안 되는지 보이고, "바꿔도 된다"이면 실제로 바꿔서 나온 알고리즘이 있다.

부품 물을 것
yw\textcolor{#e000a5}{y_w}, yl\textcolor{#e000a5}{y_l} (선호/비선호 쌍) 어떤 쌍이 좋은 쌍인가? 꼭 쌍이어야 하나?
log⁡πθ(y)\log \textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y}) (문장 로그확률) 어떻게 구하나?
토큰 로그확률의 합 길이가 다르면 공정한가?
πref\textcolor{#6f6f78}{\pi_\text{ref}} 와 β\textcolor{#827717}{\beta} 왜 묶여 있나? 빼면?
σ\sigma 와 −log⁡-\log (브래들리-테리 모델: 두 점수의 차를 시그모이드에 넣어 이길 확률로 보는 모델) 왜 이 함수인가?
스칼라 선호 하나 좋음이 여러 차원이면?

이 장은 첫 부품, 데이터를 본다. DPO는 (프롬프트, 선호 응답 yw\textcolor{#e000a5}{y_w}, 비선호 응답 yl\textcolor{#e000a5}{y_l})의 모음으로 학습하고, 모아 둔 만 개의 쌍은 모두 이 손실에 똑같은 자격으로 들어간다. 그렇다면 모든 쌍이 똑같이 쓸모 있는가?

좋은 선호 쌍의 조건: 마진을 여는 길이 행동을 바꾸는 길이어야 한다

선호 쌍을 모을 때 가장 먼저 떠오르는 생각은 "좋은 답과 나쁜 답의 차이가 클수록 확실한 신호"라는 것이다. 정답과 횡설수설을 나란히 놓으면 평가자도 헷갈릴 일이 없다. 그런데 그런 쌍이 정말 모델을 가장 많이 바꿀까? 같은 질문에 붙은 극단적인 쌍 세 개로 확인해 보자.

극단적인 쌍 세 개

질문: “대한민국의 수도는?”

[쌍 A] yw\textcolor{#e000a5}{y_w} = “서울입니다” vs yl\textcolor{#e000a5}{y_l} = “zxcgbhjdf”

"zxcgbhjdf"는 모델이 원래 절대 만들지 않는 문자열이다. DPO는 이 쌍에서 두 가지를 한다. "서울입니다"의 확률을 올리고, "zxcgbhjdf"의 확률을 내린다. 그런데 이미 거의 0인 확률을 더 0에 가깝게 깎아도, 모델이 실제로 내놓는 답의 분포는 아무것도 바뀌지 않는다. 남는 효과는 yw\textcolor{#e000a5}{y_w} 를 올리는 SFT(정답을 따라 쓰게 하는 지도 미세조정) 몫뿐이다.

이 쌍이 가르치는 것은 “엉터리를 만들지 마라” — 하지만 모델은 원래 그러지 않는다.

[쌍 B] yw\textcolor{#e000a5}{y_w} = “서울입니다” vs yl\textcolor{#e000a5}{y_l} = “부산입니다”

"부산입니다"는 문법적으로 완벽하고, 형식도 맞고, 그럴듯하다 — 부산도 대한민국의 대도시니까. 하지만 틀렸다.
모델이 "부산"에도 상당한 확률을 주고 있을 수 있다. 이 확률을 깎으면 그만큼의 확률 질량이 실제로 다른 답으로 옮겨간다. 마진을 벌리는 길이 곧 모델의 행동을 바꾸는 길이다.
→ DPO가 진짜 일을 하는 쌍이다.

두 쌍으로 학습했을 때 모델이 네 답에 주는 확률이 어떻게 달라지는지 그림으로 보면 이렇다. 숫자는 장난감이고, 깎인 확률은 나머지 답에 원래 비율대로 나뉜다고 놓았다.

처음 0.60 0.25 0.15 ≈ 0 쌍 A로 학습 엉터리를 깎음 0.60 0.25 0.15 ≈ 0 쌍 B로 학습 부산을 깎음 0.80 ≈ 0 0.20 ≈ 0 서울 부산 기타 엉터리

엉터리 문자열의 막대는 처음부터 바닥에 붙어 있어 깎을 것이 없다. 쌍 A로 학습한 모델의 답은 처음과 같다. 부산의 막대를 깎으면 그 몫이 서울과 기타로 옮겨 간다.

[쌍 C] yw\textcolor{#e000a5}{y_w} = “서울입니다” vs yl\textcolor{#e000a5}{y_l} = “서울은 대한민국의 수도이며, 한반도 중부에…”

둘 다 사실적으로 맞다. 차이는 스타일 — 질문에 비해 불필요하게 긴가.
이 쌍은 정확성이 아니라 "어떤 답이 더 선호되는가"를 가르친다. SFT로는 표현하기 어려운 신호다.
→ DPO가 SFT로 불가능한 일을 하는 쌍이다. (단, 길이가 다른 쌍에는 함정이 있다. 문장 로그확률은 토큰마다 더해지므로, 두 응답의 길이 차이가 마진에 섞여 든다.)

좋은 DPO 쌍의 네 가지 조건

세 쌍에서 본 것을 조건으로 정리하면 이렇다.

조건 뜻 어기면
1. yl\textcolor{#e000a5}{y_l}이 그럴듯하다 (plausible) 모델이 실제로 생성할 법한 응답 쌍 A: 마진은 벌어지지만 행동은 안 바뀜
2. 차이가 판단 기준을 담는다 (informative) “서울 vs 부산” = 사실 정확성, “간결 vs 장황” = 스타일, “안전 vs 위험” = 안전성 무엇을 배워야 할지 모호
3. 품질 차이가 적당하다 평가자가 매긴 점수 차가 너무 크지도 작지도 않음 너무 크면 쌍 A처럼 자명, 너무 작으면 라벨 자체가 노이즈
4. yl\textcolor{#e000a5}{y_l}이 현재 모델의 분포 안에 있다 (on-distribution) πθ\textcolor{#1565c0}{\pi_\theta}가 실제로 내놓는 실수 없는 실수를 교정하는 낭비, 또는 왜곡

세 번째 조건의 "차이"는 평가자가 매긴 품질 점수의 차이다 — 모델 로그확률의 마진과 헷갈리지 말 것. 이미지 캡션 모델 JoyCaption(fpgaminer라는 이름으로 활동하는 제작자가 공개한 오픈소스 이미지 캡셔닝 모델 — 이미지를 보고 디퓨전 모델 학습용 캡션을 쓴다)의 제작자가 응답 10개를 뽑아 최상과 최하를 고른 것은 이 품질 차이를 확보하기 위해서였다.

네 번째 조건이 가장 근본적이다. 그리고 DPO의 구조적 한계와 직결된다. 그 이야기는 다음 절에서 하고, 먼저 조건 1~3을 문제로 확인하자.

문제 1 — 오답노트에 무엇을 적나

민준이 지난 모의고사에서 틀린 20문항을 이유별로 세어 보니 부호 실수 12, 단위 빠뜨림 8, 이름 안 씀 0이었다. 오답노트 한 쪽에 실수 한 가지를 적어 두면 다음 시험에서 그 실수가 절반으로 준다고 하자. (가) 부호 실수를 적으면 몇 문항을 건지나? 이름 안 씀을 적으면? (나) 이름을 안 쓰면 시험 전체가 0점이다. 그래도 (가)의 결론이 바뀌는가?

김민준 (자신만만)
김민준
이름 안 쓰면 시험이 통째로 0점이잖아요. 제일 치명적인 걸 적어야죠.
선생님 (질문)
선생님
민준 학생, 지난 모의고사에서 이름을 안 써서 0점 받은 적이 몇 번 있었죠?
김민준 (아하)
김민준
한 번도 없죠. 아, 0번을 절반으로 줄여도 0번이네요.
이서연 (평상)
이서연
부호 실수는 12개니까 적으면 6문항을 건져. 단위 빠뜨림은 4문항이고.
선생님 (평상)
선생님
그래요. 얼마나 치명적인지와 얼마나 자주 하는지는 따로예요. 오답노트가 줄이는 건 자주 하는 실수의 횟수예요.
이서연 (평상)
이서연
기댓값 계산이랑 같네요. 손해가 아무리 커도 일어날 확률이 0이면 곱은 0이에요. 확률론 수업에서 확률 0인 사건은 기댓값에 아무것도 보태지 않는다고 배운 거요.

정리 (가) 부호 실수는 12 → 6으로 6문항, 이름 안 씀은 0 → 0으로 0문항. (나) 바뀌지 않는다. 한 번도 하지 않는 실수는 아무리 치명적이어도 고쳐서 건질 것이 없다. 건지는 양은 그 실수를 하는 횟수에 비례한다.

문제 2 — 세 쌍 분류

다음 세 쌍이 각각 무엇을 가르치는지, 가장 약한 쌍은 무엇인지 쓰시오. (가) “서울입니다” vs “” (빈 응답) (나) “서울입니다” vs “서울특별시입니다” (다) “해열제는 4시간 간격으로 드세요” vs “해열제는 두 알씩 한 번에 드세요”

선생님 (평상)
선생님
세 쌍 가운데 모델이 가장 많이 배우는 쌍과 가장 적게 배우는 쌍은 무엇일까요?
김민준 (자신만만)
김민준
(가)는 쌍 A랑 같으니까 제일 약하고요, 제일 좋은 건 (나)예요. 둘 다 맞는 답 사이의 미묘한 차이니까, 쌍 C처럼 SFT로는 못 가르치는 걸 가르치잖아요.
선생님 (질문)
선생님
쌍 C의 두 답을 평가자 열 명에게 보이면 몇 명이 "서울입니다"를 고를까요? (나)의 두 답은요?
김민준 (생각)
김민준
쌍 C는 수도를 묻는데 한반도 지리를 늘어놓으니까 거의 다 짧은 쪽을 고를 것 같아요. (나)는… "서울특별시"가 더 정확하다는 사람도, "서울"이 깔끔하다는 사람도 있겠네요. 반반쯤?
이서연 (평상)
이서연
그럼 (나)의 라벨은 누가 매겼느냐에 따라 뒤집혀. 모델은 "짧게 말해라"도 "정식 이름을 써라"도 아니고, 동전 던지기를 배우는 거고.
선생님 (평상)
선생님
그래요. 차이가 작다고 섬세한 신호가 되는 건 아니에요. 품질 차이가 너무 작으면 라벨 자체가 노이즈가 돼요.
김민준 (평상)
김민준
조별 과제 동료 평가 같네요. 둘 다 잘한 친구 둘 가운데 누가 더 잘했냐고 물으면 평가하는 사람마다 답이 뒤집히는.
김민준 (평상)
김민준
그리고 (가)는 아까 오답노트 문제의 "이름 안 씀"이에요. 챗봇이 빈 응답을 낸 적이 거의 없으니 깎아 봐야 건질 게 없죠.
이서연 (평상)
이서연
남은 (다)는 둘 다 그럴듯한데 하나는 위험하니까, 안전성 경계를 배워. 이게 제일 좋은 쌍이야.

정리 (가) 가장 약함 — 모델이 원래 안 만드는 응답. (나) 품질 차이가 거의 없어 라벨이 불안정하다(조건 3). (다) 그럴듯하지만 미묘하게 위험한 응답과의 대비 — 안전성 경계를 가르치는 좋은 쌍.

문제 3 — (킬러) 엉터리 쌍은 왜 약한가

쌍 A: “서울입니다” vs “zxcgbhjdf”. 레퍼런스 로그확률은 log⁡πref(yw)=−0.5\log \textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_w}) = -0.5, log⁡πref(yl)=−60\log \textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#e000a5}{y_l}) = -60, β=0.1\textcolor{#827717}{\beta} = 0.1. (가) 학습 첫 스텝의 손실은? (나) 손실을 0.1까지 낮추려면 Δθ−Δref\textcolor{#1565c0}{\Delta_\theta} - \textcolor{#6f6f78}{\Delta_\text{ref}} 가 얼마여야 하는가? 그것을 yl\textcolor{#e000a5}{y_l} 쪽만 움직여 달성하면 "zxcgbhjdf"의 확률은 얼마가 되는가? (다) 같은 일을 쌍 B의 yl\textcolor{#e000a5}{y_l}=“부산입니다” (log⁡πref=−2.1\log \textcolor{#6f6f78}{\pi_\text{ref}} = -2.1)에 하면 부산의 확률은 얼마에서 얼마가 되는가? 두 경우에 모델이 다른 답으로 옮긴 확률은 각각 얼마인가?

김민준 (자신만만)
김민준
(가)는 쉬워요. 레퍼런스가 이미 둘을 엄청 잘 구분하잖아요. 마진이 59.5나 되니까 손실은 거의 0이에요.
선생님 (질문)
선생님
민준 학생, 첫 스텝에서 πθ\textcolor{#1565c0}{\pi_\theta} 와 πref\textcolor{#6f6f78}{\pi_\text{ref}} 는 어떤 관계죠?
김민준 (평상)
김민준
똑같죠. 레퍼런스를 복사해서 시작하니까… 아.
김민준 (당황)
김민준
그럼 Δθ=Δref=59.5\textcolor{#1565c0}{\Delta_\theta} = \textcolor{#6f6f78}{\Delta_\text{ref}} = 59.5 라서 빼면 0이고, −log⁡σ(0)=0.693-\log\sigma(0) = 0.693 이네요. 쌍 B랑 똑같아요.
선생님 (평상)
선생님
그래요. DPO는 절대 마진이 아니라 레퍼런스 대비 마진을 봐요. 그럼 서연 학생, 첫 스텝 손실이 같으니 쌍 A도 쌍 B만큼 좋은 쌍일까요?
이서연 (평상)
이서연
손실이 같고 그래디언트 크기 σ(0)=0.5\sigma(0)=0.5 도 같으니까… 수식상으로는 차이가 없어 보여요.
선생님 (질문)
선생님
그럼 (나)를 계산해 볼까요. 손실 0.1을 만들려면?
이서연 (평상)
이서연
−log⁡σ(βz)=0.1-\log\sigma(\textcolor{#827717}{\beta} \textcolor{#d9670b}{z}) = 0.1 이면 βz≈2.25\textcolor{#827717}{\beta} \textcolor{#d9670b}{z} \approx 2.25, β=0.1\textcolor{#827717}{\beta} = 0.1 이니까 z=22.5\textcolor{#d9670b}{z} = 22.5. yl\textcolor{#e000a5}{y_l} 쪽만 움직이면 log⁡πθ(yl)\log\textcolor{#1565c0}{\pi_\theta}(\textcolor{#e000a5}{y_l}) 을 22.5 내리면 돼요. −60-60 에서 −82.5-82.5 로.
선생님 (질문)
선생님
잠깐, 서연 학생. 왜 yl\textcolor{#e000a5}{y_l} 쪽만 움직였죠? "서울입니다"를 올려도 마진은 벌어지잖아요. 그쪽으로는 얼마나 더 올릴 수 있나요?
이서연 (생각)
이서연
확률은 1을 넘을 수 없으니까 로그확률은 0이 끝이에요. 지금 −0.5-0.5 니까 많아야 0.5 올라가요.
이서연 (깨달음)
이서연
그럼 yw\textcolor{#e000a5}{y_w} 쪽만으로는 z\textcolor{#d9670b}{z} 가 0.5에서 멈추고, 손실은 −log⁡σ(0.05)≈0.669-\log\sigma(0.05) \approx 0.669 라 0.1 근처에도 못 가요. 22.5 가운데 22 이상은 yl\textcolor{#e000a5}{y_l} 을 깎아서 채울 수밖에 없어요. 로그확률은 위로는 0에서 막히는데 아래로는 끝이 없으니까요.
선생님 (평상)
선생님
그래요. 손실이 가장 쉽게 줄어드는 길이 yl\textcolor{#e000a5}{y_l} 을 깎는 길이에요. 그럼 그 길로 가면 무엇이 바뀌는지 봅시다.
김민준 (평상)
김민준
확률로 바꾸면 e−60≈9×10−27e^{-60} \approx 9 \times 10^{-27} 에서 e−82.5≈1.5×10−36e^{-82.5} \approx 1.5 \times 10^{-36}. 원래도 0이었는데 더 0이 됐네요.
선생님 (평상)
선생님
(다)도 같은 계산을 해 보죠.
이서연 (평상)
이서연
"부산입니다"는 e−2.1≈0.12e^{-2.1} \approx 0.12 에서 e−24.6e^{-24.6} 으로, 거의 0. 확률 12%가 통째로 다른 답으로 옮겨가요.
이서연 (깨달음)
이서연
아, 손실은 둘 다 0.1로 똑같이 내려갔는데, 모델이 실제로 바뀐 양이 전혀 달라요. 쌍 A는 옮긴 확률 질량이 10−2610^{-26} 이고, 쌍 B는 0.12예요.
선생님 (평상)
선생님
그게 핵심이에요. 수식의 그래디언트 크기는 같아도, 마진을 여는 가장 싼 길이 쌍 A에서는 아무 의미 없는 길이에요. 손실 곡선만 보면 잘 배운 것처럼 보이죠.
이서연 (평상)
이서연
해석학 반례 수업이 생각나요. 정리의 조건이 왜 필요한지 보여줄 때, 0=10 = 1 같은 자명하게 틀린 반례는 아무것도 안 가르쳐 주잖아요. 조건 하나만 살짝 어긴 경계 반례가 가르쳐 주죠.
김민준 (평상)
김민준
나는 조교 채점이 떠올라. 백지 답안지에 빨간 줄 긋는 건 채점하는 사람도 배우는 사람도 얻는 게 없고, 거의 맞은 답안의 한 줄을 고쳐줄 때 배우잖아.

정리 (가) 첫 스텝에서 πθ=πref\textcolor{#1565c0}{\pi_\theta} = \textcolor{#6f6f78}{\pi_\text{ref}} 이므로 손실은 0.6930.693 — 쌍 B와 같다. (나) βz≈2.25⇒z=22.5\textcolor{#827717}{\beta} \textcolor{#d9670b}{z} \approx 2.25 \Rightarrow \textcolor{#d9670b}{z} = 22.5. yw\textcolor{#e000a5}{y_w} 쪽은 로그확률이 0에서 막혀 많아야 0.5밖에 못 보태므로(그때 손실 ≈0.669\approx 0.669) 나머지는 yl\textcolor{#e000a5}{y_l} 을 깎아 채운다. yl\textcolor{#e000a5}{y_l}의 확률은 ≈9×10−27→1.5×10−36\approx 9\times10^{-27} \to 1.5\times10^{-36}. (다) "부산입니다"는 0.12→2×10−110.12 \to 2\times10^{-11}. 옮긴 확률은 쌍 A가 ≈10−26\approx 10^{-26}, 쌍 B가 ≈0.12\approx 0.12. 쌍 A가 약한 이유는 그래디언트가 0이어서가 아니라, 마진을 벌리는 가장 싼 길이 모델의 실제 행동을 바꾸지 않는 길이기 때문이다. 손실은 줄지만 배운 것은 없다.