

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

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

直接偏好最佳化 (DPO) 是基礎模型的有效微調方法，使用配對比較資料讓模型輸出與人類偏好保持一致。這種方法可根據回應較理想的人類意見回饋，直接最佳化模型行為。

提供全秩 DPO 和低秩適應器 (LoRA) DPO。

**資料格式要求**  
對於全秩和 LoRA DPO，訓練資料格式要求類似於 SFT。不過，對於 DPO，最後一回合需要有偏好配對。以下是 DPO 資料格式的範例：

```
// N-1 turns same as SFT format
{
    "role": "assistant",
    "candidates": [
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "preferred"
        },
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "non-preferred"
        }
    ]
}
```

以下是另一個完整的 DPO 文字範例：

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

以下是完整的 DPO 映像範例：

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

輸入資料集的其他限制條件適用。如需詳細資訊，請參閱[資料集限制條件](https://docs.aws.amazon.com/nova/latest/userguide/fine-tune-prepare-data-understanding.html#custom-fine-tune-constraints)。我們建議您至少包含 1,000 個偏好配對，以便進行有效的訓練。高品質的偏好資料可產生更有效率的結果。

在下列情況中，我們會建議使用 DPO：
+ 針對需要與特定人類偏好一致的主觀輸出進行最佳化。
+ 調整模型的色調、風格或內容特性，以符合所需的回應模式。
+ 根據使用者意見回饋和錯誤分析，對現有模型進行針對性的改善。
+ 在不同使用案例之間維持一致的輸出品質。
+ 透過偏好的回應模式實作安全防護機制。
+ 使用無獎勵強化學習進行訓練。
+ 僅使用偏好資料，而非分級或標記的資料。
+ 在細微的對齊任務中改善模型，例如幫助性、無害性或誠實性。

## 全秩 DPO
<a name="customize-fine-tune-hyperpod-dpo-fr"></a>

適用於全秩 DPO 的 Amazon Nova 參數如下所示：
+ **執行組態**
  + `name`：訓練任務的描述性名稱。這有助於在 中識別您的任務 AWS 管理主控台。
  + `model_type`：要使用的 Nova 模型變體。可用的選項為 `amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` 或 `amazon.nova-pro-v1:0:300k`。
  + `model_name_or_path`：基本模型的路徑。從 `nova-micro/prod`、`nova-pro/prod`、`nova-lite/prod` 或 S3 路徑中選取要用於訓練後檢查點 (`s3://<escrow bucket>/<job id>/outputs/checkpoints`) 的模型。
  + `replicas`：分散式訓練中要使用的運算執行個體數目。可用的值會根據選擇的模型而有所不同。Amazon Nova Micro 支援 2、4 或 8 個複本。Amazon Nova Lite 支援 4、8、16 或 32 個複本。Amazon Nova Pro 支援 6、12 或 24 個複本。
  + `data_s3_path`：訓練資料集的 S3 位置，這是 JSONL 檔案。此檔案必須位於與叢集相同的帳戶和區域中。提供的所有 S3 位置都必須位於相同的帳戶和區域中。
  + `validation_data_s3_path`：驗證資料集的 S3 位置，這是 JSONL 檔案。此檔案必須位於與叢集相同的 AWS 帳戶 和區域中。提供的所有 S3 位置都必須位於相同的帳戶和區域中。
+ **訓練組態**
  + `max_length`：記號中的序列長度上限。這會決定訓練的內容範圍大小。DPO 的最大支援值為 32,768 個記號。

    序列越長，越能提高訓練效率，但代價是需要增加記憶體。建議您將 `max_length` 參數與資料分佈配對。
+ **訓練器設定**
  + `max_epochs`：完整通過訓練資料集的次數。

    一般而言，較大的資料集需要較少的 epoch 才能收斂，而較小的資料集則需要較多 epoch 才能收斂。建議您根據資料大小調整 epoch 的數目。
+ **模型設定**
  + `hidden_dropout`：捨棄隱藏狀態輸出的機率。將此值增加約 0.0-0.2 可減少對較小資料集的過度擬合。有效值介於 0-1 (含) 之間。
  + `attention_dropout`：捨棄注意力權重的機率。此參數可協助進行一般化。有效值介於 0-1 (含) 之間。
  + `ffn_dropout`：捨棄前饋網路輸出的機率。有效值介於 0-1 (含) 之間。
+ **最佳化工具組態**
  + `lr`：學習率，在最佳化期間會控制步驟大小。我們建議使用介於 1e-6-1e-4 之間的值，以獲得良好的效能。有效值介於 0-1 (含) 之間。
  + `name`：最佳化工具演算法。目前僅支援 `distributed_fused_adam`。
  + `weight_decay`：L2 正規化強度。較高的值 (介於 0.01-0.1 之間) 會增加正規化。
  + `warmup_steps`：逐步提高學習率的步驟數目。這可改善訓練穩定性。有效值介於 1-20 (含) 之間。
  + `min_lr`：衰減結束時的最低學習率。有效值介於 0-1 (含) 之間，但必須小於學習率。
+ **DPO 組態**
  + `beta`：決定模型應該與訓練資料或原始模型的擬合程度。有效值介於 0.001-0.5 (含) 之間。

    指定較大的值 (例如 0.5) 可保留更多的參考模型行為，但學習新偏好的速度較慢。指定較小的值 (例如 0.01-0.05) 可更快地學習新偏好，但有偏離參考模型行為的風險。

**全秩 DPO 配方**  
以下是 DPO 的全秩配方

```
## Run config
run:
  name: "my-dpo-micro-job"             # A descriptive name for your training job
  model_type: "amazon.nova-micro-v1:0:128k"  # Model variant specification, do not change
  model_name_or_path: "nova-micro/prod"      # Base model path, do not change
  replicas: 2                     # Number of compute instances for training, allowed values are 2, 4, 8
  data_s3_path: s3:{{Replace with your S3 bucket name}}/input.jsonl
  validation_data_s3_path: {{[OPTIONAL] s3:your S3 bucket name}}/input.jsonl
  output_s3_path: {{[S3_PATH_TO_STORE_MANIFEST]}}

## Training specific configs
training_config:
  max_length: 32768               # Maximum context window size (tokens).
  global_batch_size: 64           # Global batch size, allowed values are 16, 32, 64.

  trainer:
    max_epochs: 2                # Number of training epochs

  model:
    hidden_dropout: 0.0          # Dropout for hidden states, must be between 0.0 and 1.0
    attention_dropout: 0.0       # Dropout for attention weights, must be between 0.0 and 1.0
    ffn_dropout: 0.0             # Dropout for feed-forward networks, must be between 0.0 and 1.0

    optim:
      lr: 1e-5                 # Learning rate
      name: distributed_fused_adam  # Optimizer algorithm, do not change
      adam_w_mode: true        # Enable AdamW mode
      eps: 1e-06               # Epsilon for numerical stability
      weight_decay: 0.0        # L2 regularization strength, must be between 0.0 and 1.0
      betas:                   # Adam optimizer betas, must be between 0.0 and 1.0
        - 0.9
        - 0.999
      sched:
        warmup_steps: 10     # Learning rate warmup steps
        constant_steps: 0    # Steps at constant learning rate
        min_lr: 1e-6         # Minimum learning rate, must be lower than lr

    dpo_cfg:
        beta: 0.1               # Strength of preference enforcement. Limits: [0.001, 0.5]

    peft:
        peft_scheme: null        # Disable LoRA, trigger full rank fine tuning
```

## 低秩適應器 DPO
<a name="customize-fine-tune-hyperpod-dpo-lora"></a>

適用於低階適應器 DPO 的 Amazon Nova 參數如下所示：
+ **執行組態**
  + `name`：訓練任務的描述性名稱。這有助於在 中識別您的任務 AWS 管理主控台。
  + `model_type`：要使用的 Nova 模型變體。可用的選項為 `amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` 或 `amazon.nova-pro-v1:0:300k`。
  + `model_name_or_path`：基本模型的路徑。從 `nova-micro/prod`、`nova-pro/prod`、`nova-lite/prod` 或 S3 路徑中選取要用於訓練後檢查點 (`s3://<escrow bucket>/<job id>/outputs/checkpoints`) 的模型。
  + `replicas`：分散式訓練中要使用的運算執行個體數目。可用的值會根據選擇的模型而有所不同。Amazon Nova Micro 支援 2、4 或 8 個複本。Amazon Nova Lite 支援 4、8、16 或 32 個複本。Amazon Nova Pro 支援 6、12 或 24 個複本。
+ **訓練組態**
  + `max_length`：記號中的序列長度上限。這會決定訓練的內容範圍大小。DPO 的最大支援值為 32,768 個記號。

    序列越長，越能提高訓練效率，但代價是需要增加記憶體。建議您將 `max_length` 參數與資料分佈配對。
+ **訓練器設定**
  + `max_epochs`：完整通過訓練資料集的次數。

    一般而言，較大的資料集需要較少的 epoch 才能收斂，而較小的資料集則需要較多 epoch 才能收斂。建議您根據資料大小調整 epoch 的數目。
+ **模型設定**
  + `hidden_dropout`：捨棄隱藏狀態輸出的機率。將此值增加約 0.0-0.2 可減少對較小資料集的過度擬合。有效值介於 0-1 (含) 之間。
  + `attention_dropout`：捨棄注意力權重的機率。此參數可協助進行一般化。有效值介於 0-1 (含) 之間。
  + `ffn_dropout`：捨棄前饋網路輸出的機率。有效值介於 0-1 (含) 之間。
+ **最佳化工具組態**
  + `lr`：學習率，在最佳化期間會控制步驟大小。我們建議使用介於 1e-6-1e-4 之間的值，以獲得良好的效能。有效值介於 0-1 (含) 之間。
  + `name`：最佳化工具演算法。目前僅支援 `distributed_fused_adam`。
  + `weight_decay`：L2 正規化強度。較高的值 (介於 0.01-0.1 之間) 會增加正規化。
  + `warmup_steps`：逐步提高學習率的步驟數目。這可改善訓練穩定性。有效值介於 1-20 (含) 之間。
  + `min_lr`：衰減結束時的最低學習率。有效值介於 0-1 (含) 之間，但必須小於學習率。
+ **DPO 組態**
  + `beta`：決定模型應該與訓練資料或原始模型的擬合程度。有效值介於 0.001-0.5 (含) 之間。

    指定較大的值 (例如 0.5) 可保留更多的參考模型行為，但學習新偏好的速度較慢。指定較小的值 (例如 0.01-0.05) 可更快地學習新偏好，但有偏離參考模型行為的風險。
+ **LoRA 組態參數**
  + `peft_scheme`：將 `lora` 設定為可啟用低秩適應，這會產生更高效、較小的輸出模型。也可以使用這些 LoRA 特定的屬性：
    + `alpha`：LoRA 權重的擴展係數。這通常設定為與 `adapter_dim` 相同的值。
    + `adapter_dropout`：LoRA 參數的正規化參數。

**LoRA DPO 配方**  
以下是 LoRA DPO 的配方。

```
## Run config
run:
    name: "my-lora-run"             # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification, do not change
    model_name_or_path: "nova-lite/prod"      # Base model path, do not change
    replicas: 4                     # Number of compute instances for training. All supported values: {4, 8, 16}
    data_s3_path: s3:{{Replace with your S3 bucket name}}/input.jsonl
    validation_data_s3_path: {{[OPTIONAL] s3:your S3 bucket name}}/input.jsonl
    output_s3_path: {{[S3_PATH_TO_STORE_MANIFEST]}}

## Training specific configs
training_config:
    max_length: 16384               # Maximum context window size (tokens). Should be between [1024, 32768] and multiple of 1024.
                                    # Note: Image dataset for DPO has a limit on 20k samples and 16384 max_length
    global_batch_size: 64           # Total samples per step. Limits: {16, 32, 64, 128, 256}

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states. Limits: [0.0, 1.0]
        attention_dropout: 0.0       # Dropout for attention weights. Limits: [0.0, 1.0]
        ffn_dropout: 0.0             # Dropout for feed-forward networks. Limits: [0.0, 1.0]

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm, do not change
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-08               # Epsilon for numerical stability
            weight_decay: 0.01       # L2 regularization strength
            betas:                   # Adam optimizer betas. Limits: [0.0, 1.0]
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        dpo_cfg:
            beta: 0.01               # Strength of preference enforcement. Limits: [0.001, 0.5]

        peft:
            peft_scheme: "lora"      # Enable LoRA for parameter-efficient fine-tuning
            lora_tuning:
                loraplus_lr_ratio: 20.0  # LoRA+ learning rate scaling factor. Limits: [0.0, 100.0]
                alpha: 64            # Scaling factor for LoRA weights. [32, 64, 96, 128, 160, 192]
                adapter_dropout: 0.01  # Regularization for LoRA parameters. Limits: [0.0, 1.0]
```

**限制**  
DPO 具有下列限制：
+ 未儲存中繼檢查點以供評估，而且您無法從中繼檢查點繼續。只會儲存最後一個檢查點。
+ 若要調整超參數，請遵循[選取超參數](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)中的指引。