Přeskočit na obsah
coden

Policy gradient a PPO: učení přímo strategie

Stochastická strategie jako síť, REINFORCE a věta o gradientu strategie, základní úroveň a výhoda, actor-critic, PPO s ořezem napsané od nuly na vozíku s tyčí, co se stane bez ořezu, a jak PPO doladilo jazykové modely.

12 minut Matěj Žalmánek 2026-10-16

Série Základy AI Díl 80 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • Jak se učí strategie přímo z výsledků, bez tabulky hodnot.
  • Proč pomáhá odečíst základní úroveň a co je výhoda.
  • Proč je ořez v PPO tak důležitý a jak souvisí s RLHF.

Co se hodí znát předem: Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť, Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice, Vícetřídní klasifikace a softmax: od dvou tříd k mnoha

DQN z minulého dílu se učí, jak dobrá je každá akce, a strategie z toho plyne až nepřímo: vyber akci s největší hodnotou. Druhá velká rodina metod jde rovnou: síť dostane stav a vrátí pravděpodobnosti akcí, a my ty pravděpodobnosti posouváme tak, aby dobré akce byly častější. Z této rodiny pochází PPO — algoritmus, který naučil roboty chodit, porazil profesionály ve hře Dota 2 a stál za doladěním ChatGPT. V tomhle dílu ho napíšeme od nuly a porovnáme s jednoduššími předchůdci.

Navazuje na díly Q-learning a DQN, Markovovy rozhodovací procesy a Softmax.

1. Učit rovnou strategii

Definice — parametrizovaná strategie

Nechť (S, A, P, R, γ) je MDP (značení z dílu Markovovy rozhodovací procesy) s konečnou množinou akcí A a počátečním rozdělením p(s0) na S, a nechť θ ∈ ℝm jsou parametry. Parametrizovaná (stochastická) strategie je systém strategií (πθ)θ ∈ ℝm, kde pro každé θ a každé s ∈ S je πθ(· | s) rozdělení pravděpodobnosti na A a πθ(a | s) je diferencovatelná funkce θ. Pro konečnou A se bere síť fθ : S → ℝ|A| a softmax jejích výstupů:

πθ(a | s) = efθ(s)a/∑b ∈ A efθ(s)b;

pro spojité akce síť vrací třeba střed a rozptyl normálního rozdělení. Cíl je očekávaný výnos jako funkce parametrů

J : ℝm → ℝ,   J(θ) = Eπθ[G0],

a hledá se θ s co největším J(θ) gradientním výstupem θ ← θ + α ∇J(θ) s rychlostí učení α > 0 (∇ značí gradient podle θ).

Laicky řečeno

DQN si vede tabulku „kolik bodů za který tah“ a hraje tah s nejvíc body. Strategie místo toho rovnou říká „v téhle situaci tlač doprava se 70 %, doleva s 30 %“. Výhody: funguje i se spojitými akcemi (jakou silou, jakým úhlem), náhoda je zabudovaná, takže agent sám zkouší, a malá změna parametrů znamená malou změnu chování.

Příklad — výnos jednoho pokusu na vozíku s tyčí

Odměna je +1 za každý krok a diskont γ = 0,99. Zbývá-li do konce epizody T − t kroků, je výnos geometrická řada:

Gt = 1 + γ + γ² + … + γT−t−1 = 1 − γT−t/1 − γ.

Na začátku epizody, která vydrží celých 500 kroků: G0 = 1 − 0,99500/0,01 = 99,34. Dvacet kroků před pádem: G = 1 − 0,9920/0,01 = 18,21. Krok těsně před pádem: G = 1. Výnos je tedy vždy kladný a nikdy nepřesáhne 1/1 − γ = 100 — to se bude hodit v oddílu o základní úrovni.

2. REINFORCE: posiluj, co vyšlo

Definice — věta o gradientu strategie a REINFORCE

Věta o gradientu strategie. Nechť (S, A, P, R, γ) je MDP s konečnými S a A a γ ∈ [0, 1], ve kterém každá epizoda s0, a0, r1, s1, …, sT skončí nejpozději po Tmax krocích (T ≤ Tmax), a nechť πθ je parametrizovaná strategie s πθ(a | s) > 0 pro všechna s, a, θ. Pak

