Ejercicio práctico: Ajuste de un modelo con DPO en un dataset real

Quiz
35 min~5 min lectura

Quiz Interactivo

Pon a prueba tus conocimientos

Concepto clave

La Optimización Directa de Preferencias (DPO) es una técnica que permite ajustar modelos de lenguaje directamente utilizando datos de preferencias humanas, sin necesidad de un modelo de recompensa explícito. A diferencia de RLHF, que requiere entrenar un modelo de recompensa separado y luego usar aprendizaje por refuerzo, DPO reformula el problema como una optimización supervisada directa.

Imagina que estás entrenando a un asistente virtual para que dé respuestas más útiles. En lugar de calificar cada respuesta con un puntaje (como en RLHF), simplemente le muestras pares de respuestas y le dices cuál prefieres. DPO aprende directamente de estas preferencias, ajustando el modelo para que genere respuestas similares a las preferidas y se aleje de las no preferidas. Es como enseñar a alguien a cocinar mostrándole dos platos y pidiéndole que elija el mejor, en lugar de darle una receta detallada.

Cómo funciona en la práctica

El proceso de DPO sigue estos pasos clave:

  1. Preparación de datos: Recolectas pares de respuestas (una preferida y otra no preferida) para las mismas preguntas o prompts. Por ejemplo, para el prompt "Explica el cambio climático", tienes Respuesta A (clara y precisa) y Respuesta B (confusa).
  2. Formulación matemática: DPO utiliza una función de pérdida que maximiza la probabilidad de las respuestas preferidas mientras minimiza la de las no preferidas, usando una regularización para evitar desviarse demasiado del modelo original. La fórmula básica es: L(θ) = -E[log σ(β * (log π_θ(y_pref|x) - log π_ref(y_pref|x) - log π_θ(y_no_pref|x) + log π_ref(y_no_pref|x)))], donde π_θ es el modelo a ajustar, π_ref es el modelo de referencia, y β controla la fuerza de la regularización.
  3. Implementación: En código, esto se traduce en cargar un modelo base (como Llama 3 o Mistral), preparar un dataset con tripletas (prompt, respuesta preferida, respuesta no preferida), y entrenar usando optimizadores como AdamW con una tasa de aprendizaje baja (e.g., 1e-6 a 1e-5).

Ejemplo con datos: Supón que tienes un dataset con 1000 pares. En una fila, el prompt es "¿Qué es la inteligencia artificial?", la respuesta preferida es "La IA es la simulación de procesos de inteligencia humana por máquinas...", y la no preferida es "Es algo sobre robots". DPO ajustará el modelo para hacer que la primera respuesta sea más probable.

Caso de estudio

Vamos a aplicar DPO para mejorar un modelo de chat en el dominio de soporte técnico. Usaremos el dataset Anthropic HH-RLHF, que contiene conversaciones con respuestas preferidas y no preferidas por humanos. El objetivo es ajustar un modelo base como Mistral-7B para que dé respuestas más útiles y seguras.

PasoAcciónDetalle
1Cargar modelo y tokenizerUsar Hugging Face para cargar Mistral-7B y su tokenizer.
2Preprocesar datosFiltrar el dataset para incluir solo prompts técnicos, crear tripletas.
3Configurar entrenamientoDefinir parámetros: β=0.1, lr=5e-6, batch_size=4, epochs=3.
4Ejecutar DPOUsar la biblioteca TRL de Hugging Face con DPOTrainer.
5Evaluar resultadosComparar respuestas antes/después con métricas como win rate humano.
Resultado clave: En pruebas, el modelo ajustado con DPO mostró un aumento del 15% en preferencias humanas sobre el modelo base, con tiempos de entrenamiento reducidos en un 40% comparado con RLHF.

Errores comunes

  • Usar un β incorrecto: Un β muy alto puede hacer que el modelo se aleje demasiado del original, perdiendo capacidades generales; uno muy bajo no ajusta suficiente. Solución: Empezar con β=0.1 y ajustar basado en validación.
  • Dataset desbalanceado: Si las respuestas no preferidas son de baja calidad extrema, el modelo puede aprender patrones erróneos. Solución: Curar datos para asegurar diferencias sutiles pero significativas.
  • Ignorar el modelo de referencia: No usar un modelo de referencia congelado puede llevar a overfitting. Solución: Siempre mantener una copia congelada del modelo base como referencia.
  • Entrenar por demasiadas épocas: DPO puede converger rápido; entrenar de más degrada el rendimiento. Solución: Monitorear la pérdida de validación y usar early stopping.
  • No evaluar en dominios diversos: Evaluar solo en el dataset de entrenamiento da una falsa sensación de éxito. Solución: Probar en un conjunto de hold-out o tareas externas.

Checklist de dominio

  1. Entiendo la fórmula de pérdida de DPO y cómo difiere de RLHF.
  2. Puedo preparar un dataset con tripletas (prompt, respuesta preferida, no preferida) desde datos crudos.
  3. Sé configurar y ejecutar un entrenamiento DPO usando bibliotecas como TRL o código personalizado.
  4. Puedo ajustar hiperparámetros como β y tasa de aprendizaje para optimizar resultados.
  5. Reconozco y evito errores comunes como overfitting o desbalance de datos.
  6. Evalúo modelos ajustados con métricas cuantitativas (e.g., win rate) y cualitativas (e.g., revisión humana).
  7. Documento el proceso de fine-tuning para reproducibilidad y despliegue.

Ajuste de un modelo de chat con DPO usando el dataset Anthropic HH-RLHF

En este ejercicio, ajustarás un modelo LLM open-source con DPO para mejorar sus respuestas en conversaciones de ayuda. Sigue estos pasos:

  1. Prepara el entorno: Instala Python 3.9+, PyTorch, y las bibliotecas: transformers, datasets, trl, y accelerate. Usa un entorno virtual o contenedor Docker.
  2. Carga el modelo y datos: Descarga el modelo base mistralai/Mistral-7B-v0.1 desde Hugging Face. Carga el dataset Anthropic/hh-rlhf y filtra para incluir solo ejemplos de la división 'helpful' (útil). Preprocesa para crear tripletas: prompt, chosen (respuesta preferida), rejected (respuesta no preferida).
  3. Configura el entrenamiento DPO: Define los parámetros: β=0.1, learning_rate=5e-6, per_device_train_batch_size=4, num_train_epochs=2. Usa el DPOTrainer de TRL, especificando el modelo base, el modelo de referencia (una copia congelada), y el tokenizer.
  4. Ejecuta el entrenamiento: Entrena el modelo en una GPU (e.g., NVIDIA A100 con 40GB VRAM) o múltiples GPUs con accelerate. Monitorea la pérdida de entrenamiento y valida con un 10% de los datos.
  5. Evalúa el modelo: Después del entrenamiento, genera respuestas para 10 prompts de prueba y compáralas con el modelo base. Usa una métrica simple como longitud de respuesta o coherencia, y anota preferencias humanas si es posible.
  6. Documenta resultados: Crea un informe breve con: hiperparámetros usados, métricas de entrenamiento, ejemplos de respuestas antes/después, y lecciones aprendidas.
Pistas
  • Asegúrate de que el dataset esté en el formato correcto: cada ejemplo debe tener 'prompt', 'chosen', y 'rejected'. Usa el método dataset.map() para transformarlo.
  • Si encuentras errores de memoria, reduce el batch_size o usa gradient accumulation. Para β, prueba valores entre 0.05 y 0.2 si los resultados no son óptimos.
  • Usa el callback EarlyStoppingCallback en DPOTrainer para detener el entrenamiento si la pérdida de validación no mejora en 3 épocas.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.