Otimização de Política Proximal (Proximal Policy Optimization, PPO)

Visão geral

Otimização de Política Proximal (Proximal Policy Optimization, PPO) é um algoritmo amplamente utilizado de na política (on-policy), ator-crítico (actor-critic) e gradiente de política (policy-gradient), projetado para tornar as atualizações de política estáveis e confiáveis sem a complexidade de restrições rígidas de região de confiança (trust region). O PPO foi introduzido por Schulman et al. (2017) como uma alternativa prática ao Otimização de Política por Região de Confiança (Trust Region Policy Optimization, TRPO): ele busca obter a maior parte dos benefícios de estabilidade do TRPO, sendo mais simples de implementar e ajustar.

O PPO é melhor entendido como:

  • Um método de gradiente de política (ele otimiza diretamente uma política parametrizada).
  • Geralmente implementado como um algoritmo ator-crítico (uma política ator e uma função de valor crítico).
  • “Proximal” porque ele desencoraja atualizações de política grandes demais, seja por:
    • Recorte (clipping) da razão de probabilidade da política (mais comum), ou
    • Adição de uma penalidade de divergência de KL (KL-divergence) ao objetivo.

O PPO se tornou uma linha de base padrão no aprendizado por reforço (reinforcement learning) moderno para controle contínuo e também é um componente central em muitos fluxos de aprendizado por reforço com feedback humano (Reinforcement Learning from Human Feedback, RLHF) para treinar modelos de linguagem.

Contexto relacionado: Gradientes de Política, Métodos Ator-Crítico e, no geral, Aprendizado por Reforço.

Por que o PPO existe: intuição e motivação

O problema com gradientes de política “vanilla”

Em métodos básicos de gradiente de política (por exemplo, REINFORCE), atualizamos os parâmetros da política ( \theta ) na direção:

[ \nabla_\theta J(\theta) \approx \mathbb{E}\left[\nabla_\theta \log \pi_\theta(a_t|s_t), \hat{A}_t\right] ]

onde ( \hat{A}_t ) é uma estimativa da vantagem (advantage) (o quanto uma ação é melhor do que a média naquele estado).

Isso funciona, mas pode ser instável:

  • Se a taxa de aprendizado estiver alta demais, a política pode mudar drasticamente em uma única atualização.
  • Mudanças grandes podem derrubar o desempenho (por exemplo, de repente escolher ações ruins com alta probabilidade).
  • Não há um mecanismo embutido para evitar atualizações destrutivas.

Regiões de confiança: estabilidade via “não mude demais”

Algoritmos como TRPO restringem atualizações para que a nova política permaneça “próxima” da antiga sob divergência de KL. Isso melhora a estabilidade, mas é mais complexo (exige otimização com restrições / aproximações de segunda ordem).

A ideia-chave do PPO

O PPO mantém a ideia de “não mude demais”, mas simplifica:

  • Usa um objetivo substituto (surrogate objective) que é fácil de otimizar com descida do gradiente estocástica (stochastic gradient descent, SGD) ou Adam.
  • Penaliza ou recorta mudanças com base na razão de probabilidade da política (policy probability ratio):

[ r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} ]

Se ( r_t(\theta) ) se afasta muito de 1, a atualização é desencorajada.

PPO em contexto: ator-crítico + dados na política

O PPO é tipicamente implementado como um método ator-crítico:

  • Ator: política ( \pi_\theta(a|s) )
  • Crítico: função de valor ( V_\phi(s) )

O crítico reduz a variância ao fornecer uma linha de base e permitir a estimação de vantagem. O PPO é na política, o que significa que os dados de treinamento são coletados a partir de (aproximadamente) a política atual; então, você normalmente:

  1. Executa a política atual para coletar trajetórias (rollouts).
  2. Realiza várias épocas de SGD sobre aquele lote fixo.
  3. Descarta os dados e coleta novas trajetórias.

Isso é mais simples e muitas vezes mais estável do que abordagens fora da política (off-policy) como Aprendizado Q, mas, em geral, é menos eficiente em amostras.

O objetivo central do PPO (substituto com recorte)

Objetivo substituto sem recorte

Um ponto de partida comum é o substituto de gradiente de política “ponderado por importância (importance-weighted)”:

[ L^{\text{PG}}(\theta) = \mathbb{E}_t \left[ r_t(\theta) , \hat{A}_t \right] ]

Isso diz: se uma ação teve vantagem positiva, aumente sua probabilidade; se negativa, diminua — escalado por quanto a nova política difere da antiga.

PPO-Clip: estabilizar com recorte

O objetivo mais famoso do PPO é:

[ L^{\text{CLIP}}(\theta) = \mathbb{E}_t\left[\min\left( r_t(\theta)\hat{A}_t,; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t \right)\right] ]