∇J(θ) = Eπθ[ ∑t=0T−1 γt ∇ log πθ(at | st) · Gt ],   Gt = ∑k=tT−1 γk−t rk+1.

Pro γ = 1 činitel γt zmizí a dostaneme tvar v rozboru níže. Praktické implementace (i naše) ho vynechávají i pro γ < 1; pak výsledek už není nestranný odhad ∇J(θ) (obecně dokonce není gradientem žádné funkce; Chris Nota a Philip Thomas, 2020), protože pozdější kroky epizody dostanou větší váhu, než jim podle věty patří — v praxi to přesto funguje dobře.

REINFORCE (Ronald Williams, 1992) je algoritmus:

  1. zvol počáteční θ ∈ ℝm (náhodné váhy sítě) a rychlost učení α > 0;
  2. odehraj strategií πθ epizody (u nás dohromady aspoň 2 000 kroků);
  3. v každé epizodě spočítej odzadu GT = 0 a Gt = rt+1 + γ Gt+1 pro t = T − 1, …, 0;
  4. spočítej odhad gradientu ĝ = průměr hodnot ∇ log πθ(at | st) · Gt přes všechny odehrané kroky;
  5. θ ← θ + α ĝ, data zahoď a pokračuj krokem 2, dokud nevyčerpáš rozpočet kroků v prostředí.

Pro softmax π = softmax(z) s výstupy sítě z ∈ ℝ|A| je gradient podle z roven ∇z log πa = 1a − π, kde 1a je vektor s jedničkou na místě akce a a nulami jinde.

Laicky řečeno

Zahraj, podívej se, jak to dopadlo, a každý tah, který jsi udělal, udělej o kousek pravděpodobnějším — tím víc, čím lépe to po něm dopadlo. Tahy z povedených her se posilují víc než tahy z nepovedených. Nikdo nemusí říkat, který tah byl správný; stačí výsledek.

∇J(θ) = Eπθ[ ∑t ∇ log πθ(at | st) · Gt ]

∇J(θ)
směr, kterým pootočit parametry, aby průměrný výnos rostl nejrychleji; spočítat ho přímo nejde, protože výnos závisí na θ jen přes náhodné hraní a neznámou fyziku prostředí
Eπθ[ ∑t … ]
průměr přes epizody odehrané současnou strategií — proto jde nahradit průměrem přes skutečně odehrané hry; a proto data od jiné strategie (starší, cizí) bez opravy nestačí
∇ log πθ(at | st)
směr v parametrech, který zahranou akci zpravděpodobní; ∇ log π = ∇π/π dělí pravděpodobností, takže častá akce, která se v datech objevuje často, nedostane navíc víc posílení jen proto, že je častá
Gt
váha: jak dobře to po akci dopadlo; jen odměny od kroku t dál, protože akce nemůže ovlivnit odměny, které už padly
Gradient je vážený průměr směrů „udělej tuhle akci pravděpodobnější“, vahou je výnos, který po ní přišel.
Věta — odkud vzorec pochází (trik s logaritmem)

Nechť platí předpoklady věty o gradientu strategie. Epizodu (trajektorii) τ = (s0, a0, s1, a1, …, sT) má strategie πθ s pravděpodobností

Pθ(τ) = p(s0) ∏t=0T−1 πθ(at | st) P(st+1 | st, at)

a nechť G(τ) = G0 je její výnos; trajektorií je konečně mnoho, takže J(θ) = ∑τ Pθ(τ) G(τ). Pak

∇J(θ) = ∇ ∑τ Pθ(τ) G(τ) = ∑τ Pθ(τ) · ∇ log Pθ(τ) · G(τ) = Eτ ∼ πθ[ ∇ log Pθ(τ) · G(τ) ],

