

# 直接偏好优化（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)。我们建议您纳入至少 1000 个偏好对，便于实现高效训练。高质量的偏好数据将带来更有效的结果。

我们建议在以下场景中使用 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-lite/prod`、`nova-pro/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 支持的最大值为 32768 个词元。

    更长的序列将会提高训练效率，但会以增加内存需求为代价。我们建议您根据数据分布情况设置 `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-lite/prod`、`nova-pro/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 支持的最大值为 32768 个词元。

    更长的序列将会提高训练效率，但会以增加内存需求为代价。我们建议您根据数据分布情况设置 `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)中的指导。