

# Otimização direta de preferências (DPO)
<a name="nova-dpo-smtj"></a>

## Visão geral
<a name="nova-dpo-smtj-overview"></a>

A otimização direta de preferências (DPO) é uma técnica de alinhamento que ajusta modelos de base usando dados de comparação emparelhados para alinhar as saídas do modelo com as preferências humanas. Ao contrário dos métodos de aprendizado por reforço, a DPO otimiza diretamente o comportamento dos modelos com base no feedback humano sobre quais são as respostas mais desejáveis, oferecendo uma abordagem mais estável e escalável.

**Por que usar a DPO**

Os modelos de base podem gerar resultados que estão factualmente corretos, mas que não estão alinhados com as necessidades específicas do usuário, com os valores organizacionais ou com os requisitos de segurança. A DPO resolve essa questão permitindo que você:
+ Ajuste os modelos de acordo com os padrões de comportamento desejados
+ Reduza as saídas indesejadas ou prejudiciais
+ Alinhe as respostas do modelo com as diretrizes de voz e comunicação da marca
+ Melhore a qualidade das respostas com base no feedback de especialistas no domínio
+ Implemente barreiras de proteção por meio de padrões de resposta preferenciais

**Como a DPO funciona**

A DPO usa exemplos pareados nos quais avaliadores humanos indicam qual de duas respostas possíveis é a resposta preferida. O modelo aprende a maximizar a probabilidade de gerar respostas preferidas enquanto minimiza as respostas indesejadas.

**Quando usar a DPO**

Use a DPO nos seguintes cenários:
+ Otimização para saídas subjetivas que exijam alinhamento com preferências humanas específicas
+ Ajuste do tom, do estilo ou das características de conteúdo do modelo
+ Realização de melhorias específicas com base nos feedbacks dos usuários e na análise dos erros.
+ Manutenção da qualidade consistente das saídas em diferentes casos de uso
+ Treinamento com aprendizado por reforço sem recompensa usando apenas dados preferenciais

## Modelos e técnicas compatíveis
<a name="nova-dpo-smtj-models"></a>

O DPO oferece suporte ao ajuste fino de parâmetros completos e à LoRA (adaptação low-rank):


| Modelo | Entradas compatíveis | Tipo de instância | Contagem de instâncias recomendada | Contagem de instâncias permitidas | 
| --- | --- | --- | --- | --- | 
| Amazon Nova Micro | Texto | ml.p5.48xlarge | 2 | 2, 4, 8 | 
| Amazon Nova Lite | Texto, imagem | ml.p5.48xlarge | 4 | 2, 4, 8, 16 | 
| Amazon Nova Pro | Texto, imagem | ml.p5.48xlarge | 6 | 6, 12, 24 | 

**Abordagens de treinamento**
+ **DPO full-rank**: atualiza todos os parâmetros dos modelos. Potencialmente entrega uma melhor qualidade de alinhamento, mas requer mais recursos computacionais e gera modelos maiores.
+ **DPO LoRA**: usa adaptadores leves para um ajuste fino com eficiência de parâmetros. Oferece treinamento e implantação mais eficientes com modelos de saída menores, mantendo uma boa qualidade de alinhamento.

Para a maioria dos casos de uso, a abordagem LoRA fornece capacidade de adaptação suficiente com eficiência significativamente superior.

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

Os dados de treinamento da DPO seguem o mesmo formato do SFT, exceto que o último turno do assistente deve conter pares de preferências com `preferred` e rótulos `non-preferred`.

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

O turno final do assistente usa uma matriz `candidates` em vez 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"
    }
  ]
}
```

### Concluir o texto de exemplo
<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"
        }
      ]
    }
  ]
}
```

### Exemplo com imagens
<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 conjunto de dados
<a name="nova-dpo-smtj-data-requirements"></a>
+ **Formato**: arquivo JSONL único para treinamento, arquivo JSONL único para validação (opcional)
+ **Tamanho mínimo**: são recomendados 1.000 pares de preferências para um treinamento eficaz
+ **Qualidade**: dados de preferência de alta qualidade geram resultados mais eficazes
+ **Outras restrições**: as mesmas do SFT. Para ter mais informações, consulte Restrições de conjuntos de dados.

**Upload dos dados**

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

