Razonamiento y RL — Módulo 5: actor-critic y PPO
Quinto módulo del Curso de Razonamiento y RL: cómo se domó la varianza de los policy gradients. El esquema actor-critic, la función de ventaja, y PPO — el algoritmo que limita cuánto cambia la política en cada paso y que se convirtió en el caballo de batalla del RLHF.
☰ Índice del contenido
- La tesis del módulo
- Actor-critic: la política deja de estar sola
- La función de ventaja
- El problema que PPO resuelve: el paso que mata la política
- TRPO: la idea correcta, pero cara
- PPO: la misma cautela, pero simple
- El objetivo recortado en PyTorch
- El esquema, en un diagrama
- Por qué esto importa para el resto del curso
- Errores comunes
- La frase para llevarse
- Qué viene
- Material relacionado
En el módulo 4 montamos REINFORCE y comprobamos que funciona: la política aprende a subir la probabilidad de las acciones que llevaron a buen retorno y a bajar la de las malas. Pero también vimos su enfermedad crónica — la varianza. Cada actualización empujaba la política usando el retorno completo de una trayectoria entera, un número ruidoso que dependía de mil decisiones y de la suerte. El entrenamiento avanzaba a tirones, dos pasos adelante y uno de costado, y necesitaba montañas de muestras para promediar el ruido. Al final del módulo apareció la pista de la cura: el baseline (línea base), restarle al retorno un valor de referencia para que solo cuente lo que sobró o faltó respecto a lo esperado. Este módulo completa esa idea. La convertimos en una segunda red que estima ese valor, y encima le ponemos al gradiente un freno de mano que evita que un mal paso destruya lo aprendido. Ese freno se llama PPO, y es el algoritmo que movió el RLHF.
La tesis del módulo
PPO junta dos redes — un actor que decide y un crítico que juzga cuánto mejor o peor salió una acción de lo esperado — y limita cuánto puede cambiar la política en cada paso; esa cautela deliberada es lo que lo hace estable, y por eso fue el motor del RLHF.
Actor-critic: la política deja de estar sola
REINFORCE tenía una sola red: la política. Actor-critic tiene dos, y cada una hace un trabajo distinto:
- Actor (actor): es la política π. Recibe un estado y decide una acción — igual que antes. Es la red que al final nos quedamos.
- Crítico (critic): es una función de valor V(s) (value function), una red que estima “desde este estado, ¿cuánto retorno espero acumular en promedio si sigo jugando normal?”. No decide nada; solo juzga.
El crítico es exactamente el baseline que buscábamos en el módulo anterior, pero aprendido y dependiente del estado. En REINFORCE, si al baseline le poníamos un número fijo, servía poco: un estado ganador y uno perdedor no tienen la misma referencia. El crítico da una referencia distinta para cada estado, y esa es la que reduce la varianza de verdad.
La función de ventaja
De la resta entre lo que pasó y lo que el crítico esperaba nace el concepto central del módulo. La función de ventaja (advantage function):
A(s, a) = Q(s, a) − V(s)
Donde Q(s, a) (función de valor-acción) es el retorno esperado de tomar la acción a en el estado s, y V(s) es el retorno esperado promedio del estado sin comprometerse con ninguna acción. La resta se lee en una frase: cuánto mejor (o peor) fue esta acción que el promedio de lo que se podía hacer ahí. Si A es positiva, la acción superó la expectativa: hay que subir su probabilidad. Si es negativa, quedó por debajo: hay que bajarla. Si es cero, fue exactamente lo esperado y no hay nada que corregir.
Este cambio de perspectiva es lo que apaga la varianza. REINFORCE empujaba con el retorno crudo — un número grande y ruidoso. Actor-critic empuja con la ventaja — un número pequeño y centrado en cero, que ya descontó “lo que iba a pasar de todos modos”. Es la diferencia entre calificar un examen por la nota bruta o por cuánto subiste respecto a tu promedio: lo segundo aísla la señal real.
Ojo: en la práctica no calculamos A con un Q y un V separados. Se estima directamente combinando la recompensa observada con el V del crítico, y la técnica estándar para hacerlo bien se llama GAE (Generalized Advantage Estimation, estimación generalizada de la ventaja). GAE introduce una perilla — el parámetro λ (lambda) — que regula un compromiso: mirar pocos pasos hacia adelante da estimaciones de poca varianza pero sesgadas, mirar muchos da lo contrario. GAE promedia todos los horizontes con un peso que decae, y con λ eliges el punto medio. Para este módulo basta saber que GAE es cómo se obtiene la A(s,a) que PPO va a usar; los valores típicos son λ ≈ 0.95 y γ ≈ 0.99.
El problema que PPO resuelve: el paso que mata la política
Ya tenemos con qué empujar la política (la ventaja) con poca varianza. Falta decidir cuánto empujar. Y ahí hay una trampa que no existía en el aprendizaje supervisado.
En supervisado, si das un paso de gradiente demasiado grande, empeoras un poco y en el siguiente lote te corriges: los datos son fijos, siguen ahí esperándote. En RL los datos los genera la propia política. Si un paso grande la deforma hacia una zona mala, la política empieza a producir trayectorias malas, y con datos malos el siguiente paso es todavía peor. Es una espiral: un mal paso no se corrige solo, se retroalimenta. A esto se le llama colapso de la política (policy collapse), y una vez que ocurre muchas veces no hay vuelta atrás — hay que reiniciar el entrenamiento.
La conclusión operativa: en RL el tamaño del paso no es un detalle de afinación, es una cuestión de supervivencia. Hay que impedir estructuralmente que la política nueva se aleje demasiado de la vieja en una sola actualización.
TRPO: la idea correcta, pero cara
El primer algoritmo que atacó esto de frente fue TRPO (Trust Region Policy Optimization, optimización de política por región de confianza). Su idea es exactamente la que acabamos de describir: maximiza la mejora de la política sujeta a una restricción dura — que la política nueva no se aleje de la vieja más de un presupuesto medido con la divergencia KL (Kullback-Leibler, una medida de cuánto difieren dos distribuciones de probabilidad). En cada paso resuelve un problema de optimización con esa restricción, garantizando que te quedas dentro de una “región de confianza” donde el paso no rompe nada.
Funciona, pero es pesado: la restricción de KL exige cálculos de segundo orden (aproximar curvatura) que son complejos de implementar y lentos de correr. TRPO tenía la respuesta correcta con la maquinaria equivocada para escalar.
PPO: la misma cautela, pero simple
PPO (Proximal Policy Optimization, optimización de política proximal) toma la idea de TRPO — no te alejes demasiado — y la logra sin restricción dura ni segundo orden. En vez de prohibir los pasos grandes con una barrera matemática, PPO le quita el incentivo a darlos: modifica la función objetivo para que alejarse demasiado deje de dar recompensa. Es un cambio de estrategia elegante — donde TRPO pone un muro, PPO simplemente deja de pagar por cruzarlo.
Todo gira alrededor de dos piezas.
El ratio de probabilidades (probability ratio). Compara cuánto probabiliza la política nueva la acción que ya tomamos, contra cuánto la probabilizaba la vieja (la que generó los datos):
r(θ) = π_nueva(a | s) / π_vieja(a | s)
Si r = 1, la política no cambió para esa acción. Si r = 1.3, la nueva la hace un 30% más probable; si r = 0.7, un 30% menos. El ratio es, literalmente, la medida de “cuánto me moví” en cada acción.
El objetivo recortado (clipped surrogate objective). El objetivo ingenuo sería r(θ) · A — subir el ratio donde la ventaja es positiva, bajarlo donde es negativa. El problema: nada impide que el ratio se dispare a 5 o a 0.1 en un solo paso. PPO lo acota tomando el mínimo entre el objetivo sin recortar y una versión recortada:
L = min( r · A , clip(r, 1−ε, 1+ε) · A )
Donde clip(r, 1−ε, 1+ε) aplasta el ratio para que nunca salga del rango [1−ε, 1+ε] (con ε típicamente 0.2, o sea el rango [0.8, 1.2]). El min es la sutileza: hace que el recorte muerda solo cuando conviene alejarse mucho, no cuando conviene volver.
En palabras, para una acción con ventaja positiva (fue buena, queremos más): el objetivo sube a medida que el ratio sube, pero al llegar a 1+ε se aplana — pasado ahí, hacerla aún más probable ya no da más recompensa, así que el gradiente deja de empujar. Para una acción con ventaja negativa (fue mala, queremos menos): el objetivo mejora bajando el ratio, pero se aplana en 1−ε. En ambos casos el efecto es el mismo: el algoritmo pierde el interés en moverse más allá de una banda estrecha alrededor de 1. Esa es toda la magia de PPO — la región de confianza de TRPO, lograda con un min y un clip en vez de con álgebra de segundo orden.
A ese objetivo se le suman dos términos más para el entrenamiento completo:
- Coeficiente de entropía (entropy bonus): un premio pequeño a que la política mantenga incertidumbre. La entropía mide cuán “repartida” está la distribución de acciones; premiarla evita que la política colapse temprano a una sola acción y frene de explorar. Es un empujón suave hacia la exploración.
- Pérdida del crítico (value loss): el crítico también entrena, minimizando el error entre su V(s) predicho y el retorno realmente observado. Un crítico malo da ventajas malas, así que su pérdida entra en la función total, usualmente con su propio coeficiente.
El objetivo recortado en PyTorch
Este es el corazón de PPO: dados el log-prob nuevo, el viejo y la ventaja, calcular la pérdida recortada. Verificado contra las implementaciones de referencia.
import torch
import torch.nn.functional as F
EPS_CLIP = 0.2 # ancho de la banda: ratio permitido en [0.8, 1.2]
COEF_VALOR = 0.5 # peso de la pérdida del crítico
COEF_ENTROPIA = 0.01 # peso del premio a la exploración
def perdida_ppo(logprob_nuevo, logprob_viejo, ventaja,
valor_pred, retorno, entropia):
"""Objetivo recortado de PPO para un lote de transiciones.
logprob_nuevo : log π_nueva(a|s), CON gradiente (política actual).
logprob_viejo : log π_vieja(a|s), SIN gradiente (política que
generó los datos; se guarda al recolectar).
ventaja : A(s,a) ya estimada con GAE, normalizada.
valor_pred : V(s) que predice el crítico ahora.
retorno : retorno observado (el objetivo del crítico).
entropia : entropía de la política en esos estados.
"""
# 1. Ratio nueva/vieja. Se hace en log y luego exp por estabilidad:
# exp(log_nuevo - log_viejo) == π_nueva / π_vieja
ratio = torch.exp(logprob_nuevo - logprob_viejo)
# 2. Los dos candidatos del objetivo: sin recortar y recortado.
sin_recortar = ratio * ventaja
recortado = torch.clamp(ratio, 1 - EPS_CLIP, 1 + EPS_CLIP) * ventaja
# 3. min(...) y signo negativo: maximizamos el objetivo, así que
# minimizamos su negativo. El min es lo que apaga el incentivo
# a alejarse más allá de la banda.
perdida_actor = -torch.min(sin_recortar, recortado).mean()
# 4. El crítico entrena contra el retorno observado.
perdida_critico = F.mse_loss(valor_pred, retorno)
# 5. Total: actor + crítico − premio a la entropía (restar entropía
# equivale a premiarla, porque minimizamos la pérdida total).
return (perdida_actor
+ COEF_VALOR * perdida_critico
- COEF_ENTROPIA * entropia.mean())
Cuidado: el
logprob_viejodebe venir desconectado del grafo (con.detach()en el momento de recolectar los datos). Es un valor fijo: la foto de cuánto probabilizaba la acción la política que jugó. Si por error le dejas gradiente, el ratio deja de medir “cuánto me moví” y el recorte no protege de nada — es uno de los bugs silenciosos más comunes al implementar PPO desde cero.
El esquema, en un diagrama
Cada estado pasa por las dos redes: el actor produce la acción, el crítico produce el valor. La recompensa observada más ese valor dan la ventaja, y la ventaja actualiza a los dos.
┌────────────────────────┐
estado ──┤ │
│ ▼
│ ┌────────────┐
│ │ ACTOR │
│ │ (política │ ──► acción
│ │ π) │
│ └─────┬──────┘
│ │
▼ │ log π(a|s)
┌───────────┐ ▼
│ CRÍTICO │ ┌────────────┐
│ (valor V) │ ─► V(s) ─► │ VENTAJA │
└───────────┘ │ A = Q − V │
▲ recompensa │ (GAE) │
│ ─────► └─────┬──────┘
│ │
│ actualiza │ actualiza
│ (valor) │ (recorte)
└────────────────────────┘
│
▼
paso de PPO
La ventaja es el punto de encuentro: de ella sale la señal que corrige al actor (por el objetivo recortado) y, en paralelo, el crítico se corrige contra el retorno observado para estimar mejor la próxima vez. Las dos redes suben juntas.
Por qué esto importa para el resto del curso
PPO no es un algoritmo más de este curso: es la bisagra. El RLHF clásico que veremos en el módulo 6 es, en esencia, este mismo PPO con una pieza extra — un modelo de recompensa (reward model) que reemplaza al entorno. En vez de que un videojuego devuelva puntos, una red entrenada con preferencias humanas le pone nota a cada respuesta del modelo de lenguaje, y PPO usa esa nota exactamente como usaría la recompensa de un juego. Todo lo de este módulo — actor, crítico, ventaja, recorte — se aplica tal cual; solo cambia de dónde sale la recompensa.
Pero ese mismo diseño explica también sus límites, y por qué después llegaron alternativas. Cuando aplicas PPO al RLHF, no cargas con una red, cargas con cuatro al mismo tiempo: la política que entrenas, el crítico, el modelo de recompensa y una copia de referencia para medir la KL. Es caro en memoria y frágil de afinar. Entender ese costo es lo que vuelve inevitable el módulo 7: DPO nace de preguntarse si se puede hacer RLHF sin crítico y sin modelo de recompensa separado, y GRPO de preguntarse si se puede tirar el crítico estimando la ventaja de otra forma. Los dos son reacciones directas a la factura que verás en esta tabla.
| PPO | Detalle |
|---|---|
| Qué necesita | Actor + crítico entrenándose juntos; en RLHF, además un modelo de recompensa y una referencia para la KL |
| Costo | Alto: varias redes en memoria a la vez, afinación delicada (ε, coeficientes, GAE) |
| Estabilidad | Muy buena — el recorte es justamente lo que evita el colapso |
| Cuándo usarlo | Cuando tienes una señal de recompensa densa (un entorno o un reward model) y necesitas robustez por encima de simplicidad |
Errores comunes
- Confundir el crítico con la política. El crítico no elige acciones; solo estima valor. Nunca lo despliegas — es andamiaje de entrenamiento que existe para bajar la varianza y se descarta al terminar.
- Dejar gradiente en la probabilidad vieja. El
logprob_viejoes una constante fija del momento de recolección. Si no lo desconectas del grafo, el ratio se corrompe y el recorte no protege de nada. - Reusar demasiado los mismos datos. PPO permite varias épocas sobre el mismo lote — esa es parte de su eficiencia — pero pasado cierto punto la política nueva se aleja tanto de la que generó los datos que el ratio se sale de la banda en todo, el recorte satura y el paso deja de aprender. Pocas épocas por lote.
- Tratar ε como decoración. El ancho del recorte es el parámetro de seguridad. Subirlo “para que aprenda más rápido” reabre justo la puerta al colapso que PPO vino a cerrar.
- Olvidar la entropía. Sin el premio a la entropía, la política tiende a colapsar temprano a una sola acción, deja de explorar y se estanca en un óptimo mediocre.
- Normalizar mal la ventaja. La ventaja se normaliza (media 0, desviación 1) por lote antes de entrar al objetivo. Saltarse ese paso reintroduce parte de la varianza que actor-critic vino a eliminar.
La frase para llevarse
“REINFORCE empujaba a ciegas con un número ruidoso; PPO agrega un juez que dice cuánto mejor salió cada jugada y un freno que impide creerle demasiado a un solo paso. La cautela no es un defecto de PPO: es la razón por la que no se rompe.”
Qué viene
Módulo 6: RLHF por dentro. Ya tienes todas las piezas — actor, crítico, ventaja, objetivo recortado. Ahora vamos a cambiar una sola cosa: en vez de que la recompensa venga de un entorno, la va a producir un modelo de recompensa entrenado con comparaciones de respuestas hechas por humanos. Verás cómo se arma ese modelo a partir de pares “esta respuesta es mejor que esta otra”, cómo entra la penalización de KL para que el modelo no se aleje demasiado de su versión original, y por qué este bucle — el mismo PPO de hoy, con reward model en lugar de juego — fue el que convirtió un modelo de lenguaje crudo en un asistente que sigue instrucciones.
Material relacionado
Preguntas sobre este curso
Regístrate gratis para hacer preguntas y guardar tu progreso.
✉ Entérate de lo nuevo
Recibe un aviso cuando publique nuevos cursos, workshops o investigaciones. Sin spam.