protože ∇P = P · ∇ log P. Důkaz (náčrt): logaritmus změní součin na součet, log Pθ(τ) = log p(s0) + ∑t log πθ(at | st) + ∑t log P(st+1 | st, at). Na θ závisí jen prostřední součet, takže fyziku prostředí P znát nemusíme: ∇ log Pθ(τ) = ∑t ∇ log πθ(at | st). Nakonec u každého at zahodíme odměny před krokem t: na at nezávisejí, a jejich příspěvek má proto nulovou střední hodnotu (viz věta v dalším oddílu). Ze součtu ∑k γk rk+1 tak u kroku t zbude ∑k ≥ t γk rk+1 = γt Gt, což je tvrzení věty o gradientu strategie. ∎

Příklad — jeden krok REINFORCE se softmaxem

Dvě akce, výstupy sítě z = (0; 0), takže π = softmax(z) = (0,50; 0,50). Agent zahrál akci 1 („doprava“) a výnos od toho kroku byl G = 10. Pro softmax je ∇z log π(a) = 1a − π, tedy

∇z log π(1) · G = ((0; 1) − (0,50; 0,50)) · 10 = (−5; 5)

(barvy podle rozboru vzorce výše; výsledek je odhad ∇J z jediného kroku).

Krok výstupem s α = 0,1: z ← (0; 0) + 0,1 · (−5; 5) = (−0,5; 0,5). Nová strategie π = (e−0,5; e0,5)/e−0,5 + e0,5 = (0,269; 0,731). Akce, která vyšla, je teď pravděpodobnější. (Ve skutečné síti se mění váhy θ a k z se gradient dostane zpětným šířením; směr je týž.)

θ = náhodné váhy sítě strategie
opakuj:
    odehraj celé epizody strategií π_θ, dokud není aspoň 2 000 kroků
    pro každou epizodu odzadu:              # G = 0 za koncem epizody
        G_t = r_(t+1) + γ · G_(t+1)
    g = průměr přes všechny kroky  ∇ log π_θ(a_t | s_t) · G_t
    θ = θ + α · g                           # výstup; u nás krokem Adamu
    data zahoď — příště už jsou od jiné strategie

3. Rozptyl a základní úroveň

Definice — základní úroveň (baseline) a výhoda

Nechť (S, A, P, R, γ) je MDP a πθ parametrizovaná strategie.

  1. Základní úroveň (baseline) je libovolná funkce b : S → ℝ, která závisí jen na stavu, ne na akci. Odhad gradientu se základní úrovní je ĝ = ∑t ∇ log πθ(at | st) · (Gt − b(st)); podle věty níže má stejnou střední hodnotu jako odhad bez b, jen se tím může výrazně zmenšit rozptyl.
  2. Výhoda (advantage) strategie π je funkce Aπ : S × A → ℝ, Aπ(s, a) = Qπ(s, a) − Vπ(s), kde Qπ a Vπ jsou hodnotové funkce z dílu o MDP (písmeno A s argumenty tu značí výhodu, ne množinu akcí). Nejlepší běžná volba základní úrovně je b = Vπθ, v praxi odhadnutá druhou sítí; pak Gt − b(st) je odhad výhody.
  3. Actor-critic je metoda, která současně učí parametrizovanou strategii πθ („herec“) a odhad hodnotové funkce V ≈ Vπθ („kritik“) a odhad kritika používá v odhadu gradientu strategie.
Laicky řečeno

Na vozíku s tyčí dostane agent +1 za každý krok, takže každý výnos je kladný — REINFORCE tedy posiluje každý tah, jen některé víc. Signál „tohle bylo lepší než obvykle“ se ztrácí v šumu. Odečtením očekávané úrovně se z toho stane „tenhle tah dopadl o 20 bodů líp, než se v téhle situaci čekalo“ — a horší tahy dostanou záporné znaménko.

∇J(θ) = E[ ∑t ∇ log πθ(at | st) · (Gt − b(st)) ],   A(s, a) = Q(s, a) − V(s)

∇ log πθ(at | st)
směr „zahranou akci častěji“, stejně jako v REINFORCE
Gt, Q(s, a)
co po akci skutečně přišlo (Gt), resp. kolik to po ní dává v průměru (Q je střední hodnota Gt); samo o sobě skoro vždy kladné, takže nerozliší dobrou akci od průměrné
b(st), V(s)
laťka: kolik se v téhle situaci čeká bez ohledu na akci; po odečtení dostanou horší než průměrné akce záporné znaménko. Smí záviset jen na stavu, ne na akci — jinak by se gradient zkreslil (věta níže)
A(s, a)
výhoda: o kolik je akce a lepší než průměrná akce strategie v s; přesně ta informace, kterou chceme posilovat
Odečtení laťky nemění, kam gradient v průměru míří, jen zmenší, jak moc se odhad z dávky k dávce třese.
Věta — základní úroveň nezkreslí gradient