## Configuração de fórmula
<a name="nova-dpo-smtj-recipe"></a>

### Configuração geral de execução
<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
```


| Parameter | Descrição | 
| --- | --- | 
| name | Um nome descritivo para sua tarefa de treinamento. | 
| model\$1type | Variante do modelo Nova (não modificar) | 
| model\$1name\$1or\$1path | Caminho do modelo de base (não modificar) | 
| replicas | O número de instâncias de computação para treinamento distribuído | 

### Configuração do treinamento
<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
```


| Parameter | Descrição | Intervalo | 
| --- | --- | --- | 
| max\$1length | O tamanho máximo da sequência em tokens | 1024–32768 | 
| global\$1batch\$1size | Amostras por etapa do otimizador | Micro/Lite/Pro: 16, 32, 64, 128. Micro/Lite: 256 | 
| max\$1epochs | O treinamento passa pelo conjunto de dados | Mín.: 1 | 
| hidden\$1dropout | Dropout nos estados ocultos | 0, 0 a 1,0 | 
| attention\$1dropout | Dropout nos pesos de atenção | 0, 0 a 1,0 | 
| ffn\$1dropout | Dropout em camadas de alimentação direta | 0, 0 a 1,0 | 

### Configuração do otimizador
<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
```


| Parameter | Descrição | Intervalo | 
| --- | --- | --- | 
| lr | Taxa de aprendizado | 0–1 (normalmente 1e-6 a 1e-4) | 
| weight\$1decay | Força de regularização de L2 | 0, 0 a 1,0 | 
| warmup\$1steps | Etapas para aumentar gradualmente a taxa de aprendizado | 0 a 20 | 
| min\$1lr | Taxa mínima de aprendizado no final do decaimento | 0–1 (deve ser < Ir) | 

### Configuração específica da DPO
<a name="nova-dpo-smtj-recipe-dpo"></a>

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


| Parameter | Descrição | Intervalo | 
| --- | --- | --- | 
| beta | Equilíbrio entre ajustar os dados de treinamento e permanecer próximo ao modelo original | 0,001–0,5 | 
+ **Beta superior (0,1)**: preserva mais o comportamento do modelo de referência, mas pode aprender as preferências mais lentamente.
+ **Beta inferior (0,01–0,05)**: aprendizado preferencial mais agressiva, mas corre o risco de divergência da referência.

**Recomendação**: comece com `beta: 0.1` e ajuste para baixo se o aprendizado preferencial parecer insuficiente.

### Configuração 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
```


| Parameter | Descrição | Valores permitidos | 
| --- | --- | --- | 
| peft\$1scheme | Método de ajuste fino | "lora" ou null (full-rank) | 
| alpha | Fator de escala para os pesos LoRA | 32, 64, 96, 128, 160, 192 | 
| loraplus\$1lr\$1ratio | Fator de escala da taxa de aprendizado LoRA\$1 | 0,0–100,0 | 
| adapter\$1dropout | Regularização para parâmetros de LoRA. | 0, 0 a 1,0 | 

## Início de uma tarefa de treinamento
<a name="nova-dpo-smtj-start"></a>

**Imagem de contêiner**

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

**Código de exemplo**

```
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)
```

## Implantação do modelo
<a name="nova-dpo-smtj-deploy"></a>

Após a conclusão do treinamento, implante o modelo personalizado no Amazon Bedrock usando a funcionalidade de importação de modelos personalizados. O modelo é compatível tanto com o throughput provisionado quanto com a inferência sob demanda. Modelos treinados pela LoRA são compatíveis com a inferência sob demanda.

Para obter instruções de implantação, consulte [Implantação de modelos personalizados](deploy-custom-model.md).

## Limitações
<a name="nova-dpo-smtj-limitations"></a>
+ **Modalidades de entrada**: a DPO aceita somente texto e imagens. A entrada de vídeo não é compatível.
+ **Modalidade de saída**: somente texto
+ **Pares de preferências**: o turno final de assistente deve conter exatamente dois candidatos com os rótulos `preferred` e `non-preferred`.
+ **Limite de imagens**: máximo de dez imagens por bloco de conteúdo
+ **Modalidades mistas**: não é possível combinar texto, imagem e vídeo na mesma tarefa de treinamento.