跳转到主要内容

ORPO 训练

ORPO 在单个训练阶段中结合了 SFT 和偏好优化。

什么是 ORPO?

ORPO(Odds Ratio Preference Optimization)是 DPO 的更简单替代方案,不需要参考模型。它直接使用优势比优化偏好,减少内存使用和训练复杂度。

快速开始

aitraining llm --train \
  --model google/gemma-2-2b \
  --data-path ./preferences.jsonl \
  --project-name gemma-orpo \
  --trainer orpo \
  --prompt-text-column prompt \
  --text-column chosen \
  --rejected-text-column rejected \
  --peft
ORPO 需要 --prompt-text-column--rejected-text-column--text-column 默认为 "text",因此只有当您的选择列名称不同时才需要指定。

Python API

from autotrain.trainers.clm.params import LLMTrainingParams
from autotrain.project import AutoTrainProject

params = LLMTrainingParams(
    model="google/gemma-2-2b",
    data_path="./preferences.jsonl",
    project_name="gemma-orpo",

    trainer="orpo",
    prompt_text_column="prompt",
    text_column="chosen",
    rejected_text_column="rejected",
    dpo_beta=0.1,  # Default: 0.1
    max_prompt_length=128,  # Default: 128
    max_completion_length=None,  # Default: None

    epochs=3,
    batch_size=2,
    lr=5e-5,

    peft=True,
    lora_r=16,
)

project = AutoTrainProject(params=params, backend="local", process=True)
project.create()

数据格式

与 DPO 相同 - 偏好对:
{
  "prompt": "What is AI?",
  "chosen": "AI is artificial intelligence, a field of computer science focused on creating systems that can perform tasks requiring human intelligence.",
  "rejected": "AI is just robots."
}

ORPO vs DPO

方面ORPODPO
参考模型不需要使用 PEFT 时不需要,完整微调时需要
内存使用更低更高(如果使用参考模型)
训练速度更快更慢
SFT 阶段组合分离
复杂度更简单更多选项

参数

参数描述默认值
trainer设置为 "orpo"必需
dpo_beta优势比权重0.1
max_prompt_length提示词最大 token 数128
max_completion_length响应最大 token 数None

何时使用 ORPO

在以下情况选择 ORPO:
  • 内存有限(不需要参考模型)
  • 您想要组合 SFT + 对齐
  • 偏好更简单的训练流程
  • 从基础模型开始(未进行指令微调)
在以下情况选择 DPO:
  • 您需要细粒度控制
  • 使用已进行指令微调的模型
  • 参考模型行为很重要

示例:客户支持

params = LLMTrainingParams(
    model="google/gemma-2-2b",
    data_path="./support_preferences.jsonl",
    project_name="support-bot",

    trainer="orpo",
    dpo_beta=0.15,

    epochs=3,
    batch_size=2,
    gradient_accumulation=4,
    lr=2e-5,

    peft=True,
    lora_r=32,
    lora_alpha=64,

    log="wandb",
)

下一步