

# Optimización de preferencias directas (DPO)
<a name="nova-dpo-smtj"></a>

## Descripción general
<a name="nova-dpo-smtj-overview"></a>

La optimización de preferencias directas (DPO) es una técnica de adaptación que refina los modelos fundacionales usando datos de comparación emparejados para adaptar los resultados del modelo a las preferencias humanas. A diferencia de los métodos de aprendizaje por refuerzo, la DPO optimiza directamente el comportamiento del modelo en función de la valoración humana sobre cuáles son las respuestas más deseables, ofreciendo un enfoque más estable y escalable.

**Por qué usar la DPO**

Los modelos fundacionales pueden generar resultados correctos desde el punto de vista fáctico, pero que no se ajustan a las necesidades específicas de los usuarios, los valores de las organizaciones o los requisitos de seguridad. La DPO aborda este problema permitiéndole lo siguiente:
+ Refubar los modelos en función de los patrones de comportamiento deseados.
+ Reducir los resultados no deseados o dañinos.
+ Adaptar las respuestas del modelo a la voz y a las pautas de comunicación de la marca.
+ Mejorar la calidad de la respuesta en función de los comentarios de los expertos del sector.
+ Implementar barreras de protección por medio de los patrones de respuesta preferidos.

**Cómo funciona la DPO**

La DPO utiliza ejemplos pareados en los que los evaluadores humanos indican cuál de las dos posibles respuestas es la preferida. El modelo aprende a maximizar la probabilidad de generar respuestas preferidas mientras minimiza las no deseadas.

**Cuándo utilizar la DPO**

Utilice la DPO en las situaciones siguientes:
+ Optimización para obtener resultados subjetivos que exigen una adaptación a preferencias humanas específicas.
+ Modificación del tono, el estilo o las características del contenido del modelo.
+ Realización de mejoras específicas en función de los comentarios de los usuarios y el análisis de errores.
+ Mantenimiento de una calidad de salida constante en diferentes casos de uso.
+ Entrenamiento con aprendizaje por refuerzo sin recompensas utilizando solo datos de preferencias.

## Modelos y técnicas compatibles
<a name="nova-dpo-smtj-models"></a>

La DPO admite el refinamiento de parámetros completos y LoRA (adaptación de rango bajo):


| Modelo | Entradas admitidas | Tipo de instancia | Recuento de instancia recomendado | Recuento de instancias permitido | 
| --- | --- | --- | --- | --- | 
| Amazon Nova Micro | Texto | ml.p5.48xlarge | 2 | 2, 4, 8 | 
| Amazon Nova Lite | Texto, imagen | ml.p5.48xlarge | 4 | 2, 4, 8, 16 | 
| Amazon Nova Pro | Texto, imagen | ml.p5.48xlarge | 6 | 6, 12, 24 | 

**Estrategias de entrenamiento**
+ **DPO de rango completo**: actualiza todos los parámetros del modelo. Puede llegar a ofrecer una mejor calidad de adaptación, pero requiere más recursos computacionales y produce modelos más grandes.
+ **DPO de LoRA**: utiliza adaptadores ligeros para un refinamiento eficiente de los parámetros. Ofrece un entrenamiento y una implementación más eficientes con modelos resultantes más pequeños que, a su vez, se adaptan a todos los requisitos.

Para la mayoría de los casos de uso, la estrategia LoRA proporciona una capacidad de adaptación suficiente con una eficiencia significativamente mejorada.

## Formato de los datos
<a name="nova-dpo-smtj-data"></a>

Los datos de entrenamiento de la DPO siguen el mismo formato que los del SFT, excepto que el último turno del asistente debe contener combinaciones de preferencias con etiquetas `preferred` y `non-preferred`.

### Estructura básica
<a name="nova-dpo-smtj-data-structure"></a>

El último turno del asistente usa una matriz de `candidates` en lugar de `content`:

```
{
  "role": "assistant",
  "candidates": [
    {
      "content": [
        {
          "text": "This is the preferred response."
        }
      ],
      "preferenceLabel": "preferred"
    },
    {
      "content": [
        {
          "text": "This is the non-preferred response."
        }
      ],
      "preferenceLabel": "non-preferred"
    }
  ]
}
```

### Ejemplo de texto completo
<a name="nova-dpo-smtj-data-text-example"></a>

