Wyjaśnienie drobnej optymalizacji GRPO: Nauczanie lokalnego LLM rozumowania
GRPO porzuca krytyka PPO i uczy się na podstawie porównań grupowych. Omówienie pięciu kluczowych wielkości, funkcji nagrody oraz krótkiego skryptu treningowego Unsloth i TRL.
Modele skupione na rozumowaniu, takie jak DeepSeek-R1, przyciągnęły dużą uwagę, a wiele osób chce teraz takiego samego zachowania w małym modelu, który mogą sami uruchomić. Najczęściej przyznawaną za to techniką jest doprecyzowywanie GRPO. Doprecyzowywanie pod nadzorem (SFT) uczy model, jak naśladować wzorce w przykładach. Optymalizacja polityki względnej grupy (GRPO) wykorzystuje uczenie się przez wzmocnienie, aby skierować model ku odpowiedziom, które rzeczywiście działają, co jest bliższe nauczeniu go myślenia niż tylko brzmienia.
W tym artykule omówiono, gdzie GRPO znajduje się wśród metod RLHF, co oznaczają jego pięć podstawowych wielkości oraz jak przekształcają się one w kilkadziesiąt linijek kodu treningowego.
Miejsce GRPO wśród metod doprecyzowywania według preferencji
RLHF, czyli uczenie się wzmacniające na podstawie informacji zwrotnych od ludzi, najlepiej traktować jako termin ogólny. PPO, GRPO i DPO to różne optymalizatory, które dążą do tego samego celu: dostosowania modelu do preferencji ludzi.
Pomaga porównanie z gotowaniem. RLHF to idea udoskonalania potrawy poprzez degustację i korekty. PPO to starszy, bardziej złożony „przepis”, który wymaga drugiego modelu (krytyka) oraz dużej ilości pamięci GPU. GRPO to nowszy, lżejszy „przepis”, który eliminuje krytyka i oszczędza pamięć poprzez porównywanie odpowiedzi między sobą.
Pętla uczenia się wzmacniającego
Ogólne podejście w uczeniu się wzmacniającym odbywa się w pętli: agent widzi stan, wybiera działanie, środowisko się zmienia, pojawia się nagroda, a następnie nowy stan. Gdy PPO (Proximal Policy Optimization) zastosowano do modeli językowych, model językowy stał się agentem, a cała konfiguracja składała się z trzech elementów:
- polityka generująca, czyli model, który jest obecnie trenowany
- polityka referencyjna, czyli oryginalny model pozostawiony w stanie zamrożonym
- model wartości, który szacuje średnią nagrodę
Model nagród ocenia wyniki, a trening ma na celu podniesienie tej oceny.
PPO opiera się na architekturze aktora-krytyka, co oznacza, że trenowane są dwa oddzielne sieci. Aktorem jest sam LLM. Krytykiem jest sieć wartości podobnej wielkości, która przewiduje nagrodę, jaką powinna otrzymać odpowiedź. Obecność obu sieci mniej więcej podwaja ilość pamięci potrzebnej podczas treningu.
GRPO nie posiada krytyka. Dzięki jego braku zużycie pamięci spada mniej więcej o połowę. W przypadku podejścia bazowego GRPO generuje grupę odpowiedzi na ten sam prompt, ocenia każdą z nich i używa średniej z tej grupy jako punktu odniesienia do określenia, które odpowiedzi były lepsze lub gorsze od pozostałych.
DeepSeek przedstawił metodę GRPO w swoim artykule DeepSeekMath z 2024 roku, a później została ona włączona do modelu DeepSeek-R1.
Pięć elementów leżących u podstaw GRPO
Metodę tę opierają pięć koncepcji. W przypadku każdej z nich celem jest wyjaśnienie, co mierzy oraz dlaczego została tak zaprojektowana.
1. Stosunek polityki: o ile zmieniła się opinia modelu?
Stosunek ten porównuje prawdopodobieństwo, jakie aktualizowany model przypisuje danej odpowiedzi, z prawdopodobieństwem przypisanym jej przez poprzedni model: nowe prawdopodobieństwo odpowiedzi y dla promptu x, podzielone przez stare.
Gdy pominąć symbole, pytanie brzmi, o ile bardziej lub mniej prawdopodobne jest teraz u modelu wygenerowanie tej odpowiedzi w porównaniu z okresem przed tą sesją treningową.
Pomyśl o uczniu przed i po nocy nad nauką. Niektóre odpowiedzi wydają się teraz bardziej oczywiste, a inne mniej. Stosunek ten odzwierciedla tę zmianę w pewności siebie modelu.
- Wartość powyżej 1 oznacza, że model jest bardziej pewny swojej odpowiedzi niż wcześniej.
- Wartość poniżej 1 oznacza spadek pewności i to, że model oddala się od tej odpowiedzi.
- Dokładna wartość 1 oznacza, że aktualizacja nie zmieniła nic w przypadku tej odpowiedzi.
Dlaczego to ma znaczenie? W tradycyjnym uczeniu wzmacniającym można by stwierdzić, że odpowiedź z wysoką nagrodą zasługuje na duży wzrost prawdopodobieństwa. Jest to ryzykowne, ponieważ zbyt silne naciskanie może sprawić, że model będzie się gwałtownie zachowywać i porzuci dobre wzorce działania tylko dlatego, że jedna odpowiedź miała szczęście. Ten stosunek pełni rolę ograniczenia prędkości – GRPO ogranicza duże skoki, dzięki czemu model zmienia się stopniowo, a nie chaotycznie.
2. Średnia nagroda: jaki był średni wynik tej partii?
Średnia to suma nagród dla grupy G odpowiedzi, podzielona przez G. G to liczba odpowiedzi pobranych dla jednego pytania, a każda z nich otrzymuje ocenę od modelu nagród.
Załóżmy, że poprosimy model o rozwiązanie zadania matematycznego i wybierzemy pięć odpowiedzi losowo. Jedna jest doskonała (ocena 1,0), druga częściowo prawidłowa (0,5), a trzecia całkowicie błędna (0,0). Średnia pokazuje, jak dobrze model radzi sobie z tym zadaniem w danym momencie.
To właśnie ta rola sprawia, że GRPO jest tak ciekawe. PPO wymagało krytyka – drugiej sieci, której jedynym zadaniem było przewidywanie oczekiwanej nagrody – a jej szkolenie było kosztowne, wymagało dużej ilości pamięci i narażone na błędy. GRPO pyta, po co przewidywać średnią, skoro można ją obliczyć bezpośrednio. Wybór grupy odpowiedzi i uśrednienie rzeczywistych ocen daje bazową wartość bez żadnej dodatkowej sieci i bez marnowania pamięci. To właśnie „grupa” znajduje się w nazwie tej metody.
3. Odchylenie standardowe: jak rozproszone są wyniki?
Odchylenie standardowe mierzy, o ile każda nagroda odbiega od średniej, obliczając pierwiastek kwadratowy średniej kwadratu różnic. Podczas gdy średnia opisuje typową wydajność, to odchylenie standardowe pokazuje spójność.
wysoka wartość oznacza, że odpowiedzi są bardzo zróżnicowane – niektóre doskonałe, a inne kiepskie. niska wartość oznacza, że model zawsze generuje odpowiedzi podobnej jakości.
Rozważmy dwóch uczniów. Uczeń A uzyskuje oceny 90, 10, 95, 5 i 88, co daje średnią 57,6 przy dużym rozrzutie – co wskazuje na ogromną niestabilność. Uczeń B uzyskuje oceny 58, 56, 60, 57 i 59, co daje średnią 58 przy małym rozrzutie – co oznacza spójną, choć przeciętną wydajność.
w GRPO odchylenie standardowe pełni rolę normalizatora. Gdy odpowiedzi są bardzo zróżnicowane, różnice pomiędzy nagrodami zawierają istotne informacje i uzasadniają większe aktualizacje. Gdy model jest już spójny, małe różnice w nagrodach mogą być szumem, więc aktualizacje powinny być bardziej ostrożne.
4. Przewaga względem grupy: czy ta odpowiedź była lepsza od pozostałych?
To jest sedno tej metody. Przewaga dla danej odpowiedzi wynosi jej nagrodę pomniejszoną o średnią wartość grupy, podzieloną przez standardową odchylność grupy. Dzięki temu surowe nagrody są przekształcane w względną ocenę, która napędza proces uczenia się.
Odjęcie średniej pokazuje, o ile odpowiedź jest lepsza lub gorsza od przeciętnej. Dzielenie przez standardową odchylność umożliwia porównywanie ocen pomiędzy różnymi pytaniami oraz na przestrzeni poszczególnych kroków treningu.
Wyobraźmy sobie ocenianie bardzo trudnego egzaminu, gdzie średnia w klasie wynosi 40 punktów na 100. Jakiś uczeń otrzymuje 60 punktów. Jako surowa ocena brzmi to przeciętnie, ale w porównaniu z resztą klasy jest o 20 punktów powyżej średniej, co jest doskonałe. Ta sama zasada obowiązuje w przypadku tej metody – ignoruje się bezwzględne wartości nagród i sprawdza się, czy dana odpowiedź była lepsza od tego, co model zwykle generuje na podstawie danego pytania.
Trzy właściwości sprawiają, że ta metoda jest przydatna.
- Brak krytyka. Zaleta PPO polegała na tym, że krytyk oceniał oczekiwane nagrody. GRPO zastępuje tę domysłowość empiryczną średnią dla całej grupy.
- Samokalibracja. Jeśli model nagród jest stronniczy i ocenia wszystko zbyt wysoko lub zbyt nisko, wzorzec względny eliminuje tę stronniczość. Liczy się tylko ranking wewnątrz grupy.
- Stabilność. Dzięki normalizacji prędkość uczenia się się dostosowuje. Gdy model bada szeroki zakres możliwości, aktualizacje są intensywne. W miarę zbliżania się do rozwiązania stają się one łagodniejsze.
5. Kara KL: pozostań rozpoznawalny jako ty
To jest hamulec bezpieczeństwa. Podczas gdy GRPO popycha model w kierunku odpowiedzi o wysokiej nagrodzie, wyrażenie KL ciągnie go w przeciwnym kierunku, zalecając nie stawanie się kimś innym. Porównuje ono bieżący model z zamrożonym modelem referencyjnym, który zazwyczaj to model podstawowy z czasów przed rozpoczęciem pracy z RL. Divergencja KL to miara tego, jak duży jest rozbieżność między dwiema rozkładami prawdopodobieństwa. Formuła przedstawiona w źródle to powszechnie używana szacunkowa wartość na token, obliczana na podstawie stosunku prawdopodobieństw referencyjnych do bieżących.
Wyobraźmy sobie model podstawowy jako dobrze wykształconego generalistę, który potrafi pisać wiersze, naprawiać kod i podsumowywać wiadomości. Teraz uruchamiamy RL, aby przekształcić go w eksperta od matematyki. Bez wyrażenia KL może on tak skupić się na nagrodach związanych z matematyką, że zapomni o wszystkim innym, w tym o generowaniu bezsensownych treści o charakterze matematycznym na niepowiązane tematy.
Niskie wartości KL oznaczają, że model nadal przypomina swój pierwotny kształt. Wysokie wartości KL wskazują, że model znacznie się odchylił, być może z powodu nadmiernego dopasowania do modelu nagród lub utraty ogólnej zdolności.
Modele nagród są niedoskonałe i można je oszukać. Model bez wyrazu KL może odkryć, że rozpoczęcie od frazy „Pozwól mi myśleć krok po kroku” przynosi dodatkową nagrodę, nawet jeśli nic nie dodaje. Odwoływanie się do punktów odniesienia utrudnia takie oszustwa. W praktyce wyraz KL pojawia się w funkcji straty z małą wagą, około 0,01 do 0,04. Nie służy on temu, by zatrzymać postępy, lecz by utrzymać ich równowagę.
Pełne wyjaśnienie w prostych słowach
- Stwórz grupę odpowiedzi na jedno pytanie.
- Oceń każdą z nich za pomocą modelu nagród.
- Oblicz średnią i odchylenie standardowe tych ocen.
- Określ przewagę każdej odpowiedzi, czyli o ile jest ona powyżej lub poniżej średniej.
Rezultatem jest model, który uczy się rozumować nie poprzez zapamiętywanie prawidłowych odpowiedzi, lecz poprzez odkrywanie takich wzorców myślenia, które regularnie przewyższają jego własną średnią.
Od równań do trainer.train()
Gdy już omówiliśmy aspekty matematyczne, oto kod, który to uruchamia. Wykorzystuje Unsloth do załadunku modelu Llama 3.2 3B Instruct o rozdzielczości 4 bitów z interfejsem vLLM, dodaje adaptery LoRA, narzuca format rozumowania za pomocą promptu systemowego oraz tworzy zbiór treningowy na podstawie GSM8K. vLLM jest potrzebny, ponieważ GRPO musi szybko generować wiele uzupełnień na jeden prompt.
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
Funkcje nagród
Projektowanie funkcji nagród to najdelikatniejszy element drobnej kalibracji GRPO. Jeśli zostanie to zrobione błędnie, model nauczy się obejść twoje zasady oceny zamiast rozumować. Indywidualne wyniki są sumowane, tworząc surową nagrodę, która służy do obliczania przewagi. Poniższy zestaw zawiera pięć funkcji, z których każda ma swoje uzasadnienie istnienia.
- correctness_reward jest głównym sygnałem. Wyodrębnia tekst znajdujący się w tagach odpowiedzi i przyznaje 2,0 za zgodność z prawdą obiektywną, w przeciwnym razie 0,0. Waga ta jest celowo duża, aby poprawność zawsze przeważała nad starannym formatowaniem.
- int_reward pełni rolę bezpiecznika. Na wczesnym etapie treningu prawie wszystko jest błędne, więc przyznaje 0,5 za sam fakt podania ważnej liczby, co utrzymuje jakiś sygnał uczenia się aż do momentu, gdy model zaczyna rozwiązywać problemy.
Poszczególnie każda z tych funkcji jest prosta. Gdy je połączyć, poprawność decyduje o wyniku, format kieruje procesem, a szczegóły same się załatwiają.
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
Trener
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()
Na każdym kroku GRPOTrainer wykonywa pięć opisanych powyżej obliczeń.
Dlaczego DPO ma trudności z rozumowaniem
DPO jest eleganckie, ponieważ całkowicie unika uczenia się przez wzmocnienie. Przekształca problem na zadanie klasyfikacyjne: przy danym pytaniu i dwóch odpowiedziach uczy się preferować tę lepszą. To działa dobrze, gdy etykiety preferencji są dokładne.
Rozumowanie jednak w rzeczywistości nie jest problemem preferencji – to problem wyszukiwania.
Załóżmy, że chcemy, aby model udowodnił twierdzenie z geometrii. DPO potrzebuje osoby lub silniejszego modelu, który powie, która z dwóch dowodów jest lepsza. A co, jeśli oba są błędne? A co, jeśli poprawny dowód wymaga 12 kroków i nigdy nie został wybrany? DPO uczy się tylko na podstawie dostarczonych par i nie może odkryć nowej strategii rozumowania.
GRPO generuje grupę odpowiedzi na to samo pytanie, ocenia każdą z nich i określa, które przewyższają średnią. Oznacza to, że eksploruje różne możliwości. Może trafić na nieznany sposób rozumowania, dobrze go ocenić i wzmocnić, przy czym nikt wcześniej nie zapisał takiego rozwiązania.
Mówiąc prościej, DPO jest tańszy w użyciu, ale ogranicza model jakość jego danych preferencyjnych. GRPO kosztuje więcej za krok, ale może wyjść poza dane oznaczone przez ludzi i osiągnąć rozumowanie naprawdę nowe.
Uwagi końcowe
GRPO uczy model rozumowania poprzez analizę tego, które z jego własnych odpowiedzi przewyższają średnią. Usunięcie elementu krytycznego zmniejsza zużycie pamięci, zachowując jednocześnie sygnał uczenia się; dzięki rozsądnym funkcjom nagród oraz próbkowaniu grupowemu można poprawić zdolność rozumowania lokalnego modelu na pojedynczym GPU. Nagradzaj zachowania, których faktycznie chcesz, utrzymuj model w stabilności i obserwuj wartość KL.
Powiązane materiały
- Od GPT-1 do modeli rozumowania: Co każda generacja zmieniła dla programistów — Prześledź rodzinę GPT od treningu wstępnego z 2018 roku po modele rozumowania, zobacz, jakie pomysły dodała każda generacja, oraz skorzystaj z funkcji widzenia GPT-4o i strukturyzowanych wyjść w Pythonie.
- Wnętrze agenta AI: Modele, narzędzia, pamięć i rozumowanie wyjaśnione — Omawia podstawową architekturę agentów AI – cele, modele, narzędzia, pamięć i rozumowanie – oraz przedstawia praktyczny przykład agenta badawczego opartego na Pythonie.