O que isso faz:

  • Se a nova política tenta aumentar a probabilidade demais (razão (> 1+\epsilon)) para uma ação com vantagem positiva, o objetivo para de recompensar esse aumento.
  • Se tenta diminuir demais (razão (< 1-\epsilon)) para uma ação com vantagem negativa, de forma semelhante para de recompensar essa diminuição.
  • O min o torna pessimista: ele usa o menor entre o objetivo sem recorte e o objetivo recortado, impedindo “exploração” por mudanças extremas na razão.

Intuição: o PPO permite aprender, mas “reage” quando as atualizações ficam grandes demais.

Perda completa do PPO na prática (ator + crítico + entropia)

Na maioria das implementações, o PPO otimiza um objetivo combinado:

[ L(\theta, \phi) = L^{\text{CLIP}}(\theta)

  • c_v , \mathbb{E}t\left[(V\phi(s_t) - \hat{V}_t)^2\right]
  • c_e , \mathbb{E}t\left[\mathcal{H}(\pi\theta(\cdot|s_t))\right] ]

Onde:

  • A perda de valor é tipicamente o erro quadrático médio contra um alvo de retorno ( \hat{V}_t ) (frequentemente ( \hat{V}_t = \hat{A}_t + V(s_t) )).
  • O bônus de entropia (entropy bonus) ( \mathcal{H} ) incentiva exploração (evita colapso prematuro para comportamento determinístico).
  • (c_v) e (c_e) são coeficientes.

PPO-KL: um objetivo alternativo (penalidade de KL)

Em vez de recorte, o PPO pode penalizar a divergência de KL:

[ L^{\text{KL}}(\theta) = \mathbb{E}t \left[r_t(\theta)\hat{A}t - \beta , \text{KL}\left(\pi{\theta{\text{old}}}(\cdot|s_t),|,\pi_\theta(\cdot|s_t)\right)\right] ]

  • (\beta) controla quão fortemente você penaliza mudanças na política.
  • Muitas implementações adaptam (\beta) para mirar uma KL desejada (aumenta (\beta) se a KL estiver alta demais; diminui se estiver baixa demais).

Quando o PPO-KL é útil?

  • Quando você precisa explicitamente de controle de KL (comum em RLHF para modelos de linguagem).
  • Quando você quer uma “região de confiança suave” mais contínua em vez do comportamento por partes do recorte.

Estimação de vantagem: por que o GAE é comumente usado com PPO

O PPO depende fortemente de boas estimativas de vantagem ( \hat{A}_t ). A abordagem mais comum é a Estimativa de Vantagem Generalizada (Generalized Advantage Estimation, GAE):

[ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) ] [ \hat{A}t^{\text{GAE}(\gamma,\lambda)} = \sum{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l} ]

  • ( \gamma ) é o fator de desconto.
  • ( \lambda ) ajusta o compromisso entre viés e variância:
    • Menor ( \lambda ): mais viés, menos variância (mais “tipo diferença temporal (TD-like)”).
    • Maior ( \lambda ): menos viés, mais variância (mais “tipo Monte Carlo”).

Na prática, PPO + GAE é uma combinação padrão porque equilibra bem estabilidade e velocidade de aprendizado.

O loop de treinamento do PPO (visão prática)

Em alto nível:

  1. Coletar trajetórias usando a política atual ( \pi_{\theta_{\text{old}}} )
  2. Calcular:
    • predições de valor (V(s_t))
    • vantagens ( \hat{A}_t ) (frequentemente usando GAE)
    • alvos de retorno ( \hat{V}_t )
  3. Por várias épocas:
    • amostrar mini-lotes
    • otimizar o objetivo do PPO (ator + crítico + entropia)
  4. Atualizar (\theta_{\text{old}} \leftarrow \theta) e repetir

Esboço de pseudocódigo

initialize policy parameters θ, value parameters ϕ
repeat:
  collect T steps using π_{θ_old} -> (s_t, a_t, r_t, s_{t+1}, done_t)
  compute advantages Â_t with GAE(γ, λ)
  compute return targets V̂_t

  for epoch in 1..K:
    for minibatch in rollout data:
      r_t(θ) = π_θ(a_t|s_t) / π_{θ_old}(a_t|s_t)
      L_clip = mean(min(r_t * Â_t, clip(r_t, 1-ε, 1+ε) * Â_t))
      L_v = mean((V_ϕ(s_t) - V̂_t)^2)
      L_ent = mean(entropy(π_θ(.|s_t)))

      maximize: L_clip - c_v * L_v + c_e * L_ent
      (or minimize negative of that)

  θ_old ← θ
until done

Hiperparâmetros-chave e como eles afetam o comportamento

