TRL documentation

DPO Trainer

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.18.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

DPO Trainer

All_models-DPO-blue smol_course-Chapter_2-yellow

概要

TRLは、Rafael Rafailov、Archit Sharma、Eric Mitchell、Stefano Ermon、Christopher D. Manning、Chelsea Finnによる論文Direct Preference Optimization: Your Language Model is Secretly a Reward Modelに記載されているDirect Preference Optimization (DPO) Trainerをサポートしており、言語モデルの学習に使用できます。

論文の要旨は以下の通りです:

大規模な教師なし言語モデル(LM)は広範な世界知識や一部の推論スキルを学習しますが、その学習が完全に教師なしであるため、その動作を正確に制御することは困難です。既存の手法では、モデルの生成結果の相対的な品質に関する人間のラベルを収集し、これらの嗜好に合わせるために教師なし LM をファインチューニングします。この際、人間のフィードバックからの強化学習(RLHF)がしばしば用いられます。しかし、RLHF は複雑で不安定な手順であり、まず人間の嗜好を反映する報酬モデルをフィッティングし、その後、強化学習を用いてこの推定報酬を最大化しながら、元のモデルから大きく逸脱しないように大規模な教師なし LM をファインチューニングします。本論文では、RLHF における報酬モデルの新しいパラメータ化を導入し、これにより対応する最適ポリシーを閉形式で抽出できるようにしました。これにより、標準的な RLHF 問題を単純な分類損失のみで解くことが可能になります。この結果得られるアルゴリズムを Direct Preference Optimization(DPO)と呼びますが、これは安定しており、高性能で、計算負荷が軽いため、ファインチューニング中の LM からのサンプリングや、大幅なハイパーパラメータチューニングの必要性を排除します。私たちの実験は、DPO が既存の手法と同程度、あるいはそれ以上に LM をファインチューニングして人間の嗜好に合わせられることを示しています。特に、DPO によるファインチューニングは、生成の感情を制御する能力において PPO ベースの RLHF を上回り、要約やシングルターン対話における応答の品質を匹敵または向上させると同時に、実装と学習が大幅にシンプルです。

このポストトレーニング手法は、Kashif Rasul 氏によって提供され、その後 Quentin Gallouédec 氏によってリファクタリングされました。

クイックスタート

この例では、TRLのDPOTrainerを使用して言語モデルをトレーニングする方法を示します。UltraFeedback datasetでQwen 3 0.6Bモデルをトレーニングします。

from trl import DPOTrainer
from datasets import load_dataset

trainer = DPOTrainer(
    model="Qwen/Qwen3-0.6B",
    train_dataset=load_dataset("trl-lib/ultrafeedback_binarized", split="train"),
)
trainer.train()

期待されるデータセットの型と形式

DPOにはpreferenceデータセットが必要です。DPOTrainerは、標準および会話のデータセット形式の両方に対応しています。会話形式のデータセットが提供されると、トレーナーは自動的にデータセットにチャットテンプレートを適用します。

# Standard format
## Explicit prompt (recommended)
preference_example = {"prompt": "The sky is", "chosen": " blue.", "rejected": " green."}
# Implicit prompt
preference_example = {"chosen": "The sky is blue.", "rejected": "The sky is green."}

# Conversational format
## Explicit prompt (recommended)
preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
                      "chosen": [{"role": "assistant", "content": "It is blue."}],
                      "rejected": [{"role": "assistant", "content": "It is green."}]}
## Implicit prompt
preference_example = {"chosen": [{"role": "user", "content": "What color is the sky?"},
                                 {"role": "assistant", "content": "It is blue."}],
                      "rejected": [{"role": "user", "content": "What color is the sky?"},
                                   {"role": "assistant", "content": "It is green."}]}

データセットがこれらの形式のいずれでもない場合は、前処理によって期待される形式に変換できます。Vezora/Code-Preference-Pairsデータセットを例に示します。

from datasets import load_dataset

dataset = load_dataset("Vezora/Code-Preference-Pairs")


def preprocess_function(example):
    return {
        "prompt": [{"role": "user", "content": example["input"]}],
        "chosen": [{"role": "assistant", "content": example["accepted"]}],
        "rejected": [{"role": "assistant", "content": example["rejected"]}],
    }


dataset = dataset.map(preprocess_function, remove_columns=["instruction", "input", "accepted", "ID"])
print(next(iter(dataset["train"])))
{
    "prompt": [{"role": "user", "content": "Create a nested loop to print every combination of numbers [...]"}],
    "chosen": [{"role": "assistant", "content": "Here is an example of a nested loop in Python [...]"}],
    "rejected": [{"role": "assistant", "content": "Here is an example of a nested loop in Python [...]"}],
}

