— PPO가 너무 무거워서 생긴 지름길. 보상 모델도 RL 루프도 없이, RLHF(사람의 선호로 학습한 보상 모델의 점수를 강화학습으로 올리는 절차)와 같은 목적함수를 수식 한 번의 변환으로 푼다. 이 파트는 그 변환을 따라간 뒤, 그 한 줄을 요소별로 해부한다.
Chapter 6: DPO의 재등장 — 보상 모델을 수식으로 지우다
의문
DPO는 좋은 답과 나쁜 답의 로그확률 차(마진)를, 학습 전 모델이 벌려 두었던 것보다 더 벌리도록 모델을 미는 손실 한 줄이다. 식으로는 −logσ(β(Δθ−Δref)) 이다(σ 는 시그모이드, Δθ 는 학습 중인 모델의 마진, Δref 는 학습 전 모델의 마진). 한 줄로 "레퍼런스 대비 마진을 벌린다"고 읽을 수 있다. 그런데 이 식은 어디서 왔을까?
RLHF는 보상 모델의 점수를 올리되, 레퍼런스 정책(학습 전 모델을 고정해 둔 비교 기준. 정책은 프롬프트를 받아 답을 고르는 언어모델)에서 멀어지는 만큼 벌점을 주는 목적함수를 최대화한다. 멀어진 정도는 KL 발산(두 확률분포가 얼마나 다른지 재는 양으로, 같으면 0)으로 잰다. (보상 모델 rψ를 이 장에서는 간단히 r로 쓴다.)
πmaxEy∼π(⋅∣x)[r(x,y)]−βKL(π∥πref)πr(x,y)βKLπref찾으려는정책 (최적화변수)보상 (보상모델rψ)KL 강도 (클수록짧은목줄)KL 발산레퍼런스정책 (고정)
PPO(이 목적함수를 강화학습으로 푸는 대표 알고리즘)는 이 식을 반복해서 푼다. 응답을 생성하고, 보상 모델로 채점하고, 비평가(앞으로 받을 점수를 예측하는 보조 모델)로 어드밴티지(그 토큰이 평균적인 선택보다 얼마나 나았나)를 구하고, 한 번에 너무 멀리 가지 않게 잘라 가며(클리핑) 조금씩 올라간다. 모델 네 개(정책·레퍼런스·보상 모델·비평가)가 필요하다. 그런데 이 목적함수는 생각보다 단순한 모양이다. 보상의 기대값에서 KL을 뺀 것. 이런 모양의 최적화 문제는 종종 닫힌 해(closed form)를 가진다.
최적해를 손으로 구할 수 있다면, 그 해를 거꾸로 뒤집어 보상을 정책으로 표현할 수 있지 않을까?
그러면 보상 모델을 따로 학습할 필요가 있을까?
DPO(라파일로프(Rafael Rafailov)와 동료들, 2023) 논문의 부제 *“Your Language Model is Secretly a Reward Model”*은 바로 이 질문에 대한 "그렇다"이다.
DPO 유도: 최적해를 뒤집어 보상 모델을 지운다
닫힌 해가 정말 있다면 어떤 모양일까? 그리고 그 해에서 어떻게 보상 모델을 지울 수 있을까? 세 단계로 따라가 보자. 세 단계 모두 손으로 풀리는 계산이다.
βlogZ(x)는 π와 무관하다. KL은 0 이상이고 두 분포가 같을 때만 0이다. 따라서 최적 정책은 π=π∗ 이다.
이 결과는 그 자체로 읽을 만하다. 최적 정책은 레퍼런스 분포에 보상의 지수 인자를 곱해 다시 맞춘 것이다. 곱하고, 더해서 Z 를 얻고, 나누는 세 걸음을 숫자로 따라가 보자. 응답은 셋만 두되, 레퍼런스가 가장 자주 고르는 응답의 보상을 가장 낮게, 레퍼런스가 드물게 고르는 응답의 보상을 가장 높게 잡는다. 레퍼런스의 습관과 보상이 서로 반대쪽을 가리켜야 둘이 어떻게 타협하는지 보이기 때문이다. β=1 로 둔다.
응답
πref
r
er/β
곱 πrefer/β
곱 ÷ Z = π∗
가
0.6
0
1.000
0.600
0.279
나
0.3
1
2.718
0.815
0.379
다
0.1
2
7.389
0.739
0.343
합
1
Z = 2.154
1
레퍼런스가 60%를 주던 가는 28%로 줄고, 10%뿐이던 다는 34%로 올랐다. 그래도 다가 1등이 되지는 않는다. 보상은 다가 가장 높지만 레퍼런스가 드물게 고르던 습관이 남아, 보상 1짜리 나가 38%로 앞선다. β 를 바꾸면 이 타협점이 움직인다.
β 가 크면 er/β 가 1에 가까워져 레퍼런스에서 조금만 움직이고(β=2 에서 0.44, 0.36, 0.20), β 가 작으면 높은 보상 쪽으로 확률이 몰린다(β=0.5 에서 다가 0.66). 레퍼런스에 묶는 목줄의 조임, 곧 KL 강도가 정확히 이 β다(클수록 짧은 목줄).
역사: 볼츠만이 센 경우의 수
방금 본 모양, 곧 기준 분포에 지수 인자를 곱하고 합으로 나눈 분포는 물리학이 먼저 만났다. 1877년 볼츠만(Ludwig Boltzmann)은 기체가 열평형에 이르렀을 때 분자들 사이에 에너지가 어떻게 나뉘는지를 확률로 답하려 했다. 에너지가 연속이면 나누는 방법을 셀 수 없으므로, 그는 분자 하나의 에너지가 0,ε,2ε,… 처럼 띄엄띄엄한 값만 가진다고 가정했다. 실제 역학과는 맞지 않지만 다루기 쉬운 가정이라고 스스로 밝힌 계산용 수였다. 그리고 손으로 셀 수 있는 예를 논문에 실었다. 분자 7개가 에너지 7ε 을 나눠 가지는 방법은, 어느 분자가 얼마를 가졌는지까지 구별하면 모두 1,716가지다. 이것을 「에너지 0인 분자가 몇 개, ε 인 분자가 몇 개 …」 같은 나눔 15가지로 묶으면, 가장 많은 방법(420가지)이 몰린 나눔은 셋이 0, 둘이 ε, 하나가 2ε, 하나가 3ε 이다. 에너지가 높은 칸일수록 분자가 적다. 이 셈을 연속인 에너지로 넓혀, 가장 흔한 나눔에서 에너지 E 인 분자의 몫이 e−hE 꼴로 줄어든다는 것이 그의 결론이었다(h 는 평균 에너지가 정하는 상수로, 오늘날 쓰는 1/kT 의 자리다. T 는 절대온도, k 는 볼츠만 상수). 1902년 기브스(Josiah Willard Gibbs)가 이 분포를 기체에 한정하지 않는 일반 꼴로 정리했다. 모든 상태에 대해 e−E/kT 를 더한 정규화 상수는 흔히 Z 로 쓴다(독일어 Zustandssumme, “상태들의 합”). 우리 식에서는 보상이 음의 에너지 자리에, β 가 kT 자리에 들어간다.
보상 = 최적 정책이 레퍼런스보다 이 응답을 얼마나 더 좋아하는가(로그비율) × β + 상수. 보상 모델과 최적 정책은 서로의 다른 이름일 뿐이다. 앞의 세 응답 표(β=1)로 확인해 보자. βlog(π∗/πref) 는 가 log(0.279/0.6)=−0.77, 나 0.23, 다 1.23 이다. 보상 0, 1, 2보다 셋 모두 똑같이 0.77 작고, 그 0.77이 βlogZ=log2.154 다.
문제는 Z(x)다. 응답이 셋이면 손으로 더하지만, 언어모델이 낼 수 있는 응답은 셀 수 없이 많아 그 합을 구할 수 없다. 여기서 보상 모델을 학습할 때 쓰던 쌍비교가 도움을 준다.
3단계: Bradley-Terry에 넣으면 Z가 사라진다
RLHF의 보상 모델은 쌍비교로 학습했다: P(yw≻yl)=σ(r(x,yw)−r(x,yl)). 이 식이 Bradley-Terry 모델(줄여서 BT — 두 대상의 점수 차를 시그모이드에 넣어 이길 확률로 보는 쌍비교 모델)이고, yw≻yl 은 「yw 가 yl 보다 더 선호된다」로 읽는다. 여기에 2단계의 표현을 대입한다. 두 응답은 같은 프롬프트 x를 공유하므로 βlogZ(x)가 빼기에서 상쇄된다.
정책이 곧 보상 모델이다. r^θ(x,y)=βlogπref(y∣x)πθ(y∣x)를 암묵적 보상(implicit reward)이라 부른다.
문제 1 — 반마다 다른 가산점
두 반의 수행평가 점수표를 받았다. 담임 선생님마다 자기 반 학생 모두에게 똑같은 가산점을 얹었는데, 가산점이 몇 점인지는 적혀 있지 않다. 1반은 지우 85점, 하늘 78점, 2반은 도윤 80점이다. (가) 가산점을 얹기 전, 지우는 하늘보다 몇 점 높았는가? (나) 가산점을 얹기 전, 지우와 도윤 가운데 누가 높았는가? (다) 나중에 알고 보니 1반 가산점은 10점, 2반은 2점이었다. (나)에 다시 답하시오.
김민준
(가)는 85 − 78 = 7점이요. 같은 가산점이 둘 다에 붙어 있으니까 빼면 그대로예요. (나)는 지우가 85점이니까 도윤보다 5점 높았죠.
선생님
민준 학생, (나)의 두 사람은 같은 가산점을 받았나요?
김민준
아니요, 반이 다르니까… 가산점을 모르면 그 5점이 실력 차인지 가산점 차인지 알 수가 없네요.
그래요. 모르는 수가 모두에게 똑같이 더해져 있으면, 같은 반 안의 차이는 그 수를 몰라도 믿을 수 있어요. 반을 넘는 비교는 그 수를 알아야 하고요.
정리 (가) 7점. 같은 반 두 사람에게 같은 가산점이 더해져 있으므로 빼면 사라진다. (나) 알 수 없다. 반마다 가산점이 다르면 점수표의 5점 차에 가산점 차가 섞인다. (다) 지우 75점, 도윤 78점 — 도윤이 높았다. 점수표의 순서가 뒤집힌다.
문제 2 — Z는 어디로 갔나
β=1. 프롬프트 x1 에는 응답 A, B가, 프롬프트 x2 에는 응답 C, D가 있다(각 프롬프트의 응답은 이 둘뿐). 레퍼런스 πref 는 네 응답 모두 0.5로 고른다. KL 제약 최적 정책 π∗ 는 A 0.12, B 0.88, C 0.73, D 0.27이다. (가) 네 응답의 βlog(π∗/πref) 를 구하시오. (나) 이 값만으로 B가 A보다, C가 D보다 보상이 얼마나 큰지 말할 수 있는가? (다) 이 값만으로 C가 A보다 보상이 크다고 말할 수 있는가? 실제 보상이 A 1, B 3, C 0, D −1이었다고 하고 확인하시오.
김민준
log(0.12/0.5) = −1.43, log(0.88/0.5) = 0.57, log(0.73/0.5) = 0.38, log(0.27/0.5) = −0.62. 줄 세우면 B, C, D, A. C가 A보다 1.8쯤 좋은 거죠.
이서연
같은 프롬프트 안의 차이는 B − A = 2.0, C − D = 1.0이야. 실제 보상 차 3 − 1, 0 − (−1)과 딱 맞아. 그런데 실제 보상은 A가 1, C가 0인데? A가 더 좋잖아.
선생님
2단계 식에서 이 값과 실제 보상 사이에 무엇이 더 있었죠?
이서연
β log Z(x)요. 보상은 이 값에 β log Z(x)를 더한 거예요.
선생님
그럼 Z는 무엇에 따라 값이 달라지죠?
이서연
모든 y에 대해 합을 냈으니까 y에는 안 달려 있어요. x에만 달려 있어요. x₁은 보상 3짜리 B가 있어서 Z가 크고, x₂는 보상이 0과 −1뿐이라 작아요.
김민준
아, 그러니까 같은 x에서 나온 두 응답의 보상을 빼면 β log Z(x)가 똑같이 들어 있어서 빠지는 거네요. 다른 프롬프트끼리 빼면 log Z(x₁) − log Z(x₂)가 남고요. 그게 2.43 − (−0.38) = 2.81이라 순서가 뒤집혔어요.
선생님
맞아요. 그럼 선호 데이터가 "x₁의 A가 x₂의 C보다 낫다"처럼 서로 다른 프롬프트끼리의 비교였다면요?
김민준
Z(x₁)이랑 Z(x₂)가 달라서 안 빠져요. 계산할 수 없는 게 남으니까 DPO를 못 써요.
김민준
아까 반마다 다른 가산점 문제랑 같네요. β log Z(x)가 반마다 얹힌 가산점이고요.
정리 (가) A −1.43, B 0.57, C 0.38, D −0.62. (나) 말할 수 있다. B − A ≈ 2.0, C − D ≈ 1.0으로 실제 보상 차와 같다. Z(x)는 응답이 아니라 프롬프트에만 의존하므로 같은 프롬프트의 두 응답을 빼면βlogZ(x)가 상쇄된다. (다) 말할 수 없다. 이 값으로는 C가 1.8 앞서지만 실제 보상은 A가 1 크다. 프롬프트가 다른 쌍에서는 βlogZ(x1)−βlogZ(x2)≈2.81 이 남아 DPO 식이 성립하지 않는다.
문제 3 — 암묵적 보상
β=0.1. 응답 y1을 πθ는 0.02, πref는 0.01의 확률로 생성한다. 응답 y2는 각각 0.001, 0.004다. 두 응답의 암묵적 보상을 구하고, 암묵적 보상 모델이 어느 쪽을 선호하는지 답하시오.