Skip to content

English · Español

01 — Fundamentos de RL: REINFORCE → PG con línea base → PPO

🇪🇸 Política gradiente desde cero: REINFORCE, varianza y línea base, y el "clip" de PPO. Retropropagación con una función de pérdida distinta.

Ya conoces la retropropagación (backpropagation) (Fase 04). El gradiente de política es el mismo algoritmo con una pérdida distinta. El truco es que la pérdida implica una esperanza sobre las propias muestras de la política, así que no puedes derivarla de forma ingenua.

El planteamiento

  • Política \(\pi_\theta(a \mid s)\): una distribución de probabilidad sobre acciones \(a\) dado un estado \(s\). Para un modelo de lenguaje, \(s\) es el prompt + los tokens hasta ahora, \(a\) es el siguiente token.
  • Trayectoria \(\tau = (s_0, a_0, s_1, a_1, \dots, s_T, a_T)\).
  • Retorno \(R(\tau) = \sum_{t=0}^{T} r_t\) (para nuestro caso de LM, a menudo una sola recompensa terminal \(R\) al final de la secuencia).
  • Objetivo \(J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}[R(\tau)]\).

Queremos \(\nabla_\theta J(\theta)\).

REINFORCE: el truco de la log-derivada

El gradiente de una esperanza sobre una distribución parametrizada no es trivial porque \(\theta\) está dentro de la distribución de muestreo. El truco de la log-derivada (Williams 1992) da:

\[ \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[ R(\tau) \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right] \]

Derivación (en una línea):

\[ \nabla_\theta \mathbb{E}_{\tau}[R] = \nabla_\theta \int p_\theta(\tau) R(\tau)\, d\tau = \int R(\tau)\, p_\theta(\tau)\, \nabla_\theta \log p_\theta(\tau)\, d\tau = \mathbb{E}_\tau[R \nabla_\theta \log p_\theta(\tau)] \]

usando \(\nabla_\theta p_\theta = p_\theta \nabla_\theta \log p_\theta\).

En la práctica: despliega una trayectoria, calcula su retorno \(R\), y luego haz un paso ordinario de retropropagación sobre la pérdida

\[ \mathcal{L}_{\text{REINFORCE}}(\theta) = -R(\tau) \sum_t \log \pi_\theta(a_t \mid s_t) \]

Eso es todo. El signo menos es porque queremos ascender \(J\).

Intuición

Cada log-probabilidad a nivel de token se pondera por el retorno de toda la trayectoria. Si la trayectoria fue buena (\(R>0\)), sube el peso de todos los tokens elegidos; si fue mala, bájalo. Esto es asignación de crédito por asociación.

Problema: varianza

REINFORCE tiene una varianza enorme. Si \(R\) varía de \(-10\) a \(+10\) entre trayectorias, las estimaciones del gradiente oscilan salvajemente. Dos arreglos:

1. Substracción de línea base

Restar cualquier función \(b(s_t)\) que no dependa de \(a_t\) deja el gradiente insesgado:

\[ \nabla_\theta J = \mathbb{E}_\tau\left[\sum_t (R(\tau) - b(s_t))\, \nabla_\theta \log \pi_\theta(a_t \mid s_t)\right] \]

Esbozo de demostración: \(\mathbb{E}_{a \sim \pi}[b(s) \nabla_\theta \log \pi_\theta(a \mid s)] = b(s) \nabla_\theta \mathbb{E}[1] = 0\).

Una buena línea base es la función de valor \(V^\pi(s) = \mathbb{E}_\pi[R \mid s]\). Entonces \(R - V^\pi(s)\) es la ventaja \(A(s,a)\) — cuánto mejor fue esta acción que la media desde \(s\).

2. Actor-Critic

Entrena un crítico \(V_\phi(s)\) junto con la política ("actor") para predecir \(V^\pi\). Pérdida del crítico: \((V_\phi(s_t) - R_t)^2\). Este es el setup moderno.

El estimador de PG queda:

\[ \nabla_\theta J = \mathbb{E}\left[\sum_t A(s_t, a_t)\, \nabla_\theta \log \pi_\theta(a_t \mid s_t)\right] \]

PPO: el truco del clipping

REINFORCE / actor-critic vanilla siguen teniendo un problema: un mal batch de trayectorias puede mover \(\theta\) tanto que la política colapsa (el siguiente batch es todo basura). Queremos una región de confianza — limitar cuánto puede cambiar \(\pi_\theta\) por paso.

TRPO (Schulman et al. 2015) hace esto con una restricción KL explícita y optimización de segundo orden. PPO (Schulman et al. 2017) es la aproximación de primer orden que todo el mundo usa de verdad.

El objetivo de PPO

Sea

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

el ratio de importancia entre la política nueva y la antigua en el paso \(t\). El objetivo PPO-Clip es:

\[ \mathcal{L}^{\text{CLIP}}(\theta) = \mathbb{E}_t\left[ \min\!\left( r_t(\theta) A_t,\ \mathrm{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\, A_t \right) \right] \]

Típicamente \(\epsilon = 0{,}2\).

Por qué el clipping evita actualizaciones catastróficas

Análisis por casos sobre el signo de \(A_t\):

  • \(A_t > 0\) (la acción fue buena). Queremos incrementar \(r_t\). El término sin clip \(r_t A_t\) crece sin límite cuando \(r_t \to \infty\). El término con clip se satura en \((1+\epsilon) A_t\). El min elige el valor más pequeño (clipeado) una vez que \(r_t > 1+\epsilon\). Así, el gradiente respecto a \(\theta\) se vuelve cero una vez que hemos movido la política "suficiente" — no hay incentivo para empujar \(r_t\) más en este batch.
  • \(A_t < 0\) (la acción fue mala). Queremos decrementar \(r_t\). Simétricamente, el min elige el término clipeado una vez que \(r_t < 1 - \epsilon\), matando el gradiente.
  • \(|A_t|\) pequeño o \(r_t\) dentro de \([1-\epsilon, 1+\epsilon]\): se comporta como PG vanilla.

Resultado: las actualizaciones por batch están acotadas; la política no puede dar un salto gigante basándose en la estimación estocástica del gradiente de un solo batch.

Lo que PPO no hace

PPO no impone una restricción KL en forma cerrada. El clip es un proxy de una región de confianza; el KL real entre \(\pi_\theta\) y \(\pi_{\theta_{\text{old}}}\) se monitoriza pero no se restringe directamente en PPO-Clip. (PPO-Penalty es una variante que sí añade un término KL; PPO-Clip es más común.)

El algoritmo general

for iteration in 1..N:
    rollouts = collect_trajectories(π_θ_old)
    advantages = estimate_advantages(rollouts, V_φ)
    for epoch in 1..K:                      # K ≈ 4 típicamente
        for minibatch in rollouts:
            update θ on L^CLIP
            update φ on (V_φ - R)^2
    θ_old ← θ

Las "K épocas por batch de rollouts" es lo que hace a PPO eficiente en muestras frente a PG vanilla — reutilizas los mismos rollouts varias veces, lo cual el clipping hace seguro.

Qué falta para el lenguaje

Este capítulo planteó PPO en el marco MDP estándar. Para modelos de lenguaje necesitamos además:

  • Una señal de recompensa — no hay entorno que nos dé \(r_t\). Solución: entrenar un modelo de recompensa (siguiente capítulo).
  • Una manera de evitar que el LM se aleje demasiado de una distribución razonable. Solución: una penalización KL al modelo de referencia (capítulo 03).

Enlaces cruzados

Referencias

  • Williams 1992, Simple statistical gradient-following algorithms for connectionist reinforcement learning.
  • Schulman et al. 2015, Trust Region Policy Optimization (TRPO).
  • Schulman et al. 2017, Proximal Policy Optimization Algorithms. arXiv:1707.06347.