直接偏好优化 (DPO) - Amazon SageMaker AI

直接偏好优化 (DPO)

直接偏好优化 (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" } ] } ], }

对输入数据集的其他限制也适用。有关更多信息,请参阅数据集限制。我们建议您纳入至少 1000 个偏好对,便于实现高效训练。高质量的偏好数据将带来更有效的结果。

我们建议在以下场景中使用 DPO:

  • 针对需要符合特定人类偏好的主观输出进行优化。

  • 调整模型的语气、风格或内容特征以匹配预期的响应模式。

  • 根据用户反馈和错误分析对现有模型进行针对性的改进。

  • 在不同用例中保持一致的输出质量。

  • 通过偏好的响应模式实施安全护栏。

  • 使用无奖励强化学习进行训练。

  • 仅使用偏好数据,而非已评分或标注的数据。

  • 在细致的对齐任务中改进模型,例如有用、无害或诚实。

全秩 DPO

可用于全秩 DPO 的 Amazon Nova 参数如下所示:

  • 运行配置

    • name:训练作业的描述性名称。这有助于您在 AWS 管理控制台中识别您的作业。

    • model_type:要使用的 Nova 模型变体。可用选项有 amazon.nova-micro-v1:0:128kamazon.nova-lite-v1:0:300kamazon.nova-pro-v1:0:300k

    • model_name_or_path:基本模型的路径。从 nova-micro/prodnova-lite/prodnova-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:遍历训练数据集的次数。最大值为 5。

      通常,较大的数据集需要较少的 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

可用于低秩适应 DPO 的 Amazon Nova 参数如下所示:

  • 运行配置

    • name:训练作业的描述性名称。这有助于您在 AWS 管理控制台中识别您的作业。

    • model_type:要使用的 Nova 模型变体。可用选项有 amazon.nova-micro-v1:0:128kamazon.nova-lite-v1:0:300kamazon.nova-pro-v1:0:300k

    • model_name_or_path:基本模型的路径。从 nova-micro/prodnova-lite/prodnova-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:遍历训练数据集的次数。最大值为 5。

      通常,较大的数据集需要较少的 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 具有以下限制:

  • 不会保存中间检查点以供评估,也无法从中间检查点恢复。仅保存最后一个检查点。

  • 不支持 MLFlow 日志记录。

  • 要调整超参数,请遵循选择超参数中的指导。