10. PPO와 RLHF: 멀리 가지 않게 묶다

KL 페널티: 레퍼런스에서 멀어진 만큼 물리는 값

보상 모델이 생겼으니, 그 점수를 PPO로 올리기만 하면 될까? 보상 모델은 SFT 모델이 만든 응답들로만 학습됐으므로, 정책이 그 근처를 벗어나면 보상 모델의 점수는 근거 없는 외삽(본 적 없는 곳까지 짐작으로 늘여 잡은 값)이 된다. 정책은 그 빈틈을 정확히 찾아낸다.

역사: 점수는 오르는데 요약은 망가졌다

빈틈은 사람의 비교로 보상 모델을 학습해 아타리 게임과 로봇 시뮬레이션을 가르친 크리스티아노(Paul Christiano)와 동료들(2017)의 실험에서 이미 드러났다. 보상 모델을 도중에 다시 학습하지 않고 처음 모은 비교로만 학습해 둔 채 퐁(Pong)을 배우게 하자, 에이전트는 점수를 잃지 않는 법만 배우고 점수를 따지는 않아 같은 랠리를 끝없이 되풀이하곤 했다.

스티넌 팀은 요약 태스크에서 리워드 해킹을 사람의 눈으로 쟀다. 같은 보상 모델을 두고 KL 페널티의 강도를 바꿔 가며 정책을 여럿 학습시키고 라벨러에게 판정하게 하니, 조금 밀었을 때는 요약이 좋아졌다. 더 밀자 사람의 선호는 보상 모델의 예측에서 떨어져 나갔고, 끝내는 보상 모델의 점수와 사람의 선호가 거꾸로 움직였다. 너무 밀어붙인 정책의 요약은 길었고, 글마다 같은 틀(「고집스럽게 미룬다 … 합리적인 타협을 시도했는데도??? … 이 방침을 바꾸고 싶다 도와줘」)에 철자가 틀린 말과 욕설이 섞여 있었다.

사람을 불러 판정하는 일은 비싸서 이 현상을 촘촘히 재기 어렵다. 가오(Leo Gao)·슐먼·힐턴(Jacob Hilton)은 2022년, 사람 대신 큰 보상 모델 하나를 "정답 심판"으로 세운 인공 실험으로 이것을 쟀다. 처음 정책에서 멀어진 정도를 KL로 잴 때, 학습에 쓴 보상 모델의 점수는 계속 오르는데 정답 심판의 점수는 오르다가 어느 거리부터 떨어졌다.

보상 모델이 매긴 점수 사람이 느끼는 실제 품질 여기서부터 갈라진다 점수 레퍼런스에서 멀어진 정도 (KL) 모양만 그린 그림(선의 값은 실험값이 아니다)

이렇게 보상 모델의 빈틈을 파고들어 점수만 올리는 것을 리워드 해킹(reward hacking)이라 한다. 길이만 늘리기, 아첨하기, 형식 꾸미기가 흔히 드는 꼴이고, 위의 틀에 박힌 요약도 그 하나다. 그렇다면 정책을 “보상 모델이 믿을 만한 동네” 안에 붙잡아 둘 장치가 필요하다.

RLHF의 셋째 단계

3단계: PPO. 보상 모델을 채점기로 삼아 PPO를 돌리되, 보상에 KL 페널티를 섞는다. 토큰마다 받는 보상 rtr_t(비율 rt(θ)r_t(\theta)가 아니다)는

