From 61056a978f2bf0885a7163381967744f0a0d46a1 Mon Sep 17 00:00:00 2001 From: "I. Alonso" Date: Sat, 10 Oct 2026 22:15:54 +0200 Subject: [PATCH] Add Spanish translation for Chapter 12 Sections 1 to 3b (Build Reasoning Models & DeepSeek R1/GRPO) --- chapters/es/_toctree.yml | 13 + chapters/es/chapter12/1.mdx | 90 +++++++ chapters/es/chapter12/2.mdx | 239 ++++++++++++++++++ chapters/es/chapter12/3.mdx | 328 +++++++++++++++++++++++++ chapters/es/chapter12/3b.mdx | 415 ++++++++++++++++++++++++++++++++ chapters/es/chapter12/img/1.png | Bin 0 -> 58807 bytes chapters/es/chapter12/img/2.jpg | Bin 0 -> 44339 bytes 7 files changed, 1085 insertions(+) create mode 100644 chapters/es/chapter12/1.mdx create mode 100644 chapters/es/chapter12/2.mdx create mode 100644 chapters/es/chapter12/3.mdx create mode 100644 chapters/es/chapter12/3b.mdx create mode 100644 chapters/es/chapter12/img/1.png create mode 100644 chapters/es/chapter12/img/2.jpg diff --git a/chapters/es/_toctree.yml b/chapters/es/_toctree.yml index 10e3ce7a6..ce2a36725 100644 --- a/chapters/es/_toctree.yml +++ b/chapters/es/_toctree.yml @@ -113,6 +113,19 @@ - local: chapter8/2 title: ¿Qué hacer cuando se produce un error? +- title: 12. Construir modelos de razonamiento + subtitle: Aprende a construir modelos de razonamiento como DeepSeek R1 + new: true + sections: + - local: chapter12/1 + title: Introducción + - local: chapter12/2 + title: Aprendizaje por refuerzo en LLMs + - local: chapter12/3 + title: El momento «¡Ajá!» en el artículo de DeepSeek R1 + - local: chapter12/3b + title: Comprensión avanzada de GRPO en DeepSeekMath + - title: Glosario sections: - local: glossary/1 diff --git a/chapters/es/chapter12/1.mdx b/chapters/es/chapter12/1.mdx new file mode 100644 index 000000000..781c7f968 --- /dev/null +++ b/chapters/es/chapter12/1.mdx @@ -0,0 +1,90 @@ +# Open R1 para estudiantes[[open-r1-para-estudiantes]] + +¡Te damos la bienvenida a un emocionante viaje al mundo de la IA de código abierto con aprendizaje por refuerzo! Este capítulo está diseñado para ayudar a los estudiantes a comprender el aprendizaje por refuerzo y su papel en los LLMs. + +También exploraremos [Open R1](https://github.com/huggingface/open-r1), un innovador proyecto comunitario que está haciendo accesible la IA avanzada para todos. Específicamente, este curso tiene como objetivo ayudar a los estudiantes y aprendices a utilizar y contribuir a [Open R1](https://github.com/huggingface/open-r1). + +## Qué aprenderás + +En este capítulo, desglosaremos conceptos complejos en partes fáciles de entender y te mostraremos cómo puedes formar parte de este emocionante proyecto para hacer que los LLMs razonen sobre problemas complejos. + +Los LLMs han mostrado un excelente rendimiento en muchas tareas generativas. Sin embargo, hasta hace poco tenían dificultades con problemas complejos que requerían razonamiento. Por ejemplo, les cuesta resolver acertijos o problemas matemáticos que requieren múltiples pasos de razonamiento. + +Open R1 es un proyecto que tiene como objetivo hacer que los LLMs razonen sobre problemas complejos. Lo hace utilizando el aprendizaje por refuerzo para animar a los LLMs a «pensar» y razonar. + +En términos sencillos, el modelo se entrena para generar pensamientos así como respuestas, y para estructurar estos pensamientos y respuestas de modo que el usuario pueda manejarlos por separado. + +Veamos un ejemplo. Si nos propusiéramos resolver el siguiente problema, podríamos pensar de esta manera: + +```sh +Problema: "Tengo 3 manzanas y 2 naranjas. ¿Cuántas piezas de fruta tengo en total?" + +Pensamiento: "Necesito sumar la cantidad de manzanas y naranjas para obtener la cantidad total de piezas de fruta." + +Respuesta: "5" +``` + +Luego podemos estructurar este pensamiento y respuesta para que el usuario pueda manejarlos por separado. Para tareas de razonamiento, los LLMs pueden entrenarse para generar pensamientos y respuestas en el siguiente formato: + +```sh +Necesito sumar la cantidad de manzanas y naranjas para obtener la cantidad total de piezas de fruta. +5 +``` + +Como usuarios, podemos extraer el pensamiento y la respuesta de la salida del modelo y utilizarlos para resolver el problema. + +## Por qué esto es importante para los estudiantes + +Como estudiante, comprender Open R1 y el papel del aprendizaje por refuerzo en los LLMs es valioso porque: +- Te muestra cómo se desarrolla la IA de vanguardia +- Te brinda oportunidades prácticas para aprender y contribuir +- Te ayuda a comprender hacia dónde se dirige la tecnología de IA +- Abre puertas a futuras oportunidades profesionales en IA + +## Resumen del capítulo + +Este capítulo se divide en cuatro secciones, cada una centrada en un aspecto diferente de Open R1: + +### 1️⃣ Introducción al aprendizaje por refuerzo y su papel en los LLMs +Exploraremos los conceptos básicos del Aprendizaje por Refuerzo (RL) y su función en el entrenamiento de LLMs: +- ¿Qué es el RL? +- ¿Cómo se utiliza el RL en los LLMs? +- ¿Qué es DeepSeek R1? +- ¿Cuáles son las innovaciones clave de DeepSeek R1? + +### 2️⃣ Comprender el artículo de DeepSeek R1 +Desglosaremos el artículo de investigación que inspiró [Open R1](https://huggingface.co/open-r1): +- Innovaciones y avances clave +- El proceso de entrenamiento y la arquitectura +- Resultados y su significado + +### 3️⃣ Implementación de GRPO en TRL +Pasaremos a la práctica con ejemplos de código: +- Cómo utilizar la librería Transformer Reinforcement Learning (TRL) +- Configuración del entrenamiento con GRPO + +### 4️⃣ Caso de uso práctico para alinear un modelo +Veremos un caso de uso práctico para alinear un modelo usando Open R1: +- Cómo entrenar un modelo usando GRPO en TRL +- Comparte tu modelo en el [Hugging Face Hub](https://huggingface.co/models) + +## Requisitos previos + +Para aprovechar al máximo este capítulo, es útil contar con: +- Conocimientos sólidos de programación en Python +- Familiaridad con los conceptos de aprendizaje automático +- Interés en la IA y los modelos de lenguaje + +No te preocupes si te falta alguno de estos: ¡iremos explicando los conceptos clave a medida que avancemos! 🚀 + +> [!TIP] +> Si no cuentas con todos los requisitos previos, consulta este [curso](/course/chapter1/1) desde las unidades 1 a 11. + +## Cómo utilizar este capítulo + +1. **Lee secuencialmente**: Las secciones se complementan entre sí, por lo que es mejor leerlas en orden +2. **Comparte notas**: Anota los conceptos clave y las preguntas, y debátelos con la comunidad en [Discord](https://discord.gg/UrrTSsSyjb) +3. **Prueba el código**: Cuando lleguemos a los ejemplos prácticos, pruébalos tú mismo +4. **Únete a la comunidad**: Utiliza los recursos que proporcionamos para conectarte con otros estudiantes + +¡Comencemos nuestra exploración de Open R1 y descubramos cómo puedes formar parte del objetivo de hacer que la IA sea más accesible para todos! 🚀 diff --git a/chapters/es/chapter12/2.mdx b/chapters/es/chapter12/2.mdx new file mode 100644 index 000000000..b89dc2d1a --- /dev/null +++ b/chapters/es/chapter12/2.mdx @@ -0,0 +1,239 @@ +# Introducción al aprendizaje por refuerzo y su papel en los LLMs[[introduccion-al-aprendizaje-por-refuerzo-y-su-papel-en-los-llms]] + +¡Te damos la bienvenida a la primera página! + +Vamos a comenzar nuestro viaje por el apasionante mundo del Aprendizaje por Refuerzo (RL, por sus siglas en inglés: *Reinforcement Learning*) y descubriremos cómo está revolucionando la forma en que entrenamos modelos de lenguaje como los que utilizas todos los días. + +> [!TIP] +> En este capítulo, nos centramos en el aprendizaje por refuerzo para modelos de lenguaje. Sin embargo, el aprendizaje por refuerzo es un campo amplio con muchas aplicaciones más allá de los modelos de lenguaje. Si estás interesado en aprender más sobre el aprendizaje por refuerzo, deberías consultar el [curso de Deep Reinforcement Learning](https://huggingface.co/courses/deep-rl-course/en/unit1/introduction). + +Esta página te brindará una introducción amigable y clara al RL, incluso si nunca lo has visto antes. Desglosaremos las ideas centrales y veremos por qué el RL se está volviendo tan importante en el campo de los Modelos Grandes de Lenguaje (LLMs). + +## ¿Qué es el aprendizaje por refuerzo (RL)? + +Imagina que estás entrenando a un perro. Quieres enseñarle a sentarse. Puedes decir "¡Siéntate!" y luego, si el perro se sienta, le das un premio y lo felicitas. Si no se sienta, puedes guiarlo suavemente o simplemente intentarlo de nuevo. Con el tiempo, el perro aprende a asociar sentarse con la recompensa positiva (premio y elogio) y es más probable que se siente cuando vuelvas a decir "¡Siéntate!". En el aprendizaje por refuerzo, nos referimos a esta retroalimentación como una **recompensa** (*reward*). + +¡Esa es, en pocas palabras, la idea básica detrás del aprendizaje por refuerzo! En lugar de un perro, tenemos un **modelo de lenguaje** (en el aprendizaje por refuerzo, lo llamamos **agente**), y en lugar de ti, tenemos el **entorno** (*environment*) que da la retroalimentación. + +![Proceso de términos de RL](https://huggingface.co/reasoning-course/images/resolve/main/grpo/3.jpg) + +Desglosemos las piezas clave del RL: + +### Agente (*Agent*) + +Este es nuestro aprendiz. En el ejemplo del perro, el perro es el agente. En el contexto de los LLMs, el propio LLM se convierte en el agente que queremos entrenar. El agente es quien toma decisiones y aprende del entorno y sus recompensas. + +### Entorno (*Environment*) + +Este es el mundo en el que vive e interactúa el agente. Para el perro, el entorno es tu casa y tú. Para un LLM, el entorno es un poco más abstracto: podrían ser los usuarios con los que interactúa o un escenario simulado que configuramos para él. El entorno proporciona retroalimentación al agente. + +### Acción (*Action*) + +Estas son las elecciones que el agente puede hacer en el entorno. Las acciones del perro son cosas como "sentarse", "pararse", "ladrar", etc. Para un LLM, las acciones podrían ser generar palabras en una oración, elegir qué respuesta dar a una pregunta o decidir cómo responder en una conversación. + +### Recompensa (*Reward*) + +Esta es la retroalimentación que el entorno le da al agente después de que realiza una acción. Las recompensas suelen ser números. + +Las **recompensas positivas** son como premios y elogios: le dicen al agente "¡buen trabajo, hiciste algo bien!". + +Las **recompensas negativas** (o penalizaciones) son como un "no" suave: le dicen al agente "eso no estuvo del todo bien, intenta otra cosa". Para el perro, el premio es la recompensa. + +Para un LLM, las recompensas están diseñadas para reflejar qué tan bien lo está haciendo el LLM en una tarea específica: tal vez qué tan útil, veraz o inocua es su respuesta. + +### Política (*Policy*) + +Esta es la estrategia del agente para elegir acciones. Es como la comprensión del perro de lo que debe hacer cuando dices "¡Siéntate!". En RL, la política es lo que realmente intentamos aprender y mejorar. Es un conjunto de reglas o una función que le dice al agente qué acción tomar en diferentes situaciones. Inicialmente, la política puede ser aleatoria, pero a medida que el agente aprende, la política mejora a la hora de elegir acciones que conducen a mayores recompensas. + +## El proceso de RL: Ensayo y error + +![Proceso de RL](https://huggingface.co/reasoning-course/images/resolve/main/grpo/1.jpg) + +El aprendizaje por refuerzo ocurre a través de un proceso de ensayo y error: + +| Paso | Proceso | Descripción | +|------|---------|-------------| +| 1. Observación | El agente observa el entorno | El agente recopila información sobre su estado actual y su entorno | +| 2. Acción | El agente toma una acción basada en su política actual | Usando su estrategia aprendida (política), el agente decide qué hacer a continuación | +| 3. Retroalimentación | El entorno le da una recompensa al agente | El agente recibe retroalimentación sobre qué tan buena o mala fue su acción | +| 4. Aprendizaje | El agente actualiza su política en función de la recompensa | El agente ajusta su estrategia: refuerza las acciones que condujeron a altas recompensas y evita las que llevaron a bajas recompensas | +| 5. Iteración | Repetir el proceso | Este ciclo continúa, permitiendo que el agente mejore continuamente su toma de decisiones | + +Piensa en aprender a andar en bicicleta. Al principio puedes tambalearte y caerte (¡recompensa negativa!). Pero cuando logras mantener el equilibrio y pedalear suavemente, te sientes bien (¡recompensa positiva!). Ajustas tus acciones en función de esta retroalimentación (inclinándote ligeramente, pedaleando más rápido, etc.) hasta que aprendes a andar bien. El RL es similar: se trata de aprender a través de la interacción y la retroalimentación. + +## El papel del RL en los Modelos Grandes de Lenguaje (LLMs) + +Ahora bien, ¿por qué el RL es tan importante para los Modelos Grandes de Lenguaje? + +Entrenar LLMs realmente buenos es complicado. Podemos entrenarlos con cantidades masivas de texto de Internet y se vuelven muy buenos prediciendo la siguiente palabra en una oración. Así es como aprenden a generar texto fluido y gramaticalmente correcto, como aprendimos en el [capítulo 2](/course/chapter2/1). + +Sin embargo, limitarse a ser fluido no es suficiente. Queremos que nuestros LLMs sean más que simplemente buenos uniendo palabras. Queremos que sean: + +* **Útiles (*Helpful*):** Proporcionen información útil y relevante. +* **Inocuos (*Harmless*):** Eviten generar contenido tóxico, sesgado o dañino. +* **Alineados con las preferencias humanas (*Aligned*):** Respondan de maneras que los humanos encuentren naturales, útiles y atractivas. + +Los métodos de preentrenamiento de LLM, que dependen principalmente de predecir la siguiente palabra a partir de datos de texto, a veces se quedan cortos en estos aspectos. + +Si bien el entrenamiento supervisado es excelente para producir salidas estructuradas, puede ser menos efectivo para producir respuestas útiles, inocuas y alineadas. Exploramos el entrenamiento supervisado en el [capítulo 11](/course/chapter11/1). + +Los modelos ajustados finamente pueden generar texto fluido y estructurado que sigue siendo contextualmente incorrecto, sesgado o que realmente no responde a la pregunta del usuario de manera útil. + +**¡Aquí es donde entra el Aprendizaje por Refuerzo!** El RL nos brinda una manera de ajustar finamente estos LLMs preentrenados para lograr mejor estas cualidades deseadas. ¡Es como darle a nuestro perro LLM entrenamiento adicional para convertirse en un compañero educado y servicial, no solo en un perro que sabe ladrar fluidamente! + +## Aprendizaje por refuerzo a partir de retroalimentación humana (RLHF) + +Una técnica muy popular para alinear modelos de lenguaje es el **Aprendizaje por Refuerzo a partir de Retroalimentación Humana (RLHF)** (*Reinforcement Learning from Human Feedback*). En RLHF, utilizamos la retroalimentación humana como un indicador de la señal de "recompensa" en RL. Así es como funciona: + +1. **Obtener preferencias humanas:** Podemos pedir a las personas que comparen diferentes respuestas generadas por el LLM para el mismo prompt de entrada y nos digan qué respuesta prefieren. Por ejemplo, podríamos mostrarle a un evaluador humano dos respuestas diferentes a la pregunta "¿Cuál es la capital de Francia?" y preguntarle "¿Qué respuesta es mejor?". + +2. **Entrenar un modelo de recompensa:** Utilizamos estos datos de preferencia humana para entrenar un modelo independiente llamado **modelo de recompensa** (*reward model*). Este modelo de recompensa aprende a predecir qué tipo de respuestas preferirán los humanos. Aprende a calificar las respuestas en función de su utilidad, inocuidad y alineación con las preferencias humanas. + +3. **Ajustar el LLM con RL:** Ahora usamos el modelo de recompensa como entorno para nuestro agente LLM. El LLM genera respuestas (acciones) y el modelo de recompensa califica estas respuestas (proporciona recompensas). En esencia, estamos entrenando al LLM para producir texto que nuestro modelo de recompensa (que aprendió de las preferencias humanas) considera bueno. + +![Concepto básico de RL](https://huggingface.co/reasoning-course/images/resolve/main/grpo/2.jpg) + +Desde una perspectiva general, veamos los beneficios de utilizar RL en los LLMs: + +| Beneficio | Descripción | +|-----------|-------------| +| Control mejorado | El RL nos permite tener más control sobre el tipo de texto que generan los LLMs. Podemos guiarlos para que produzcan texto más alineado con objetivos específicos, como ser útiles, creativos o concisos. | +| Mayor alineación con los valores humanos | El RLHF, en particular, nos ayuda a alinear los LLMs con preferencias humanas complejas y a menudo subjetivas. Es difícil redactar reglas sobre "qué hace que una respuesta sea buena", pero los humanos pueden juzgar y comparar respuestas fácilmente. El RLHF permite que el modelo aprenda de estos juicios humanos. | +| Mitigación de comportamientos no deseados | El RL se puede utilizar para reducir comportamientos negativos en los LLMs, como generar lenguaje tóxico, difundir desinformación o exhibir sesgos. Al diseñar recompensas que penalicen estos comportamientos, podemos orientar al modelo para que los evite. | + +El Aprendizaje por Refuerzo a partir de Retroalimentación Humana se ha utilizado para entrenar muchos de los LLMs más populares de la actualidad, como GPT-4 de OpenAI, Gemini de Google y R1 de DeepSeek. Existe una amplia gama de técnicas para RLHF, con distintos grados de complejidad y sofisticación. En este capítulo, nos centraremos en Group Relative Policy Optimization (GRPO), que es una técnica de RLHF que ha demostrado ser eficaz para entrenar LLMs que sean útiles, inocuos y alineados con las preferencias humanas. + +## ¿Por qué debería importarnos GRPO (*Group Relative Policy Optimization*)? + +Existen muchas técnicas para RLHF, pero este curso se centra en GRPO porque representa un avance significativo en el aprendizaje por refuerzo para modelos de lenguaje. + +Consideremos brevemente otras dos técnicas populares para RLHF: + +- Optimización de política proximal (PPO, *Proximal Policy Optimization*) +- Optimización directa de preferencias (DPO, *Direct Preference Optimization*) + +La optimización de política proximal (PPO) fue una de las primeras técnicas altamente efectivas para RLHF. Utiliza un método de gradiente de política para actualizar la política en función de la recompensa de un modelo de recompensa independiente. + +La optimización directa de preferencias (DPO) se desarrolló posteriormente como una técnica más simple que elimina la necesidad de un modelo de recompensa independiente utilizando datos de preferencias directamente. Esencialmente, plantea el problema como una tarea de clasificación entre las respuestas elegidas y rechazadas. + +> [!TIP] +> DPO y PPO son algoritmos complejos de aprendizaje por refuerzo por derecho propio, que no cubriremos en este curso. Si estás interesado en aprender más sobre ellos, puedes consultar los siguientes recursos: +> +> - [Proximal Policy Optimization](https://huggingface.co/docs/trl/main/en/ppo_trainer) +> - [Direct Preference Optimization](https://huggingface.co/docs/trl/main/en/dpo_trainer) + +A diferencia de DPO y PPO, GRPO agrupa muestras similares y las compara en grupo. El enfoque basado en grupos proporciona gradientes más estables y mejores propiedades de convergencia en comparación con otros métodos. + +GRPO no utiliza datos de preferencias como DPO, sino que compara grupos de muestras similares utilizando una señal de recompensa de un modelo o función. + +GRPO es flexible en cuanto a cómo obtiene las señales de recompensa: puede funcionar con un modelo de recompensa (como lo hace PPO), pero no requiere estrictamente uno. Esto se debe a que GRPO puede incorporar señales de recompensa de cualquier función o modelo que pueda evaluar la calidad de las respuestas. + +Por ejemplo, podríamos usar una función de longitud para recompensar respuestas más cortas, un solucionador matemático para verificar la corrección de una solución o una función de precisión fáctica para recompensar respuestas que sean más precisas desde el punto de vista factual. Esta flexibilidad hace que GRPO sea particularmente versátil para diferentes tipos de tareas de alineación. + +--- + +¡Felicitaciones por completar el Módulo 1! Ahora tienes una sólida introducción al Aprendizaje por Refuerzo y su papel crucial en la configuración del futuro de los Modelos Grandes de Lenguaje. Comprendes los conceptos básicos de RL, por qué se utiliza para LLMs y te has familiarizado con GRPO, un algoritmo clave en este campo. + +En el próximo módulo, pasaremos a la práctica y nos sumergiremos en el artículo de DeepSeek R1 para ver estos conceptos en acción. + +## Cuestionario + +### 1. ¿Cuáles son los componentes clave del Aprendizaje por Refuerzo? + + + +### 2. ¿Cuál es la principal ventaja de RLHF para el entrenamiento de modelos de lenguaje? + + + +### 3. En el contexto de RL para LLMs, ¿qué representa una "acción"? + + + +### 4. ¿Cuál es el papel de la recompensa en el entrenamiento con RL de modelos de lenguaje? + + + +### 5. ¿Qué es una recompensa en el contexto de RL para LLMs? + + diff --git a/chapters/es/chapter12/3.mdx b/chapters/es/chapter12/3.mdx new file mode 100644 index 000000000..b72b0ebb7 --- /dev/null +++ b/chapters/es/chapter12/3.mdx @@ -0,0 +1,328 @@ +# El momento «¡Ajá!» en el artículo de DeepSeek R1[[el-momento-aja-en-el-articulo-de-deepseek-r1]] + +Este capítulo es una lectura intensiva del artículo. Analizaremos el artículo en términos sencillos y luego desglosaremos los conceptos y conclusiones clave. + +DeepSeek R1 representa un avance significativo en el entrenamiento de modelos de lenguaje, particularmente en el desarrollo de capacidades de razonamiento a través del aprendizaje por refuerzo. El artículo presenta un nuevo algoritmo de aprendizaje por refuerzo llamado Optimización de Política Relativa de Grupo (GRPO, por sus siglas en inglés: *Group Relative Policy Optimization*). + +![Descripción general de DeepSeek R1](https://huggingface.co/reasoning-course/images/resolve/main/grpo/4.png) + +En el próximo capítulo, nos basaremos en este conocimiento e implementaremos GRPO en la práctica. + +El objetivo inicial del artículo era explorar si el aprendizaje por refuerzo puro podía desarrollar capacidades de razonamiento sin ajuste fino supervisado. + +> [!TIP] +> Hasta ese momento, todos los LLMs populares requerían algún tipo de ajuste fino supervisado, que exploramos en el [capítulo 11](/course/chapter11/1). + +## El gran avance: El momento «¡Ajá!» (*Aha Moment*) + +![El momento «¡Ajá!»](https://huggingface.co/reasoning-course/images/resolve/main/grpo/9.png) + +Uno de los descubrimientos más notables en el entrenamiento de R1-Zero fue la aparición de un fenómeno conocido como el momento «¡Ajá!» (*Aha Moment*). Este fenómeno es similar a la forma en que los humanos experimentan revelaciones repentinas al resolver problemas. Así es como funciona: + +1. Intento inicial: El modelo realiza un intento inicial para resolver un problema +2. Reconocimiento: Reconoce posibles errores o inconsistencias +3. Autocorrección: Ajusta su enfoque en función de este reconocimiento +4. Explicación: Puede explicar por qué el nuevo enfoque es mejor + +Este avance resuena en los aprendices y se siente como un momento "Eureka". Demuestra aprendizaje en lugar de mera memorización, así que tomémonos un momento para imaginar cómo se siente tener un momento «¡Ajá!». + +Por ejemplo, imagina que estás intentando resolver un rompecabezas: +- Primer intento: "Esta pieza debería ir aquí según el color" +- Reconocimiento: "Pero espera, la forma no encaja del todo" +- Corrección: "Ah, en realidad pertenece allá" +- Explicación: "Porque tanto el patrón de color como el de forma coinciden en esta posición" + +Esta capacidad surgió naturalmente del entrenamiento con RL, sin haber sido programada explícitamente, demostrando aprendizaje en lugar de la mera memorización de un proceso a partir de los datos de entrenamiento. + +La forma más sencilla de comprender el momento «¡Ajá!» es verlo en acción. Veamos un ejemplo. En el chat a continuación, le pedimos al modelo que resuelva un problema y la interfaz muestra el proceso de pensamiento del modelo a medida que lo resuelve. + + + +Si quieres probar R1 de DeepSeek, también puedes consultar [Hugging Chat](https://huggingface.co/chat/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B). + +## El proceso de entrenamiento + +Entrenar a R1 fue un proceso de varias fases. Desglosemos las fases y las innovaciones clave en cada una de ellas. + +El proceso final da como resultado dos modelos: +- DeepSeek-R1-Zero: Un modelo entrenado exclusivamente mediante aprendizaje por refuerzo. +- DeepSeek-R1: Un modelo que se basa en los cimientos de DeepSeek-R1-Zero y añade ajuste fino supervisado. + +| Característica | DeepSeek-R1-Zero | DeepSeek-R1 | +|----------------|------------------|-------------| +| Enfoque de entrenamiento | RL puro | Multifase (SFT + RL) | +| Ajuste fino | Ninguno | Ajuste fino supervisado | +| Capacidad de razonamiento | Emergente | Mejorada | +| Rendimiento en AIME | 71.0% | 79.8% | +| Características clave | Fuerte razonamiento pero problemas de legibilidad | Mejor consistencia lingüística y legibilidad | + +Si bien DeepSeek-R1-Zero demuestra el potencial del aprendizaje por refuerzo puro para desarrollar capacidades de razonamiento, DeepSeek-R1 se basa en esta base con un enfoque más equilibrado que prioriza tanto el rendimiento del razonamiento como la usabilidad. + +El proceso de entrenamiento involucra cuatro fases: + +1. Fase de inicio en frío (*Cold Start Phase*) +2. Fase de RL de razonamiento (*Reasoning RL Phase*) +3. Fase de muestreo por rechazo (*Rejection Sampling Phase*) +4. Fase de RL diverso (*Diverse RL Phase*) + +Desglosemos cada fase: + +### Fase de inicio en frío (Base de calidad) + +![Fase de inicio en frío](https://huggingface.co/reasoning-course/images/resolve/main/grpo/5.png) + +Esta fase está diseñada para establecer una base sólida para la legibilidad y la calidad de respuesta del modelo. Utiliza un pequeño conjunto de datos de muestras de alta calidad de R1-Zero para ajustar el modelo V3-Base. Comenzando con el modelo DeepSeek-V3-Base, el equipo utilizó miles de muestras validadas y de alta calidad de R1-Zero para el ajuste fino supervisado. Este enfoque innovador utiliza un conjunto de datos pequeño pero de alta calidad para establecer una sólida línea de base de legibilidad y calidad de respuesta. + +### Fase de RL de razonamiento (Desarrollo de capacidades) + +![Fase de RL de razonamiento](https://huggingface.co/reasoning-course/images/resolve/main/grpo/6.png) + +La fase de RL de razonamiento se centra en desarrollar capacidades centrales de razonamiento en dominios que incluyen matemáticas, programación, ciencias y lógica. Esta fase emplea aprendizaje por refuerzo basado en reglas, con recompensas directamente vinculadas a la corrección de la solución. + +Crucialmente, todas las tareas en esta fase son «verificables», por lo que podemos comprobar si la respuesta del modelo es correcta o no. Por ejemplo, en el caso de las matemáticas, podemos comprobar si la respuesta del modelo es correcta utilizando un solucionador matemático. + +Lo que hace que esta fase sea particularmente innovadora es su enfoque de optimización directa que elimina la necesidad de un modelo de recompensa independiente, agilizando el proceso de entrenamiento. + +### Fase de muestreo por rechazo (Control de calidad) + +![Fase de muestreo por rechazo](https://huggingface.co/reasoning-course/images/resolve/main/grpo/7.png) + +Durante la fase de muestreo por rechazo, el modelo genera muestras que luego se filtran mediante un proceso de control de calidad. DeepSeek-V3 sirve como juez de calidad, evaluando las respuestas en un amplio espectro que se extiende más allá de las tareas de razonamiento puro. Los datos filtrados se utilizan luego para el ajuste fino supervisado. La innovación de esta fase radica en su capacidad para combinar múltiples señales de calidad para garantizar salidas de alto nivel. + +### Fase de RL diverso (Alineación amplia) + +![Fase de RL diverso](https://huggingface.co/reasoning-course/images/resolve/main/grpo/8.png) + +La fase final de RL diverso aborda múltiples tipos de tareas mediante un enfoque híbrido sofisticado. Para tareas deterministas, emplea recompensas basadas en reglas, mientras que las tareas subjetivas se evalúan mediante retroalimentación de LLMs. Esta fase tiene como objetivo lograr la alineación con las preferencias humanas a través de su enfoque de recompensa híbrido innovador, combinando la precisión de los sistemas basados en reglas con la flexibilidad de la evaluación de modelos de lenguaje. + +## El algoritmo: Group Relative Policy Optimization (GRPO) + +Ahora que tenemos una buena comprensión del proceso de entrenamiento, veamos el algoritmo que se utilizó para entrenar el modelo. + +Los autores describen GRPO como un gran avance en el ajuste fino de modelos: + +![Proceso de GRPO](https://huggingface.co/reasoning-course/images/resolve/main/grpo/10.png) + +La novedad de GRPO radica en su capacidad para "optimizar directamente para la rectificación de preferencias". Esto significa una vía más directa y eficiente para alinear el modelo con las salidas deseadas, en contraste con los algoritmos tradicionales de aprendizaje por refuerzo como PPO. Desglosemos cómo funciona GRPO a través de sus tres componentes principales. + +### Formación de grupos: Creación de múltiples soluciones + +El primer paso en GRPO es notablemente intuitivo: es similar a cómo un estudiante podría resolver un problema difícil probando múltiples enfoques. Ante un prompt, el modelo no solo genera una respuesta; en su lugar, crea múltiples intentos para resolver el mismo problema (generalmente 4, 8 o 16 intentos diferentes). + +Imagina que le estás enseñando a un modelo a resolver problemas matemáticos. Para una pregunta sobre el conteo de pollos en una granja, el modelo podría generar varias soluciones diferentes: +- Una solución podría desglosar el problema paso a paso: primero contando el total de pollos, luego restando los gallos y finalmente contabilizando las gallinas que no ponen huevos +- Otra podría utilizar un enfoque diferente pero igualmente válido +- Algunos intentos pueden contener errores o soluciones menos eficientes + +Todos estos intentos se mantienen juntos como un grupo, de manera similar a tener las soluciones de varios estudiantes para comparar y aprender de ellas. + +![Formación de grupos](https://huggingface.co/reasoning-course/images/resolve/main/grpo/11.jpg) + +### Aprendizaje de preferencias: Comprender qué hace que una solución sea buena + +Aquí es donde GRPO realmente destaca por su simplicidad. A diferencia de otros métodos para RLHF que siempre requieren un modelo de recompensa independiente para predecir qué tan buena puede ser una solución, GRPO puede utilizar cualquier función o modelo para evaluar la calidad de una solución. Por ejemplo, podríamos usar una función de longitud para recompensar respuestas más cortas o un solucionador matemático para recompensar soluciones matemáticas precisas. + +El proceso de evaluación analiza varios aspectos de cada solución: +- ¿Es correcta la respuesta final? +- ¿Siguió la solución el formato adecuado (como usar las etiquetas XML correctas)? +- ¿Coincide el razonamiento con la respuesta proporcionada? + +Lo que hace que este enfoque sea particularmente ingenioso es cómo maneja la puntuación. En lugar de dar únicamente puntuaciones absolutas, GRPO normaliza las recompensas dentro de cada grupo. Utiliza una fórmula simple pero eficaz para la estimación de la ventaja relativa del grupo: + +``` +Ventaja = (recompensa - media(recompensas_del_grupo)) / desv_est(recompensas_del_grupo) +``` + +![Aprendizaje de preferencias](https://huggingface.co/reasoning-course/images/resolve/main/grpo/12.jpg) + +Esta normalización es como calificar según una curva estadística, pero para IA. Ayuda al modelo a comprender qué soluciones dentro del grupo fueron mejores o peores en comparación con sus pares, en lugar de limitarse a observar puntuaciones absolutas. + +### Optimización: Aprender de la experiencia + +El paso final es donde GRPO le enseña al modelo a mejorar en función de lo que aprendió al evaluar el grupo de soluciones. Este proceso es tanto potente como estable, y utiliza dos principios principales: + +1. Anima al modelo a producir más soluciones similares a las exitosas mientras se aleja de los enfoques menos efectivos +2. Incluye un mecanismo de seguridad (denominado penalización por divergencia KL) que evita que el modelo cambie de manera demasiado drástica de una sola vez + +Este enfoque resulta más estable que los métodos tradicionales porque: +- Analiza múltiples soluciones juntas en lugar de comparar solo dos a la vez +- La normalización basada en grupos ayuda a prevenir problemas con el escalado de recompensas +- La penalización KL actúa como una red de seguridad, asegurando que el modelo no olvide lo que ya sabe mientras aprende cosas nuevas + +> [!TIP] +> Las innovaciones clave de GRPO son: +> - Aprender directamente de cualquier función o modelo, eliminando la dependencia de un modelo de recompensa independiente. +> - Aprendizaje basado en grupos, que es más estable y eficiente que los métodos tradicionales como las comparaciones por pares. + +Este desglose es complejo, pero la conclusión clave es que GRPO es una forma más eficiente y estable de entrenar un modelo para que razone. + +### Algoritmo GRPO en pseudocódigo + +Ahora que comprendemos los componentes clave de GRPO, veamos el algoritmo en pseudocódigo. Esta es una versión simplificada del algoritmo, pero captura las ideas clave: + +``` +Entrada: +- initial_policy: Modelo inicial a entrenar +- reward_function: Función que evalúa las salidas +- training_prompts: Conjunto de ejemplos de entrenamiento +- group_size: Número de salidas por prompt (típicamente 4-16) + +Algoritmo GRPO: +1. Para cada iteración de entrenamiento: + a. Establecer reference_policy = initial_policy (instantánea de la política actual) + b. Para cada prompt en el lote: + i. Generar group_size salidas diferentes utilizando initial_policy + ii. Calcular las recompensas para cada salida utilizando reward_function + iii. Normalizar las recompensas dentro del grupo: + normalized_advantage = (reward - mean(rewards)) / std(rewards) + iv. Actualizar la política maximizando la razón recortada (clipped ratio): + min(prob_ratio * normalized_advantage, + clip(prob_ratio, 1-epsilon, 1+epsilon) * normalized_advantage) + - kl_weight * KL(initial_policy || reference_policy) + + donde prob_ratio es current_prob / reference_prob + +Salida: Modelo de política optimizado +``` + +Este algoritmo muestra cómo GRPO combina la estimación de ventajas basada en grupos con la optimización de políticas manteniendo la estabilidad mediante recorte y restricciones de divergencia KL. + +## Resultados e impacto + +Ahora que hemos explorado el algoritmo, veamos los resultados. DeepSeek R1 logra un rendimiento de vanguardia en múltiples dominios: + +| Dominio | Resultados clave | +|---------|------------------| +| Matemáticas | • 79.8% en AIME 2024
• 97.3% en MATH-500 | +| Programación | • Clasificación Codeforces: 2029
• LiveCodeBench: 65.9% | +| Conocimiento general | • MMLU: 90.8%
• GPQA Diamond: 71.5% | +| Tareas del lenguaje | • AlpacaEval 2.0: 87.6% de tasa de victoria
• FRAMES: 82.5% | + +El impacto práctico del modelo se extiende más allá de los puntos de referencia gracias a los precios rentables de su API ($0,14 por millón de tokens de entrada) y la destilación exitosa del modelo en varios tamaños (desde 1.5B hasta 70B de parámetros). En particular, incluso el modelo de 7B alcanza el 55.5% en AIME 2024, mientras que la versión destilada de 70B se acerca al rendimiento de o1-mini en MATH-500 (94.5%), demostrando una preservación efectiva de la capacidad a diferentes escalas. + +## Limitaciones y desafíos de GRPO + +Si bien GRPO representa un avance significativo en el aprendizaje por refuerzo para modelos de lenguaje, es importante comprender sus limitaciones y desafíos: + +- **Costo de generación**: Generar múltiples terminaciones (4-16) para cada prompt aumenta los requisitos computacionales en comparación con los métodos que generan solo una o dos terminaciones. +- **Restricciones del tamaño de lote**: La necesidad de procesar grupos de terminaciones juntos puede limitar los tamaños de lote efectivos, agregando complejidad al proceso de entrenamiento y potencialmente ralentizándolo. +- **Diseño de la función de recompensa**: La calidad del entrenamiento depende en gran medida de funciones de recompensa bien diseñadas. Recompensas mal diseñadas pueden provocar comportamientos no deseados u optimización para objetivos incorrectos. +- **Compromisos del tamaño de grupo**: Elegir el tamaño de grupo óptimo implica equilibrar la diversidad de soluciones frente al costo computacional. Muy pocas muestras pueden no proporcionar suficiente diversidad, mientras que demasiadas aumentan el tiempo de entrenamiento y los requisitos de recursos. +- **Ajuste de la divergencia KL**: Encontrar el equilibrio adecuado para la penalización por divergencia KL requiere un ajuste cuidadoso: si es demasiado alta, el modelo no aprenderá eficazmente; si es demasiado baja, puede divergir demasiado de sus capacidades iniciales. + +## Conclusión + +El artículo de DeepSeek R1 representa un hito importante en el desarrollo de modelos de lenguaje. El algoritmo Group Relative Policy Optimization (GRPO) ha demostrado que el aprendizaje por refuerzo puro puede efectivamente desarrollar sólidas capacidades de razonamiento, desafiando suposiciones previas sobre la necesidad del ajuste fino supervisado. + +Quizás lo más importante es que DeepSeek R1 ha demostrado que es posible equilibrar el alto rendimiento con consideraciones prácticas como la rentabilidad y la accesibilidad. La exitosa destilación de las capacidades del modelo en diferentes tamaños, de 1.5B a 70B de parámetros, muestra un camino a seguir para que las capacidades avanzadas de IA estén más ampliamente disponibles. + +--- + +En la siguiente sección, exploraremos implementaciones prácticas de estos conceptos, centrándonos en cómo aprovechar GRPO en tus propios proyectos de desarrollo de modelos de lenguaje. + +## Cuestionario + +### 1. ¿Cuál es la principal innovación del artículo de DeepSeek R1? + + + +### 2. ¿Cuáles son las cuatro fases del proceso de entrenamiento de DeepSeek R1? + + + +### 3. ¿Qué es el fenómeno del «momento ¡Ajá!» en el entrenamiento de R1-Zero? + + + +### 4. ¿Cómo funciona la formación de grupos de GRPO? + + + +### 5. ¿Cuál es la diferencia clave entre DeepSeek-R1-Zero y DeepSeek-R1? + + diff --git a/chapters/es/chapter12/3b.mdx b/chapters/es/chapter12/3b.mdx new file mode 100644 index 000000000..928c36261 --- /dev/null +++ b/chapters/es/chapter12/3b.mdx @@ -0,0 +1,415 @@ +# Comprensión avanzada de Group Relative Policy Optimization (GRPO) en DeepSeekMath[[comprension-avanzada-de-grpo-en-deepseekmath]] + +> [!TIP] +> Esta sección profundiza en los detalles técnicos y matemáticos de GRPO. Fue redactada por Shirin Yamani. + +Profundicemos en nuestra comprensión de GRPO para que podamos mejorar el proceso de entrenamiento de nuestro modelo. + +GRPO evalúa directamente las respuestas generadas por el modelo comparándolas dentro de grupos de generación para optimizar el modelo de política, en lugar de entrenar un modelo de valor independiente (Crítico / *Critic*). ¡Este enfoque conduce a una reducción significativa en el costo computacional! + +GRPO se puede aplicar a cualquier tarea verificable donde se pueda determinar la corrección de la respuesta. Por ejemplo, en el razonamiento matemático, la corrección de la respuesta se puede verificar fácilmente comparándola con el valor real (*ground truth*). + +Antes de sumergirnos en los detalles técnicos, visualicemos cómo funciona GRPO a alto nivel: + +![deep](https://huggingface.co/reasoning-course/images/resolve/main/grpo/16.png) + +Ahora que tenemos una descripción visual, desglosemos cómo funciona GRPO paso a paso. + +## El algoritmo GRPO + +La innovación central de GRPO es su enfoque para evaluar y aprender de múltiples respuestas generadas simultáneamente. En lugar de depender de un modelo de recompensa independiente, compara las respuestas dentro del mismo grupo para determinar cuáles deben reforzarse. + +Repasemos cada paso del algoritmo en detalle: + +### Paso 1: Muestreo de grupos (*Group Sampling*) + +El primer paso es generar múltiples respuestas posibles para cada pregunta. Esto crea un conjunto diverso de salidas que se pueden comparar entre sí. + +Para cada pregunta \\( q \\), el modelo generará \\( G \\) salidas (tamaño del grupo) a partir de la política entrenada: { \\( {o_1, o_2, o_3, \dots, o_G}\sim\pi_{\theta_{\text{old}}} \\) }, \\( G=8 \\) donde cada \\( o_i \\) representa una terminación del modelo. + +#### Ejemplo + +Para concretar esto, veamos un problema aritmético simple: + +**Pregunta** + +\\( q \\) : \\( \text{Calcular}\space2 + 2 \times 6 \\) + +**Salidas** + +\\( (G = 8) \\): \\( \{o_1:14 \text{ (correcta)}, o_2:16 \text{ (incorrecta)}, o_3:10 \text{ (incorrecta)}, \ldots, o_8:14 \text{ (correcta)}\} \\) + +Observa cómo algunas de las respuestas generadas son correctas (14) mientras que otras son incorrectas (16 o 10). Esta diversidad es crucial para el siguiente paso. + +### Paso 2: Cálculo de la ventaja (*Advantage Calculation*) + +Una vez que tenemos múltiples respuestas, necesitamos una forma de determinar cuáles son mejores que otras. Aquí es donde entra el cálculo de la ventaja (*advantage*). + +#### Distribución de recompensas + +Primero, asignamos una puntuación de recompensa a cada respuesta generada. En este ejemplo, usaremos un modelo de recompensa, pero como aprendimos en la sección anterior, podemos usar cualquier función que devuelva recompensas. + +Asignamos una puntuación RM a cada una de las respuestas generadas en función de la corrección \\( r_i \\) *(por ejemplo, 1 para respuesta correcta, 0 para respuesta incorrecta)* y luego, para cada \\( r_i \\), calculamos el siguiente valor de ventaja (*Advantage*). + +#### Fórmula del valor de ventaja + +La idea clave de GRPO es que no necesitamos medidas absolutas de calidad: podemos comparar las salidas dentro del mismo grupo. Esto se hace mediante estandarización: + +$$A_i = \frac{r_i - \text{media}(\{r_1, r_2, \ldots, r_G\})}{\text{desv\_est}(\{r_1, r_2, \ldots, r_G\})}$$ + +#### Ejemplo + +Continuando con nuestro ejemplo aritmético anterior, imagina que tenemos 8 respuestas, 4 de las cuales son correctas y el resto incorrectas, por lo tanto: + +| Métrica | Valor | +|---------|-------| +| Promedio del grupo | \\( mean(r_i) = 0.5 \\) | +| Desviación estándar | \\( std(r_i) = 0.53 \\) | +| Valor de ventaja (Respuesta correcta) | \\( A_i = \frac{1 - 0.5}{0.53}= 0.94 \\) | +| Valor de ventaja (Respuesta incorrecta) | \\( A_i = \frac{0 - 0.5}{0.53}= -0.94 \\) | + +#### Interpretación + +Ahora que hemos calculado los valores de ventaja, comprendamos qué significan: + +Esta estandarización (es decir, la ponderación \\( A_i \\)) permite al modelo evaluar el rendimiento relativo de cada respuesta, guiando el proceso de optimización hacia respuestas favorables que son mejores que el promedio (alta recompensa) y desalentando aquellas que son peores. Por ejemplo, si \\( A_i > 0 \\), entonces \\( o_i \\) es una respuesta mejor que el nivel promedio dentro de su grupo; y si \\( A_i < 0 \\), entonces la calidad de la respuesta es inferior al promedio (es decir, calidad/rendimiento deficiente). + +Para el ejemplo anterior, si \\( A_i = 0.94 \text{ (salida correcta)} \\), entonces durante los pasos de optimización se incrementará su probabilidad de generación. + +Con nuestros valores de ventaja calculados, ya estamos listos para actualizar la política. + +### Paso 3: Actualización de la política (*Policy Update*) + +El paso final es usar estos valores de ventaja para actualizar nuestro modelo de modo que sea más probable que genere buenas respuestas en el futuro. + +La función objetivo para la actualización de la política es: + +$$J_{GRPO}(\theta) = \left[\frac{1}{G} \sum_{i=1}^{G} \min \left( \frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)} A_i, \text{clip}\left( \frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}, 1 - \epsilon, 1 + \epsilon \right) A_i \right)\right]- \beta D_{KL}(\pi_{\theta} \| \pi_{ref})$$ + +Esta fórmula puede parecer intimidante al principio, pero está construida a partir de varios componentes que cumplen un propósito importante. Desglosémoslos uno por uno. + +## Componentes clave de la función objetivo + +La función de actualización de GRPO combina varias técnicas para garantizar un aprendizaje estable y eficaz. Examinemos cada componente: + +### 1. Razón de probabilidad (*Probability Ratio*) + +La razón de probabilidad se define como: + +\\( \left(\frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}\right) \\) + +Intuitivamente, la fórmula compara cuánto difiere la probabilidad de respuesta del nuevo modelo de la probabilidad de respuesta del modelo anterior, incorporando al mismo tiempo una preferencia por las respuestas que mejoran el resultado esperado. + +#### Interpretación + +- Si \\( \text{razón} > 1 \\), el nuevo modelo asigna una mayor probabilidad a la respuesta \\( o_i \\) que el modelo anterior. +- Si \\( \text{razón} < 1 \\), el nuevo modelo asigna una menor probabilidad a \\( o_i \\) + +Esta razón nos permite controlar cuánto cambia el modelo en cada paso, lo que nos lleva al siguiente componente. + +### 2. Función de recorte (*Clip Function*) + +La función de recorte se define como: + +\\( \text{clip}\left( \frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}, 1 - \epsilon, 1 + \epsilon\right) \\) + +Limita la razón discutida anteriormente para que esté dentro de \\( [1 - \epsilon, 1 + \epsilon] \\) con el fin de evitar o controlar cambios drásticos o actualizaciones excesivas y alejarse demasiado de la política anterior. En otras palabras, limita cuánto puede aumentar la razón de probabilidad para ayudar a mantener la estabilidad al evitar actualizaciones que empujen al nuevo modelo demasiado lejos del anterior. + +#### Ejemplo (ε = 0.2) + +Veamos dos escenarios diferentes para comprender mejor esta función de recorte: + +- **Caso 1**: si la nueva política tiene una probabilidad de 0.9 para una respuesta específica y la política anterior tiene una probabilidad de 0.5, significa que esta respuesta está siendo reforzada por la nueva política para tener una mayor probabilidad, pero dentro de un límite controlado que es el recorte para moderar su magnitud. + - \\( \text{Razón}: \frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)} = \frac{0.9}{0.5} = 1.8 → \text{Recorte a}\space1.2 \\) (límite superior 1.2) +- **Caso 2**: Si la nueva política no está a favor de una respuesta (menor probabilidad, por ejemplo, 0.2), lo que significa que si la respuesta no es beneficiosa el aumento podría ser incorrecto, y el modelo sería penalizado. + - \\( \text{Razón}: \frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)} = \frac{0.2}{0.5} = 0.4 → \text{Recorte a}\space0.8 \\) (límite inferior 0.8) + +#### Interpretación + +- La fórmula anima al nuevo modelo a favorecer respuestas que el modelo anterior subestimaba **si mejoran el resultado**. +- Si el modelo anterior ya favorecía una respuesta con alta probabilidad, el nuevo modelo aún puede reforzarla **pero solo dentro de un límite controlado \\( [1 - \epsilon, 1 + \epsilon] \\), \\( \text{(por ejemplo, }\epsilon = 0.2, \space \text{es decir, } \space [0.8-1.2]) \\)**. +- Si el modelo anterior sobrestimó una respuesta que rinde mal, se **desalienta** al nuevo modelo de mantener esa alta probabilidad. +- Por lo tanto, intuitivamente, al incorporar la razón de probabilidad, la función objetivo asegura que las actualizaciones a la política sean proporcionales a la ventaja \\( A_i \\) al tiempo que se moderan para evitar cambios drásticos. + +Si bien la función de recorte ayuda a prevenir cambios drásticos, necesitamos una salvaguarda más para garantizar que nuestro modelo no se desvíe demasiado de su comportamiento original. + +### 3. Divergencia KL (*KL Divergence*) + +El término de divergencia KL es: + +\\( \beta D_{KL}(\pi_{\theta} \| \pi_{ref}) \\) + +En el término de divergencia KL, \\( \pi_{ref} \\) es básicamente la salida del modelo previa a la actualización, `per_token_logps`, y \\( \pi_{\theta} \\) es la salida del nuevo modelo, `new_per_token_logps`. Teóricamente, la divergencia KL se minimiza para evitar que el modelo se desvíe demasiado de su comportamiento original durante la optimización. Esto ayuda a lograr un equilibrio entre mejorar el rendimiento en función de la señal de recompensa y mantener la coherencia. En este contexto, minimizar la divergencia KL reduce el riesgo de que el modelo genere texto sin sentido o, en el caso del razonamiento matemático, produzca respuestas extremadamente incorrectas. + +#### Interpretación + +- Una penalización por divergencia KL mantiene las salidas del modelo cerca de su distribución original, evitando cambios extremos. +- En lugar de derivar hacia salidas completamente irracionales, el modelo refina su comprensión permitiendo cierta exploración. + +#### Definición matemática + +Para aquellos interesados en los detalles matemáticos, veamos la definición formal: + +Recordemos que la distancia KL se define de la siguiente manera: +$$D_{KL}(P \| Q) = \sum_{x \in X} P(x) \log \frac{P(x)}{Q(x)}$$ +En RLHF, las dos distribuciones de interés son a menudo la distribución de la nueva versión del modelo, P(x), y la distribución de la política de referencia, Q(x). + +#### El papel del parámetro β + +El coeficiente \\( \beta \\) controla con qué fuerza aplicamos la restricción de divergencia KL: + +- **Mayor β (Penalización KL más fuerte)** + - Mayor restricción en las actualizaciones de la política. El modelo se mantiene cercano a su distribución de referencia. + - Puede ralentizar la adaptación: El modelo puede tener dificultades para explorar mejores respuestas. +- **Menor β (Penalización KL más débil)** + - Mayor libertad para actualizar la política: El modelo puede desviarse más de la referencia. + - Adaptación más rápida pero riesgo de inestabilidad: El modelo podría aprender comportamientos de piratería de recompensas (*reward-hacking*). + - Riesgo de sobreoptimización: Si el modelo de recompensa es defectuoso, la política podría generar salidas sin sentido. +- El artículo original de [DeepSeekMath](https://arxiv.org/abs/2402.03300) estableció \\( \beta = 0.04 \\). + +Ahora que comprendemos los componentes de GRPO, veamos cómo funcionan juntos en un ejemplo completo. + +## Ejemplo resuelto con GRPO + +Para consolidar nuestra comprensión de GRPO, repasemos un ejemplo completo de principio a fin. + +### Problema de ejemplo + +$$\text{P: Calcular}\space2 + 2 \times 6$$ + +### Paso 1: Muestreo de grupos + +Primero, generamos múltiples respuestas a partir de nuestro modelo. + +Generamos \\( (G = 8) \\) respuestas, \\( 4 \\) de las cuales son la respuesta correcta (\\( 14, \text{recompensa=} 1 \\)) y \\( 4 \\) incorrectas \\( \text{(recompensa= 0)} \\). Por lo tanto: + +$${o_1:14 \text{ (correcta)}, o_2:10 \text{ (incorrecta)}, o_3:16 \text{ (incorrecta)}, \dots, o_G:14 \text{ (correcta)}}$$ + +### Paso 2: Cálculo de la ventaja + +A continuación, calculamos los valores de ventaja para determinar qué respuestas son mejores que el promedio: + +| Estadística | Valor | +|-------------|-------| +| Promedio del grupo | \\( mean(r_i) = 0.5 \\) | +| Desviación estándar | \\( std(r_i) = 0.53 \\) | +| Valor de ventaja (Respuesta correcta) | \\( A_i = \frac{1 - 0.5}{0.53}= 0.94 \\) | +| Valor de ventaja (Respuesta incorrecta) | \\( A_i = \frac{0 - 0.5}{0.53}= -0.94 \\) | + +### Paso 3: Actualización de la política + +Finalmente, actualizamos nuestro modelo para reforzar las respuestas correctas: + +- Suponiendo que la probabilidad de la política anterior (\\( \pi_{\theta_{old}} \\)) para una salida correcta \\( o_1 \\) sea \\( 0.5 \\) y la nueva política la aumente a \\( 0.7 \\), entonces: +$$\text{Razón}: \frac{0.7}{0.5} = 1.4 → \text{tras Recorte}\space1.2 \space (\epsilon = 0.2)$$ +- Luego, cuando se repondera la función objetivo, el modelo tiende a reforzar la generación de la salida correcta, y la \\( \text{Divergencia KL} \\) limita la desviación de la política de referencia. + +Con la comprensión teórica consolidada, veamos cómo se puede implementar GRPO en código. + +## Ejemplo de implementación + +Unamos todo en un ejemplo práctico. El siguiente código demuestra cómo implementar GRPO en PyTorch: + +### 1. Cargar el modelo y generar respuestas + +Primero, debemos cargar un modelo y generar múltiples respuestas para una pregunta determinada: + +```python +import torch +import torch.nn.functional as F +from transformers import AutoModelForCausalLM, AutoTokenizer + +# Cargar el modelo y tokenizador +model_name = "Qwen/Qwen2-Math-1.5B" +model = AutoModelForCausalLM.from_pretrained(model_name) +tokenizer = AutoTokenizer.from_pretrained(model_name) +model.eval() + +# Mover el modelo a GPU si está disponible +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") +model.to(device) + +# Prompt de entrada +prompt = "Solve y = 2x + 1 for x = 2, y = " # Respuesta correcta: 5 +inputs = tokenizer(prompt, return_tensors="pt", padding=True) +input_ids = inputs["input_ids"].to(device) # Forma: (1, prompt_len) +attention_mask = inputs["attention_mask"].to(device) + +# Paso 1: Generar 8 respuestas (B = 2 grupos, G = 4 respuestas por grupo) +batch_size, num_generations = 2, 4 +outputs = model.generate( + input_ids=input_ids, # Forma: (1, prompt_len) + attention_mask=attention_mask, + max_new_tokens=1, # seq_len = 1 (un solo token por respuesta) + num_return_sequences=batch_size * num_generations, # 8 respuestas en total + do_sample=True, + top_k=10, + temperature=0.7, + pad_token_id=tokenizer.eos_token_id, + return_dict_in_generate=True, + output_scores=True, +) +``` + +Esta generación inicial (antes de cualquier paso) producirá algo como esto: + +```text +Output 1: 5.0 +Output 2: 6.0 +Output 3: 7.0 +Output 4: 5.0 +Output 5: 10.0 +Output 6: 2.0 +Output 7: 5.0 +Output 8: 5.0 +``` + +### 2. Calcular recompensas + +Ahora debemos determinar qué respuestas son correctas y asignar recompensas en consecuencia: + +Con GRPO, a partir del mismo prompt de muestra generamos múltiples terminaciones. Así, por ejemplo, para nuestros prompts `"Solve y = 2x + 1 for x = 2, y = "` y `"Solve y = 2x + 1 for x = 4, y = "` tenemos dos grupos de salidas generadas para el prompt dado: uno es, por ejemplo: +- `[5, 6, 7, 5]` y el otro es +- `[10, 2, 9, 9]`, mientras que las respuestas correctas son 5 y 9. + +Ten en cuenta que, en la práctica, estas puntuaciones de recompensa se obtienen mediante una función de recompensa basada en reglas que asigna recompensas según la corrección de la respuesta, o un modelo más complejo basado en redes neuronales entrenado para asignar recompensas según la corrección de la respuesta, o una combinación de ambos. Pero por simplicidad digamos que nuestra recompensa por respuesta es 1 si la respuesta es correcta y 0 si es incorrecta; por lo tanto: + +```python +reward_1 = [1, 0, 0, 1] +reward_2 = [0, 0, 1, 1] +``` + +A continuación obtenemos la media y desviación estándar de las recompensas por grupo: + +```python +# Forma: (B * G,) = (8,) porque tenemos 2 grupos de 4 generaciones que aplanamos +rewards = torch.tensor([1, 0, 0, 1, 0, 0, 1, 1], dtype=torch.float32) +num_generations = 4 + +# Recompensas agrupadas: Forma (B, G) = (2, 4) +rewards_grouped = rewards.view(-1, num_generations) + +# Media por grupo: Forma (B,) = (2,) +mean_grouped_rewards = rewards_grouped.mean(dim=1) + +# Desv. est. por grupo: Forma (B,) = (2,) +std_grouped_rewards = rewards_grouped.std(dim=1) + +# Difundir (broadcast) para coincidir con rewards y normalizar: Forma (B * G,) = (8,) +# ¿Por qué necesitamos difundir? Porque necesitamos calcular los valores de ventaja para cada respuesta dentro del grupo +mean_grouped_rewards = mean_grouped_rewards.repeat_interleave(num_generations, dim=0) +std_grouped_rewards = std_grouped_rewards.repeat_interleave(num_generations, dim=0) +``` + +Esto generará: + +```text +Grouped Rewards: tensor([[1., 0., 0., 1.], + [0., 0., 1., 1.]]) +Mean per group: tensor([0.5000, 0.5000]) +Std per group: tensor([0.5774, 0.5774]) +Broadcasted Mean: tensor([0.5000, 0.5000, 0.5000, 0.5000, 0.5000, 0.5000, 0.5000, 0.5000]) +Broadcasted Std: tensor([0.5774, 0.5774, 0.5774, 0.5774, 0.5774, 0.5774, 0.5774, 0.5774]) +``` + +Ahora podemos calcular los valores de ventaja para cada respuesta: + +```python +# Ventajas: Forma (B * G,) = (8,) +advantages = (rewards - mean_grouped_rewards) / (std_grouped_rewards + 1e-8) +``` + +Esto generará: + +```text +Advantages: tensor([ 0.8659, -0.8660, -0.8660, 0.8659, -0.8660, -0.8660, 0.8659, 0.8659]) +``` + +Lo cual proviene de la fórmula de ventaja anterior: + +```text +Para reward_1 = [1, 0, 0, 1]: +1 - 0.5 / 0.5774 ≈ 0.8659 +0 - 0.5 / 0.5774 ≈ -0.8660 +Para reward_2 = [0, 0, 1, 1]: Mismo patrón. +``` + +Sin embargo, la forma aquí es `(B*G,) = (8,)`, pero en la práctica necesitamos tener la forma `(B, G) = (2, 4)` para coincidir con la forma de los logits, ¿verdad? Por lo tanto, necesitamos expandir dimensiones (`unsqueeze`) en el tensor de ventajas para tener la forma `(B*G, 1) = (8, 1)` y coincidir con la forma de los logits. + +```python +# Forma (B * G, 1) = (8, 1) para coincidir con la forma de logits +advantages = advantages.unsqueeze(1) +``` + +Lo que producirá: + +```text +Advantages: tensor([[ 0.8659], + [-0.8660], + [-0.8660], + [ 0.8659], + [-0.8660], + [-0.8660], + [ 0.8659], + [ 0.8659]]) +``` + +Ahora que todo está listo, pasemos al siguiente paso: actualizar el modelo de política en función de los valores de ventaja. + +### 3. Actualizar la política +Por último, usamos los valores de ventaja para actualizar nuestro modelo: + +```python +# Calcular razón de probabilidad entre la política nueva y la antigua +ratio = torch.exp( + new_per_token_logps - per_token_logps +) # Forma: (B*G, seq_len) donde seq_len es la longitud de la salida, es decir, el número de tokens generados, por lo que aquí por simplicidad supongamos que es 1 # (8, 1) +``` + +Ten en cuenta que `per_token_logps` se puede obtener pasando las salidas generadas al modelo para obtener los logits y luego aplicando la función softmax para obtener las probabilidades `F.softmax(logits, dim=-1)`. + +```python +# Función de recorte +eps = self.cliprange # ej. 0.2 +pg_losses1 = -advantages * ratio # Forma: (B*G, seq_len) #(8, 1) +pg_losses2 = -advantages * torch.clamp( + ratio, 1.0 - eps, 1.0 + eps +) # Forma: (B*G, seq_len) #(8, 1) +pg_loss_max = torch.max(pg_losses1, pg_losses2) # Forma: (B*G, seq_len) #(8, 1) + + +# Ahora combinar con penalización KL # Forma: (B*G, seq_len) #(8, 1) +per_token_loss = pg_loss_max + self.beta * per_token_kl +``` + +`per_token_kl` también se puede calcular de la siguiente manera: + +```python +# Forma: (B*G, seq_len) #(8, 1) +per_token_kl = F.kl_div( + F.log_softmax(new_per_token_logps, dim=-1), + F.softmax(per_token_logps, dim=-1), + reduction="none", +).sum(dim=-1, keepdim=True) +``` + +Se puede encontrar un ejemplo completo [aquí](./basic_example.py). GRPO también está implementado por el excelente equipo de TRL; puedes consultar la implementación [TRL/GRPO_trainer](https://github.com/huggingface/trl/blob/main/trl/trainer/grpo_trainer.py) para obtener más detalles. + +## Resumen y próximos pasos + +¡Felicitaciones! Has aprendido sobre Group Relative Policy Optimization (GRPO). Para recapitular lo que hemos cubierto: + +1. GRPO compara múltiples salidas dentro de un grupo para determinar cuáles son mejores que otras, sin requerir un modelo de valor independiente. +2. El cálculo de la ventaja estandariza las recompensas para identificar qué respuestas están por encima o por debajo del promedio. +3. La actualización de la política utiliza una función objetivo recortada con una penalización por divergencia KL para garantizar un aprendizaje estable. + +Este enfoque es particularmente poderoso para tareas de razonamiento matemático, donde la corrección se puede verificar objetivamente. El método GRPO permite un entrenamiento más eficiente en comparación con los enfoques tradicionales de RLHF que requieren un modelo de crítico independiente. + +A medida que continúes explorando GRPO, considera experimentar con diferentes tamaños de grupo, funciones de recompensa y coeficientes de penalización KL para ver cómo afectan el rendimiento de tu modelo. + +¡Feliz entrenamiento! 🚀 + +## Referencias +1. [Libro de RLHF por Nathan Lambert](https://github.com/natolambert/rlhf-book) +2. [Informe técnico de DeepSeek-V3](https://huggingface.co/papers/2412.19437) +3. [DeepSeekMath](https://huggingface.co/papers/2402.03300) diff --git a/chapters/es/chapter12/img/1.png b/chapters/es/chapter12/img/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a53e8a1863920d2bb6a190bb13466a2f6435d150 GIT binary patch literal 58807 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 literal 0 HcmV?d00001 diff --git a/chapters/es/chapter12/img/2.jpg b/chapters/es/chapter12/img/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1fd22662f5aa0bf6162154312742aeea03d6d98 GIT binary patch literal 44339 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 literal 0 HcmV?d00001