¿Podemos Hacer RL Online Sin un Critic?

Ahora hemos visto dos extremos del espectro de alignment. PPO basado en RLHF es poderoso pero complejo: requiere un reward model , una red de valor (el critic) y un bucle de muestreo online que genera completaciones, las puntúa, estima ventajas y realiza actualizaciones con recorte. DPO elimina toda esa complejidad optimizando directamente a partir de datos de preferencia, pero renuncia completamente a la generación online, entrenando en cambio sobre un conjunto fijo de pares de preferencia. Surge una pregunta natural: ¿existe un punto medio que mantenga la generación online (para que el modelo aprenda de sus propias salidas) pero elimine el costoso critic?

Shao et al. (2024) propusieron Group Relative Policy Optimization (GRPO) como parte de la serie de modelos DeepSeek, y la idea central es desarmantemente simple. En lugar de entrenar una red de valor separada para estimar "¿qué tan bueno es este estado?" como baseline, generamos un grupo de respuestas para el mismo prompt, puntuamos todas con una función de recompensa y usamos las propias estadísticas del grupo (media y desviación estándar) como baseline. Las respuestas que puntúan por encima del promedio del grupo se refuerzan; las que están por debajo se suprimen. No se necesita critic.

Esto importa especialmente para modelos de lenguaje grandes, donde el critic (red de valor) es típicamente otro modelo de tamaño comparable a la policy. Mantenerlo puede aproximadamente duplicar la huella de memoria durante el entrenamiento. GRPO intercambia ese costo de memoria por cómputo: generar $G$ respuestas por prompt requiere más pasadas forward, pero evitamos almacenar y actualizar una red neuronal extra completa.

¿Cómo Reemplaza la Normalización de Grupo a la Red de Valor?

En PPO, la ventaja $\hat{A}_t$ en cada paso temporal le dice al optimizador si una acción fue mejor o peor de lo esperado, donde "esperado" proviene de una función de valor aprendida $V_\phi(s_t)$. Entrenar $V_\phi$ para que sea preciso es en sí mismo un problema de aprendizaje supervisado que se ejecuta junto con la actualización de la policy, y equivocarse introduce sesgo en las estimaciones de ventaja. GRPO evita esto por completo.

Para cada prompt $x$, muestreamos un grupo de $G$ respuestas completas $\{y_1, y_2, \ldots, y_G\}$ de la policy actual $\pi_\theta$. Luego puntuamos cada una usando una función de recompensa $r(x, y_i)$ (esto puede ser un reward model entrenado, un verificador basado en reglas o cualquier función de puntuación escalar). La ventaja para la respuesta $i$ se calcula normalizando dentro del grupo:

$$\hat{A}_i = \frac{r_i - \text{mean}(r_1, \ldots, r_G)}{\text{std}(r_1, \ldots, r_G)}$$

Esto reemplaza completamente el rol de la red de valor. En lugar de preguntar "¿fue esta respuesta mejor de lo que esperábamos de este estado?" (lo cual requiere un aproximador de funciones entrenado), preguntamos "¿fue esta respuesta mejor que las otras respuestas que acabamos de generar para el mismo prompt?" El grupo mismo proporciona el contexto de lo que cuenta como bueno o malo.

Para ver por qué esto funciona, consideremos qué sucede con diferentes tamaños de grupo. Cuando $G$ es grande (digamos 64), la media y la desviación estándar del grupo son estimaciones estables de la distribución de recompensa para ese prompt, así que $\hat{A}_i$ identifica confiablemente qué respuestas están por encima o por debajo del promedio. La normalización también maneja el hecho de que diferentes prompts pueden tener escalas de recompensa muy distintas: un problema de matemáticas donde la mayoría de las respuestas puntúan 0 o 1 se normaliza por separado de un prompt de escritura abierta donde las puntuaciones se distribuyen en un rango continuo.

Cuando $G = 2$, sucede algo interesante. Tenemos dos respuestas y, después de la normalización, una obtiene una ventaja positiva y la otra una negativa. La actualización refuerza la mejor respuesta y suprime la peor, lo cual es conceptualmente similar a lo que DPO hace con un par de preferencia (aunque el mecanismo es diferente porque GRPO aún usa una señal de recompensa explícita y actualizaciones de gradiente de policy en lugar de una pérdida supervisada sobre log-ratios). A medida que $G$ aumenta, obtenemos información más detallada sobre la distribución de recompensa para cada prompt.