Nechť A je konečná množina akcí, πθ parametrizovaná strategie s πθ(a | s) > 0, s ∈ S stav a b : S → ℝ funkce. Pak

  1. Ea ∼ πθ(· | s)[∇ log πθ(a | s)] = ∑a ∈ A πθ(a | s) ∇ log πθ(a | s) = 0;
  2. Ea ∼ πθ(· | s)[∇ log πθ(a | s) · b(s)] = 0.

Odečtení b(st) od Gt tedy střední hodnotu odhadu gradientu nezmění (stačí podmínit stavem st).

Důkaz: ∑a πθ(a | s) ∇ log πθ(a | s) = ∑a ∇πθ(a | s) = ∇ ∑a πθ(a | s) = ∇1 = 0. Člen b(s) je pro pevné s konstanta, takže se dá vytknout před součet. ∎

Příklad — stejný průměr, jiný rozptyl

Jeden stav, dvě akce s π = (0,5; 0,5). Akce 1 vynese výnos 12, akce 0 výnos 10 — obojí kladné jako na vozíku. Složka odhadu gradientu podle výstupu z1 je z jednoho vzorku (1a=1 − 0,5) · (G − b) (barvy podle vzorce výše).

Bez základní úrovně (b = 0): padne-li akce 1, odhad je 0,5 · 12 = 6; padne-li akce 0, je −0,5 · 10 = −5. Průměr 6 − 5/2 = 0,5, rozptyl (6 − 0,5)² + (−5 − 0,5)²/2 = 30,25.

Se základní úrovní b = 11 (průměrný výnos): 0,5 · (12 − 11) = 0,5 a −0,5 · (10 − 11) = 0,5. Průměr je pořád 0,5, rozptyl 0.

Skutečný gradient je π1(1 − π1) · (12 − 10) = 0,25 · 2 = 0,5. Oba odhady míří v průměru správně, ale bez laťky se jeden vzorek trefí vedle o ±5,5, s laťkou vůbec. Ve skutečnosti rozptyl na nulu neklesne (výnosy jsou náhodné a stavů je mnoho), ale princip je týž.

Změřili jsme to na začátku učení: 40 nezávislých dávek po 1 000 krocích téže náhodné strategie, z každé gradient REINFORCE. Už jen odečtení průměrného výnosu (konstantní základní úroveň) zmenší součet rozptylů složek gradientu z 0,177 na 0,131, tedy o 26 %. Naučená hodnota V(s), která rozliší dobré a špatné situace, pomáhá víc.

Definice — součet rozptylů složek gradientu

Nechť K ≥ 1 (u nás K = 40) a ĝ(1), …, ĝ(K) ∈ ℝm jsou odhady gradientu z K nezávislých dávek (vektory přes všech m vah sítě). Pro j = 1, …, m označme ḡj = 1/K ∑k=1K ĝj(k) průměr j-té složky. Součet rozptylů složek je číslo

∑j=1m 1/K ∑k=1K (ĝj(k) − ḡj)².

Je to stopa (výběrové) kovarianční matice odhadu — jedno číslo pro to, jak moc se odhad třese. Pokles: 1 − 0,131/0,177 = 0,26, tedy 26 %.

Naučenou V potřebuje i PPO níže. Výhodu přitom neodhaduje rozdílem Gt − V(st), ale kompromisem mezi ním a jednokrokovým odhadem z dílu o Q-learningu:

Ât = ∑l≥0 (γλ)l δt+l,   δt = rt+1 + γ V(st+1) − V(st)

