Guía de entrenamiento de modelos 5: Guía de entrenamiento DPO
El núcleo de DPO (Optimización de Preferencias Directas) no es enseñar al modelo a "hablar", sino a "elegir".
Renderizando...
Desde que has completado PT (Inyección de Conocimiento) y SFT (Ajuste Supervisado), **DPO (Optimización Directa de Preferencias)** es tu última herramienta quirúrgica. Su función principal no es enseñar al modelo a "hablar", sino a **"elegir"**. En escenarios de IA conversacional, DPO se utiliza específicamente para eliminar las respuestas "correctas pero insustanciales" y obligar al modelo a elegir la respuesta más "humana" entre dos opciones.
## Preparación de datos para DPO
Este es el paso más crítico. El entrenamiento de DPO no requiere respuestas estándar, sino **pares de comparación "uno contra uno"**.
**Formato de datos:** Cada entrada de datos contiene tres partes:
1. **Prompt (Indicación):** La entrada del usuario.
2. **Chosen (Respuesta Elegida):** Una respuesta cálida, empática y coloquial.
3. **Rejected (Respuesta Rechazada):** Una respuesta mecánica, fría, con tono de servicio al cliente y que tiende a dar sermones.
**Ejemplo JSONL:**
```JSON
{
"prompt": "Me siento muy cansado, siento que estoy trabajando horas extras sin sentido todos los días.",
"chosen": "Te abrazo, ese cansancio abrumador es el que más te agota. Si puedes, no pienses en nada esta noche y descansa bien, ¿de acuerdo?",
"rejected": "Las horas extras son un fenómeno común en el lugar de trabajo moderno. Te sugiero que planifiques tu tiempo de manera razonable o que hables con tu supervisor sobre tu carga de trabajo. Mantener una actitud positiva ayuda a aliviar el estrés."
}
```
## Pasos operativos para dos esquemas
### 1. LLaMA-Factory
LLaMA-Factory tiene un soporte muy maduro para DPO, y se puede ejecutar con unas pocas líneas de configuración.
**Flujo de operación:**
1. **Registrar datos:** Configura tu conjunto de datos de preferencias en `dataset_info.json`.
2. **Escribir `dpo.yaml`:**
```YAML
stage: dpo # Especifica la etapa DPO
model_name_or_path: ./sft_output # Debe usar la ruta de tu modelo SFT
create_new_adapter: true # Agrega una capa LoRA sobre SFT
dataset: my_dpo_data
template: qwen
finetuning_type: lora # Hiperparámetro específico de DPO
pref_beta: 0.1 # Valor típico de Beta
dpo_ft_loss: sigmoid # Tipo de función de pérdida
learning_rate: 1e-6 # La tasa de aprendizaje de DPO debe ser un orden de magnitud menor que la de SFT
num_train_epochs: 2.0
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
```
3. **Comando de inicio:**
```Bash
llamafactory-cli train dpo.yaml
```
### 2. Escribir código tú mismo
La biblioteca `TRL` de HuggingFace proporciona `DPOTrainer`, que es adecuada para una personalización profunda.
**Fragmento de código principal:**
```Python
from trl import DPOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
# 1. Cargar el modelo SFT como modelo de política (Policy Model)
# 2. También se necesita un modelo de referencia (Reference Model), que suele ser una copia del mismo modelo, para calcular la divergencia KL y evitar que el modelo se desvíe
model = AutoModelForCausalLM.from_pretrained("./sft_model")
ref_model = AutoModelForCausalLM.from_pretrained("./sft_model")
dpo_trainer = DPOTrainer(
model,
ref_model=ref_model, # Modelo de referencia específico de DPO
beta=0.1, # Ajusta el entrenamiento
train_dataset=train_dataset,
tokenizer=tokenizer,
args=DPOConfig(
output_dir="./dpo_model",
per_device_train_batch_size=1,
learning_rate=1e-6,
remove_unused_columns=False # DPO necesita conservar los campos prompt/chosen/rejected
),
)
dpo_trainer.train()
```
## Problemas a tener en cuenta
1. **Debes hacer SFT antes de DPO:** Si tomas directamente el modelo original para DPO, el modelo generará una gran cantidad de código basura porque no ha aprendido el formato de diálogo.
2. **El misterio del parámetro Beta:** Cuanto mayor sea $\beta$, más "obediente" será el modelo, es decir, más propenso a la respuesta Elegida; pero si es demasiado grande, el modelo perderá diversidad e incluso repetirá. 0.1 es un buen punto de partida.
3. **Presión de la memoria:** El entrenamiento de DPO generalmente requiere cargar dos modelos simultáneamente (el modelo que se está optimizando y el modelo de referencia), y el consumo de memoria es casi el **doble** que el de SFT. Si no tienes suficiente memoria, asegúrate de activar `load_in_4bit=True` o usar LoRA.
4. **Evitar la degradación del modelo:** DPO puede hacer que el modelo se degrade en la capacidad de razonamiento lógico (como la aritmética). Si tu IA conversacional también necesita ayudar a los usuarios con los cálculos, recuerda mezclar algunos datos de alineación lógica genéricos en el conjunto de datos de DPO.
## Resumen
- **PT:** Resuelve el problema de "saber o no saber" (contexto empresarial, conocimiento profesional).
- **SFT:** Resuelve el problema de "entender o no las reglas" (formato de diálogo, configuración de la personalidad).
- **DPO:** Resuelve el problema de "sonido agradable o no" (percepción emocional, eliminación del sabor a IA).
**Con esto, se han presentado todas las tres herramientas principales para el entrenamiento del modelo.**Comentario
Inicia sesión para ver y publicar comentarios
Ir a iniciar sesión