DPO手法をより深く掘り下げる

Direct Preference Optimization (DPO)は、言語モデルを好みデータに合わせて整列させるために設計された学習手法です。教師ありのインプットとアウトプットのペアではなく、同じプロンプトに対する2つの補完(completion)のペアでモデルを学習します。このとき、一方の補完がもう一方よりも好まれます。この目的関数は、明示的な報酬モデルを必要とすることなく、参照モデルに対する相対的な観点から、好ましい補完と好ましくない補完の対数尤度の差を広げるようにモデルを直接最適化します。実際には、これは通常、好ましい補完の尤度を高めるのではなく、好ましくない補完の尤度を抑制することによって達成されます。

このセクションでは、DPOが実際どのように動作するかを分解して説明します。主なステップである前処理と損失の計算について扱います。

前処理とトークン化

学習中、各サンプルにはプロンプトと、好ましい(chosen)および好ましくない(rejected)補完が含まれていることが期待されます。期待される形式の詳細については、Dataset formatsを参照してください。 DPOTrainerは、モデルのトークナイザーを使用して各入力をトークン化します。

損失の計算

dpo_figure

DPOで使用される損失は、次のように定義されます。LDPO(θ)=−E(x,y+,y−) ⁣[log⁡σ ⁣(β(log⁡πθ(y+ ⁣∣x)πref(y+ ⁣∣x)−log⁡πθ(y− ⁣∣x)πref(y− ⁣∣x)))] \mathcal{L}_{\mathrm{DPO}}(\theta) = -\mathbb{E}_{(x,y^{+},y^{-})}\!\left[\log \sigma\!\left(\beta\Big(\log\frac{\pi_{\theta}(y^{+}\!\mid x)}{\pi_{\mathrm{ref}}(y^{+}\!\mid x)}-\log \frac{\pi_{\theta}(y^{-}\!\mid x)}{\pi_{\mathrm{ref}}(y^{-}\!\mid x)}\Big)\right)\right]

ここで x x はプロンプト、 y+ y^+ は好ましい補完、 y− y^- は好ましくない補完です。 πθ \pi_{\theta} は学習中のポリシーモデル、 πref \pi_{\mathrm{ref}} は参照モデル、 σ \sigma はシグモイド関数、 β>0 \beta > 0 は好意シグナルの強さを制御するハイパーパラメータです。

損失の種類

文献には、目的関数のいくつかの定式化が提案されています。当初、DPOの目的関数は上記の通り定義されていました。

loss_type=説明
"sigmoid"(デフォルト)好意データが与えられた場合、Bradley-Terryモデルに従って二値分類器をフィッティングできます。実際、DPOの著者たちは、正規化された尤度に対するシグモイド損失をlogsigmoidを通じて適用することで、ロジスティック回帰をフィッティングすることを提案しています。
"hinge"RSOの著者らは、SLiC論文からの正規化尤度に対してヒンジ損失を使用することを提案しています。この場合、betaはマージンの逆数です。
"ipo"IPOの著者らは、logit変換が過学習を引き起こし得ると主張し、好みを直接最適化するために恒等変換を提案しています。TRLでは、これをloss_type="ipo"として公開しています。
"exo_pair"EXO の著者らは、reverse-KL 好適性最適化を提案しています。label_smoothing は 0.0 より厳密に大きい値でなければなりません。推奨値は 1e-3 です(簡略化されたペアワイズ変種については式 16 を参照)。完全な手法は K>2 の SFT 補完を使用し、K が大きくなるにつれて PPO に近づきます。
"nca_pair"NCAの著者たちは、NCAが相対尤度ではなく、各応答の絶対尤度を最適化することを示しています。
"robust"Robust DPO の著者らは、ノイズのある好みデータに対するバイアスのない DPO ロスを提案しています。DPOConfig で label_smoothing を使用してラベル反転の確率をモデル化できます。有効な値は [0.0, 0.5) の範囲です。
"bco_pair"BCOの著者らは、ロジットを報酬として機能する二値分類器を訓練します。この分類器は、{プロンプト, 選択された補完}のペアを1に、{プロンプト, 拒否された補完}のペアを0にマッピングするように設計されています。
"sppo_hard"SPPOの著者らは、SPPOは選択された報酬を1/2に近づけ、拒否された報酬を-1/2に近づけることで、Nash均衡を反復的に解くことができ、データのスパース性问题を緩和できると主張しています。実装では、このアルゴリズムを近似するためにハードラベル確率を用いており、勝者に1、敗者に0を割り当てます。
"aot" または loss_type="aot_unpaired"AOT の著者らは、最適輸送による分布的選好アライメントを提案しています。loss_type="aot" はペアデータ用、loss_type="aot_unpaired" は非ペアデータ用です。どちらもソートされた分位数を用いて確率的優位性を強制します。GPU 単体のバッチサイズを大きくすると効果的です。
"apo_zero" または loss_type="apo_down"APOメソッドはアンカー付きの目的関数を導入します。apo_zeroは勝者をブーストし、敗者を減衰させます(モデルが勝者のパフォーマンスを下回っている場合に有用です)。apo_downは両方を減衰させますが、敗者への圧力がより強くなります(モデルがすでに勝者のパフォーマンスを上回っている場合に有用です)。
"discopop"DiscoPOP論文では、LLMを用いてより効率的なオフライン好適性最適化損失を発見しています。本論文で提案されたDiscoPOP損失(対数比で調整された損失)は、異なるタスク(IMDbの肯定的なテキスト生成、Reddit TLDR要約、Alpaca Eval 2.0)において、他の最適化損失を上回るパフォーマンスを示しました。
"sft"SFT(Supervised Fine-Tuning)の損失は、好ましい応答を生成するようにモデルを訓練するために使用される負の対数尤度損失です。
"sigmoid_norm"SimPOの著者は、元のシグモイド損失における長さバイアスを、マスクされていないトークンの数で正規化することで対処しています。TRLでは、これをloss_type="sigmoid_norm"として公開しています。
"udpo"UDPO の著者らは、ノイズのある好みデータに対してバイアスのない DPO ロスを提案しています。このロスは、"robust" とは異なり、フリップ確率を過大評価した場合でもバイアスを保ちます。DPOConfig の label_smoothing を使用してフリップ確率 ε を設定します。有効な値の範囲は [0.0, 0.5) です。