Ât
odhad výhody kroku t (GAE, John Schulman a kol., 2015) — to, čím se násobí ∇ log π
δt
TD chyba: o kolik dopadl jeden krok líp, než V čekala; jednokrokový odhad výhody s malým rozptylem, ale zkreslený, pokud se V plete
rt+1
odměna, která skutečně přišla — jediný kus skutečnosti v δ
V(s)
naučená laťka; v st+1 nahrazuje zbytek výnosu odhadem, v st se odečítá jako základní úroveň (po pádu je V(st+1) = 0)
(γλ)l
jak rychle zapomínat vzdálenější kroky. λ = 0 dá jen δt; λ = 1 dá po sečtení (členy V se navzájem odečtou) přesně Gt − V(st) — nezkreslené, ale s velkým rozptylem. My máme λ = 0,95
V kódu se počítá odzadu jedním řádkem: Ât = δt + γλ Ât+1.

4. PPO: malé, bezpečné kroky

REINFORCE má ještě jednu slabinu: každou odehranou zkušenost použije jen na jeden krok gradientu a pak ji zahodí. Kdybychom nad stejnými daty udělali kroků víc, strategie by se mohla vzdálit od té, která data nasbírala, a odhad gradientu by přestal platit — učení se zhroutí. PPO tohle hlídá.

Definice — Proximal Policy Optimization (PPO)

Nechť πθ je parametrizovaná strategie, V : S → ℝ naučený odhad hodnotové funkce (kritik), ε > 0 (typicky ε = 0,2), γ ∈ [0, 1] a λ ∈ [0, 1]. Pro x ∈ ℝ označme clip(x, 1 − ε, 1 + ε) = min(max(x, 1 − ε), 1 + ε) číslo x sevřené do intervalu [1 − ε, 1 + ε]. PPO (Proximal Policy Optimization; John Schulman a kol., OpenAI, 2017) opakuje tyto kroky:

  1. Polož θold = θ, πold = πθold a nasbírej touto strategií dávku kroků (st, at, rt+1, st+1).
  2. Pro každý krok spočítej TD chybu δt = rt+1 + γ V(st+1) − V(st) (po pádu V(st+1) = 0) a odhad výhody metodou GAE (generalized advantage estimation) Ât = ∑l≥0 (γλ)l δt+l, kde součet končí s koncem epizody.
  3. Několik epoch (u nás 10) maximalizuj gradientními kroky vzhledem k θ ořezaný cíl L(θ) = Et[ min( rt(θ) Ât, clip(rt(θ), 1 − ε, 1 + ε) Ât ) ],   rt(θ) = πθ(at | st)/πold(at | st), kde Et je průměr přes kroky dávky (minidávky) a rt(θ) je poměr pravděpodobností (nezaměňovat s odměnou rt+1); zároveň uč kritika V zmenšováním průměru (V(st) − yt)², kde yt = Ât + Vold(st) je cíl spočtený v kroku 2 z hodnot kritika před učením.
  4. Dávku zahoď a pokračuj krokem 1, dokud nevyčerpáš rozpočet kroků v prostředí.

Jakmile se pravděpodobnost akce změní o víc než faktor 1 ± ε ve směru, který cíl zlepšuje, gradient z toho vzorku zmizí.

Laicky řečeno

Trenér po zápase řekne „tohle dělej častěji“. Hráč to na tréninku opakuje — ale jen do chvíle, kdy to dělá o pětinu častěji než dřív. Dál se už neučí, dokud neodehraje další zápas a nezjistí, jestli to pořád funguje. Dost velké kroky, aby se rychle zlepšoval, dost malé, aby se nezbláznil.

−2−1012 00,511,52 poměr pravděpodobností r (bez jednotky) ořezaný cíl (násobky výhody A)
Ořezaný cíl PPO podle poměru r = π_nová / π_stará (ε = 0,2; zeleně pásmo 1 ± ε) výhoda A = +1: nad 1 + ε už nic nepřidá výhoda A = −1: pod 1 − ε už nic nepřidá

L(θ) = Et[ min( rt(θ) Ât, clip(rt(θ), 1 − ε, 1 + ε) Ât ) ]