💡 La normalización de grupo también tiene un efecto de reducción de varianza similar a un baseline en REINFORCE. Restar la recompensa media centra las ventajas alrededor de cero, lo que tiende a reducir la varianza de la estimación del gradiente de la policy y estabilizar el entrenamiento.

¿Cómo Es el Objetivo Completo de GRPO?

Con las ventajas normalizadas por grupo en mano, GRPO usa un objetivo recortado al estilo PPO para actualizar la policy. Para cada respuesta $y_i$ en el grupo, sea $\rho_i$ el ratio de importance sampling entre la policy actual y la policy que generó la muestra (la policy "antigua" de la iteración anterior):

$$\rho_i = \frac{\pi_\theta(y_i | x)}{\pi_{\theta_{\text{old}}}(y_i | x)}$$

El objetivo completo de GRPO combina estas ventajas normalizadas con una actualización recortada al estilo PPO.

$$\mathcal{J}_{\text{GRPO}} = \mathbb{E}_{x \sim \mathcal{D}} \; \frac{1}{G} \sum_{i=1}^{G} \left[ \min\!\left( \rho_i \, \hat{A}_i, \; \text{clip}(\rho_i, 1-\varepsilon, 1+\varepsilon) \, \hat{A}_i \right) \right] - \beta \, \text{KL}(\pi_\theta \| \pi_{\text{ref}})$$

Varias piezas de esto deberían resultar familiares del artículo sobre PPO. El término $\min(\rho_i \hat{A}_i, \text{clip}(\rho_i, 1{-}\varepsilon, 1{+}\varepsilon) \hat{A}_i)$ es el mismo objetivo sustituto recortado que previene actualizaciones de policy destructivamente grandes. Cuando $\rho_i$ se mantiene dentro de $[1{-}\varepsilon, 1{+}\varepsilon]$, el recorte no tiene efecto y el gradiente fluye normalmente. Cuando la policy intenta cambiar demasiado (empujando $\rho_i$ fuera de este intervalo), el recorte limita el objetivo y el gradiente se desvanece, lo cual actúa como una región de confianza.

La penalización de KL $\beta \, \text{KL}(\pi_\theta \| \pi_{\text{ref}})$ cumple el mismo propósito que en RLHF: evita que la policy se desvíe demasiado del modelo de referencia (típicamente el checkpoint de SFT). Sin ella, la policy podría degenerar en producir un conjunto estrecho de salidas de alta recompensa que ya no se parecen a lenguaje coherente. En la práctica, DeepSeek calcula este término de KL a nivel de token y lo promedia a lo largo de la secuencia, usando una aproximación $\text{KL} \approx \frac{\pi_{\text{ref}}(y|x)}{\pi_\theta(y|x)} - \log \frac{\pi_{\text{ref}}(y|x)}{\pi_\theta(y|x)} - 1$ que es más numéricamente estable que la forma de log-ratio directo.

Juntando todo, el bucle de entrenamiento de GRPO para cada lote se ve así.

# Simplified GRPO training loop (pseudocode)

def grpo_step(policy, ref_policy, prompts, reward_fn, G=16, eps=0.2, beta=0.04):
    all_losses = []

    for x in prompts:
        # 1. Sample a group of G responses from the current policy
        responses = [policy.generate(x) for _ in range(G)]

        # 2. Score each response
        rewards = torch.tensor([reward_fn(x, y) for y in responses])

        # 3. Group-normalize advantages (replaces the critic)
        advantages = (rewards - rewards.mean()) / (rewards.std() + 1e-8)

        # 4. Compute log-probs under current and old policy
        for y_i, A_i in zip(responses, advantages):
            log_pi = policy.log_prob(y_i, given=x)
            log_pi_old = policy_old.log_prob(y_i, given=x)  # from before this update
            log_pi_ref = ref_policy.log_prob(y_i, given=x)

            # Importance sampling ratio
            rho = torch.exp(log_pi - log_pi_old)

            # Clipped surrogate (same as PPO)
            surr1 = rho * A_i
            surr2 = torch.clamp(rho, 1 - eps, 1 + eps) * A_i
            policy_loss = -torch.min(surr1, surr2)

            # KL penalty against reference
            kl = torch.exp(log_pi_ref - log_pi) - (log_pi_ref - log_pi) - 1
            loss = policy_loss + beta * kl

            all_losses.append(loss)

    total_loss = torch.stack(all_losses).mean()
    total_loss.backward()
    optimizer.step()