記録されたメトリクス

学習と評価の実行中、以下のメトリクスを記録します:

  • global_step: 現在までに実行されたオプティマイザーステップの総数。
  • epoch: データセットの反復に基づいた現在のエポック番号。
  • num_tokens: 現在までに処理されたトークンの総数。
  • loss: 現在のログ区間におけるDPO損失の平均値。
  • entropy: マスクされていないトークンにおける、モデルが予測したトークン分布の平均エントロピー。
  • aux_loss: Mixture-of-Experts モデルのロードバランス用の補助損失。router_aux_loss_coef によってスケーリングされ、損失に追加される前の値です。モデルが MoE モデルであり、router_aux_loss_coef がゼロでない場合にのみ記録されます。
  • mean_token_accuracy: 選択された補完のトークンとモデルのトップ1予測が一致する、マスクされていないトークンの割合。
  • learning_rate: 現在の学習率。スケジューラを使用している場合、動的に変更される可能性があります。
  • grad_norm: グラディエントクリッピングの前に計算される、勾配のL2ノルム。
  • logits/chosen: モデルが選択された補完のトークンに割り当てた平均ロジット値。
  • logits/rejected: モデルが拒否された補完のトークンに割り当てた平均ロジット値。
  • logps/chosen: モデルが選択された補完のトークンに割り当てた平均対数確率。
  • logps/rejected: モデルが拒否された補完のトークンに割り当てた平均対数確率。
  • rewards/chosen: 選択された補完に対して計算される平均暗黙報酬は、以下のように計算されます βlog⁡πθ(y+ ⁣∣x)πref(y+ ⁣∣x) \beta \log \frac{\pi_{\theta}(y^{+}\!\mid x)}{\pi_{\mathrm{ref}}(y^{+}\!\mid x)} .
  • rewards/rejected: 拒否された補完に対して計算される平均暗黙報酬は、以下のように計算されます βlog⁡πθ(y− ⁣∣x)πref(y− ⁣∣x) \beta \log \frac{\pi_{\theta}(y^{-}\!\mid x)}{\pi_{\mathrm{ref}}(y^{-}\!\mid x)} .
  • rewards/margins: 選択された補完と拒否された補完の間の平均的な暗黙の報酬マージン。
  • rewards/accuracies: 選択された補完の暗黙的な報酬が、拒否された補完のそれより高い例の割合。

カスタマイズ

互換性と制約

現在のDPOTrainer実装では、一部の引数の組み合わせが意図的に制限されています:

  • use_weighting=True は、loss_type="aot" または loss_type="aot_unpaired" と併用できません。
  • lm_headをターゲットとするPEFTアダプターはサポートされていません(代わりにmodules_to_save=["lm_head"]を使用してください)。
  • sync_ref_model=Trueは、独立したref_modelを保持しないPEFTモデルでトレーニングする場合はサポートされていません。
  • sync_ref_model=True は precompute_ref_log_probs=True と併用できません。
  • precompute_ref_log_probs=True は IterableDataset(train または eval)と併用できません。

