Пояснення деталізованої налаштуваності GRPO: навчання локального LLM міркувати
GRPO відкидає критика PPO та навчається за допомогою порівнянь у групі. Розглядаються п’ять основних величин, функції нагороди та короткий скрипт навчання Unsloth та TRL.
Моделі, орієнтовані на міркування, такі як DeepSeek-R1, привернули багато уваги, і тепер багато хто хоче отримати таку саму поведінку у невеликій моделі, яку можна запустити самостійно. Зазвичай за це вважається техніка деталізованої налаштування GRPO. Налаштування під керівництвом (SFT) навчає модель імітувати закономірності в прикладах. Оптимізація відносної політики групи (GRPO) використовує метод посилення навчання, щоб спрямувати модель до відповідей, які дійсно ефективні, що ближче до навчання її міркувати, ніж до формування певного стилю висловлювань.
У цій статті розглядається місце GRPO серед методів RLHF, що означають її п’ять основних показників та як вони перетворюються на кілька десятків рядків коду для навчання.
Місце GRPO серед методів налаштування за пріоритетами
RLHF, тобто навчання з підкріпленням на основі людських відгуків, найкраще розглядати як загальний термін. PPO, GRPO та DPO – це різні оптимізатори, спрямовані на досягнення однієї мети: приведення моделі у відповідність із тим, що preferують люди.
Допоможе порівняння з кулінарією. RLHF – це ідея покращення страви шляхом дегустації та корекцій. PPO – це старіший, більш складний підхід, який потребує другої моделі (критика) та великої кількості пам’яті GPU. GRPO – це новіший, простіший підхід, який відмовляється від критика та економить пам’ять шляхом порівняння відповідей між собою.
Цикл навчання з підкріпленням
Загальне навчання з підкріпленням відбувається у циклі: агент бачить стан, обирає дію, середовище змінюється, надходить винагорода та формується новий стан. Коли PPO (Proximal Policy Optimization) було застосовано до мовних моделей, сама мовна модель стала агентом, а схема включала три компоненти:
- політика генерації, якою є модель, що наразі проходить навчання
- політика порівняння, оригінальна модель, яка залишається незмінною
- модель значень, яка оцінює середню винагороду
Модель винагород оцінює результати, а навчання спрямоване на підвищення цього рейтингу.
PPO використовує підхід актор-критик, що означає навчання двох окремих мереж. Актором є сама LLM. Критиком є мережа значень схожого розміру, яка прогнозує винагороду, яку має отримати відповідь. Наявність обох мереж приблизно подвоює обсяг пам’яті, необхідний під час навчання.
У GRPO немає критика. Завдяки його відсутності використання пам’яті зменшується приблизно вдвічі. Для базової реалізації GRPO генерує низку відповідей на один і той самий запит, оцінює кожну з них та використовує середнє значення групи як точку порівняння для визначення того, які відповіді кращі чи гірші за інші.
DeepSeek представив метод GRPO у своїй статті DeepSeekMath 2024 року, а згодом цей метод було використано у DeepSeek-R1.
П’ять основних елементів методу GRPO
Метод ґрунтується на п’яти ідеях. Для кожної з них метою є пояснення того, що саме вона вимірює та чому була розроблена саме так.
1. Коефіцієнт політики: наскільки змінилась думка моделі?
Цей коефіцієнт порівнює ймовірність, яку оновлена модель надає певній відповіді, з ймовірністю, яку надавала їй попередня модель: нова ймовірність відповіді y для запиту x, поділена на стару.
Якщо відкинути символи, це питання про те, наскільки більш чи менш ймовірно тепер модель дасть цю відповідь порівняно з періодом до цього кроку навчання.
Уявіть учня до та після ночі повторення. Деякі відповіді тепер здаються більш очевидними, а інші — менш. Коефіцієнт відображає саме цю зміну рівня впевненості.
- Значення вище 1 означає, що модель більш впевнена у своїй відповіді, ніж раніше.
- Значення нижче 1 означає, що рівень впевненості знизився, і модель відхиляється від цієї відповіді.
- Точне значення 1 означає, що оновлення нічого не змінило для цієї відповіді.
Чому це важливо? У звичайному навчанні з підкріпленням можна сказати, що відповідь з високою нагородою заслуговує на значне підвищення ймовірності. Це ризиковано, адже надмірний тиск може змусити модель різко змінюватися та втрачати хорошу поведінку лише через те, що одна відповідь виявилася удачною. Цей коефіцієнт діє як обмеження швидкості. GRPO обмежує великі зміни, тож модель змінюється поступово, а не хаотично.
2. Середня нагорода: який був середній бал цієї групи?
Середнє значення — це сума нагород для групи G відповідей, поділена на G. G — це кількість відповідей, вибраних для одного запитання, і кожна відповідь отримує оцінку від моделі нагород.
Припустимо, ви просите модель розв’язати математичну задачу та вибрати п’ять варіантів відповідей з певною випадковістю. Один з них ідеальний (нагорода 1,0), інший частково правильний (0,5), а ще один явно неправильний (0,0). Середнє значення показує, наскільки добре модель справляється з цією задачею у поточний момент.
Саме ця роль робить GRPO цікавим методом. PPO потребував критика — другої мережі, завданням якої було прогнозувати очікувану нагороду, а її навчання було дорогим, вимагало багато пам’яті та схильним до помилок. GRPO запитує: навіщо прогнозувати середнє, якщо його можна просто обчислити? Вибір групи варіантів та усереднення реальних нагород дає базовий показник безкоштовно, без додаткових мереж та марної витрати пам’яті. Саме це і є „групою“ у назві методу.
3. Стандартне відхилення: наскільки розкидані оцінки?
Стандартне відхилення вимірює, наскільки кожна нагорода відхиляється від середнього значення, беручи квадратний корінь від середньоквадратичної різниці. Якщо середнє значення описує типову продуктивність, то цей показник відображає послідовність.
Високе значення означає, що відповіді дуже різні — деякі відмінні, а деякі жахливі. Низьке значення означає, що модель щоразу формує відповіді схожої якості.
Розглянемо двох учнів. Учень А отримує оцінки 90, 10, 95, 5 та 88; середнє значення становить 57,6, а розкид дуже великий — це ознака крайньої непослідовності. Учень Б отримує оцінки 58, 56, 60, 57 та 59; середнє значення — 58, а розкид дуже малий — це ознака стабільно посередньої продуктивності.
У GRPO відхилення виконує функцію нормалізатора. Коли відповіді сильно різняться, різниці між нагородами несуть значущу інформацію та виправдовують більші оновлення. Коли модель вже є послідовною, невеликі розбіжності в нагородах можуть бути шумом, тому оновлення мають бути обережнішими.
4. Відносна перевага групи: чи кращий цей відповідь за середній?
Це ядро методу. Перевага для відповіді i — це її нагорода мінус середнє значення групи, поділене на стандартне відхилення групи. Це перетворює первинні нагороди на відносний бал, який сприяє навчанню.
Віднімання показує, наскільки відповідь краща чи гірша за середнє. Ділення здійснюється з урахуванням розкиду, щоб бали можна було порівнювати між запитаннями та етапами навчання.
Уявіть оцінювання дуже складного іспиту, де середній бал у класі становить 40 з 100. Учень отримує 60 балів. Як первинна оцінка це звучить посередньо, але відносно класу це на 20 балів вище середнього, що є чудовим результатом. Принцип переваги працює аналогічно: ігноруючи абсолютні значення нагород, він визначає, чи кращий цей відповідь за те, що модель зазвичай генерує для цього запиту.
Три властивості роблять цей підхід корисним.
- Відсутність критика. Перевага PPO залежала від оцінки очікуваної винагороди критиком. GRPO замінює ці припущення емпіричною середньою значеннями всередині групи.
- Самокалібрування. Якщо модель оцінки винагороди має упередження та оцінює все занадто високо або занадто низько, відносна формула компенсує це упередження. Важливим є лише рангування всередині групи.
- Стабільність. Завдяки нормалізації швидкість навчання адаптується. Коли модель активно досліджує простір, оновлення є різкими; у міру зближення до оптимального рішення вони стають більш поміркованими.
5. Штраф KL: залишайтеся впізнаваним собою
Це захисний гальмо. Хоча GRPO спонукає модель до отримання відповідей із високою винагородою, показник KL тягне її у протилежному напрямку, забороняючи ставати кимось іншим. Він порівнює поточну модель із замороженою моделлю-орієнтиром, якою зазвичай є базова модель з періоду до початку роботи з RL. Розхилення KL — це показник того, наскільки різні дві розподіли ймовірностей. Формула, наведена у джерелі, — це поширений спосіб оцінки для кожного токена, який обчислюється на основі співвідношення ймовірностей орієнтира та поточної моделі.
Уявіть собі базову модель як добре освіченого універсаліста, який може писати вірші, виправляти код та узагальнювати новини. Тепер ви застосовуєте RL, щоб перетворити її на експерта з математики. Без показника KL вона може настільки зосередитися на математичних винагородах, що забуде про все інше, навіть почне створювати безглузді тексти у математичному стилі для нерелевантних запитів.
Низьке значення KL означає, що модель все ще нагадує свою початкову версію. Високе значення KL означає, що вона сильно відхилилась, можливо, через надмірну адаптацію до моделі винагороди чи втрату загальних здібностей.
Моделі винагород є недосконалими та можуть бути обіграні. Модель без члена KL може виявити, що початок відповіді фразою «Дозвольте мені подумати крок за кроком» приносить додаткову винагороду, навіть якщо це нічого не додає. Орієнтація на контрольні блоки сприяє так званому хакуванню винагород. На практиці член KL входить до функції втрат із невеликою вагою — близько 0,01–0,04. Він призначений не для зупинки прогресу, а лише для його збалансованості.
Повна інформація простою мовою
- Сформувати групу відповідей на одне запитання.
- Оцінити кожну з них за допомогою моделі винагород.
- Обчислити середнє та стандартне відхилення цих оцінок.
- Визначити перевагу кожної відповіді, тобто наскільки вона вища чи нижча за середнє значення.
Результатом є модель, яка вчиться міркувати не шляхом запам’ятовування правильних відповідей, а шляхом виявлення тих патернів мислення, які регулярно перевершують її власний середній рівень.
Від рівнянь до trainer.train()
Після того, як розглянуто математичні аспекти, ось код, який дозволяє їх застосувати на практиці. Він використовує Unsloth для завантаження 4-бітної моделі Llama 3.2 3B Instruct із використанням бекенду vLLM, додає адаптери LoRA, примушує до певного формату міркувань за допомогою системних запитів та створює набір для навчання з GSM8K. vLLM потрібен тому, що GRPO має швидко генерувати багато варіантів відповідей на кожен запит.
from unsloth import FastLanguageModel
from datasets import load_dataset
import re
# 1. Load 4-bit model with vLLM backend for fast group generation
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Llama-3.2-3B-Instruct",
max_seq_length=1024,
load_in_4bit=True,
fast_inference=True,
max_lora_rank=32,
gpu_memory_utilization=0.6,
)
# 2. Attach LoRA adapters
model = FastLanguageModel.get_peft_model(
model,
r=32,
target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj"],
lora_alpha=64,
use_gradient_checkpointing="unsloth",
)
# 3. Enforcing reasoning format - GRPO needs structure to reward
SYSTEM_PROMPT = "Respond in the following format:\n<reasoning>\n...\n</reasoning>\n<answer>\n...\n</answer>"
# 4. Load GSM8K and wrap prompts
dataset = load_dataset("openai/gsm8k", "main")["train"]
dataset = dataset.map(lambda x: {
"prompt": [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": x["question"]}
],
"answer": x["answer"].split("####")[1].strip()
})
#vLLM is used in GRPO because GRPO requires the AI to generate a ma
Функції винагороди
Проектування системи винагород є найбільш делікатною частиною деталізованої налаштування GRPO. Якщо це зробити неправильно, модель почне обходити ваші правила оцінювання замість того, щоб міркувати. Окремі оцінки підсумовуються у первинну винагороду, яка використовується для розрахунку переваги. У наведеному нижче списку є п’ять функцій, кожна з яких має свою причину існування.
- correctness_reward є основним сигналом. Він витягує текст усередині тегів відповідей та присвоює 2,0 у разі збігу з істинним рішенням, в іншому випадку — 0,0. Вага цього показника навмисно велика, щоб правильна відповідь завжди мала більше значення, ніж акуратний вигляд.
- int_reward є запобіжним механізмом. На ранніх етапах навчання майже все є неправильним, тому він присвоює 0,5 лише за надання коректного числа, що підтримує наявність сигналів для навчання до того моменту, коли модель почне розв’язувати задачі.
Кожна з цих функцій окремо є простою. У сукупності правильність забезпечує якість, формат вказує напрямок, а деталі самі себе контролюють.
def extract_xml_answer(text: str) -> str:
return text.split("<answer>")[-1].split("</answer>")[0].strip()
# Primary signal: is the final answer correct?
def correctness_reward(prompts, completions, answer, **kwargs):
responses = [c[0]["content"] for c in completions]
extracted = [extract_xml_answer(r) for r in responses]
return [2.0 if r == a else 0.0 for r, a in zip(extracted, answer)]
# Dense shaping rewards - keep learning signal alive even when answers are wrong
def int_reward(completions, **kwargs):
return [0.5 if extract_xml_answer(c[0]["content"]).isdigit() else 0.0 for c in completions]
def strict_format_reward(completions, **kwargs):
pattern = r"^<reasoning>\n.*?\n</reasoning>\n<answer>\n.*?\n</answer>\nquot;
return [0.5 if re.match(pattern, c[0]["content"]) else 0.0 for c in completions]
def soft_format_reward(completions, **kwargs):
pattern = r"<reasoning>.*?</reasoning>\s*<answer>.*?</answer>"
return [0.5 if re.match(pattern, c[0]["content"]) else 0.0 for c in completions]
def xmlcount_reward(completions, **kwargs):
def score(text):
count = 0.0
if text.count("<reasoning>\n") == 1: count += 0.125
if text.count("\n</reasoning>\n") == 1: count += 0.125
if text.count("\n<answer>\n") == 1:
count += 0.125
count -= len(text.split("\n</answer>\n")[-1]) * 0.001
if text.count("\n</answer>") == 1:
count += 0.125
count -= (len(text.split("\n</answer>")[-1]) - 1) * 0.001
return count
return [score(c[0]["content"]) for c in completions]pyt
Тренер
from trl import GRPOConfig, GRPOTrainer
trainer = GRPOTrainer(
model=model,
processing_class=tokenizer,
reward_funcs=[
xmlcount_reward, # tag quality
soft_format_reward, # structure (forgiving)
strict_format_reward, # structure (exact)
int_reward, # partial credit
correctness_reward, # ground-truth match
],
args=GRPOConfig(
learning_rate=5e-6,
per_device_train_batch_size=1,
gradient_accumulation_steps=1,
num_generations=8, # G = group size
max_prompt_length=256,
max_completion_length=200,
max_steps=250,
warmup_ratio=0.1,
max_grad_norm=0.1,
output_dir="outputs",
),
train_dataset=dataset,
)
trainer.train()
На кожному кроці GRPOTrainer виконує п’ять описаних вище обчислень.
Чому DPO має труднощі з міркуванням
DPO є елегантним, тому що він повністю уникає методу посилення навчання. Він переформулює проблему як задачу класифікації: за наявності запитання та двох варіантів відповідей потрібно навчитися віддавати перевагу кращому варіанту. Це добре працює, коли мітки переваг є точними.
Однак міркування насправді не є проблемою переваг — це проблема пошуку.
Припустимо, ви хочете, щоб модель довела теорему з геометрії. DPO потребує людини або більш потужної моделі, яка визначить, який з двох доведень кращий. А що, якщо обидва є неправильними? А що, якщо правильне доведення вимагає 12 кроків та ніколи не було вибрано? DPO може навчатися лише на тих парах даних, які йому надано, і не може знайти нову стратегію міркувань.
GRPO генерує низку відповідей на одне й те саме запитання, оцінює кожну з них та визначає, яка перевищує середній рівень. Це означає, що він досліджує різні можливості. Він може знайти незвичайний спосіб міркування, добре його оцінити та посилити, причому ніхто раніше не записував цей шлях.
Простими словами, DPO дешевший у використанні, але обмежує якість моделі якістю її даних для формування уподобань. GRPO коштує більше за кожен крок, але дозволяє виходити за межі даних, позначених людьми, та досягати справді нових способів міркування.
Заключні думки
GRPO навчає модель міркувати, вивчаючи, які з її власних відповідей перевищують середній рівень. Видалення елемента критики зменшує використання пам’яті, зберігаючи при цьому сигнал для навчання, а за допомогою розумних функцій нагород та групового вибірки можна покращити здатність локальної моделі до міркувань на одному GPU. Нагороджуйте ту поведінку, якої ви насправді бажаєте, утримуйте модель у стабільному стані та стежте за значенням KL.