Перейти до вмісту
11/30Розділ 11 з 30

Від базової моделі до асистента: SFT, RLHF, DPO і GRPO

Попросіть базову модель про хайку — вона повторить речення. А reward model навчиться цінувати довжину більше за правильність.

На цій сторінці

Попросіть GPT-2 — компетентно попередньо навчену мовну модель — написати хайку про море:

TEXT
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 року — після етапів навчання, про які цей розділ:

TEXT
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:

TEXT
<|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?:

TEXT
 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:

TEXT
The capital of France is Paris.

В обох випадках відповідь правильна, але без маркерів модель з’їжджає в написання Python, щоб перевірити себе, бо отриманий prompt не схожий ні на що з того, на чому її fine-tuned. Це найпоширеніша причина фрази «модель стала дурнішою, коли я викликав її напряму»: template — не декор навколо моделі, це частина моделі, а неправильний template — це тиха деградація без жодної помилки.

Етап другий і проблема, яку він має розв’язати

Посилання на розділ: Етап другий і проблема, яку він має розв’язати

У SFT є стеля, і ця стеля — дані. Щоб виконати fine-tune на демонстрації, потрібно, щоб хтось написав ідеальну відповідь, а для більшості цікавих запитань написати хорошу відповідь складно, повільно, дорого — і в результаті виходить рівно одна відповідь, якість якої ви не можете перевірити.

Люди добре вміють порівнювати. Побачивши дві відповіді, анотатор за кілька секунд може надійно сказати, яка краща, навіть якщо сам не зміг би створити жодну з них. На цьому факті побудований увесь другий етап, і саме цю частину більшість пояснень перевертає навпаки:

Люди не пишуть відповіді. Вони ранжують пари.

Тож дані — це пари: prompt, дві відповіді й те, яка перемогла. Це не можна підставити у втрату next-token, бо немає цільової послідовності. Потрібна інша машина.

Ви не можете просити людину оцінювати кожну відповідь під час навчання — це мільйони суджень. Тому ви навчаєте модель імітувати людей: reward model, яка бере відповідь і повертає скаляр.

Навчання з порівнянь використовує результат 1952 року. Модель Bradley–Terry2 каже: якщо два об’єкти мають приховані сили, ймовірність того, що один переможе інший, є логістичною функцією їхньої різниці. Переверніть це — і отримаєте loss: якщо людина віддала перевагу ywy_w над yly_l, максимізуйте

P(ywyl)=σ(r(yw)r(yl))P(y_w \succ y_l) = \sigma\big(r(y_w) - r(y_l)\big)

що в коді є всім циклом навчання:

reward_model.pyPYTHON
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 — це не міра добра; це міра того, що обрали анотатори, і кожне упередження в пулі анотацій тепер стало коефіцієнтом у диференційовній функції, яку значно більша модель ось-ось почне оптимізувати.

І це підводить нас до того, що стається, коли ви це оптимізуєте. Дайте policy фіксований бюджет зусиль, який вона може витратити на властивості відповіді, з реалістичною асиметрією: бути корисною й бути правильною — дорого, а бути довшою — дешево; ви просто продовжуєте писати.

Reward на одиницю зусилля для моделі, навченої вище: корисність 8.26, правильність 8.31, довжина 31.70. Довжина окупається майже вчетверо краще за правильність не тому, що reward model зламана, а тому, що довжина дешева.

Оптимізуйте під цей reward і подивіться на обидва числа:

оцінка reward modelсправжня якістьстворена довжина
початкова policy12.5880.9743.365
після оптимізації31.6960.00012.497

Reward зріс у 2,5 раза. Те, що reward мав вимірювати, впало до нуля. Policy виявила, що може отримувати величезний score, пишучи багато й не кажучи нічого, і жодна частина навчального циклу не могла це помітити, бо reward model є визначенням добра всередині циклу.

Це reward hacking, і якщо ви колись дивувалися, чому chat-моделі такі багатослівні, ця таблиця — значна частина відповіді.

Стандартний захист — штрафувати policy за те, що вона надто далеко відходить від початкового стану, вимірюючи відстань KL-дивергенцією з розділу 4:

objective=E[r(y)]βDKL(πθπref)\text{objective} = \mathbb{E}\big[r(y)\big] - \beta \, D_{\mathrm{KL}}\big(\pi_\theta \,\|\, \pi_{\text{ref}}\big)

Референс πref\pi_{\text{ref}} — це SFT-модель, тобто policy до reinforcement-етапу. Твердження таке: це не дає моделі з’їхати в деградовану поведінку. З’ясуймо, яка частина цього твердження витримує вимірювання. Той самий setup, перебір β\beta:

β\betarewardсправжня якістьдовжинаKL
031.6990.00012.4982.994
131.6970.00012.4972.993
528.3180.28510.7002.163
1512.8601.5422.5520.151
3010.4261.7191.3030.025
609.6321.7690.9080.005
сама reference model9.1621.7910.6870

Читайте останній рядок на тлі решти. За β=0\beta = 0 і β=1\beta = 1 штраф узагалі нічого не робить: reward настільки цінніший за KL, що оптимізатор сплачує штраф і все одно зламує метрику. Між 5 і 15 поведінка різко змінюється. А за β=60\beta = 60 справжня якість піднімається назад до 1.769 — що все ще нижче за 1.791, які мала reference model до початку всього цього.

Одне застереження, перш ніж хтось десь процитує це число: 1.791 в останньому рядку й 0.974, які перша таблиця дає початковій policy, — це два різні вимірювання тієї самої pre-RL моделі, зроблені двома експериментами окремо. Порівнюйте рядки всередині таблиці, ніколи не між таблицями: висновок кожної таблиці тримається на її власних рядках, і жоден не залежить від baseline іншої.

Отже, чесне резюме — не «KL-штраф запобігає reward hacking». Воно таке:

KL-штраф не запобігає reward hacking. Він обмежує, наскільки далеко policy може відійти від reference, — а оскільки збій потребує руху, це допомагає. Але це повідець, а не виправлення: за низького β\beta повідець рветься, а за високого β\beta ви отримуєте reference model назад, і весь дорогий етап нічого не купив.

Корисна зона вузька, її положення залежить від reward model, і знайти її можна лише дивлячись. Саме тому reference model має бути хорошою: KL — це підлога на рівні якості reference, а не стеля для збою. І це велика частина причин, чому цей етап складний на практиці, а не в принципі.

Алгоритм, який дав цьому працювати в масштабі, — 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 і це два рядки:

dpo.pyPYTHON
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:

стан policylossвеличина gradient
уже сильно віддає перевагу переможцю0.51300.0401
уже віддає перевагу, але слабко0.66850.0488
ідентична reference0.69310.0500
віддає перевагу переможеному0.79810.0550
сильно віддає перевагу переможеному1.00550.0634

Gradient зростає, коли policy помиляється сильніше. Пари, з якими модель уже справляється, майже нічого не додають; пари, які вона розвертає навпаки, домінують в оновленні. DPO зважує кожен приклад за тим, наскільки policy наразі помиляється, автоматично, без scheduling — і це самозважування є механізмом, який виконує роботу, що в PPO виконували оцінка advantage і critic. (Loss у третьому рядку рівно ln2\ln 2, і це якір для перевірки будь-якої реалізації: policy, ідентична своєму reference, нічого не вивчила й має сидіти на ln2\ln 2.)

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.

Дві речі варто взяти далі.

Перша: цей етап має вартість, і вона проявляється як спроможність. Моделі часто вимірювано гіршають на деяких 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 від початку до кінця без бібліотеки.

  1. Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). Делегування навмисне: блок словника вище — найменша придатна до використання підмножина, а справжня тема — це книжка.

  2. 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, яка використовується сьогодні.

  3. Schulman, J., Wolski, F., Dhariwal, P., Radford, A. and Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017).

  4. 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.

  5. 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, і його варто прочитати повністю; воно коротше, ніж здається з репутації.

  6. Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). Вводить GRPO у розділі 4.1.

  7. Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022).

  8. Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023).

  9. Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021).

  10. Dettmers, T., Pagnoni, A., Holtzman, A. and Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023).


Створено

David Vicente Campos

Засновник NeuraLIA Labs і співзасновник MyRealFood

Я інженер-програміст, випускник Університету Леона. Я співзаснував MyRealFood, де на посаді CTO створив застосунок, яким користувалися мільйони людей, щоб харчуватися здоровіше, і заснував NeuraLIA Labs, де створюю AI-продукти. Тут я пишу про те, що мені довелося зрозуміти дорогою, — так, як я сам хотів би, щоб мені це свого часу пояснили.

Більше про автора

Опубліковано NeuraLIA Labs.

Отримуйте нові дописи на пошту

Новини AI, гайди й оновлення продукту — короткий лист, коли ми публікуємо щось варте вашого часу.

Зміст курсу

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev10 хв читання

AI-модель Jev створена для рішень, а не прози

Jev від TypeSafe AI привертає увагу, бо розглядає програмний інтелект як задачу ймовірності: вибрати правильну гілку, додати впевненість і не платити LLM за написання тексту, коли коду потрібне рішення.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering12 хв читання

Context engineering for long-horizon AI agents

Long-running agents do not fail only because the window is small. They fail when files, tool outputs and stale history crowd out the task the agent was supposed to finish.

Готові довірити вибір моделі LIA?

Створюйте з усіма моделями ШІ в одному місці — почніть безкоштовно вже сьогодні.