```
{
  "schemaVersion": "bedrock-conversation-2024",
  "system": [
    {
      "text": "You are a helpful assistant."
    }
  ],
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "text": "What is the capital of France?"
        }
      ]
    },
    {
      "role": "assistant",
      "content": [
        {
          "text": "The capital of France is Paris."
        }
      ]
    },
    {
      "role": "user",
      "content": [
        {
          "text": "Tell me more about it."
        }
      ]
    },
    {
      "role": "assistant",
      "candidates": [
        {
          "content": [
            {
              "text": "Paris is the capital and largest city of France, known for the Eiffel Tower, world-class museums like the Louvre, and its rich cultural heritage."
            }
          ],
          "preferenceLabel": "preferred"
        },
        {
          "content": [
            {
              "text": "Paris is a city in France."
            }
          ],
          "preferenceLabel": "non-preferred"
        }
      ]
    }
  ]
}
```

### Ejemplo con imágenes
<a name="nova-dpo-smtj-data-image-example"></a>

```
{
  "schemaVersion": "bedrock-conversation-2024",
  "system": [
    {
      "text": "You are a helpful assistant."
    }
  ],
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "text": "Describe this image."
        },
        {
          "image": {
            "format": "jpeg",
            "source": {
              "s3Location": {
                "uri": "s3://your-bucket/your-path/image.jpg",
                "bucketOwner": "your-aws-account-id"
              }
            }
          }
        }
      ]
    },
    {
      "role": "assistant",
      "candidates": [
        {
          "content": [
            {
              "text": "The image shows a detailed description with relevant context and observations."
            }
          ],
          "preferenceLabel": "preferred"
        },
        {
          "content": [
            {
              "text": "This is a picture."
            }
          ],
          "preferenceLabel": "non-preferred"
        }
      ]
    }
  ]
}
```

### Requisitos de los conjuntos de datos
<a name="nova-dpo-smtj-data-requirements"></a>
+ **Formato**: archivo JSONL único para el entrenamiento, archivo JSONL único para la validación (opcional).
+ **Tamaño mínimo**: se recomiendan 1000 pares de preferencias para un entrenamiento efectivo.
+ **Calidad**: los datos de preferencias de alta calidad producen resultados más efectivos.
+ **Otras restricciones**: igual que el SFT. Para obtener más información, consulte Restricciones del conjunto de datos.

**Subir datos**

```
aws s3 cp /path/to/training-data/ s3://your-bucket/train/ --recursive
aws s3 cp /path/to/validation-data/ s3://your-bucket/val/ --recursive
```

## Configuración de fórmulas
<a name="nova-dpo-smtj-recipe"></a>

### Configuración general de ejecución
<a name="nova-dpo-smtj-recipe-run"></a>

```
run:
  name: "my-dpo-run"
  model_type: "amazon.nova-lite-v1:0:300k"
  model_name_or_path: "nova-lite/prod"
  replicas: 4
```


| Parámetro | Descripción | 
| --- | --- | 
| name | Nombre descriptivo para su trabajo de entrenamiento. | 
| model\$1type | Variante del modelo de Nova (no modificar) | 
| model\$1name\$1or\$1path | Ruta del modelo base (no modificar) | 
| replicas | Número de instancias de computación que se van a utilizar para el entrenamiento distribuido. | 

### Configuración de entrenamiento
<a name="nova-dpo-smtj-recipe-training"></a>

```
training_config:
  max_length: 16384
  global_batch_size: 32

  trainer:
    max_epochs: 3

  model:
    hidden_dropout: 0.0
    attention_dropout: 0.0
    ffn_dropout: 0.0
```


| Parámetro | Descripción | Range | 
| --- | --- | --- | 
| max\$1length | Longitud máxima de la secuencia en tokens | 1024–32768 | 
| global\$1batch\$1size | Muestras por paso del optimizador | Micro/Lite/Pro: 16, 32, 64, 128 Micro/Lite: 256 | 
| max\$1epochs | Ciclos de entrenamiento sobre el conjunto de datos | Mín.: 1 | 
| hidden\$1dropout | Desactivación aleatoria en los estados ocultos | 0,0-1,0 | 
| attention\$1dropout | Desactivación aleatoria en las ponderaciones de atención | 0,0-1,0 | 
| ffn\$1dropout | Desactivación aleatoria en las capas de propagación hacia delante | 0,0-1,0 | 

### Configuración del optimizador
<a name="nova-dpo-smtj-recipe-optimizer"></a>

```
model:
  optim:
    lr: 1e-5
    name: distributed_fused_adam
    adam_w_mode: true
    eps: 1e-08
    weight_decay: 0.0
    betas:
      - 0.9
      - 0.999
    sched:
      warmup_steps: 10
      constant_steps: 0
      min_lr: 1e-6
```


