사람은 "좋은 비서 응답(assistant response)"에 대한 보상 함수(reward function)를 직접 손으로 쓸 수 없습니다. 하지만 두 응답을 나란히 비교하고 더 나은 쪽을 고르는 일은 어렵지 않습니다. 그렇게 모은 비교 데이터에 보상 모델(reward model)을 학습시키고, 그 보상 모델을 목표로 언어 모델(language model)에 강화학습(RL)을 적용합니다. Christiano 2017, InstructGPT 2022가 바로 이 접근입니다. GPT-3를 ChatGPT로 바꿔 놓은 표준 방법이며, 2026년에는 대부분 DPO로 대체되고 있지만 그 사고 모형(mental model)은 여전히 유효합니다.
유형: Build
언어: Python
선수 지식: Phase 5 · 05 (Sentiment), Phase 9 · 08 (PPO)
예상 시간: 약 45분
문제
다음 토큰 예측(next-token-prediction) 목적 함수로 언어 모델을 학습했다고 가정해 봅시다. 문법적으로 자연스러운 영어 문장은 잘 만들어 냅니다. 그러나 동시에 거짓말을 늘어놓고, 장황하게 떠들고, 거절해야 할 상황에서 거절하지 못합니다. 이 문제는 사전학습(pretraining)을 더 많이 시킨다고 해결되지 않습니다. 웹 텍스트(web text) 자체가 원인이지 치료제가 아니기 때문입니다.
우리에게 필요한 것은 "지시문 X에 대해 응답 A가 응답 B보다 낫다"고 말해 주는 *스칼라 보상(scalar reward)*입니다. 이 보상 함수를 사람이 직접 손으로 작성하는 것은 사실상 불가능합니다. "도움이 됨(helpfulness)"이라는 개념은 토큰들 위에 정의되는 닫힌 형태의 식(closed-form expression)이 아니기 때문입니다. 그러나 사람은 두 출력을 나란히 두고 어느 쪽이 더 좋은지 선호(preference)를 표시할 수는 있고, 이는 대규모로도 비교적 저렴하게 수집할 수 있는 데이터입니다.
RLHF(Christiano et al. 2017; Ouyang et al. 2022)는 이러한 선호 데이터를 보상 모델로 변환한 뒤, 그 보상에 대해 PPO로 언어 모델을 최적화하는 방식입니다. 세 단계로 정리하면 SFT → RM → PPO입니다. 이 절차가 바로 2023-2025년 사이에 ChatGPT, Claude, Gemini를 비롯한 모든 정렬된(aligned) 대규모 언어 모델을 세상에 내놓은 표준 레시피입니다.
2026년에는 PPO 단계가 대부분 DPO(Phase 10 · 08)로 대체됩니다. 계산 비용이 더 싸고 정렬 튜닝(alignment tuning) 품질이 거의 비슷하기 때문입니다. 다만 보상 모델 부분은 여전히 살아남아서, Best-of-N 샘플러(sampler), 검증 가능한 보상에서 학습하는 강화학습(RL-from-verifiable-rewards) 파이프라인, 그리고 과정 보상 모델(Process Reward Model; PRM)을 쓰는 추론 모델 모두의 토대 역할을 합니다. RLHF를 이해하면 결국 전체 정렬(alignment) 스택을 이해하는 셈입니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.사전학습된 LLM이 문법적으로 자연스러운 텍스트를 생성하지만, 장황하거나 부정확하거나 도움을 거부하는 경우가 많습니다. 왜 더 많은 웹 텍스트로 학습시키는 것으로는 이 문제를 해결할 수 없나요?
2.RLHF는 사람이 y_+를 선호한다고 라벨링한 쌍(y_+, y_-)으로 선호 데이터를 수집합니다. 사람에게 절대적인 품질 점수를 매기라고 하는 대신 쌍대 비교(pairwise comparison)를 사용하는 이유는 무엇인가요?
0/2 답변 완료
개념
Stage 1: 지도 미세조정(Supervised Fine-Tuning; SFT). 사전학습된 기반 모델(pretrained base model)에서 시작합니다. 목표 행동(target behavior)에 대한 사람 작성 시연 데이터(demonstration), 예를 들어 지시를 따르는 응답(instruction-following responses)이나 도움이 되는 답변(helpful replies) 등으로 미세조정합니다. 그 결과로 좋은 행동 쪽으로 편향된(biased) 모델 π_SFT를 얻습니다. 다만 행동 공간(action space)은 여전히 무한정 열려 있습니다.
Stage 2: 보상 모델(Reward Model) 학습.
프롬프트(prompt) x에 대해 응답 쌍 (y_+, y_-)를 수집하고, 사람이 "y_+가 y_-보다 선호된다"라고 라벨을 답니다.
KL penalty는 π_θ가 π_SFT에서 너무 멀리 벗어나는 것을 막아 줍니다. 이는 단단한 신뢰 영역(hard trust region)이 아니라 *규제 항(regularizer)*에 해당하며, β는 보통 0.01-0.05 범위를 씁니다.
이 보상으로 PPO(Lesson 08)를 실행합니다. 어드밴티지(advantage)는 토큰 단위(token-level) 궤적에서 계산하지만, 보상 모델은 전체 응답(full response)에 대해서만 점수를 매깁니다.
왜 KL이 필요한가요? KL 항이 없으면 PPO는 곧장 보상 해킹(reward-hacking) 전략을 찾아냅니다. 보상 모델은 분포 안(in-distribution) 응답에서만 학습되었기 때문에, 분포 밖(out-of-distribution) 응답이 오히려 사람이 쓴 어떤 답변보다 더 높은 점수를 받을 수 있습니다. KL 항은 π_θ를 보상 모델이 학습된 다양체(manifold) 근처에 묶어 두는 역할을 합니다. RLHF에서 가장 중요한 단 하나의 조정 손잡이(knob)입니다.
2026년 현황:
DPO(Rafailov 2023): 닫힌 형태의 대수 변형(closed-form algebra)을 통해 Stage 2와 Stage 3을 선호 데이터(preference data) 위의 단일 지도학습 손실(supervised loss)로 접어 버립니다. 별도의 보상 모델도, PPO도 필요 없습니다. 훨씬 적은 계산량으로도 정렬 벤치마크(alignment benchmark)에서 비슷한 품질을 냅니다. Phase 10 · 08에서 다룹니다.
GRPO(DeepSeek 2024-2025): 크리틱(critic) 대신 그룹 상대 베이스라인(group-relative baseline)을 쓰는 PPO 변형이며, 사람으로 학습한 보상 모델 대신 검증기(verifier)(예: 코드가 실행되는지, 수학 답이 일치하는지)로부터 보상을 받습니다. 추론 모델(reasoning model)에서 지배적인 방법이며 Phase 9 · 12에서 다룹니다.
과정 보상 모델(Process Reward Models; PRMs): 부분 풀이 즉 각 추론 단계(reasoning step)에 점수를 매깁니다. 추론용 RLHF 및 GRPO 변형 모두에서 사용됩니다.
헌법적 AI(Constitutional AI) / RLAIF: 사람 대신 정렬된 LLM이 선호 라벨을 생성합니다. 이렇게 하면 선호 라벨 예산(preference budget)을 크게 확장할 수 있습니다.
직접 만들기
이 lesson은 문자열로 표현한 작은 합성(synthetic) "프롬프트"와 "응답"을 사용합니다. 보상 모델은 토큰 가방(bag-of-tokens) 표현 위의 선형 점수 함수(linear scorer)입니다. 실제 LLM은 등장하지 않습니다. 여기서 중요한 것은 규모가 아니라 파이프라인의 형태(shape) 입니다. 자세한 코드는 code/main.py에서 확인할 수 있습니다.
실제 RLHF에서는 이 부분이 사람 라벨러(human labeler)로 대체됩니다. 데이터의 형태 (prompt, preferred_response, rejected_response) 자체는 동일합니다.
Step 2: Bradley-Terry 보상 모델
선형 점수는 R(x, y) = w · bag(y)로 정의합니다. Bradley-Terry 쌍대 로그 손실(pairwise log-loss)을 최소화하도록 학습합니다.
defrm_train_step(w, x, y_pos, y_neg, lr):
r_pos = dot(w, bag(y_pos))
r_neg = dot(w, bag(y_neg))
p = sigmoid(r_pos - r_neg)
for tok, cnt in bag(y_pos).items():
w[tok] += lr * (1 - p) * cnt
for tok, cnt in bag(y_neg).items():
w[tok] -= lr * (1 - p) * cnt
수백 번 갱신을 거치면 w는 좋은 단어 토큰에는 양의 가중치(positive weight)를, 나쁜 단어 토큰에는 음의 가중치(negative weight)를 부여하게 됩니다.
Step 3: 보상 모델 위의 PPO 스타일 정책
이 토이 정책(toy policy)은 어휘집(vocabulary)에서 단일 토큰 하나를 생성합니다. 보상 모델로 그 토큰의 점수를 매기고, log π_θ(token | prompt)를 계산하고, 기준 모델 대비 KL penalty(KL-to-reference penalty)를 더한 뒤, 잘라낸 PPO 대리 목적 함수(clipped PPO surrogate)를 적용합니다.
매 갱신마다 평균 KL(π_θ || π_ref)를 추적합니다. 이 값이 ~5-10을 넘기 시작하면 정책이 π_SFT에서 멀리 벗어났다는 신호로, β가 너무 낮거나 보상 해킹이 시작되고 있다는 뜻입니다. 실제 RLHF에서 가장 중요한 진단 지표(diagnostic)입니다.
Step 5: TRL을 사용한 실제 운영용 레시피
토이 파이프라인을 이해했다면, 실제 라이브러리 사용자가 같은 루프를 어떻게 작성하는지 살펴봅시다. 허깅페이스(Hugging Face)의 TRL이 사실상의 참조 구현(reference implementation)이며, Stage 2에는 RewardTrainer를, Stage 3에는 KL-to-reference가 기본 내장된 PPOTrainer를 사용합니다.
# Stage 2: 쌍대 선호 데이터로부터 보상 모델 학습from trl import RewardTrainer, RewardConfig
from transformers import AutoModelForSequenceClassification, AutoTokenizer
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
rm = AutoModelForSequenceClassification.from_pretrained(
"meta-llama/Llama-3.1-8B-Instruct", num_labels=1
)
# 데이터셋의 각 행: {"prompt", "chosen", "rejected"} — Bradley-Terry 형식
trainer = RewardTrainer(
model=rm,
tokenizer=tok,
train_dataset=preference_data,
args=RewardConfig(output_dir="./rm", num_train_epochs=1, learning_rate=1e-5),
)
trainer.train()
# Stage 3: SFT 기준 모델 대비 KL penalty를 두고 RM에 대해 PPO 수행from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead
policy = AutoModelForCausalLMWithValueHead.from_pretrained("./sft-checkpoint")
ref = AutoModelForCausalLMWithValueHead.from_pretrained("./sft-checkpoint") # 동결(frozen)
ppo = PPOTrainer(
config=PPOConfig(learning_rate=1.41e-5, batch_size=64, init_kl_coef=0.05,
target_kl=6.0, adap_kl_ctrl=True),
model=policy, ref_model=ref, tokenizer=tok,
)
for batch in dataloader:
responses = ppo.generate(batch["query_ids"], max_new_tokens=128)
rewards = rm(torch.cat([batch["query_ids"], responses], dim=-1)).logits[:, 0]
stats = ppo.step(batch["query_ids"], responses, rewards)
# stats에는 mean_kl, clip_frac, value_loss — PPO 진단 3종 세트가 들어 있습니다
이 라이브러리가 대신 처리해 주는 일은 크게 세 가지입니다. 첫째, adap_kl_ctrl=True는 적응적 β 일정(adaptive-β schedule)을 구현합니다. 관측된 KL이 target_kl을 넘으면 β를 두 배로 늘리고, 절반 아래로 내려가면 β를 절반으로 줄입니다. 둘째, 기준 모델은 관례상 동결되어 있으며, 정책 모델(policy)과 파라미터를 실수로 공유해서는 안 됩니다. 셋째, 값 머리(value head)는 정책과 같은 백본 위에 함께 얹혀 있는데, AutoModelForCausalLMWithValueHead가 그 위에 스칼라 다층 퍼셉트론 헤드(scalar MLP head)를 붙여 줍니다. 바로 이 구조 때문에 TRL은 policy/kl과 value/loss를 각각 분리해서 보고합니다.
주의할 점
과최적화 / 보상 해킹(Over-optimization / reward hacking). 보상 모델은 본질적으로 불완전합니다. 그래서 π_θ는 점수는 높지만 실제로는 나쁜 적대적 응답(adversarial completion)을 찾아내곤 합니다. 증상은 보상은 끝없이 오르는데 사람의 평가 점수(human eval score)는 정체하거나 오히려 떨어지는 것입니다. 해결책은 일찍 멈추기(early stopping), β 키우기, 보상 모델 학습 데이터의 폭 넓히기입니다.
길이 해킹(Length hacking). 도움이 되는 응답으로 학습한 보상 모델은 암묵적으로 응답 길이를 보상하는 경향이 있습니다. 그러면 정책은 응답을 늘려서 패딩(padding)하는 방법을 배우게 됩니다. 해결책은 길이 정규화 보상(length-normalized reward)이나 길이를 인식하는 보상 모델을 함께 쓰는 RLAIF입니다.
너무 작은 보상 모델(Too-small RM). 보상 모델은 적어도 정책 모델만큼은 커야 합니다. 너무 작은 보상 모델은 정책 출력에 대해 충실하게 점수를 매길 수 없습니다.
KL 튜닝(KL tuning). β가 너무 낮으면 표류(drift)와 보상 해킹이 일어나고, 반대로 β가 너무 높으면 정책이 거의 바뀌지 않습니다. 표준적인 요령은 매 step마다 일정한 KL 목표치를 유지하는 적응적(adaptive) β를 쓰는 것입니다.
선호 데이터 잡음(Preference-data noise). 사람이 단 라벨의 약 30%는 잡음이 섞이거나 모호합니다. 라벨러 일치도(agreement)로 거른 데이터로 보상 모델을 학습하거나 Bradley-Terry에 온도(temperature)를 적용해 보정합니다.
오프 폴리시 문제(Off-policy problems). PPO 데이터는 첫 에폭(epoch) 이후로는 약간 오프 폴리시(off-policy) 상태가 됩니다. Lesson 08에서처럼 clip 비율(clip fraction)을 함께 모니터링합니다.
RLHF는 2022-2024년의 바로 그(the) 방법이었습니다. 2026년의 실제 운영 정렬 파이프라인은 DPO를 우선으로 쓰고, PPO는 보상 모델이 핵심이 되는 단계나 안전성이 중요한 단계에만 제한적으로 사용합니다.
산출물 만들기
outputs/skill-rlhf-architect.md로 저장합니다.
---
name: rlhf-architect
description: Design an RLHF / DPO / GRPO alignment pipeline for a language model, including RM, KL, and data strategy.
version: 1.0.0
phase: 9
lesson: 9
tags: [rl, rlhf, alignment, llm]
---
Given a base LM, a target behavior (alignment / reasoning / refusal / agent), and a preference or verifier budget, output:
1. Stage. SFT? RM? DPO? GRPO? With justification.
2. Preference or verifier source. Humans, AI feedback, rule-based, unit-test-pass, or reward distillation.
3. KL strategy. Fixed β, adaptive β, or DPO (implicit KL).
4. Diagnostics. Mean KL, reward stability, over-optimization guard (holdout human eval).
5. Safety gate. Red-team set, refusal rate, safety RM separate from helpfulness RM.
Refuse to ship RLHF-PPO without a KL monitor. Refuse to use an RM smaller than the target policy. Refuse length-only rewards. Flag any pipeline that does not hold back a blind human-eval set as lacking over-optimization protection.
연습문제
쉬움.code/main.py에 있는 Bradley-Terry 보상 모델을 합성 선호 쌍 500개로 학습합니다. 그리고 100쌍의 검증용(held-out) 데이터에서 쌍대 정확도(pairwise accuracy)를 측정합니다. 90%는 넘겨야 합니다.
중간.β ∈ {0.0, 0.1, 1.0}로 토이 PPO-RLHF 루프를 실행합니다. 각 β에 대해 갱신 단계별 보상 모델 점수(RM score)와 기준 모델 대비 KL 값을 함께 그려 봅니다. 어떤 실행이 보상 해킹을 일으키나요?
어려움. 같은 선호 데이터에 대해 DPO(닫힌 형태의 선호 가능도 손실; closed-form preference-likelihood loss)를 직접 구현하고, 사용한 계산량과 최종 보상 모델 점수를 RLHF-PPO 파이프라인과 비교해 봅니다.
핵심 용어
용어
흔한 설명
실제 의미
RLHF
"정렬용 강화학습(Alignment RL)"
세 단계 SFT + RM + PPO 파이프라인이다(Christiano 2017, Ouyang 2022).
보상 모델(Reward Model; RM)
"점수 매기는 신경망(Scoring net)"
Bradley-Terry로 쌍대 선호 데이터에 맞춰 학습한 스칼라 함수이다.
Bradley-Terry
"쌍대 로지스틱 손실(Pairwise logistic loss)"
P(y_+ ≻ y_-) = σ(R(y_+) - R(y_-))이며 표준 RM 목적 함수이다.
KL 페널티(KL penalty)
"기준 모델 근처에 머물러라"
보상 안의 `β · KL(π_θ
보상 해킹(Reward hacking)
"굿하트의 법칙(Goodhart's law)"
정책이 보상 모델의 결함을 이용한다. 증상은 보상은 오르고 사람 평가 점수는 그대로인 것이다.
RLAIF
"AI가 라벨링한 선호"
라벨이 사람 대신 다른 LM에서 오는 RLHF이다.
과정 보상 모델(PRM)
"과정 보상 모델(Process Reward Model)"
추론 파이프라인에서 부분 추론 단계에 점수를 매기는 모델이다.
헌법적 AI(Constitutional AI)
"Anthropic의 방법"
명시적 규칙(explicit rules)에 따라 안내된, AI가 생성한 선호 데이터로 학습한다.