L(θ)
náhradní cíl, který se několik epoch maximalizuje nad starou dávkou; jeho gradient v θ = θold je přesně gradient strategie z REINFORCE s výhodou
rt(θ) = πθ/πold
poměr nové a staré pravděpodobnosti zahrané akce. Data nasbírala stará strategie; vynásobením poměrem se z nich dá odhadnout, jak by si vedla nová (vážení podle důležitosti). Na začátku je r = 1
Ât
výhoda z GAE: znaménko říká, jestli akci posílit (+), nebo potlačit (−)
clip(r, 1 − ε, 1 + ε)
poměr sevřený do pásma (v obrázku zeleně); mimo pásmo je konstantní, takže z něj nejde žádný gradient — dál strategii tímhle vzorkem tlačit nejde
min
ze dvou odhadů ten horší (pesimistický): ořez platí jen tam, kde by zlepšení vypadalo podezřele dobře. Když se akce naopak zhoršila, min nechá neořezaný člen a chybu opraví
Posiluj výhodné akce, ale jen dokud se jejich pravděpodobnost nezmění víc než o faktor 1 ± ε; pak vzorek mlčí.
Příklad — tři vzorky a ořez s ε = 0,2

Stará strategie dala zahrané akci pravděpodobnost 0,5. Po několika krocích učení je to 0,65, takže r = 0,65/0,5 = 1,3 a clip(1,3; 0,8; 1,2) = 1,2 (barvy podle rozboru ořezaného cíle výše).

Výhoda +2: min(1,3 · 2; 1,2 · 2) = min(2,6; 2,4) = 2,4. Vyhrál ořezaný člen, který na θ nezávisí — gradient z tohoto vzorku je nula. Akce už je o 30 % častější, víc ne.

Výhoda −2 (týž poměr): min(1,3 · (−2); 1,2 · (−2)) = min(−2,6; −2,4) = −2,6. Vyhrál neořezaný člen: strategie omylem zpravděpodobnila špatnou akci, a gradient ji proto dál stahuje zpátky.

Výhoda +2, ale pravděpodobnost klesla na 0,35: r = 0,35/0,5 = 0,7, min(0,7 · 2 = 1,4; 0,8 · 2 = 1,6) = 1,4. Zase neořezaný člen — dobrá akce, kterou strategie potlačila, se vrací. Ořez brzdí jen kroky, které by cíl zlepšily „příliš“.

opakuj:
    π_old = π_θ;  nasbírej 2 000 kroků strategií π_old, ulož π_old(a_t | s_t)
    pro každou epizodu odzadu:                       # V(s_(t+1)) = 0 po pádu
        δ_t = r_(t+1) + γ · V(s_(t+1)) − V(s_t)
        Â_t = δ_t + γλ · Â_(t+1)                      # GAE, γ = 0,99, λ = 0,95
    cíl_t = Â_t + V(s_t);  Â normalizuj na průměr 0 a rozptyl 1
    10krát (epocha):
        zamíchej kroky a rozděl je na minidávky po 100
        pro každou minidávku:
            r_t = π_θ(a_t | s_t) / π_old(a_t | s_t)
            θ: krok vzhůru po průměru min(r_t · Â_t, clip(r_t, 0,8, 1,2) · Â_t)
            V: krok dolů po průměru (V(s_t) − cíl_t)²

5. Pokus: vozík s tyčí

Stejný vozík s tyčí jako u DQN, odměna +1 za každý krok, epizoda končí pádem nebo po 500 krocích. Strategie je síť 4 → 32 → 32 → 2 se softmaxem, hodnota stavu druhá síť stejného tvaru. Všechny čtyři metody dostanou 100 000 kroků v prostředí, v dávkách po 2 000. REINFORCE udělá nad dávkou jeden krok gradientu, PPO deset epoch po minidávkách 100. Varianta „bez ořezu“ je PPO, kterému jsme ořez vypnuli.

0100200300400500 025 00050 00075 000100 000 krok učení (počet kroků v prostředí) délka epizody (kroky)
Průměrná délka epizody během učení (tlustě průměr tří běhů, tence jednotlivé běhy) REINFORCEREINFORCE se základní úrovníPPOPPO bez ořezu
metodakdy poprvé průměr ≥ 475 (běh 1 · 2 · 3)na konci (běh 1 · 2 · 3)
REINFORCE— · — · —463 · 333 · 348
REINFORCE se základní úrovní90 000 · 80 000 · —488 · 500 · 404
PPO30 000 · 20 000 · 20 000500 · 500 · 500
PPO bez ořezu100 000 · 30 000 · 50 000494 · 44 · 500

