Policy gradient och REINFORCE
Kunna härleda policy gradient-satsen och implementera REINFORCE.
Förkunskaper
Intuition
Q-learning lär sig värden och härleder policyn av dem. Policy gradient hoppar över mellanledet och optimerar policyn direkt.
Policyn är ett neuralt nät som ger sannolikheter över handlingar. Vi vill justera så att bra utfall blir mer sannolika.
Idén i en mening:
Gick det bra — gör mer av det du gjorde. Gick det dåligt — gör mindre.
Matematiskt: multiplicera log-sannolikheten för varje handling med hur bra episoden blev, och gå uppför gradienten.
Varför bry sig, när Q-learning finns?
| Värdebaserat | Policy gradient | |
|---|---|---|
| Kontinuerliga handlingar | svårt (max över oändligt många) | naturligt |
| Stokastisk policy | nej | ja — behövs i spel med bluff |
| Konvergens | kan oscillera med funktionsapproximation | stabilare garantier |
| Sampeleffektivitet | bättre (off-policy, replay) | sämre (on-policy) |
Den sista raden är priset: REINFORCE slänger all data efter varje uppdatering.
Härledning
Målet är förväntad avkastning över banor :
Problemet: gradienten hamnar på sannolikhetsfördelningen, som vi inte kan derivera igenom direkt.
Log-derivatatricket löser det. Eftersom :
Nu är det ett väntevärde igen — och väntevärden kan skattas med stickprov.
Nästa steg: banans sannolikhet är
Tar vi logaritmen blir det en summa, och allt som inte beror på försvinner vid derivering — inklusive miljöns dynamik . Det är hela poängen: vi behöver ingen modell av världen.
Två förbättringar som inte ändrar väntevärdet men sänker variansen kraftigt:
- Kausalitet. En handling kan inte påverka det som redan hänt. Byt mot avkastningen framåt från steg : .
- Baslinje. För vilken funktion som helst gäller , eftersom . Alltså kan vi dra bort gratis.
Med blir fördelen — och då är vi framme vid actor–critic.
Varför variansen är problemet: skattningen bygger på hela episoders slumpmässiga utfall. Utan baslinje kan gradienten peka åt olika håll mellan två körningar med samma policy. Baslinjen tar bort den delen av signalen som är gemensam för alla handlingar i ett tillstånd — och det är den delen som bara är brus.
Kod
import torch, torch.nn as nn
class Policy(nn.Module):
def __init__(self, obs, handlingar, dolt=128):
super().__init__()
self.f = nn.Sequential(nn.Linear(obs, dolt), nn.Tanh(), nn.Linear(dolt, handlingar))
def forward(self, s):
return torch.distributions.Categorical(logits=self.f(s))
def returer(belonningar, gamma=0.99):
ut, G = [], 0.0
for r in reversed(belonningar):
G = r + gamma * G
ut.append(G)
return list(reversed(ut))
def reinforce(miljo, policy, opt, episoder=1000, gamma=0.99):
for _ in range(episoder):
s, klar = miljo.reset()[0], False
logp, belon = [], []
while not klar:
d = policy(torch.as_tensor(s, dtype=torch.float32))
a = d.sample()
logp.append(d.log_prob(a))
s, r, term, trunk, _ = miljo.step(int(a))
belon.append(r); klar = term or trunk
G = torch.tensor(returer(belon, gamma))
G = (G - G.mean()) / (G.std() + 1e-8) # baslinje: sänker variansen kraftigt
förlust = -(torch.stack(logp) * G).sum() # minustecknet: vi maximerar J
opt.zero_grad(); förlust.backward()
nn.utils.clip_grad_norm_(policy.parameters(), 1.0)
opt.step()
Tre saker som brukar gå fel:
| Symtom | Orsak |
|---|---|
| Policyn blir snabbt deterministisk och slutar förbättras | entropin kollapsar — lägg till en entropibonus |
| Ingen inlärning alls | glömt minustecknet, eller normaliserat bort all signal |
| Väldigt skakig inlärning | normalisering över en enda kort episod; batcha flera |
Normaliseringen på rad 24 är standard men inte oskyldig: gör du den över en enda episod jämför du bara handlingar inom den episoden, och information om att hela episoden var dålig går förlorad.
Behärskning innebär
- Härleder policy gradient-satsen med log-derivatatricket
- Implementerar REINFORCE med baslinje
- Förklarar variansproblemet och motmedlen
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- Sutton & Barto — Reinforcement Learning: An Introduction (2:a uppl.) — fri att läsa online (författarnas utgåva)
- OpenAI Spinning Up in Deep RL (MIT) — MIT
- Sutton m.fl. — Policy Gradient Methods (NeurIPS 1999) — NeurIPS öppen åtkomst