Phase 09: Reinforcement Learning

Otimizar as políticas próximas (PPO)

A A2C descarta cada implementação após uma atualização. O PPO envolve o gradiente da política em uma relação de importância reduzida para que você possa fazer 10+ épocas nos mesmos dados sem a política explodir. Schulman et al. (2017). Ainda o algoritmo padrão de gradiente da política em 2026.

Type: Build

Languages: Python

Prerequisites: Phase 9 · 06 (REINFORCE), Phase 9 · 07 (Actor-Critic)

Time: ~75 minutes

O problema

A2C (Lessão 07) é sobre política: o gradiente E_{π_θ}[A · ∇ log π_θ]requer dados recolhidos a partir da corrente π_θ- Faça uma atualização e...π_θOs dados que usou agora estão fora da política.

As implementações são caras. Na Atari, uma implementação em 8 envs × 128 passos = 1024 transições e uma dúzia de segundos de tempo ambiental.

A Primeira solução foi a otimização das políticas de região de confiança (TRPO, Schulman 2015): restringir cada atualização para que a divergência entre as políticas antigas e novas permaneça abaixo δTeoricamente limpo, mas requer uma solução conjugada-gradiente por atualização.

O PPO (Schulman et al. 2017) substitui a restrição de região de confiança dura por um objetivo simples. Uma linha extra de código. Dez épocas por implantação. Nenhum gradiente conjugado. Garantias teóricas boas o suficiente. Nove anos depois, ainda é o algoritmo padrão de política-gradiente para tudo, desde MuJoCo até RLHF.

O conceito

!PPO clipped surrogate objective: ratio clipping at 1 ± ε

The importance ratio.

r_t(θ) = π_θ(a_t | s_t) / π_{θ_old}(a_t | s_t)

Esta é a relação de probabilidade entre a nova política e a política que recolheu os dados. r_t = 1Não significa nenhuma mudança.r_t = 2significa que a nova política é duas vezes mais provável quea_tComo os antigos.

The clipped surrogate.

L^{CLIP}(θ) = E_t [ min( r_t(θ) A_t, clip(r_t(θ), 1-ε, 1+ε) A_t ) ]

Dois termos:

  • Se a vantagem A_t > 0E a proporção tenta crescer para além.1 + ε, o clip aplania a gradiente não empurrar uma boa ação mais longe do que +εacima da velha probabilidade.
  • Se a vantagem A_t < 0E a proporção tenta crescer para além.1 - ε(o que significa que faríamos uma ação ruim mais provável em comparação com a sua redução cortada), o clip caps a gradiente não empurrar uma ação ruim abaixo -ε- Não .

O minO que é que se passa? - Não, não.

Tipico .ε = 0.2. Descrever o objectivo como uma função de r_tA função linear de pedaço com um telhado plano no "lado bom" e um piso plano no "lado ruim".

The full PPO loss.

L(θ, φ) = L^{CLIP}(θ) - c_v · (V_φ(s_t) - V_t^{target})² + c_e · H(π_θ(·|s_t))

A mesma estrutura de actores-críticos que A2C. Três coeficientes, geralmente c_v = 0.5- Não .c_e = 0.01- Não .ε = 0.2- Não .

The training loop.

  1. ColetarN × TTransições transversais NEnvistas paralelas para TCada passo.
  2. Calcule vantagens (GAE), congelem-nas como constantes.
  3. Congelando .π_{θ_old}como um instantâneo de corrente π_θ- Não .
  4. Para oKEpoca, para cada minipartida de (s, a, A, V_target, log π_old(a|s))- Não .

- Computaçãor_t(θ) = exp(log π_θ(a|s) - log π_old(a|s))- Não .

- AplicarL^{CLIP}+ perda de valor + entropia.

- Passo gradual.

  1. Descarte o lançamento, volte ao primeiro passo.

K = 10O PPO é robusto: os números exatos raramente importam dentro de ±50%.

KL-penalty variant.O artigo original propôs uma alternativa que utilizasse uma penalidade KL adaptativa: L = L^{PG} - β · KL(π_θ || π_old)comβA versão de corte tornou-se dominante; a variante KL sobrevive no RLHF (onde KL à política de referência é uma restrição separada que você sempre quer de qualquer maneira).

Construí-lo

Passo 1: Capturalog π_old(a | s)no momento da implantação

pythonfor step in range(T):
    probs = softmax(logits(theta, state_features(s)))
    a = sample(probs, rng)
    s_next, r, done = env.step(s, a)
    buffer.append({
        "s": s, "a": a, "r": r, "done": done,
        "v_old": value(w, state_features(s)),
        "log_pi_old": log(probs[a] + 1e-12),
    })
    s = s_next

A imagem é tirada uma vez, no momento da implantação.

Passo 2: calcular as vantagens do GAE (Lessão 07)

A mesma coisa que o A2C. Normaliza-se ao longo do lote.

Passo 3: atualização de substituição cortada

pythonfor _ in range(K_EPOCHS):
    for mb in minibatches(buffer, size=64):
        for rec in mb:
            x = state_features(rec["s"])
            probs = softmax(logits(theta, x))
            logp = log(probs[rec["a"]] + 1e-12)
            ratio = exp(logp - rec["log_pi_old"])
            adv = rec["advantage"]
            surrogate = min(
                ratio * adv,
                clamp(ratio, 1 - EPS, 1 + EPS) * adv,
            )
            # backprop -surrogate, add value loss, subtract entropy
            grad_logpi = onehot(rec["a"]) - probs
            if (adv > 0 and ratio >= 1 + EPS) or (adv < 0 and ratio <= 1 - EPS):
                pg_grad = 0.0  # clipped
            else:
                pg_grad = ratio * adv
            for i in range(N_ACTIONS):
                for j in range(N_FEAT):
                    theta[i][j] += LR * pg_grad * grad_logpi[i] * x[j]