O PPO frequentemente funciona “de primeira”, mas desempenho e estabilidade dependem de alguns ajustes.

Parâmetro de recorte \( \epsilon \)

  • Valores típicos: 0.1 a 0.3 (frequentemente 0.2)
  • (\epsilon) menor: atualizações mais conservadoras (estáveis, porém mais lentas)
  • (\epsilon) maior: aprendizado mais rápido, porém com atualizações mais arriscadas

Taxa de aprendizado

  • Típico: 1e-4 a 3e-4 com Adam (varia bastante por domínio)
  • Alta demais: colapso da política / função de valor instável
  • Baixa demais: melhoria lenta

Um truque comum é decaimento da taxa de aprendizado (learning rate annealing) ao longo do treinamento.

Número de épocas \(K\) e tamanho de mini-lote

  • O PPO reutiliza o mesmo lote na política por múltiplas épocas, melhorando a eficiência em amostras.
  • Muitas épocas podem causar sobreajuste ao lote (overfitting to the batch) e maior deriva efetiva da política.
  • Típico: 3–10 épocas.

Tamanho do lote (comprimento do rollout)

  • Trajetórias maiores fornecem melhores estimativas de gradiente, mas aumentam latência e memória.
  • Prática comum: coletar de alguns milhares a dezenas de milhares de timesteps por atualização (dependendo do paralelismo do ambiente).

Fator de desconto \( \gamma \)

  • Típico: 0.99 (às vezes 0.95 para tarefas de horizonte mais curto)
  • (\gamma) maior enfatiza recompensas de longo prazo, mas pode aumentar a variância.

Parâmetro do GAE \( \lambda \)

  • Típico: 0.9 a 0.97 (frequentemente 0.95)
  • Controla o compromisso viés/variância nas estimativas de vantagem.

Coeficiente de entropia \(c_e\)

  • Incentiva exploração (maior entropia).
  • Alto demais: o agente permanece aleatório demais.
  • Baixo demais: convergência prematura / exploração fraca.

Coeficiente de perda de valor \(c_v\)

  • Equilibra o aprendizado do crítico com as atualizações do ator.
  • Se baixo demais, o crítico fica para trás e as vantagens ficam ruidosas.
  • Se alto demais, o treinamento pode focar demais em ajustar valores.

Monitoramento de KL / parada antecipada

Mesmo com recorte, muitas implementações monitoram:

  • divergência de KL aproximada entre política antiga e nova
  • parar antecipadamente uma época de atualização se a KL exceder um limite (por exemplo, 0.01–0.05)

Isso adiciona um mecanismo extra de segurança.

Corte de gradiente

O corte da norma global do gradiente (gradient norm) (por exemplo, 0.5 ou 1.0) é comum para prevenir passos grandes e destrutivos, especialmente com redes profundas ou espaços de ação grandes.

Exemplos práticos: onde o PPO se destaca

Robótica de controle contínuo e locomoção

O PPO é uma linha de base comum em ambientes como MuJoCo e simuladores no estilo Isaac Gym:

  • Espaços de ação são contínuos (políticas Gaussianas).
  • O PPO lida naturalmente com políticas estocásticas.
  • O objetivo com recorte reduz atualizações catastróficas, o que é valioso em cenários de controle instável.

Exemplos de uso:

  • locomoção de quadrúpedes
  • braços robóticos
  • estabilização de drones (em simulação)

Controle discreto e jogos

O PPO também funciona bem em espaços de ação discretos (por exemplo, tarefas no estilo Atari), frequentemente com codificadores convolucionais:

  • A política produz uma distribuição categórica sobre ações.
  • O bônus de entropia ajuda na exploração.

Aprendizado por reforço multiagente e distribuído em larga escala

Com muitos ambientes em paralelo, a otimização simples via SGD do PPO é fácil de escalar. Variantes de PPO com grandes lotes são comuns em sistemas de treinamento distribuído.

PPO em RLHF: por que ele é usado com modelos de linguagem

Em RLHF, o “ambiente” geralmente é um processo de geração de texto, e a “recompensa” vem de um modelo de recompensa aprendido ou de comparações de preferência. O PPO é popular aqui porque:

  • Ele oferece suporte a políticas estocásticas sobre tokens.
  • Ele pode incorporar um termo de controle de KL (KL control term) para manter o modelo próximo de uma política de referência (importante para preservar a qualidade de linguagem e evitar exploração indevida da recompensa).
  • É relativamente estável em comparação com gradiente de política ingênuo.

Um pipeline comum de RLHF:

  1. Ajuste fino supervisionado (Supervised Fine-Tuning, SFT) em demonstrações humanas.
  2. Treinar um modelo de recompensa a partir de dados de preferência.
  3. Otimizar a política com PPO para maximizar a recompensa enquanto permanece próxima do modelo SFT/de referência.

