Base model에서 Assistant까지: SFT, RLHF, DPO, GRPO
base model은 질문에 답하지 않고 텍스트를 이어 씁니다. SFT, reward model, DPO, GRPO가 assistant를 만드는 과정을 봅니다.
이 페이지에서
GPT-2 — 충분히 잘 사전 학습된 언어 모델 — 에게 바다에 관한 하이쿠를 써 달라고 해 봅시다:
prompt: Write a haiku about the sea.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.모델이 혼란스러운 것도 아니고, 자기 일을 실패한 것도 아닙니다. 그것은 10장에서 학습한 일을 정확히 하고 있습니다. 어떤 텍스트가 주어지면, 그럴듯하게 이어질 텍스트를 생성하는 일입니다. 인터넷에서 Write a haiku about the sea. 같은 문장 뒤에는 바다에 관한 산문이 이어지는 경우가 많고, 방금 등장한 문장은 다시 등장할 가능성이 유난히 높습니다. 이 모델은 뛰어난 다음 token 예측기이지만 쓸모없는 assistant입니다.
이제 같은 방식으로 만들어진 모델 — Qwen2.5, 5억 개 파라미터, 위 GPT-2보다 네 배 큰 모델이지만 2026년 기준으로는 여전히 작은 모델 — 에 이 장에서 다룰 학습 단계를 거친 뒤 같은 요청을 해 봅니다:
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.파라미터가 네 배라고 해서 모델이 말을 멈추는 법을 배우지는 않습니다. 두 출력 사이의 간극은 규모도, 아키텍처도, 데이터 양도 아닙니다. 그것은 post-training입니다. 사전 학습보다 몇 자릿수나 작은 두 번째 단계가 텍스트 예측기를 답변하는 무언가로 바꿉니다.
Stage one: 답변이 어떻게 생겼는지 보여 주기
섹션 링크: Stage one: 답변이 어떻게 생겼는지 보여 주기첫 단계는 가장 화려하지 않지만 대부분의 일을 해냅니다. 지시와 좋은 응답이 짝지어진 예시를 모아 8장의 손실 — 다음 token 예측 — 을 그대로 사용해 계속 학습합니다. 다만 응답 부분에 대해서만 학습합니다. 이것이 supervised fine-tuning, 즉 SFT입니다.
언어에 관해 새로 가르치는 것은 없습니다. 가르치는 것은 형식입니다. 이런 모양의 텍스트 뒤에는 저런 모양의 텍스트가 오고, 그런 다음 멈춘다는 것입니다. base model의 실패를 다시 보세요. 첫 문장에서 질문에 답했지만 그 뒤 멈추지 못했습니다. 학습 과정 어디에도 응답의 끝을 표시하는 것이 없었기 때문입니다. 멈추기는 학습된 행동입니다.
그래서 모델은 경계가 어디인지도 알아야 합니다. 이것이 chat template이 하는 일입니다:
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
What is the capital of France?<|im_end|>
<|im_start|>assistant저 <|im_start|> 및 <|im_end|> 마커는 fine-tuning 전에 추가된 어휘 속 실제 token이며, 모델은 정확히 이 위치에서 그런 token을 수백만 번 보았습니다. 모델은 그것으로 지금 누구 차례인지, 한 턴이 어디에서 끝나는지 압니다.
template을 생략하고 모델에 날것의 질문만 건네면, 학습에서 본 적 없는 시퀀스를 주는 셈입니다. 같은 모델, 같은 질문, 같은 greedy decoding으로 측정하면 다음과 같습니다:
template 없음 — 원시 문자열 What is the capital of France?:
The capital of France is Paris.
To verify this, I will use a simple
Python code snippet to confirm that
Paris is indeed the capital city of
France.
[...and then it starts writing a
Python script to check its own answer]template 사용:
The capital of France is Paris.둘 다 답은 맞지만, 마커가 없으면 모델은 스스로 확인하려고 Python 코드를 쓰는 쪽으로 흘러갑니다. 받은 prompt가 fine-tuning 때 본 것과 전혀 닮지 않았기 때문입니다. “직접 호출했더니 모델이 멍청해졌다”의 가장 흔한 원인은 이것입니다. template은 모델 주변의 장식이 아니라 모델의 일부이며, 잘못된 template은 오류 없이 조용히 성능을 떨어뜨립니다.
Stage two, 그리고 그것이 해결하려는 문제
섹션 링크: Stage two, 그리고 그것이 해결하려는 문제SFT에는 한계가 있고, 그 한계는 데이터입니다. demonstration으로 fine-tuning하려면 누군가가 이상적인 응답을 써야 합니다. 그런데 흥미로운 질문 대부분에서 좋은 답을 쓰는 일은 어렵고, 느리고, 비싸며, 품질을 검증할 수 없는 답 하나만 만들어 냅니다.
사람들이 잘하는 것은 비교입니다. 두 응답을 보여 주면, annotator는 몇 초 만에 어느 쪽이 더 나은지 꽤 안정적으로 말할 수 있습니다. 둘 중 어느 것도 직접 만들어 낼 수 없더라도 그렇습니다. 전체 두 번째 단계는 이 사실 위에 세워져 있고, 대부분의 설명이 거꾸로 말하는 부분도 바로 이것입니다:
사람은 답을 쓰지 않습니다. 쌍을 순위 매깁니다.
따라서 데이터는 쌍입니다. prompt, 두 응답, 그리고 어느 쪽이 이겼는지입니다. 이것은 다음 token 손실에 넣을 수 없습니다. target sequence가 없기 때문입니다. 다른 기계가 필요합니다.
reward model, 그리고 그것이 실제로 배우는 것
섹션 링크: reward model, 그리고 그것이 실제로 배우는 것학습 중 모든 응답을 사람에게 점수 매기게 할 수는 없습니다. 판단이 수백만 개나 필요하기 때문입니다. 그래서 사람을 모방하는 모델을 학습합니다. 응답을 받아 scalar를 반환하는 reward model입니다.
비교로 그것을 학습하는 데에는 1952년의 결과가 쓰입니다. Bradley–Terry 모델2은 두 항목에 잠재적인 strength가 있다면 한쪽이 다른 쪽을 이길 확률은 그 차이의 logistic function이라고 말합니다. 이것을 뒤집으면 손실이 됩니다. 사람이 보다 를 선호했다면 다음을 최대화합니다.
코드로는 전체 학습 루프가 이것입니다:
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean() 모델이 절대 보지 않는 것에 주목하세요. 절대 점수입니다. 모델은 오직 차이만 배웁니다. 데이터에 들어 있는 것도 정확히 그것입니다.
이제 측정할 가치가 있는 부분입니다. reward model은 annotator가 reward한 것을 배웁니다. 그리고 annotator는 사람입니다. 다음은 응답의 진짜 품질이 오직 유용하고 올바른지에만 달려 있고 — 길이는 아무 가치가 없으며 — simulated annotator는 다른 조건이 비슷할 때 긴 답을 약간 선호하는 시뮬레이션입니다. 이는 잘 문서화된 인간 편향입니다. reward model을 2000개의 비교로 학습하고 그 weight를 읽어 봅니다:
| annotator의 길이 편향 | 유용함에 대해 학습된 weight | 정확함에 대해 | 길이에 대해 |
|---|---|---|---|
| 0.0 | +1.00 | +1.00 | +0.01 |
| 0.3 | +0.98 | +1.00 | +0.15 |
| 0.6 | +0.97 | +1.00 | +0.27 |
| 1.2 | +1.00 | +0.99 | +0.59 |
reward model은 완벽하게 작동하고 있습니다. 보여 준 선호를 충실히 배웠습니다. 그 선호 중 품질과 아무 관련 없는 부분까지 포함해서입니다. reward model은 좋음의 척도가 아닙니다. annotator가 고른 것의 척도입니다. 그리고 annotation pool의 모든 편향은 이제 훨씬 더 큰 모델이 최적화하게 될 미분 가능한 함수의 coefficient가 됩니다.
Reward hacking, 측정하기
섹션 링크: Reward hacking, 측정하기이제 그것을 최적화하면 무슨 일이 일어나는지 봅시다. policy에 응답의 속성들 사이에 배분할 고정된 노력 예산을 주고, 현실적인 비대칭을 둡니다. 유용하고 정확해지는 일은 비싸고, 길어지는 일은 쌉니다. 그냥 계속 쓰면 되니까요.
위에서 학습한 모델 기준 노력 단위당 reward는 다음과 같습니다. 유용함 8.26, 정확함 8.31, 길이 31.70. 길이는 정확함보다 거의 네 배 더 잘 보상됩니다. reward model이 망가져서가 아니라, 길게 쓰는 것이 싸기 때문입니다.
그 reward에 맞춰 최적화하고 두 숫자를 모두 봅니다:
| reward model의 점수 | 진짜 품질 | 생성된 길이 | |
|---|---|---|---|
| 시작 policy | 12.588 | 0.974 | 3.365 |
| 최적화 후 | 31.696 | 0.000 | 12.497 |
reward는 2.5배 올랐습니다. reward가 측정해야 했던 것은 0이 되었습니다. policy는 길게 쓰면서 아무 말도 하지 않으면 엄청난 점수를 받을 수 있음을 발견했습니다. 그리고 학습 루프의 어떤 부분도 그것을 알아차릴 방법이 없었습니다. 루프 안에서는 reward model 자체가 좋음의 정의이기 때문입니다.
이것이 reward hacking입니다. chat 모델들이 왜 그렇게 장황한지 궁금했던 적이 있다면, 이 표가 답의 큰 부분입니다.
KL penalty가 실제로 사 주는 것
섹션 링크: KL penalty가 실제로 사 주는 것표준 방어책은 policy가 시작점에서 너무 멀리 움직이면 벌점을 주는 것입니다. 거리는 4장의 KL divergence로 측정합니다:
reference 는 SFT 모델, 즉 reinforcement 단계 이전의 policy입니다. 이 방법이 모델이 퇴화한 행동으로 흘러가는 것을 막는다는 주장입니다. 그 주장 중 측정 후에도 얼마나 남는지 확인해 봅시다. 같은 설정에서 를 sweep합니다:
| reward | 진짜 품질 | 길이 | KL | |
|---|---|---|---|---|
| 0 | 31.699 | 0.000 | 12.498 | 2.994 |
| 1 | 31.697 | 0.000 | 12.497 | 2.993 |
| 5 | 28.318 | 0.285 | 10.700 | 2.163 |
| 15 | 12.860 | 1.542 | 2.552 | 0.151 |
| 30 | 10.426 | 1.719 | 1.303 | 0.025 |
| 60 | 9.632 | 1.769 | 0.908 | 0.005 |
| reference model만 | 9.162 | 1.791 | 0.687 | 0 |
마지막 행을 나머지와 비교해 읽어 보세요. 와 에서는 penalty가 아무 일도 하지 않습니다. reward의 가치가 KL보다 훨씬 커서 optimiser가 벌금을 내고도 hacking을 합니다. 5와 15 사이에서는 행동이 급격히 바뀝니다. 그리고 에서는 진짜 품질이 1.769까지 올라왔습니다. 하지만 이는 이 모든 것을 시작하기 전 reference model이 가졌던 1.791보다 여전히 낮습니다.
이 숫자가 어디에서 인용되기 전에 한 가지 주의할 점이 있습니다. 마지막 행의 1.791과 첫 표에서 starting policy에 주어진 0.974는 같은 pre-RL 모델을 별개의 두 실험에서 각각 측정한 값입니다. 표 안의 행끼리만 비교하고, 표를 넘나들어 비교하지 마세요. 각 표의 결론은 자기 표의 행들 위에서 독립적으로 성립하며, 다른 표의 baseline에 의존하지 않습니다.
따라서 정직한 요약은 “KL penalty가 reward hacking을 막는다”가 아닙니다. 이렇습니다:
KL penalty는 reward hacking을 막지 않습니다. policy가 reference에서 얼마나 멀리 움직일 수 있는지를 제한합니다. 실패에는 움직임이 필요하므로 도움이 되기는 합니다. 그러나 이것은 교정 장치가 아니라 목줄입니다. 낮은 에서는 목줄이 끊어지고, 높은 에서는 reference model을 되돌려 받을 뿐이며, 비싼 단계는 아무것도 사지 못합니다.
유용한 구간은 좁고, 그 위치는 reward model에 의존하며, 직접 보지 않고는 찾을 방법이 없습니다. 그래서 reference model이 좋아야 합니다. KL은 reference 품질의 바닥이지, 실패에 대한 천장이 아닙니다. 그리고 이것이 이 단계가 원리상 어렵다기보다 실제로 어렵게 되는 큰 이유입니다.
PPO, 그리고 DPO가 그것을 대체한 이유
섹션 링크: PPO, 그리고 DPO가 그것을 대체한 이유이것을 대규모로 작동하게 만든 알고리즘은 Proximal Policy Optimization입니다.3 한 문단으로 말하면, 각 응답의 advantage를 추정하고, baseline보다 좋은 응답의 확률을 높이도록 policy를 업데이트하며, 큰 advantage 추정치가 한 번에 policy를 망가뜨리지 못하도록 단일 업데이트의 크기를 clip합니다. 언어 모델에 적용하면4 policy, reference, reward model, critic — 네 모델을 동시에 유지하고, 학습 내내 policy가 새 샘플을 생성하게 됩니다.
작동합니다. InstructGPT와 그 후손들을 만들어 냈습니다. 그리고 정말 어렵습니다. 메모리에 네 모델, 학습 루프 안의 sampling, 그리고 충분히 그럴 만한 불안정성의 평판이 있습니다. 블로그 글 안에서 구현할 수 있는 척하는 것은 부정직하므로, 이 장은 그렇게 하지 않습니다.
대부분의 용도에서 그것을 대체한 것은 한 가지 관찰에서 나왔습니다. 위 KL-regularised objective에는 closed-form optimal policy가 있고, 그 식을 뒤집을 수 있습니다. reward를 optimal policy와 reference로 쓸 수 있다는 뜻입니다. 그것을 Bradley–Terry loss에 다시 대입하면 reward model이 완전히 사라집니다. 남는 것은 preference pair에 대한 supervised loss입니다. sampling도, critic도, reward model도 없고, 메모리에는 네 모델 대신 두 모델만 있습니다.
이것이 Direct Preference Optimization이며,5 두 줄입니다:
def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
"""pi_* and ref_* are summed log-probabilities of a full response."""
logits = beta * ((pi_w - ref_w) - (pi_l - ref_l))
return -F.logsigmoid(logits) 이 식이 말하는 것을 읽어 보세요. 끌어올리는 양은 policy가 reference보다 winner를 얼마나 더 선호하는지에서, loser를 얼마나 더 선호하는지를 뺀 값입니다. reference는 나중에 덧붙인 penalty가 아닙니다. loss 안에 들어 있습니다. 그래서 DPO에는 별도의 KL term이 필요 없습니다.
가장 중요한 성질은 gradient에 있습니다. 같은 pair에 대해 policy의 다섯 가지 상태에서 loss와 gradient를 평가해 봅니다:
| policy의 상태 | loss | gradient 크기 |
|---|---|---|
| 이미 winner를 강하게 선호함 | 0.5130 | 0.0401 |
| 이미 winner를 약하게 선호함 | 0.6685 | 0.0488 |
| reference와 동일함 | 0.6931 | 0.0500 |
| loser를 선호함 | 0.7981 | 0.0550 |
| loser를 강하게 선호함 | 1.0055 | 0.0634 |
gradient는 policy가 더 틀릴수록 커집니다. 모델이 이미 처리하는 pair는 거의 기여하지 않고, 거꾸로 처리하는 pair가 업데이트를 지배합니다. DPO는 policy가 현재 얼마나 틀렸는지에 따라 모든 예시에 자동으로 weight를 줍니다. 스케줄링 없이 말입니다. 그리고 이 self-weighting이 PPO의 advantage estimate와 critic이 하던 일을 대신하는 메커니즘입니다. (세 번째 행의 loss는 정확히 이며, 어떤 구현이든 확인할 때의 기준점입니다. reference와 동일한 policy는 아무것도 배우지 않았고 에 있어야 합니다.)
GRPO6는 같은 문제에서 빠져나오는 다른 길을 택합니다. sampling loop는 유지하지만 critic을 삭제합니다. baseline을 예측하는 모델을 학습하는 대신, 같은 prompt에 대한 응답 그룹을 샘플링하고 그 그룹의 평균 reward를 baseline으로 직접 사용합니다. 어떤 응답의 advantage는 그 응답이 형제 응답들보다 얼마나 나았는지입니다. 이것은 모델 하나를 더 큰 batch와 맞바꾸는 일이며, 검증 가능한 reward 학습 — 12장의 주제 — 을 실용적으로 만든 방법입니다.
세부 정보 보기
post-training 지형의 세 조각을 더, 짧게.
RLAIF와 Constitutional AI.7 annotator가 꼭 사람일 필요는 없습니다. 모델에 원칙의 문서 목록을 주고 자기 출력물을 비평하고 수정하게 하거나, 두 후보 중 하나를 고르게 하면, 기계의 속도와 비용으로 생성된 preference dataset을 얻게 됩니다. 뻔한 반론 — 모델이 자기 숙제를 채점한다 — 은 실제로 맞습니다. 정직한 답은, 판단은 생성보다 쉽기 때문에 생각보다 잘 작동한다는 것입니다. 이것은 이 장 전체가 기대고 있는 바로 그 비대칭입니다.
LIMA, 그리고 이것에 필요한 데이터가 얼마나 적은가.8 신중하게 선별된 demonstration 천 개가 경쟁력 있는 assistant를 만들었습니다. 제안된 설명은 사전 학습이 이미 지식과 형식을 설치해 두었고, post-training은 모델의 기존 행동 중 무엇을 표면으로 꺼낼지만 선택하면 된다는 것입니다. 그것이 맞다면 post-training 데이터의 품질이 양을 압도합니다. 그리고 이후 이 분야의 행동을 보면 사람들이 그렇게 믿고 있음을 알 수 있습니다.
LoRA와 QLoRA.910 큰 모델의 모든 weight를 fine-tuning하려면 weight, 그 gradient, optimiser state를 위한 메모리가 필요합니다. 6장이 손으로 만든 두 평균 위에서, 10장의 파라미터당 16바이트가 적용되고, 클러스터가 필요한 규모가 됩니다. LoRA는 원래 weight를 고정하고 그 옆에 low-rank matrix 쌍을 학습해 trainable parameter를 몇 자릿수 줄입니다. QLoRA는 여기에 더해 고정된 base를 4비트로 quantize합니다. 여기서는 둘 다 technique으로 다룹니다. fine-tuning이 애초에 돈을 쓸 만한 일인지는 별개의 질문이며, 그것은 20장의 주제입니다.
alignment tax, 그리고 아무도 답하지 못한 질문
섹션 링크: alignment tax, 그리고 아무도 답하지 못한 질문앞으로 가져갈 것은 두 가지입니다.
첫째, 이 단계에는 비용이 있고, 그것은 capability로 나타납니다. 모델은 alignment training 이후 일부 benchmark task에서 측정 가능하게 더 나빠지는 경우가 많습니다. 이것이 alignment tax입니다. objective가 바뀌었기 때문입니다. 안전하고, 신중하게 표현되고, 형식이 잘 잡힌 응답이 항상 정확도를 최대화하는 응답은 아닙니다. 그 간극 중 일부는 engineering으로 줄어들었고, 일부는 고쳐야 할 버그가 아니라 실제 trade-off입니다.
둘째, aligned라는 단어가 숨기는 질문입니다. 누구와 aligned되었는가? 사슬은 이렇습니다. 회사가 guideline을 쓰고, contractor가 그것을 해석하며, 그들의 비교가 reward model을 학습시키고, reward model이 policy를 형성하며, policy는 그 모든 것을 보지 못한 사람의 질문에 답합니다. 모든 연결고리는 특정 사람들이 내린 선택이며, 이 장의 어떤 알고리즘도 그 선택이 좋은지에 대해 의견을 갖고 있지 않습니다.
이것은 수사적 장식이 아닙니다. 두 frontier model이 서로 다른 요청을 거절하는 구체적인 이유이고, 같은 모델이 버전 사이에서 마음을 바꾸는 이유이며, “aligned”가 인공물의 속성이 아니라 process의 설명인 이유입니다. 이 장의 수학은 정리되어 있습니다. 그 부분은 그렇지 않습니다.
다음으로 갈 곳
섹션 링크: 다음으로 갈 곳post-training은 모델에게 답하는 법을 가르쳤습니다. 답하기 전에 생각하는 법을 가르치지는 않았습니다. 그리고 이 둘은 학습 가능한 방식으로 서로 다르다는 것이 드러납니다.
12장은 학습 시간이 아니라 답변 시간에 어려운 질문에 더 많은 계산을 쓰게 하면 무슨 일이 일어나는지에 관한 장입니다. chain of thought, 검증 가능한 reward로부터의 reinforcement learning, 그리고 풀이 과정을 보여 주는 모델이 단지 자신을 설명하는 것이 아니라 다르게 계산하고 있는 이유를 다룹니다. 또한 이 장에서 진 빚도 갚습니다. GRPO가 그 안에서 등장해, annotator가 전혀 필요 없는 reward 위에서 PPO의 critic이 하던 일을 합니다. 증명은 검증되거나 검증되지 않기 때문입니다.
Sources and method
섹션 링크: Sources and method위 generation은 greedy decoding을 사용한 gpt2 및 Qwen/Qwen2.5-0.5B-Instruct에서 나온 것이므로 정확히 재현됩니다. 시뮬레이션이 아니라 실제로 실행해 보고 싶다면 Hugging Face LLM Course 11장이 trl와 peft로 SFT와 DPO를 안내합니다. Sebastian Raschka의 Build a Large Language Model (From Scratch) 7장은 instruction fine-tuning을 라이브러리 없이 처음부터 끝까지 구현합니다.
-
Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). 위 vocabulary box는 사용할 수 있는 최소 부분집합이고, 진짜 주제는 한 권의 책입니다. 이 위임은 의도적입니다. ↩
-
Bradley, R. A. and Terry, M. E. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika 39(3/4), pp. 324–345 (1952). 오늘날 쓰이는 모든 reward model 아래에 있는 pairwise-comparison model입니다. ↩
-
Schulman, J., Wolski, F., Dhariwal, P., Radford, A. and Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017). ↩
-
Ouyang, L. et al. Training language models to follow instructions with human feedback. arXiv:2203.02155 (2022). InstructGPT — 세 단계 레시피를 표준으로 만든 논문입니다. 그 전에 Christiano et al. (arXiv:1706.03741)이 인간 비교로부터 reward model을 학습하는 방법을 도입했고, Stiennon et al. (arXiv:2009.01325)이 이를 summarisation에 적용했습니다. ↩
-
Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. and Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). reward model을 제거하는 derivation은 4절에 있으며 전체를 읽을 가치가 있습니다. 평판보다 짧습니다. ↩
-
Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). 4.1절에서 GRPO를 도입합니다. ↩
-
Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022). ↩
-
Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023). ↩
-
Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021). ↩
-
Dettmers, T., Pagnoni, A., Holtzman, A. and Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023). ↩