マルチロス組み合わせ

DPO トレーナーは、異なる重みを持つ複数の損失関数を組み合わせることをサポートしており、より高度な最適化戦略を可能にします。これは、MPO(Mixed Preference Optimization)のようなアルゴリズムの実装に特に有用です。MPO は、論文 Enhancing the Reasoning Ability of Multimodal Large Language Models via Mixed Preference Optimization に記載されているように、複数の最適化目標を組み合わせるトレーニング手法です。

複数の損失を組み合わせるには、損失の種類と対応する重みをリストとして指定します:

# MPO: Combines DPO (sigmoid) for preference and BCO (bco_pair) for quality
training_args = DPOConfig(
    loss_type=["sigmoid", "bco_pair", "sft"],  # loss types to combine
    loss_weights=[0.8, 0.2, 1.0]  # corresponding weights, as used in the MPO paper
)

モデルの初期化

from_pretrained() メソッドの kwargs を DPOConfig に直接渡すことができます。例えば、別の精度でモデルを読み込みたい場合は、

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", dtype=torch.bfloat16)

model_init_kwargs={"dtype": torch.bfloat16} 引数を DPOConfig に渡すことで、これを行うことができます。

from trl import DPOConfig

training_args = DPOConfig(
    model_init_kwargs={"dtype": torch.bfloat16},
)

from_pretrained()のすべてのキーワード引数がサポートされていることに注意してください。

PEFTでアダプターを学習

🤗 PEFT ライブラリとの緊密な統合をサポートしており、モデル全体を学習させる代わりに、アダプターを学習して Hub で共有することを、すべてのユーザーが手軽に行えます。

from datasets import load_dataset
from trl import DPOTrainer
from peft import LoraConfig

dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")

trainer = DPOTrainer(
    "Qwen/Qwen3-0.6B",
    train_dataset=dataset,
    peft_config=LoraConfig(),
)

trainer.train()

PeftModelの学習を継続することもできます。そのためには、まずPeftModelをDPOTrainerの外で読み込み、peft_config引数を渡さずにそのままトレーナーに直接渡します。

from datasets import load_dataset
from trl import DPOTrainer
from peft import AutoPeftModelForCausalLM

model = AutoPeftModelForCausalLM.from_pretrained("trl-lib/Qwen3-4B-LoRA", is_trainable=True)
dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")

trainer = DPOTrainer(
    model=model,
    train_dataset=dataset,
)

trainer.train()

アダプターを学習する際は、学習されるのが新しいパラメータのみであるため、フルファインチューニングよりも高い学習率(約1e‑5)を使用するのが一般的です。

DPOConfig(learning_rate=1e-5, ...)

DPOのための迅速な実験

RapidFire AI は、TRL の上に構築されたオープンソースの実験エンジンです。単一の GPU 上でも複数の DPO 設定を同時に起動できます。設定を順番に試すのではなく、RapidFire を使用すると、すべての学習曲線を早期に確認し、性能が低い実行を停止し、実行中に有望な実行を新しい設定でクローンできます。詳細については、RapidFire AI Integrationを参照してください。

Unslothで学習

Unslothは、LLM(Llama、Mistral、Gemma、DeepSeekなど)のファインチューニングと強化学習のためのオープンソースフレームワークです。最大2倍の高速化と最大70%のVRAM削減を実現しながら、トレーニング、評価、デプロイメントのためのHugging Face互換の簡素化されたワークフローを提供します。詳細については、Unsloth Integrationを参照してください。

DPOによるツール呼び出し

DPOTrainerは、tool calling機能を持つモデルのファインチューニングを完全にサポートしています。この場合、各データセットの例には以下を含める必要があります。

  • ツール呼び出し(tool_calls)やツール応答(toolロールのメッセージ)を含む、会話メッセージ(プロンプト、chosen、rejected)
  • tools 列に表示される利用可能なツールのリスト。通常、JSON スキーマとして提供されます

期待されるデータセットの構造の詳細については、Dataset Format — Tool Callingセクションを参照してください。

ビジョン言語モデルの学習

DPOTrainerは、Vision-Language Models (VLMs) の学習を完全にサポートしています。VLMを学習するには、image列(サンプルごとに1枚の画像)またはimages列(サンプルごとに画像のリスト)を含むデータセットを指定してください。期待されるデータセットの構造の詳細については、Dataset Format — Vision Datasetセクションを参照してください。 このようなデータセットの例として、RLAIF-V Datasetがあります。