Em RLHF, o termo de KL frequentemente tem uma interpretação como “não se afastar demais do modelo-base”, e a recompensa pode ser aumentada:

[ R' = R_{\text{reward model}} - \beta , \text{KL}(\pi_\theta ,|, \pi_{\text{ref}}) ]

Isso é conceitualmente próximo do PPO-KL e é um grande motivo pelo qual o PPO aparece em muitos sistemas de RLHF.

Conceitos relacionados: Arquitetura Transformer, Modelagem de Recompensa (se presente no seu wiki) e Ajuste Fino.

Detalhes de implementação que importam na prática

Parametrização da política

  • Ações discretas: a política produz logits (\rightarrow) distribuição categórica.
  • Ações contínuas: a política produz a média (e às vezes log-std) de uma distribuição Gaussiana; as ações podem ser “squashadas” (por exemplo, tanh) para impor limites.

Redes compartilhadas vs separadas

Arquiteturas comuns:

  • Codificador compartilhado com duas cabeças (cabeça de política + cabeça de valor)
  • Ator e crítico totalmente separados

Backbones compartilhados reduzem computação, mas o acoplamento pode, às vezes, desestabilizar o aprendizado de valor.

Normalização de vantagem

Um truque muito comum: normalizar vantagens dentro de um lote:

[ \hat{A} \leftarrow \frac{\hat{A} - \text{mean}(\hat{A})}{\text{std}(\hat{A}) + \epsilon} ]

Isso melhora o condicionamento e a estabilidade do treinamento.

Recorte da função de valor (opcional)

Algumas implementações também recortam atualizações de valor de forma semelhante ao recorte da razão de política, para evitar que o crítico mude de maneira abrupta demais.

Pontos fortes e limitações

Pontos fortes

  • Simples e prático: fácil de implementar com ferramentas padrão de aprendizado profundo.
  • Atualizações estáveis: recorte/KL desencoraja mudanças destrutivas na política.
  • Forte desempenho padrão em muitos benchmarks.
  • Funciona bem em espaços de ação contínuos e discretos.
  • Amplamente usado e suportado em bibliotecas de RL.

Limitações

  • Ineficiência em amostras na política: os dados são descartados após as atualizações; caro em cenários do mundo real.
  • Sensível à escala de recompensa e à qualidade da estimação de vantagem.
  • O PPO ainda pode colapsar se os hiperparâmetros forem ruins (por exemplo, épocas demais, taxa de aprendizado alta demais).
  • Em RLHF, o PPO pode ser complexo de executar em escala (sequências longas, modelos de recompensa caros, ajuste de KL), levando a alternativas como métodos no estilo DPO em alguns cenários (embora o PPO permaneça importante).

PPO vs algoritmos relacionados (brevemente)

  • Gradiente de política “vanilla” / REINFORCE: mais simples, porém com maior variância e menos estabilidade.
  • A2C/A3C: ator-crítico sem a restrição proximal; pode ser menos estável com atualizações grandes.
  • TRPO: região de confiança mais fundamentada, porém mais complexa de implementar.
  • SAC / DDPG / TD3 (ator-crítico fora da política): frequentemente mais eficientes em amostras, mas com compromissos de estabilidade diferentes e, tipicamente, dinâmicas mais complexas de buffer de replay (replay buffer).

Veja também: Métodos Ator-Crítico, Gradientes de Política.

Quando escolher PPO

O PPO é uma boa escolha quando:

  • Você quer uma linha de base robusta para uma nova tarefa de RL.
  • Você pode arcar com coleta de dados na política (por exemplo, simulação com muitos trabalhadores paralelos).
  • Você precisa de uma política estocástica e treinamento estável.
  • Você está implementando ou estudando RLHF e quer um método bem estabelecido com controle de KL.

Ele pode ser menos ideal quando:

  • A interação com o ambiente é muito cara (considere métodos fora da política).
  • Você precisa de eficiência máxima em amostras a partir de dados limitados.

Resumo

O PPO é um algoritmo prático na política e ator-crítico que estabiliza o aprendizado por gradiente de política ao limitar o quanto a política muda por atualização. Suas duas formas principais — PPO com recorte e PPO com penalidade de KL — são construídas em torno do controle da razão de probabilidade da política (r_t(\theta)) e de manter as atualizações “proximais” à política de comportamento. Com boa estimação de vantagem (frequentemente GAE) e ajuste cuidadoso de alguns hiperparâmetros (faixa de recorte, taxa de aprendizado, épocas, coeficientes de entropia/valor), o PPO continua sendo um dos métodos mais usados e confiáveis no aprendizado por reforço moderno e segue desempenhando um papel importante em pipelines de RLHF para treinar modelos de linguagem.