PPO ve všech třech bězích udrží tyč celých 500 kroků už po 30 000, 20 000, 20 000 krocích a už to nepustí. REINFORCE se zlepšuje pomalu a do konce to nezvládne; se základní úrovní je o něco rychlejší a ve dvou bězích ze tří se k cíli dostane. Pozor, srovnání není úplně férové v počtu výpočtů: PPO udělá nad každou dávkou desetkrát víc kroků gradientu. Je ale férové v tom, co se v posilovaném učení počítá nejvíc — v počtu zkušeností, které musí agent ve světě nasbírat.

A co se stane, když stejné opakované učení nad dávkou pustíme bez ořezu? Délky epizod skáčou nahoru a dolů, běh 2 skončil na 44 krocích. Proč, ukáže, jak daleko se strategie při jedné aktualizaci vzdálí od té, která data nasbírala:

10-410-310-210-1100101 025 00050 00075 000100 000 krok učení (počet kroků v prostředí) odhad KL (naty, log. měřítko)
Vzdálenost nové strategie od staré po každé dávce (odhad KL, běh 1, logaritmicky) PPO bez ořezu

U PPO je průměrná vzdálenost 0,014 natu a nikdy nepřesáhne 0,06. Bez ořezu je to v průměru 5,5 a občas až 25 natů — strategie po jedné aktualizaci dělá úplně něco jiného než ta, ze které se učila. Data pak o ní nic neříkají a zlepšení je loterie. Ořez je drobná úprava ve vzorci, ale dělá z nestabilního algoritmu spolehlivý.

Definice — odhad KL mezi starou a novou strategií

Nechť πold a πθ jsou strategie na konečné množině akcí A s πθ(a | s) > 0 a nechť (si, ai), i = 1, …, N, jsou kroky dávky nasbírané strategií πold. KL divergence z dílu o teorii informace, tady s přirozeným logaritmem (jednotka nat; 1 nat = 1/ln 2 ≈ 1,44 bitu), průměrovaná přes stavy, které stará strategie navštěvuje, je

DKL(πold ‖ πθ) = Es[ ∑a ∈ A πold(a | s) log πold(a | s)/πθ(a | s) ] = Es, a ∼ πold[ log πold(a | s) − log πθ(a | s) ]

a její odhad z dávky je

D̂ = 1/N ∑i=1N [ log πold(ai | si) − log πθ(ai | si) ].

Akce ai zahrála stará strategie, takže průměr přes dávku je nestranný odhad. Je to průměrný logaritmus poměru, a tedy e−D̂ je geometrický průměr poměru πθ/πold přes nasbírané akce.

Co to znamená v číslech: u PPO nejvýš 0,06 natu, e−0,06 = 0,94 — akce ze staré dávky jsou typicky o pár procent méně pravděpodobné, data o nové strategii pořád vypovídají. Bez ořezu až 24,9 natu: e−24,9 ≈ 1,5 · 10−11, nová strategie by akce, ze kterých se právě učila, téměř nikdy nezahrála.

6. PPO a jazykové modely

V dílu o RLHF jsme zmínili, že InstructGPT a první ChatGPT se dolaďovaly posilovaným učením. Bylo to právě PPO: strategie je jazykový model, stav je dosavadní text, akce je další token, a odměnu na konci odpovědi dá model odměny naučený z lidských preferencí. Trest za vzdálení od výchozího modelu (KL) hraje stejnou roli jako ořez — nedovolí strategii utéct tam, kde odměně nelze věřit.

Definice — odměna při doladění jazykového modelu PPO

Nechť x je dotaz a y = (y1, …, yn) odpověď (posloupnosti tokenů) vygenerovaná laděným jazykovým modelem πθ, kde πθ(y | x) = ∏k=1n πθ(yk | x, y1, …, yk−1). Nechť rφ(x, y) ∈ ℝ je výstup modelu odměny, πref zmrazený model po doladění na příkladech (SFT) a β > 0 síla trestu. PPO pak dostane odměnu