from trl import DPOConfig, DPOTrainer
from datasets import load_dataset

trainer = DPOTrainer(
    model="Qwen/Qwen2.5-VL-3B-Instruct",
    args=DPOConfig(max_length=None),
    train_dataset=load_dataset("HuggingFaceH4/rlaif-v_formatted", split="train"),
)
trainer.train()

VLMでは、切り詰めを行うと画像トークンが削除され、トレーニング中にエラーが発生する可能性があります。これを回避するには、DPOConfigでmax_length=Noneを設定してください。これにより、モデルは画像トークンを切り詰めずに、シーケンス全体の長さを処理できます。

DPOConfig(max_length=None, ...)

max_lengthは、データセット全体で切り詰めによって画像トークンが削除されないことを確認した場合にのみ使用してください。

DPOTrainer

クラス trl.DPOTrainer

< >

( model: str | PreTrainedModel | PeftModelref_model: transformers.modeling_utils.PreTrainedModel | None = Noneargs: trl.trainer.dpo_config.DPOConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | datasets.dataset_dict.DatasetDict | datasets.dataset_dict.IterableDatasetDict | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)quantization_config: BitsAndBytesConfig | None = Nonepeft_config: PeftConfig | None = None )

パラメータ

  • model (str または PreTrainedModel または PeftModel) — 学習対象のモデル。以下のいずれかです:
    • 文字列。huggingface.co上のモデルリポジトリにホストされている事前学習モデルのmodel id、またはsave_pretrainedを使用してモデルの重みを保存したディレクトリへのパス(例: './my_model_directory/')です。モデルは、モデル設定から導出される<ModelArchitecture>を用いた<ModelArchitecture>.from_pretrainedによって、args.model_init_kwargs内のキーワード引数を使用して読み込まれます。args.model_init_kwargsにdtypeが指定されていない場合、デフォルトはfloat32です。これは、モデル設定からdtypeを推論する(Transformers v5以降)from_pretrainedとは異なります。
    • PreTrainedModelオブジェクト。因果言語モデルのみサポートされています。
    • PeftModelオブジェクト。因果言語モデルのみサポートされています。
  • ref_model (PreTrainedModel, 省略可能) — 参照ログ確率を計算するために使用される参照モデル。指定された場合、このモデルが参照ポリシーとして直接使用されます。PeftModel は指定できません。None の場合、トレーナーは model に対応する初期ポリシー、つまり DPO トレーニング開始前のモデル状態を自動的に使用します。
    • 指定された場合、このモデルは参照ポリシーとして直接使用されます。PeftModelにはできません。
    • Noneの場合、トレーナーはmodelに対応する初期ポリシー、つまりDPOトレーニング開始前のモデル状態を自動的に使用します。
  • args (DPOConfig、任意) — このトレーナーの設定です。None の場合、デフォルトの設定が使用されます。
  • data_collator (DataCollator, 省略可) — 処理済みのtrain_datasetまたはeval_datasetの要素のリストからバッチを形成するために使用する関数。 モデルが言語モデルの場合はDataCollatorForPreferenceが、ビジョン言語モデルの場合はDataCollatorForVisionPreferenceがデフォルトとして使用されます。カスタムのコレーターでは、パディングの前にシーケンスを切り詰める必要があります。トレーナーは、コレーション後の切り詰めは適用しません。
  • train_dataset (Dataset または IterableDataset) — 学習に使用するデータセット。このトレーナーは 言語モデリング タイプと プロンプト-補完 タイプの両方をサポートします。サンプルの形式は次のいずれかです:
    • Standard: 各サンプルにはプレーンテキストが含まれています。
    • 対話形式: 各サンプルには構造化されたメッセージ(例: roleとcontent)が含まれます。

    train_dataset が IterableDataset(ストリーミングデータセットなど)である場合、その長さを推定できないため、学習ループの上限を定め、学習率スケジューラを設定するために必要な総学習ステップ数を指定するため、max_steps を学習引数で設定する必要があります。

  • eval_dataset (Dataset、IterableDataset、DatasetDict、IterableDatasetDict または dict[str, Dataset | IterableDataset]) — 評価に使用する Dataset です。train_dataset と同じ要件を満たす必要があります。
  • processing_class (PreTrainedTokenizerBase または ProcessorMixin、任意) — データを処理するために使用される処理クラスです。パディング側は “left” に設定する必要があります。None の場合、from_pretrained を使用してモデル名から処理クラスを読み込みます。パディングトークンである tokenizer.pad_token が設定されている必要があります。処理クラスにパディングトークンが設定されていない場合、tokenizer.eos_token がデフォルトとして使用されます。
  • compute_metrics (Callable[[EvalPrediction], dict], 省略可) — 評価時にメトリクスを計算するために使用される関数。EvalPrediction を引数に取り、メトリクス名(文字列)からメトリクス値への辞書を返す必要があります。SFTConfig に batch_eval_metrics が True に設定されている場合、compute_metrics 関数はブール型の compute_result 引数を受け取らなければなりません。これは最後の評価バッチの後にトリガーされ、関数がバッチレベルの統計を累積するのではなく、グローバルなサマリー統計を計算して返す必要があることを示します。この関数が受け取る logits は、追加のフォワードパスで再計算されます。この機能は非推奨であり、v2.0.0 で削除されます。
  • callbacks (のリスト TrainerCallback, 省略可) — トレーニングループをカスタマイズするためのコールバックのリスト。デフォルトのコールバックのリストに追加されます。デフォルトのコールバックの詳細は こちら.

    デフォルトで使用するコールバックの1つを削除したい場合は、remove_callbackメソッドを使用します。

  • optimizers (tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None]、任意、デフォルトは (None, None)) — 使用するオプティマイザーとスケジューラーを含むタプルです。デフォルトでは、モデルに対して AdamW のインスタンスと、args によって制御される get_linear_schedule_with_warmup によって与えられるスケジューラーが使用されます。
  • quantization_config (BitsAndBytesConfig、任意) — モデル識別子からモデルを読み込む際に使用される量子化設定です。QLoRA 学習には peft_config と組み合わせて使用します。モデルがすでにインスタンス化されている場合は無視されます。
  • peft_config (PeftConfig、任意) — モデルをラップするために使用されるPEFT設定です。Noneの場合、モデルはラップされません。