Nótese lo que está ausente: no hay red $V_\phi$, no hay estimación de ventaja vía GAE (Generalized Advantage Estimation) y no hay pérdida de valor separada. La única red neuronal que se actualiza es la policy misma. Esto reduce significativamente el uso de memoria (sin modelo critic en la memoria GPU) y simplifica el código de entrenamiento, a costa de necesitar $G$ pasadas forward por prompt para generar el grupo.

¿Cómo Usó DeepSeek GRPO para Razonamiento?

La aplicación más prominente de GRPO es DeepSeek-R1 (DeepSeek-AI, 2025) , que lo utilizó para entrenar un modelo con fuertes capacidades de razonamiento. La configuración es particularmente adecuada para tareas de razonamiento porque la señal de recompensa a menudo puede verificarse automáticamente: para un problema de matemáticas, verificamos si la respuesta final es correcta; para una tarea de código, ejecutamos el código generado contra casos de prueba. Esta estructura de recompensa binaria o casi binaria significa que ni siquiera necesitamos un reward model aprendido, solo un verificador.

El pipeline de entrenamiento de DeepSeek-R1 comenzó con un modelo base (DeepSeek-V3) y aplicó GRPO directamente, sin una etapa inicial de SFT sobre datos de razonamiento. El tamaño del grupo era lo suficientemente grande como para asegurar que, para cada prompt, algunas respuestas del grupo llegarían a la respuesta correcta y otras no. La normalización de grupo entonces naturalmente asignó ventajas positivas a las respuestas correctas y ventajas negativas a las incorrectas, creando una señal de aprendizaje clara sin ninguna etiqueta de preferencia humana.

Uno de los hallazgos más llamativos fue que el modelo desarrolló espontáneamente razonamiento de cadena de pensamiento durante el entrenamiento con GRPO. Sin que se le dijera explícitamente que "piense paso a paso", el modelo aprendió a producir trazas de razonamiento más largas y estructuradas porque esas trazas tendían a conducir a respuestas correctas (y por lo tanto recibían ventajas positivas). También aprendió comportamientos de autocorrección, donde el modelo escribía algo, se daba cuenta de que estaba mal, retrocedía e intentaba un enfoque diferente, todo dentro de una sola generación. Estos comportamientos emergieron solo de la señal de recompensa.

Esto destaca un punto más amplio sobre los métodos de RL online (tanto PPO como GRPO): dado que el modelo genera sus propios datos de entrenamiento, puede descubrir estrategias que ningún anotador humano habría pensado en demostrar. DPO, al entrenar sobre un conjunto fijo de preferencias humanas, solo puede aprender comportamientos que ya están representados en ese conjunto de datos. La generación online de GRPO abre la puerta a comportamientos emergentes, lo cual es tanto su mayor fortaleza (el modelo puede sorprendernos con soluciones creativas) como un riesgo potencial (también puede descubrir atajos indeseables si la función de recompensa tiene brechas).

💡 DeepSeek-R1 también reveló un "momento aha" durante el entrenamiento donde el modelo comenzó a asignar más tokens a problemas más difíciles y menos a los más fáciles, sugiriendo que la señal relativa al grupo de GRPO puede enseñar estrategias de asignación de recursos que serían difíciles de especificar explícitamente.

Quiz

Pon a prueba tu comprensión de GRPO y cómo simplifica el pipeline de RL.

¿Qué usa GRPO en lugar de una red de valor aprendida (critic) para calcular ventajas?

¿Qué sucede con la normalización de grupo de GRPO cuando el tamaño del grupo G = 2?

¿Por qué GRPO es particularmente adecuado para tareas de razonamiento como matemáticas y código?

¿Cuál es la principal ventaja de memoria de GRPO sobre PPO?