Від базової моделі до асистента: SFT, RLHF, DPO і GRPO
Попросіть базову модель про хайку — вона повторить речення. А reward model навчиться цінувати довжину більше за правильність.
На цій сторінці
Попросіть 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 і нікудишній асистент.
Тепер той самий запит до моделі, побудованої так само — Qwen2.5, пів мільярда параметрів, у чотири рази більшої за GPT-2 вище й усе ще крихітної за будь-яким стандартом 2026 року — після етапів навчання, про які цей розділ:
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.Учетверо більше параметрів не вчить модель замовкати. Розрив між цими двома виводами — це не масштаб, не архітектура й не обсяг даних. Це post-training: друга фаза, на порядки менша за pretraining, яка бере предиктор тексту й перетворює його на щось, що відповідає.
Етап перший: показати, як виглядає відповідь
Посилання на розділ: Етап перший: показати, як виглядає відповідьПерший крок найменш гламурний і робить більшу частину роботи. Зберіть приклади інструкцій у парі з хорошими відповідями й продовжте навчання на них із тією самою втратою, що й у розділі 8, — передбачати наступний token, — але лише на частині відповіді. Це supervised fine-tuning, або SFT.
Модель не вчать нічого нового про мову. Її вчать формату: що текст такої форми продовжується текстом такої форми, а потім зупиняється. Ще раз подивіться на провал базової моделі. Вона відповіла на запитання в першому реченні, а потім не змогла зупинитися, бо ніщо в її навчанні ніколи не позначало кінець відповіді. Зупинка — це вивчена поведінка.
Саме тому моделі також потрібно сказати, де межі, — для цього й існує 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|> — справжні tokens у словнику, додані перед fine-tuning, і модель бачила мільйони таких маркерів саме в цих позиціях. Так вона знає, чия зараз черга і де репліка закінчується.
Пропустіть 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-tuned. Це найпоширеніша причина фрази «модель стала дурнішою, коли я викликав її напряму»: template — не декор навколо моделі, це частина моделі, а неправильний template — це тиха деградація без жодної помилки.
Етап другий і проблема, яку він має розв’язати
Посилання на розділ: Етап другий і проблема, яку він має розв’язатиУ SFT є стеля, і ця стеля — дані. Щоб виконати fine-tune на демонстрації, потрібно, щоб хтось написав ідеальну відповідь, а для більшості цікавих запитань написати хорошу відповідь складно, повільно, дорого — і в результаті виходить рівно одна відповідь, якість якої ви не можете перевірити.
Люди добре вміють порівнювати. Побачивши дві відповіді, анотатор за кілька секунд може надійно сказати, яка краща, навіть якщо сам не зміг би створити жодну з них. На цьому факті побудований увесь другий етап, і саме цю частину більшість пояснень перевертає навпаки:
Люди не пишуть відповіді. Вони ранжують пари.
Тож дані — це пари: prompt, дві відповіді й те, яка перемогла. Це не можна підставити у втрату next-token, бо немає цільової послідовності. Потрібна інша машина.
Reward model і що вона насправді вивчає
Посилання на розділ: Reward model і що вона насправді вивчаєВи не можете просити людину оцінювати кожну відповідь під час навчання — це мільйони суджень. Тому ви навчаєте модель імітувати людей: reward model, яка бере відповідь і повертає скаляр.
Навчання з порівнянь використовує результат 1952 року. Модель Bradley–Terry2 каже: якщо два об’єкти мають приховані сили, ймовірність того, що один переможе інший, є логістичною функцією їхньої різниці. Переверніть це — і отримаєте loss: якщо людина віддала перевагу над , максимізуйте
що в коді є всім циклом навчання:
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean() Зверніть увагу, чого модель ніколи не бачить: абсолютної оцінки. Вона завжди вивчає лише різниці, а це саме те, що містять дані.
Тепер частина, яку варто виміряти. Reward model вивчає те, що винагороджували анотатори, а анотатори — люди. Ось симуляція, у якій справжня якість відповіді залежить лише від корисності й правильності — довжина нічого не варта, — але симульований анотатор має легку перевагу до довших відповідей, коли все інше близьке; це добре задокументоване людське упередження. Навчіть reward model на 2000 порівнянь і прочитайте її ваги:
| упередження анотатора до довжини | вивчена вага для корисності | для правильності | для довжини |
|---|---|---|---|
| 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 — це не міра добра; це міра того, що обрали анотатори, і кожне упередження в пулі анотацій тепер стало коефіцієнтом у диференційовній функції, яку значно більша модель ось-ось почне оптимізувати.
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 мав вимірювати, впало до нуля. Policy виявила, що може отримувати величезний score, пишучи багато й не кажучи нічого, і жодна частина навчального циклу не могла це помітити, бо reward model є визначенням добра всередині циклу.
Це reward hacking, і якщо ви колись дивувалися, чому chat-моделі такі багатослівні, ця таблиця — значна частина відповіді.
Що насправді дає KL-штраф
Посилання на розділ: Що насправді дає KL-штрафСтандартний захист — штрафувати policy за те, що вона надто далеко відходить від початкового стану, вимірюючи відстань KL-дивергенцією з розділу 4:
Референс — це SFT-модель, тобто policy до reinforcement-етапу. Твердження таке: це не дає моделі з’їхати в деградовану поведінку. З’ясуймо, яка частина цього твердження витримує вимірювання. Той самий setup, перебір :
| 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 |
Читайте останній рядок на тлі решти. За і штраф узагалі нічого не робить: reward настільки цінніший за KL, що оптимізатор сплачує штраф і все одно зламує метрику. Між 5 і 15 поведінка різко змінюється. А за справжня якість піднімається назад до 1.769 — що все ще нижче за 1.791, які мала reference model до початку всього цього.
Одне застереження, перш ніж хтось десь процитує це число: 1.791 в останньому рядку й 0.974, які перша таблиця дає початковій policy, — це два різні вимірювання тієї самої pre-RL моделі, зроблені двома експериментами окремо. Порівнюйте рядки всередині таблиці, ніколи не між таблицями: висновок кожної таблиці тримається на її власних рядках, і жоден не залежить від baseline іншої.
Отже, чесне резюме — не «KL-штраф запобігає reward hacking». Воно таке:
KL-штраф не запобігає reward hacking. Він обмежує, наскільки далеко policy може відійти від reference, — а оскільки збій потребує руху, це допомагає. Але це повідець, а не виправлення: за низького повідець рветься, а за високого ви отримуєте reference model назад, і весь дорогий етап нічого не купив.
Корисна зона вузька, її положення залежить від reward model, і знайти її можна лише дивлячись. Саме тому reference model має бути хорошою: KL — це підлога на рівні якості reference, а не стеля для збою. І це велика частина причин, чому цей етап складний на практиці, а не в принципі.
PPO і чому DPO його з’їв
Посилання на розділ: PPO і чому DPO його з’ївАлгоритм, який дав цьому працювати в масштабі, — Proximal Policy Optimization.3 В одному абзаці: він оцінює advantage кожної відповіді, оновлює policy, щоб підвищити ймовірність відповідей вище baseline, і обрізає розмір кожного окремого оновлення, щоб велика оцінка advantage не зруйнувала policy за один крок. У застосуванні до мовних моделей4 це означає тримати в роботі одразу чотири моделі — policy, reference, reward model і critic — причому policy генерує свіжі samples протягом усього навчання.
Це працює, це породило InstructGPT і все, що від нього походить, і це справді складно: чотири моделі в пам’яті, sampling у навчальному циклі й заслужена репутація нестабільності. Удавати, що це можна реалізувати в blog post, було б нечесно, тому цей розділ цього не робить.
Те, що замінило його для більшості цілей, виникло з одного спостереження. KL-регуляризована ціль вище має policy з оптимумом у замкненій формі, і цей вираз можна обернути: reward можна записати через оптимальну policy та reference. Підставте це назад у втрату Bradley–Terry — і reward model повністю зникає. Залишається supervised loss на preference pairs: без 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, мінус наскільки більше вона віддає перевагу тому, хто програв. Reference — не штраф, прикручений потім; він усередині loss, саме тому DPO не потребує окремого KL-терміна.
Найважливіша властивість — у gradient. Оцініть loss і його gradient на тій самій парі в п’яти різних станах policy:
| стан policy | loss | величина gradient |
|---|---|---|
| уже сильно віддає перевагу переможцю | 0.5130 | 0.0401 |
| уже віддає перевагу, але слабко | 0.6685 | 0.0488 |
| ідентична reference | 0.6931 | 0.0500 |
| віддає перевагу переможеному | 0.7981 | 0.0550 |
| сильно віддає перевагу переможеному | 1.0055 | 0.0634 |
Gradient зростає, коли policy помиляється сильніше. Пари, з якими модель уже справляється, майже нічого не додають; пари, які вона розвертає навпаки, домінують в оновленні. DPO зважує кожен приклад за тим, наскільки policy наразі помиляється, автоматично, без scheduling — і це самозважування є механізмом, який виконує роботу, що в PPO виконували оцінка advantage і critic. (Loss у третьому рядку рівно , і це якір для перевірки будь-якої реалізації: policy, ідентична своєму reference, нічого не вивчила й має сидіти на .)
GRPO6 виходить із тієї самої проблеми іншим маршрутом. Він зберігає sampling loop, але видаляє critic: замість навчати модель передбачати baseline, він генерує групу відповідей на той самий prompt і прямо використовує середній reward групи як baseline. Advantage відповіді — це те, наскільки вона краща за своїх «сестер». Так цілу модель міняють на більший batch, і саме це зробило практичним навчання на verifiable rewards — тему розділу 12.
Показати подробиці
Ще три частини ландшафту post-training — коротко.
RLAIF і Constitutional AI.7 Анотатор не мусить бути людиною. Дайте моделі письмовий набір принципів і попросіть її критикувати та переглядати власні outputs або вибирати між двома кандидатами — і ви отримаєте preference dataset зі швидкістю й вартістю машини. Очевидне заперечення — модель перевіряє власне домашнє завдання — реальне, а чесна відповідь така: це працює краще, ніж здається, бо судити легше, ніж генерувати; на цій самій асиметрії тримається весь розділ.
LIMA і те, як мало даних для цього потрібно.8 Тисяча ретельно відібраних демонстрацій дала конкурентного асистента. Запропоноване пояснення: pretraining уже встановив знання й формат, а post-training має лише вибрати, які з наявних поведінок моделі показати назовні. Якщо це правда, якість post-training даних домінує над кількістю — і поведінка галузі відтоді натякає, що люди в це вірять.
LoRA і QLoRA.910 Fine-tuning кожної ваги великої моделі потребує пам’яті для ваг, їхніх gradients і стану оптимізатора — шістнадцять байтів на параметр із розділу 10, поверх двох середніх, які розділ 6 зібрав вручну, — у масштабі, що потребує кластера. LoRA заморожує початкові ваги й навчає поруч із ними низькорангову пару матриць, скорочуючи trainable parameters на порядки; QLoRA додатково квантує заморожену base до 4 бітів. Обидва тут розглядаються як техніка. Чи є fine-tuning узагалі правильним місцем для витрат — це інше питання, і воно належить розділу 20.
Alignment tax і питання, на яке ніхто не відповів
Посилання на розділ: Alignment tax і питання, на яке ніхто не відповівДві речі варто взяти далі.
Перша: цей етап має вартість, і вона проявляється як спроможність. Моделі часто вимірювано гіршають на деяких benchmark tasks після alignment training — це alignment tax, — бо ціль змінилася: відповідь, яка безпечна, обережна й добре відформатована, не завжди є відповіддю, що максимізує точність. Частину цього розриву вже інженерно прибрали, а частина є справжнім компромісом, а не багом, який треба виправити.
Друге — питання, яке приховує слово aligned. Узгоджена з ким? Ланцюжок такий: компанія пише настанови, підрядники їх інтерпретують, їхні порівняння навчають reward model, reward model формує policy, а policy відповідає на запитання людини, яка всього цього не бачила. Кожна ланка — це вибір конкретних людей, і жоден алгоритм у цьому розділі не має думки про те, чи ці вибори добрі.
Це не риторична прикраса. Це конкретна причина, чому дві frontier-моделі відмовляються від різних запитів, чому та сама модель змінює думку між версіями і чому «aligned» — це опис процесу, а не властивість артефакту. Математика в цьому розділі усталена. Оця частина — ні.
Куди це веде далі
Посилання на розділ: Куди це веде даліPost-training навчив модель відповідати. Він не навчив її думати перед відповіддю, а ці дві речі відрізняються так, що це, як виявляється, можна тренувати.
Розділ 12 — про те, що стається, коли ви дозволяєте моделі витрачати більше обчислень на складне запитання під час відповіді, а не під час навчання: chain of thought, reinforcement learning from verifiable rewards і причина, чому модель, яка показує свою роботу, не просто пояснює себе, а обчислює інакше. Він також закриває борг із цього розділу: GRPO існує там, виконуючи роботу, яку раніше робив critic у PPO, на rewards, що взагалі не потребують анотатора, бо доказ або перевіряється, або ні.
Джерела й метод
Посилання на розділ: Джерела й методНаведені вище generations отримані з gpt2 і Qwen/Qwen2.5-0.5B-Instruct із greedy decoding, тому відтворюються точно. Розділ 11 Hugging Face LLM Course проходить SFT і DPO з trl і peft, якщо ви хочете запустити справжню річ, а не симуляцію; розділ 7 книжки Sebastian Raschka Build a Large Language Model (From Scratch) реалізує instruction fine-tuning від початку до кінця без бібліотеки.
Примітки
Посилання на розділ: Примітки-
Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). Делегування навмисне: блок словника вище — найменша придатна до використання підмножина, а справжня тема — це книжка. ↩
-
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, яка використовується сьогодні. ↩
-
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, міститься в розділі 4, і його варто прочитати повністю; воно коротше, ніж здається з репутації. ↩
-
Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). Вводить GRPO у розділі 4.1. ↩
-
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). ↩