Direct Preference Optimization (DPO) 手法用の Trainer です。このアルゴリズムは、論文 Direct Preference Optimization: Your Language Model is Secretly a Reward Model で初めて提案されました。 このクラスは Trainer クラスのラッパーであり、そのすべての属性とメソッドを継承します。

例:

>>> from trl import DPOTrainer
>>> from datasets import load_dataset

>>> dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")

>>> trainer = DPOTrainer(
...     model="Qwen/Qwen2.5-0.5B-Instruct",
...     train_dataset=dataset,
... )
>>> trainer.train()

train

< >

( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput

パラメータ

  • resume_from_checkpoint (str または bool、省略可) — str の場合、以前の Trainer インスタンスによって保存されたチェックポイントのローカルパスを指定します。bool で True の場合、以前の Trainer インスタンスによって args.output_dir に保存された最後のチェックポイントを読み込みます。指定がある場合、ここで読み込まれたモデル/オプティマイザ/スケジューラの状態からトレーニングを再開します。
  • trial (optuna.Trial または dict[str, Any]、省略可) — ハイパーパラメータ探索のための試行またはハイパーパラメータの辞書。
  • ignore_keys_for_eval (list[str]、省略可) — モデルの出力が辞書である場合、学習中の評価で予測を収集する際に無視すべきキーのリストです。

戻り値

~trainer_utils.TrainOutput

グローバルステップ数、トレーニング損失、およびメトリクスを含むオブジェクト。

メインの学習エントリポイント。

save_model

< >

( output_dir: str | None = None_internal_call: bool = False )

モデルを保存するため、from_pretrained()を使用して再読み込みできます。

メインプロセスからのみ保存します。

push_to_hub

< >

( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = None**kwargs )

パラメータ

  • commit_message (str、任意、デフォルトは"End of training") — プッシュ時にコミットするメッセージ。
  • blocking (bool、省略可能、デフォルトはTrue) — git pushが完了した後にのみ関数が返すかどうか。
  • token (str、任意、デフォルトはNone) — Trainer の元の引数を上書きするための書き込み権限を持つトークン。
  • revision (str, 省略可) — コミット元の git リビジョンです。“main” ブランチのヘッドがデフォルトです。
  • kwargs (dict[str, Any]、省略可) — ~Trainer.create_model_card に渡される追加のキーワード引数。

self.args.hub_model_id のリポジトリに、self.model と self.processing_class を 🤗 model hub にアップロードします。

DPOConfig

クラス trl.DPOConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 10logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Falserestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool = Truelabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'random'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonedisable_dropout: bool = Truedataset_num_proc: int | None = Nonemax_length: int | None = 1024truncation_mode: str = 'keep_start'padding_free: bool = Falsepad_to_multiple_of: int | str | None = 'auto'precompute_ref_log_probs: bool = Falseprecompute_ref_batch_size: int | None = Noneloss_type: list[str] = <factory>loss_weights: list[float] | None = Noneld_alpha: float | None = Nonef_divergence_type: str = 'reverse_kl'f_alpha_divergence_coef: float = 0.5label_smoothing: float = 0.0beta: float = 0.1use_weighting: bool = Falsediscopop_tau: float = 0.05activation_offloading: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512pad_token: str | None = None )

