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:
- Executa a política atual para coletar trajetórias (rollouts).
- Realiza várias épocas de SGD sobre aquele lote fixo.
- 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
mino 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:
- Coletar trajetórias usando a política atual ( \pi_{\theta_{\text{old}}} )
- Calcular:
- predições de valor (V(s_t))
- vantagens ( \hat{A}_t ) (frequentemente usando GAE)
- alvos de retorno ( \hat{V}_t )
- Por várias épocas:
- amostrar mini-lotes
- otimizar o objetivo do PPO (ator + crítico + entropia)
- 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:
- Ajuste fino supervisionado (Supervised Fine-Tuning, SFT) em demonstrações humanas.
- Treinar um modelo de recompensa a partir de dados de preferência.
- 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.