R(x, y) = rφ(x, y) − β · log πθ(y | x)/πref(y | x)

(tak to zapisuje InstructGPT, Long Ouyang a kol., 2022). Střední hodnota druhého členu přes odpovědi je přesně β · DKL(πθ ‖ πref). Epizoda je jedna odpověď, akce jsou tokeny, odměna rφ přijde až po posledním tokenu; zbytek je PPO tak, jak je popsané výše.

U velkých modelů je ale PPO drahé: potřebuje kromě modelu i stejně velkou hodnotovou síť. Proto vznikly zjednodušení. DPO z dílu o RLHF se posilovanému učení úplně vyhne. GRPO (DeepSeek, 2024) hodnotovou síť vypustí a jako základní úroveň použije průměrnou odměnu několika odpovědí na stejnou otázku — přesně ta konstantní základní úroveň, kterou jsme měřili výše. Tak se učí modely, které „přemýšlejí“ nad matematikou a kódem, kde se správnost odpovědi dá ověřit.

Âi = ri − průměr(r1, …, rG)/sd(r1, …, rG)

Âi
výhoda i-té odpovědi; dostanou ji všechny její tokeny a dál jde do ořezaného cíle PPO
ri
odměna i-té z G odpovědí na tutéž otázku, třeba 1 = výsledek sedí, 0 = nesedí
průměr(…)
základní úroveň místo hodnotové sítě: jak dobře model na tuhle otázku odpovídá obvykle — lehká otázka má vysokou laťku, těžká nízkou
sd(…)
směrodatná odchylka skupiny, sd(r1, …, rG) = √∑i=1G (ri − r̄)²/G, kde r̄ je průměr; srovná měřítko, aby otázky s velkým i malým rozptylem odměn táhly stejně silně (jako normalizace výhod v našem PPO)
GRPO (Zhihong Shao a kol., DeepSeekMath, 2024): výhoda odpovědi = o kolik je lepší než ostatní odpovědi na stejnou otázku.
Příklad — výhody GRPO pro čtyři odpovědi

Model odpoví na úlohu čtyřikrát, správně jen poprvé: odměny (1; 0; 0; 0). Průměr 0,25, směrodatná odchylka √0,75² + 3 · 0,25²/4 = √0,1875 = 0,433.

Výhody (barvy podle vzorce výše): 1 − 0,25/0,433 = 1,732 pro správnou odpověď a 0 − 0,25/0,433 = −0,577 pro každou ze tří špatných. Součet je nula: správná se posílí, špatné potlačí. Kdyby byly všechny čtyři odpovědi správně (nebo všechny špatně), jsou všechny výhody nulové a otázka nic nenaučí — učí se jen z otázek, kde se model někdy trefí a někdy ne. (Dělíme G; některé implementace dělí G − 1, čísla se pak mírně liší.)

7. Shrnutí

  • Policy gradient učí přímo pravděpodobnosti akcí; funguje i pro spojité akce a zkouší sám od sebe.
  • REINFORCE posiluje akce úměrně výnosu, který po nich přišel; je jednoduchý, ale odhad gradientu má velký rozptyl.
  • Odečtení základní úrovně rozptyl zmenší beze změny střední hodnoty (u nás o 26 % už s konstantou); s naučenou V(s) vzniká actor-critic.
  • PPO využije každou dávku několikrát a ořezem poměru pravděpodobností drží strategii blízko té, která data nasbírala.
  • Na vozíku s tyčí: PPO zvládne 500 kroků po 20–30 tisících krocích ve všech běhech; bez ořezu se strategie vzdaluje až o 25 natů a učení kolísá.
  • PPO dolaďovalo první ChatGPT; jeho zjednodušení (GRPO) dnes učí „přemýšlející“ modely.

Chcete si to osahat? Nechte AI agenta pustit PPO z knihovny Stable-Baselines3 na prostředí LunarLander a měnit ε v ořezu (0,05; 0,2; 0,5) — a nakreslit, jak se mění rychlost a stabilita učení.

Máte na to jiný názor? Napište na support@coden-app.com.

Agent na vašem počítači, ovládaný z telefonu