モデルを制御するパラメータ

  • model_init_kwargs (dict[str, Any]、省略可) — model引数がDPOTrainerに文字列として指定された場合、from_pretrainedに渡すキーワード引数です。revisionの値は、処理クラスの読み込み時にも使用されます。
  • trust_remote_code (bool, optional, defaults to False) — Whether to allow loading models and tokenizers that ship custom Python code from the Hub. Forwarded to from_pretrained and from_pretrained.
  • router_aux_loss_coef (float, 任意) — Mixture-of-Experts (MoE) モデルにおける負荷分散用の補助損失の係数です。この重みで学習損失に追加されます。設定されていない場合、モデル設定で宣言された値が使用されます。0.0 に設定すると無効になります。MoE 以外のモデルで使用するとエラーになります。
  • disable_dropout (bool、任意、デフォルトはTrue) — モデルおよび参照モデルでdropoutを無効にするかどうかを指定します。

データ前処理を制御するパラメータ

  • dataset_num_proc (int, 省略可) — データセットの処理に使用するプロセス数。
  • max_length (int または None、任意、デフォルトは 1024) — トークン化されたシーケンスの最大長。max_length より長いシーケンスは、truncation_mode に応じて左側または右側から切り詰められます。None の場合は、切り詰めは行われません。
  • truncation_mode (str、任意、デフォルトは "keep_start") — シーケンスが max_length を超えた場合に使用する切り詰めモード。サポートされている値は "keep_start" のみです。 "keep_end" は非推奨であり、v2.0.0 で削除されます。
  • padding_free (bool、任意、デフォルトは False) — バッチ内のすべてのシーケンスを単一の連続シーケンスにフラット化して、パディングなしでフォワードパスを実行するかどうかを指定します。これにより、パディングのオーバーヘッドを排除してメモリ使用量を削減できます。現在、この機能はフラット化されたバッチ構造を効率的に処理できる FlashAttention 2 または 3 のみでサポートされています。一時的に利用不可: DPO のリファクタリング以降、これを True に設定すると警告が表示され、標準的なパディングにフォールバックします。将来のアップデートで復活する予定です。
  • pad_to_multiple_of (int または str、任意、デフォルトは "auto") — 設定されている場合、シーケンスはこの値の倍数にパディングされます。"auto" は、入力形状ごとに一度だけコンパイルされる Neuron (AWS Trainium) 上で 128 の倍数にパディングし、それ以外の環境ではパディングを行いません。
  • precompute_ref_log_probs (bool、省略可能、デフォルトはFalse) — 学習を開始する前に、学習データセット全体に対する参照モデルの対数確率を事前計算するかどうかを指定します。これにより、参照モデルをメモリに保持する必要がなくなるため、学習中のメモリ使用量を削減できます。
  • precompute_ref_batch_size (int, 省略可) — 参照モデルの対数尤度を事前計算する際に使用するバッチサイズです。前処理を高速化するために、トレーニングのバッチサイズよりも大きく設定できます。None の場合、トレーニングでは per_device_train_batch_size、評価では per_device_eval_batch_size がデフォルトとして使用されます。