rt=−βlog⁡πθ(yt∣st)πref(yt∣st)  +  {rψ(x,y)t=T (마지막 토큰)0그 외\textcolor{#d9670b}{r_t} = -\textcolor{#827717}{\beta} \log\frac{\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y_t} \mid \textcolor{#0093b8}{s_t})}{\textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#1c9c60}{y_t} \mid \textcolor{#0093b8}{s_t})} \;+\; \begin{cases} \textcolor{#d9670b}{r_\psi}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y}) & t = \textcolor{#915a08}{T} \text{ (마지막 토큰)} \\ 0 & \text{그 외} \end{cases}
rt토큰 t의 보상 (확률 비율 rt(θ)가 아님)βKL 강도 (클수록 정책이 레퍼런스에서 덜 멀어진다)πrefSFT 모델 (레퍼런스, 고정)rψ(x,y)보상 모델의 점수 (마지막 토큰에만) \small\begin{array}{ll} \textcolor{#d9670b}{r_t} & \text{토큰 }t\text{의 보상 (확률 비율 }\textcolor{#c2185b}{r_t(\theta)}\text{가 아님)} \\ \textcolor{#827717}{\beta} & \text{KL 강도 (클수록 정책이 레퍼런스에서 덜 멀어진다)} \\ \textcolor{#6f6f78}{\pi_\text{ref}} & \text{SFT 모델 (레퍼런스, 고정)} \\ \textcolor{#d9670b}{r_\psi}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y}) & \text{보상 모델의 점수 (마지막 토큰에만)} \end{array}

토큰 하나를 레퍼런스보다 더 자신 있게 고를 때마다 조금씩 KL 페널티를 받는다. 예: πθ(서울)=0.6\textcolor{#1565c0}{\pi_\theta}(\text{서울}) = 0.6, πref(서울)=0.3\textcolor{#6f6f78}{\pi_\text{ref}}(\text{서울}) = 0.3, β=0.1\textcolor{#827717}{\beta} = 0.1이면 이 토큰의 페널티는 0.1×log⁡2≈0.0690.1 \times \log 2 \approx 0.069. 페널티를 응답 전체에 걸쳐 더하면 βlog⁡πθ(y)πref(y)\textcolor{#827717}{\beta}\log\frac{\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y})}{\textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#1c9c60}{y})}이고, 그 기댓값이 β KL(πθ ∥ πref)\textcolor{#827717}{\beta}\,\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#6f6f78}{\pi_\text{ref}})다. 결국 RLHF가 최대화하는 것은

max⁡θ  Ey∼πθ[rψ(x,y)]  −  β KL(πθ ∥ πref)\max_\theta \; \mathbb{E}_{\textcolor{#1c9c60}{y} \sim \textcolor{#1565c0}{\pi_\theta}}\big[\textcolor{#d9670b}{r_\psi}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y})\big] \;-\; \textcolor{#827717}{\beta}\,\textcolor{#8c564b}{\mathrm{KL}}\big(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#6f6f78}{\pi_\text{ref}}\big)
rψ보상 모델의 점수KL레퍼런스에서 멀어진 정도βKL 강도πθ, πref학습 중인 정책과 SFT 레퍼런스 \small\begin{array}{ll} \textcolor{#d9670b}{r_\psi} & \text{보상 모델의 점수} \\ \textcolor{#8c564b}{\mathrm{KL}} & \text{레퍼런스에서 멀어진 정도} \\ \textcolor{#827717}{\beta} & \text{KL 강도} \\ \textcolor{#1565c0}{\pi_\theta},\ \textcolor{#6f6f78}{\pi_\text{ref}} & \text{학습 중인 정책과 SFT 레퍼런스} \end{array}

둘째 항 β KL(πθ ∥ πref)\textcolor{#827717}{\beta}\,\textcolor{#8c564b}{\mathrm{KL}}(\textcolor{#1565c0}{\pi_\theta} \,\|\, \textcolor{#6f6f78}{\pi_\text{ref}}) 가 모델을 레퍼런스에 묶어 두는 KL 페널티다. 모양은 단순해서, 보상의 기댓값에서 레퍼런스와의 거리(KL)에 β\textcolor{#827717}{\beta} 를 곱해 뺀 것이다. 정책을 보상 모델이 학습한 응답들 근처, 곧 “보상 모델이 믿을 만한 동네” 안에 머물게 한다.

(InstructGPT는 여기에 프리트레인 데이터의 로그우도(그 데이터가 나올 확률의 로그) 항을 조금 섞어, 얼라인먼트(사람이 바라는 방식으로 답하게 맞추기)를 하면서 일반 능력이 떨어지는 현상인 얼라인먼트 세금(alignment tax)을 줄였다. 이 변형을 PPO-ptx라 부른다.)

ML에서: RLHF가 무거운 이유, 네 개의 모델

PPO로 RLHF를 돌리려면 메모리에 네 개의 모델이 동시에 올라간다.

모델 역할 학습하나? 어디서 왔나
정책 πθ\textcolor{#1565c0}{\pi_\theta} 응답 생성, 업데이트 대상 ✓ SFT 모델에서 시작
비평가 Vϕ\textcolor{#00897b}{V_\phi} 토큰별 가치 추정 → 어드밴티지 ✓ 보상 모델에서 시작(InstructGPT)
레퍼런스 πref\textcolor{#6f6f78}{\pi_\text{ref}} KL 페널티 계산 ✗ (고정) SFT 모델 사본
보상 모델 rψ\textcolor{#d9670b}{r_\psi} 응답 채점 ✗ (고정) 2단계에서 학습
graph LR
    P["π_θ 정책<br/>(학습)"] -->|"응답 생성"| Y["응답 y"]
    Y --> RM["r_ψ 보상 모델<br/>(고정)"]
    Y --> REF["π_ref 레퍼런스<br/>(고정)"]
    Y --> V["V 비평가<br/>(학습)"]
    RM -->|"점수"| ADV["보상 − β·KL<br/>→ GAE 어드밴티지"]
    REF -->|"KL 페널티"| ADV
    V -->|"베이스라인"| ADV
    ADV -->|"L_CLIP"| P

대략의 크기를 보자. 7B(파라미터 70억 개) 모델을 bf16(16비트 부동소수점, 파라미터당 2바이트)으로 올리면 파라미터만 약 14GB다. 학습하는 정책과 비평가는 파라미터 값·그래디언트·Adam(널리 쓰는 옵티마이저) 상태까지 파라미터당 약 16바이트가 들어 하나에 약 112GB다. RLHF에서 새로 붙는 것은 고정된 두 모델(레퍼런스와 보상 모델, 각 약 14GB)이다. 넷을 합치면 250GB를 넘고, 여기에 생성용 KV 캐시(생성하면서 앞 토큰들의 계산 결과를 담아 두는 메모리)와 활성값이 붙는다. 게다가 생성과 학습이 번갈아 도는 구조라 엔지니어링이 까다롭고, 하이퍼파라미터(ϵ\textcolor{#1f6d7a}{\epsilon}, β\textcolor{#827717}{\beta}, GAE의 λ\textcolor{#993600}{\lambda}, 가치 손실 계수, 에폭 수…)가 많아 튜닝이 어렵다.

두 개의 모델만이라도 없앨 수 있다면? 그 뒤의 연구는 두 가지로 나뉘었다.

문제 9: (킬러) 클리핑이 있는데 KL은 왜

민준: “ϵ=0.2\textcolor{#1f6d7a}{\epsilon} = 0.2로 클리핑하니까 모델은 원래 SFT 모델에서 20% 이상 못 멀어져요. KL 페널티는 중복이니 빼도 됩니다.” 서연: “클리핑이 누적된다는 건 알겠어. 그런데 KL 페널티도 결국 한 스텝의 변화만 제한하니까, 둘 다 똑같이 누적되는 거 아니야?” 두 주장의 오류를 각각 밝히고, 10번·50번 반복 뒤 가능한 최대 비율을 계산하시오.

칠판에 “ε = 0.2 → SFT 모델에서 최대 20%” 라고 민준이 적어 두었다.
선생님 (평상)
선생님
민준 학생, 클리핑의 비율 r은 무엇과 무엇의 비율이었죠?
김민준 (평상)
김민준
π_θ 나누기 π_old요.
선생님 (평상)
선생님
π_old는 언제 바뀌죠?
김민준 (평상)
김민준
매 반복 끝에 π_θ로 교체…
김민준 (당황)
김민준
아. 기준이 계속 따라오네요.
선생님 (질문)
선생님
그럼 한 반복에 최대 1.2배씩, 10번 반복하면 어떤 토큰의 확률은 처음보다 최대 몇 배까지 갈 수 있을까요?
김민준 (평상)
김민준
1.2의 10제곱… 돌려보면 6.19배요. 50번이면 9100배. 확률이 1을 넘을 순 없으니까, 사실상 0.0001이던 토큰이 거의 1이 될 수 있다는 거네요.
선생님 (평상)
선생님
20%라는 건 어디서 온 숫자였을까요?
김민준 (평상)
김민준
한 스텝의 크기 제한이었어요. 스텝을 몇 번 밟는지는 안 정해져 있고요.
김민준 (좌절)
김민준
제가 스텝 크기를 전체 거리로 읽었네요.
김민준 (평상)
김민준
러닝 앱 같아요. 한 번에 1km씩만 뛰라고 해도, 매일 뛰면 한 달 뒤엔 30km 떨어진 데 있을 수 있는 거.
이서연 (평상)
이서연
거기까진 나도 알아. 누적되니까 클리핑만으론 레퍼런스에서 멀어지는 걸 못 막아. 그런데 KL 페널티도 매 스텝 계산하잖아. 매 스텝 조금씩 벌주는 거면 그것도 똑같이 누적되는 거 아니야?
선생님 (질문)
선생님
서연 학생, KL 페널티의 분모에는 누가 있죠?
이서연 (평상)
이서연
π_ref…
이서연 (놀람)
이서연
π_old가 아니라 π_ref네요.
선생님 (평상)
선생님
π_ref는 언제 바뀌죠?
이서연 (평상)
이서연
안 바뀌어요. SFT 모델로 고정이에요. 그러니까 이건 한 스텝의 크기 제한이 아니라, 출발점에서 지금까지의 전체 거리를 매번 재는 거네요. 멀리 갈수록 페널티가 계속 커지고요.
이서연 (깨달음)
이서연
클리핑은 이웃한 두 항 사이의 차이를 제한하는 거고, KL은 수열 전체가 한 고정점 근처에 있게 하는 거예요. 인접항 차이가 작아도 발산하는 수열은 얼마든지 있잖아요. 조화급수처럼요.
선생님 (미소)
선생님
좋은 예예요. 두 장치는 기준점이 달라요. 클리핑의 기준은 움직이는 π_old, KL의 기준은 고정된 π_ref예요. 그래서 둘 다 필요해요.
김민준 (평상)
김민준
그럼 DAPO(2025년에 나온, 수학 문제를 정답 채점기로 학습하는 방법) 같은 데서 KL을 뺐다는 얘기는 뭐예요? 들은 적 있는데.
선생님 (평상)
선생님
좋은 질문이에요. DAPO 논문은 긴 풀이를 배우는 모델은 처음 모델에서 크게 멀어져야 하니 이 KL 페널티가 필요 없다고 봤어요. 보상도 해킹하기 어려운 정답 채점기였고요. 보상 모델이라는 믿을 수 없는 심판이 있을 때 KL 페널티가 필요한 거죠.

정리 민준: 클리핑의 기준 πold\textcolor{#6f6f78}{\pi_\text{old}}는 매 반복 업데이트되므로 제한이 누적된다(1.210≈6.191.2^{10} \approx 6.19, 1.250≈91001.2^{50} \approx 9100). 서연: KL 페널티의 기준 πref\textcolor{#6f6f78}{\pi_\text{ref}}는 고정이라 누적된 전체 거리에 페널티를 준다. 클리핑은 한 반복의 스텝 크기 제한, KL 페널티는 출발점(레퍼런스)에서의 누적 거리 제한이다. 보상 모델이 불완전한 RLHF에서는 둘 다 필요하다.