

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 直接偏好最佳化 (DPO)
<a name="nova-dpo-smtj"></a>

## 概觀
<a name="nova-dpo-smtj-overview"></a>

Direct Preference Optimization (DPO) 是一種對齊技術，使用配對比較資料微調基礎模型，使模型輸出與人類偏好設定保持一致。與強化學習方法不同，DPO 會根據人類對哪些回應更理想的意見回饋，直接最佳化模型行為，提供更穩定且可擴展的方法。

**為什麼要使用 DPO**

基礎模型可能會產生實際上正確的輸出，但無法符合特定使用者需求、組織值或安全需求。DPO 可讓您：
+ 針對所需的行為模式微調模型
+ 減少不想要或有害的輸出
+ 使模型回應與品牌語音和通訊指導方針保持一致
+ 根據網域專家意見回饋改善回應品質
+ 透過偏好的回應模式實作安全護欄

**DPO 的運作方式**

DPO 使用配對範例，其中人工評估人員會指出偏好兩種可能回應中的哪一種。此模型會學習將產生偏好回應的可能性最大化，同時將不需要的回應減至最少。

**何時使用 DPO**

在下列案例中使用 DPO：
+ 最佳化需要符合特定人類偏好設定的主觀輸出
+ 調整模型的色調、風格或內容特性
+ 根據使用者意見回饋和錯誤分析進行有針對性的改善
+ 在不同使用案例中維持一致的輸出品質
+ 僅使用偏好資料進行無獎勵強化學習的訓練

## 支援的模型和技術
<a name="nova-dpo-smtj-models"></a>

DPO 同時支援全參數微調和 LoRA （低排名調整）：


| 模型 | 支援的輸入 | 執行個體類型 | 建議的執行個體計數 | 允許的執行個體計數 | 
| --- | --- | --- | --- | --- | 
| Amazon Nova Micro | 文字 | ml.p5.48xlarge | 2 | 2、4、8 | 
| Amazon Nova Lite | 文字、影像 | ml.p5.48xlarge | 4 | 2、4、8、16 | 
| Amazon Nova Pro | 文字、影像 | ml.p5.48xlarge | 6 | 6、12、24 | 

**訓練方法**
+ **全階 DPO**：更新所有模型參數。可能提供更好的一致性品質，但需要更多的運算資源，並產生更大的模型。
+ **LoRA DPO**：使用輕量型轉接器進行參數效率微調。以較小的輸出模型提供更有效率的訓練和部署，同時保持良好的一致性品質。

對於大多數使用案例，LoRA 方法提供足夠的調整功能，並大幅提升效率。

## 資料格式
<a name="nova-dpo-smtj-data"></a>

DPO 訓練資料遵循與 SFT 相同的格式，但最後一個助理輪換必須包含具有 `preferred`和 `non-preferred`標籤的偏好設定對。

### 基本結構
<a name="nova-dpo-smtj-data-structure"></a>

最終助理輪換使用`candidates`陣列而非 `content`：

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

### 完成文字範例
<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"
        }
      ]
    }
  ]
}
```

### 具有映像的範例
<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"
        }
      ]
    }
  ]
}
```

### 資料集要求
<a name="nova-dpo-smtj-data-requirements"></a>
+ **格式**：用於訓練的單一 JSONL 檔案、用於驗證的單一 JSONL 檔案 （選用）
+ **大小下限**：為有效訓練建議 1，000 個偏好設定配對
+ **品質**：高品質偏好資料會產生更有效的結果
+ **其他限制**條件：與 SFT 相同。如需詳細資訊，請參閱資料集限制條件。

**上傳資料**

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

## 配方組態
<a name="nova-dpo-smtj-recipe"></a>

### 一般執行組態
<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
```


| 參數 | Description | 
| --- | --- | 
| name | 訓練任務的描述性名稱 | 
| model\$1type | Nova 模型變體 （請勿修改） | 
| model\$1name\$1or\$1path | 基本模型路徑 （請勿修改） | 
| replicas | 分散式訓練的運算執行個體數量 | 

### 訓練組態
<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
```


| 參數 | Description | 範圍 | 
| --- | --- | --- | 
| max\$1length | 字符中的序列長度上限 | 1024–32768 | 
| global\$1batch\$1size | 每個最佳化工具步驟的範例 | Micro/Lite/Pro：16、32、64、128。Micro/Lite：256 | 
| max\$1epochs | 訓練透過資料集傳遞 | 最小值：1 | 
| hidden\$1dropout | 隱藏狀態的捨棄 | 0.0–1.0 | 
| attention\$1dropout | 捨棄注意力權重 | 0.0–1.0 | 
| ffn\$1dropout | 向前饋送圖層的退出 | 0.0–1.0 | 

### 最佳化工具組態
<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
```


| 參數 | Description | 範圍 | 
| --- | --- | --- | 
| lr | 學習率 | 0–1 （通常是 1e-6 到 1e-4) | 
| weight\$1decay | L2 正規化強度 | 0.0–1.0 | 
| warmup\$1steps | 逐步提高學習率的步驟 | 0–20 | 
| min\$1lr | 衰減結束時的最低學習率 | 0–1 （必須 < lr) | 

### DPO 特定組態
<a name="nova-dpo-smtj-recipe-dpo"></a>

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


| 參數 | Description | 範圍 | 
| --- | --- | --- | 
| beta | 在調整訓練資料與保持接近原始模型之間取得平衡 | 0.001–0.5 | 
+ **較高的 Beta 值 (0.1)**：保留更多參考模型行為，但可能會更慢地學習偏好設定
+ **較低的 Beta 版 (0.01–0.05)**：更積極的偏好學習，但有偏離參考的風險

**建議**：如果偏好學習似乎不足，請從 開始`beta: 0.1`並向下調整。

### LoRA PEFT 組態
<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
```


| 參數 | Description | 允許的值 | 
| --- | --- | --- | 
| peft\$1scheme | 微調方法 | "lora" 或 null（完整排名） | 
| alpha | LoRA 權重的擴展因素 | 32、64、96、128、160、192 | 
| loraplus\$1lr\$1ratio | LoRA\$1 學習率擴展因素 | 0.0–100.0 | 
| adapter\$1dropout | LoRA 參數的正規化 | 0.0–1.0 | 

## 啟動訓練任務
<a name="nova-dpo-smtj-start"></a>

**容器映像**

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

**範例程式碼**

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

## 部署模型
<a name="nova-dpo-smtj-deploy"></a>

訓練完成後，使用自訂模型匯入功能將自訂模型部署至 Amazon Bedrock。此模型支援佈建輸送量和隨需推論。LoRA 訓練的模型支援隨需推論。

如需部署說明，請參閱[部署自訂模型](deploy-custom-model.md)。

## 限制
<a name="nova-dpo-smtj-limitations"></a>
+ **輸入模式**：DPO 僅接受文字和影像。不支援視訊輸入。
+ **輸出模式**：僅限文字
+ **偏好設定對**：最終助理輪換必須包含剛好兩個具有 `preferred`和 `non-preferred`標籤的候選者
+ **影像限制**：每個內容區塊最多 10 個影像
+ **混合模式**：無法在相同的訓練任務中結合文字、影像和影片