学習を制御するパラメータ

  • loss_type (list[str]、任意、デフォルトは ["sigmoid"]) — 使用する損失の種類。指定可能な値は: 'sigmoid'、'hinge'、'ipo'、'exo_pair'、'nca_pair'、 'robust'、'bco_pair'、'sppo_hard'、'aot'、'aot_unpaired'、'apo_zero'、'apo_down'、 'discopop'、'sft'、'sigmoid_norm'、'udpo' です。複数の損失タイプを指定した場合、loss_weights で指定された重みを使用してそれらが結合されます。
  • loss_weights (list[float]、任意) — 複数の損失を組み合わせる場合の損失重みのリストです。複数の損失タイプを組み合わせる際に使用します。例: MPO 用の [0.8, 0.2, 1.0]。指定されない場合、すべての損失タイプに対して等しい重み (1.0) がデフォルトとして使用されます。
  • ld_alpha (float, 省略可) — LD-DPO論文におけるαパラメータです。レスポンス内の冗長なトークンの対数尤度の重みを制御します。Noneの場合、冗長な部分には重みが適用されず、損失は標準的なDPO損失と同等になります。値は[0.0, 1.0]の範囲でなければなりません。ld_alpha=1.0では重みが適用されず、ld_alpha=0.0では共有長を超えるトークンがマスクされます。
  • f_divergence_type (str、任意、デフォルトは "reverse_kl") — ポリシーとリファレンス間の f-divergence 正則化項 (f-DPO paper)。指定可能な値は: reverse_kl (デフォルト)、forward_kl、js_divergence、alpha_divergence です。デフォルト以外の値をサポートするのは、chosen-rejected の報酬差に基づいて構築された損失タイプのみです: 'sigmoid'、'sigmoid_norm'、'hinge'、 'ipo'、'exo_pair'、'robust'、'discopop'、'sft'、'udpo'。その他の損失タイプには有効な f-divergence 一般化が存在しないため、デフォルト以外の値は拒否されます。
  • f_alpha_divergence_coef (float、任意、デフォルトは0.5) — f_divergence_type='alpha_divergence'の場合にのみ使用される、α-divergence u^-α正則化項のα係数。
  • label_smoothing (float, 任意、デフォルトは 0.0) — Robust DPO、UDPO、EXO で使用されるラベルスムーthingのパラメータです。Robust DPO と UDPO では、これは好みが逆転する確率 ε として解釈され、[0.0, 0.5) の範囲に収まる必要があります。Robust DPO の論文で推奨される典型的な値は 0.1 です。UDPO では a = ε / (1 - ε) を設定するために使用され、UDPO の論文では a = 0.8、すなわち ε = 4/9 が推奨されています。EXO では、これは ε ラベルスムーthingパラメータに対応し、論文では典型的な値として 1e-3 が推奨されています。
  • beta (float、任意、デフォルトは0.1) — 参照モデルからの逸脱を制御するパラメータです。βの値が大きいほど、参照モデルからの逸脱は小さくなります。IPO損失(loss_type='ipo')の場合、この値は論文でτと表記される正則化パラメータです。
  • use_weighting (bool、任意、デフォルトはFalse) — ポリシーの長さ正規化されたシーケンス確率を用いて、好対立ペアにWPOスタイルの重みを適用するかどうか。
  • discopop_tau (float、任意、デフォルト値は0.05) — DiscoPOP論文からのτ/温度パラメータで、loss_type='discopop'を使用する場合に、log-ratio変調損失の形状を制御します。論文では、デフォルト値discopop_tau=0.05が推奨されています。
  • activation_offloading (bool、任意、デフォルトはFalse) — アクティベーションをCPUにオフロードするかどうか。
  • sync_ref_model (bool、任意、デフォルトはFalse) — ref_model_mixup_alpha パラメータを使用して、ref_model_sync_steps ステップごとに参照モデルをアクティブなモデルと同期するかどうか。TR-DPO 論文に由来する同期処理です。sync_ref_model=True は、PEFT や precompute_ref_log_probs=True とまだ互換性がありません。
  • ref_model_mixup_alpha (float, 任意、デフォルト値は 0.6) — TR-DPO論文からのαパラメータで、更新時の現在のポリシーと以前の参照ポリシーの混合を制御します。参照ポリシーは、以下の式に従って更新されます: π_ref = α * π_θ + (1 - α) * π_ref_prev。このパラメータを使用するには、sync_ref_model=True を設定する必要があります。
  • ref_model_sync_steps (int、任意、デフォルトは512) — TR-DPO論文のτパラメータで、現在のポリシーを参照ポリシーと同期する頻度を決定します。このパラメータを使用するには、sync_ref_model=Trueを設定する必要があります。

非推奨のパラメータ

  • pad_token —

    パラメータ pad_token は非推奨となり、バージョン v2.0.0 で削除されます。代わりに、tokenizer.pad_token を直接設定し、processing_class としてトレーナーに渡してください。

DPOTrainerの構成クラスです。

このクラスには、DPO学習に固有のパラメータのみが含まれています。学習引数の完全なリストについては、TrainingArgumentsのドキュメントを参照してください。なお、このクラスのデフォルト値は、TrainingArgumentsのものと異なる場合があります。

HfArgumentParser を使用すると、このクラスをコマンドラインで指定できる argparse の引数に変換できます。

これらのパラメータは、TrainingArgumentsとは異なるデフォルト値を持っています:

  • logging_steps: デフォルト値が500ではなく10になります。
  • gradient_checkpointing: デフォルト値がFalseではなくTrueに変更されました。
  • bf16: fp16が設定されていない場合、デフォルトでFalseではなくTrueになります。
  • learning_rate: 5e-5ではなく、デフォルト値が1e-6に変更されました。
Update on GitHub