O padrão de "gradiente de corte → zero" é o coração da PPO. Se a nova política já se desviou muito longe na direcção benéfica, a atualização pára.

Passo 4: valor e entropia

Adicionar MSE padrão ao alvo crítico e um bônus de entropia no ator, igual ao A2C.

Passo 5: diagnóstico

Três coisas para ver em cada atualização:

  • Mean KL E[log π_old - log π_θ]Devia ficar dentro .[0, 0.02]Se passar por aí .0.1, reduzirK_EPOCHSou LR- Não .
  • Clip fraction a fracção das amostras cuja proporção se encontra fora [1-ε, 1+ε]Devia ser .~0.1-0.3Se ...~0, o clip nunca desencadeia → aumento LRou K_EPOCHSSe ...~0.5+, você está super-ajustando a implantação → baixá-los.
  • Explained variance 1 - Var(V_target - V_pred) / Var(V_target)Metrica de qualidade crítica. Deve subir para 1.

Encurralagens

  • Clip coefficient mistuned. ε = 0.2É o padrão de facto.0.1torna as atualizações demasiado tímidas; 0.3+Invita a instabilidade.
  • Too many epochs. K > 20O sistema de segurança social é um dos principais factores de destabilização da política social.π_old- Epoca de limite, especialmente para grandes redes.
  • No reward normalization.Grandes escalas de recompensa se alimentam na faixa de clip. Normalize recompensas (exercício std) antes de vantagens computacionais.
  • Forgetting advantage normalization.A normalização de média zero/unit-std por lote é padrão.
  • Learning rate not decayed.O PPO beneficia da decadência do LR linear para zero.
  • Importance ratio math errors.Sempre .exp(log_new - log_old)para estabilidade numérica, não new / old- Não .
  • Wrong gradient sign.Maximizar a substitutória = minimizar -L^{CLIP}Um sinal invertido é o bug mais comum de PPO.

Usá-lo

O PPO é o algoritmo RL padrão de 2026 em um número surpreendente de domínios:

Use casePPO variant
MuJoCo / robotics controlPPO with Gaussian policy, GAE(0.95)
Atari / discrete gamesPPO with categorical policy, rolling 128-step rollouts
RLHF for LLMsPPO with KL penalty to reference model, reward from RM at end of response
Large-scale game agentsIMPALA + PPO (AlphaStar, OpenAI Five)
Reasoning LLMsGRPO (Lesson 12) — PPO variant without critic
Preference-only dataDPO — closed-form collapsing of PPO+KL, no online sampling

A forma de perda de PPO * substituto cortado + valor + entropia é o andamio para DPO, GRPO e quase todos os oleodutos RLHF.

Envia-o

Salva comooutputs/skill-ppo-trainer.md- Não .

markdown---
name: ppo-trainer
description: Produce a PPO training config and a diagnostic plan for a given environment.
version: 1.0.0
phase: 9
lesson: 8
tags: [rl, ppo, policy-gradient]
---

Given an environment and training budget, output:

1. Rollout size. `N` envs × `T` steps.
2. Update schedule. `K` epochs, minibatch size, LR schedule.
3. Surrogate params. `ε` (clip), `c_v`, `c_e`, advantage normalization on.
4. Advantage. GAE(`λ`) with explicit `γ` and `λ`.
5. Diagnostics plan. KL, clip fraction, explained variance thresholds with alerts.

Refuse `K > 30` or `ε > 0.3` (unsafe trust region). Refuse any PPO run without advantage normalization or KL/clip monitoring. Flag clip fraction sustained above 0.4 as drift.

Exercícios

  1. Easy.Execute PPO em 4×4 GridWorld com ε=0.2, K=4- Compare a eficiência da amostra com A2C (uma época por implantação) em etapas de ambiente correspondentes.
  2. Medium.EsvaziarK ∈ {1, 4, 10, 30}- Retorno de trama versus passos de env e seguimento média KL por atualização.KO KL explode nesta tarefa?
  3. Hard.Substitua a substitutora cortada por uma penalidade KL adaptativa (βduplicado se KL > 2·target, reduzida à metade se KL < target/2) Compare o retorno final, estabilidade e livre de clipes.

Termos-chave

TermWhat people sayWhat it actually means
Importance ratio"r_t(θ)"π_θ(a|s) / π_old(a|s); deviation from the policy that collected the data.
Clipped surrogate"PPO's main trick"min(r·A, clip(r, 1-ε, 1+ε)·A); flat gradient past the clip on beneficial side.
Trust region"TRPO / PPO intent"Limit each update's KL to guarantee monotone improvement.
KL penalty"Soft trust region"Alternative PPO: L - β · KL(π_θ || π_old). Adaptive β.
Clip fraction"How often clipping triggers"Diagnostic — should be 0.1-0.3; outside means mistuned.
Multi-epoch training"Data reuse"K epochs on each rollout; variance cost traded for sample efficiency.
On-policy-ish"Mostly on-policy"PPO is nominally on-policy but K>1 epochs uses slightly-off-policy data safely.
PPO-KL"The other PPO"KL-penalty variant; used in RLHF where KL-to-reference is already a constraint.

Mais leitura

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.