| Parámetro | Descripción | Range | 
| --- | --- | --- | 
| lr | Tasa de aprendizaje | 0-1 (normalmente de 1e-6 a 1e-4) | 
| weight\$1decay | Fuerza de regularización L2 | 0,0-1,0 | 
| warmup\$1steps | Pasos para aumentar gradualmente el ritmo de aprendizaje | 0–20 | 
| min\$1lr | Tasa mínima de aprendizaje al final de la degradación | 0-1 (debe ser < lr) | 

### Configuración específica de la DPO
<a name="nova-dpo-smtj-recipe-dpo"></a>

```
model:
  dpo_cfg:
    beta: 0.1
```


| Parámetro | Descripción | Range | 
| --- | --- | --- | 
| beta | Equilibrio entre el ajuste a los datos de entrenamiento y la proximidad al modelo original | 0,001–0,5 | 
+ **Beta superior (0,1)**: conserva mejor el comportamiento del modelo de referencia, pero puede aprender las preferencias más lentamente.
+ **Beta inferior (0,01-0,05)**: aprendizaje preferencial más agresivo, pero corre el riesgo de desviarse de la referencia.

**Recomendación**: comience con `beta: 0.1` y ajústelo a la baja si el aprendizaje preferencial le parece insuficiente.

### Configuración del PEFT LoRA
<a name="nova-dpo-smtj-recipe-lora"></a>

```
model:
  peft:
    peft_scheme: "lora"
    lora_tuning:
      loraplus_lr_ratio: 64.0
      alpha: 32
      adapter_dropout: 0.01
```


| Parámetro | Descripción | Valores permitidos | 
| --- | --- | --- | 
| peft\$1scheme | Método de refinamiento | "lora" o null (rango completo) | 
| alpha | Factor de escalado para ponderaciones de LoRA | 32, 64, 96, 128, 160, 192 | 
| loraplus\$1lr\$1ratio | Factor de escalado del ritmo de aprendizaje de LoRA\$1 | 0,0-100,0 | 
| adapter\$1dropout | Regularización de los parámetros de LoRA | 0,0-1,0 | 

## Inicio de un trabajo de entrenamiento
<a name="nova-dpo-smtj-start"></a>

**Imagen de contenedor**

```
708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-DPO-latest
```

**Código de ejemplo**

```
from sagemaker.pytorch import PyTorch
from sagemaker.inputs import TrainingInput

instance_type = "ml.p5.48xlarge"
instance_count = 4

image_uri = "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-DPO-latest"

recipe_overrides = {
    "training_config": {
        "trainer": {"max_epochs": 2},
        "model": {
            "dpo_cfg": {"beta": 0.1},
            "peft": {
                "peft_scheme": "lora",
                "lora_tuning": {
                    "loraplus_lr_ratio": 64.0,
                    "alpha": 32,
                    "adapter_dropout": 0.01,
                },
            },
        },
    },
}

estimator = PyTorch(
    output_path=f"s3://{bucket_name}/{job_name}",
    base_job_name=job_name,
    role=role,
    instance_count=instance_count,
    instance_type=instance_type,
    training_recipe="fine-tuning/nova/nova_lite_p5_gpu_lora_dpo",
    recipe_overrides=recipe_overrides,
    max_run=18000,
    sagemaker_session=sagemaker_session,
    image_uri=image_uri,
    disable_profiler=True,
    debugger_hook_config=False,
)

train_input = TrainingInput(
    s3_data=train_dataset_s3_path,
    distribution="FullyReplicated",
    s3_data_type="Converse",
)

val_input = TrainingInput(
    s3_data=val_dataset_s3_path,
    distribution="FullyReplicated",
    s3_data_type="Converse",
)

estimator.fit(inputs={"train": train_input, "validation": val_input}, wait=True)
```

## Implementación del modelo
<a name="nova-dpo-smtj-deploy"></a>

Una vez finalizado el entrenamiento, implemente el modelo personalizado en Amazon Bedrock mediante la función de importación de modelos personalizados. El modelo admite tanto el rendimiento aprovisionado como la inferencia bajo demanda. Los modelos entrenados con LoRA admiten la inferencia bajo demanda.

Para obtener instrucciones de implementación, consulte [Implementación de modelos personalizados](deploy-custom-model.md).

## Limitaciones
<a name="nova-dpo-smtj-limitations"></a>
+ **Modalidades de entrada**: la DPO solo acepta texto e imágenes. No se admite la entrada de video.
+ **Modalidad de salida**: solo texto.
+ **Pares de preferencias**: el turno final del asistente debe contener exactamente dos candidatos con etiquetas `preferred` y `non-preferred`.
+ **Límite de imágenes**: máximo 10 imágenes por bloque de contenido.
+ **Modalidades mixtas**: no se puede combinar texto, imagen y video en el mismo trabajo de entrenamiento.