TRL documentation
KTO Trainer
KTO Trainer
概要
TRLは、Kawin Ethayarajh、Winnie Xu、Niklas Muennighoff、Dan Jurafsky、Douwe Kielaによる論文KTO: Model Alignment as Prospect Theoretic Optimizationで説明されているKahneman-Tversky Optimization (KTO) Trainerをサポートしており、言語モデルの学習に使用できます。
論文の要旨は以下の通りです:
Kahneman & Tversky の prospect theory(期待効用理論)は、人間がランダム変数を偏りはあるが明確に定義された方法で知覚することを示しています。例えば、人間は損失回避的であることで知られています。本研究では、LLM を人間のフィードバックと整合させるための目的関数が、これらの偏りの多くを暗黙的に取り込んでいることを示します。これらの目的関数(例えば DPO)が交差エントロピー最小化を上回る成功は、それらが人間を考慮した損失関数(HALOs)であることにも一部起因しています。しかし、これらの手法が人間に帰属させる効用関数は、prospect theory の文献におけるものとは異なります。人間の効用を Kahneman-Tversky モデルで表現し、現在の手法が好みの対数尤度を最大化するのに対し、生成の効用を直接最大化する HALO を提案します。このアプローチを Kahneman-Tversky Optimization(KTO)と呼び、1B から 30B のスケールにおいて、好みベースの手法と同等以上の性能を達成します。重要なのは、KTO は好み(ペア比較)を必要とせず、与えられた入力に対して出力が望ましいか望ましくないかという二値シグナルだけで済む点です。これにより、好みデータが希少で高価な現実世界での利用が大幅に容易になります。
公式コードはContextualAI/HALOsで確認できます。
このポストトレーニング手法は、Kashif Rasul、Younes Belkada、Lewis Tunstall、Pablo Vicente によって提供され、その後 Albert Villanova del Moral によってリファクタリングされました。
クイックスタート
この例では、KTO手法を用いてモデルを学習する方法を示します。ベースモデルにはQwen 0.5Bモデルを使用します。好意データにはKTO Mix 14kを使用します。データセットのデータはここで確認できます:
以下は、モデルを学習するためのスクリプトです:
# train_kto.py
from datasets import load_dataset
from trl import KTOConfig, KTOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
train_dataset = load_dataset("trl-lib/kto-mix-14k", split="train")
training_args = KTOConfig(output_dir="Qwen2-0.5B-KTO")
trainer = KTOTrainer(model=model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset)
trainer.train()以下のコマンドを使用してスクリプトを実行します:
accelerate launch train_kto.py
8 x H100 GPUに分散して実行した場合、学習には約30分かかります。報酬グラフを確認することで、学習の進捗を検証できます。報酬マージンが増加傾向にあることは、モデルが改善され、時間とともにより良い応答を生成していることを示しています。

学習済みモデルの性能を確認するには、Transformers Chat CLIを使用できます。
$ transformers chat trl-lib/Qwen2-0.5B-KTO
<quentin_gallouedec>:
What is the best programming language?
<trl-lib/Qwen2-0.5B-KTO>:
The best programming language can vary depending on individual preferences, industry-specific requirements, technical skills, and familiarity with the specific use case or task. Here are some widely-used programming languages that have been noted as popular and widely used:
Here are some other factors to consider when choosing a programming language for a project:
1 JavaScript: JavaScript is at the heart of the web and can be used for building web applications, APIs, and interactive front-end applications like frameworks like React and Angular. It's similar to C, C++, and F# in syntax structure and is accessible and easy to learn, making it a popular choice for beginners and professionals alike.
2 Java: Known for its object-oriented programming (OOP) and support for Java 8 and .NET, Java is used for developing enterprise-level software applications, high-performance games, as well as mobile apps, game development, and desktop applications.
3 C++: Known for its flexibility and scalability, C++ offers comprehensive object-oriented programming and is a popular choice for high-performance computing and other technical fields. It's a powerful platform for building real-world applications and games at scale.
4 Python: Developed by Guido van Rossum in 1991, Python is a high-level, interpreted, and dynamically typed language known for its simplicity, readability, and versatility.
期待されるデータセットの型と形式
KTOにはペアになっていない好みのデータセットが必要です。代わりに、ペアになった好みデータセット(単に好みデータセットとも呼ばれます)を提供することもできます。この場合、トレーナーは、選択された応答と拒否された応答を分離して非ペア形式に変換し、選択された補完にlabel = Trueを、拒否された補完にlabel = Falseを割り当てます。
KTOTrainerは、標準および対話の両方のデータセット形式に対応しています。対話形式のデータセットが提供されると、トレーナーは自動的にデータセットにチャットテンプレートを適用します。
# Standard format
unpaired_preference_example = {"prompt": "The sky is", "completion": " blue.", "label": True}
# Conversational format
unpaired_preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
"completion": [{"role": "assistant", "content": "It is blue."}],
"label": True}理論上、データセットには少なくとも1つのchosen completionと1つのrejected completionが含まれている必要があります。ただし、only chosenデータ、またはrejectedデータのみを使用してKTOを正常に実行したユーザーもいます。rejectedデータのみを使用する場合は、保守的な学習率を採用することをお勧めします。
KTOメソッドの深掘り
Kahneman-Tversky Optimization (KTO)は、与えられた入力に対して出力が望ましいか望ましくないかという二値のシグナルのみを用いて言語モデルをアラインメントするための学習手法です。好ましい/好ましくない補完のペアではなく、この二値シグナルを使用します。KahnemanとTverskyのProspect Theoryに基づき、human-aware loss (HALO)を定義します。HALOは生成の効用を直接最大化するように設計されており、人間の損失回避を反映するために、望ましい例と望ましくない例を非対称に重み付けします。
このセクションでは、KTOが実際どのように動作するかを分解して説明します。主なステップである前処理と損失の計算について扱います。
前処理とトークン化
学習中、各サンプルにはプロンプト、completion、およびその補完が望ましい(True)か望ましくない(False)かを示すブール値のlabelが含まれている必要があります。期待される形式の詳細については、Dataset formatsを参照してください。
KTOTrainerは、モデルのトークナイザーを使用して各入力をトークン化します。
損失の計算
KTO損失で使用されるKLダイバージェンス項は、バッチ内の他の場所から抽出された不一致の補完を各プロンプトとペアリングすることで推定されます。このため、KL項を推定する損失タイプ(apo_zero_unpairedを除くすべて)は、バッチ内で不一致ペアが安定するように、デバイスごとの学習バッチサイズが1より大きく、シーケンシャルなサンプリング戦略が必要です。
KTOで使用される損失( 論文) の式7)は、次のように定義されます:
ここで、値 は
ここで はプロンプト、 は補完、 は学習中のポリシーモデル、 は参照モデル、 はシグモイド関数、 は参照モデルからの逸脱を制御し、 は推定されたKLダイバージェンス項です。重み は、望ましい補完に対して desirable_weight 、望ましくない補完に対して undesirable_weight が使用され、望ましい例と望ましくない例の数の不均衡を補正するために用いられます。
損失の種類
loss_type= | 説明 |
|---|---|
"kto"(デフォルト) | KTO論文のKTO損失。カーネマン・トヴェルスキーの展望理論に基づく人間認識型損失(HALO)であり、推定されたKL発散項を参照点として、望ましい補完の効用を最大化し、望ましくない補完の効用を最小化します。 |
"apo_zero_unpaired" | APO論文のAPO-zero損失の非対称版です。KL分散項を推定せずに、望ましい補完の尤度を上げ、望ましくない補完の尤度を下げます。望ましい補完がモデルのデフォルト出力よりも優れていると判断する場合に、この損失を使用してください。 |
記録されたメトリクス
学習と評価の実行中、以下のメトリクスを記録します:
global_step: 現在までに実行されたオプティマイザーステップの総数。epoch: データセットの反復に基づいた現在のエポック番号。num_tokens: 現在までに処理されたトークンの総数。loss: 現在のログ区間におけるKTO損失の平均値。entropy: マスクされていないトークンにおける、モデルが予測したトークン分布の平均エントロピー。aux_loss: Mixture-of-Experts モデルのロードバランス用の補助損失。router_aux_loss_coefによってスケーリングされ、損失に追加される前の値です。モデルが MoE モデルであり、router_aux_loss_coefがゼロでない場合にのみ記録されます。kl: ポリシーモデルと参照モデルの間の推定KLダイバージェンスの平均値。KTO損失における参照点として使用されます。learning_rate: 現在の学習率。スケジューラを使用している場合、動的に変更される可能性があります。grad_norm: グラディエントクリッピングの前に計算される、勾配のL2ノルム。logits/chosen: モデルが選択済み(望ましい)補完のトークンに割り当てた平均ロジット値。logits/rejected: モデルが拒否(望ましくない)補完のトークンに割り当てたロジット値の平均。logps/chosen: モデルが選択済み(望ましい)補完のトークンに割り当てた平均対数確率。logps/rejected: モデルが拒否(望ましくない)補完のトークンに割り当てた平均対数確率。rewards/chosen: 選択された(望ましい)補完に対して計算される平均暗黙報酬は、以下のように計算されます .rewards/rejected: 拒否(望ましくない)補完に対して計算される平均暗黙報酬は、以下のように計算されます .rewards/margins: 選択された補完と拒否された補完の間の平均的な暗黙の報酬マージン。
カスタマイズ
互換性と制約
現在のKTOTrainer実装では、一部の引数の組み合わせが意図的に制限されています:
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(学習用または評価用)やビジョンデータセットではサポートされていません。- KL 発散項を推定する損失タイプ(
"apo_zero_unpaired"以外のすべて)には、train_sampling_strategy="sequential"および、デバイスごとの学習バッチサイズが 1 より大きいことが必要です。
モデルの初期化
from_pretrained() メソッドの kwargs を KTOConfig に直接渡すことができます。例えば、別の精度でモデルを読み込みたい場合は、
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct", dtype=torch.bfloat16)model_init_kwargs={"dtype": torch.bfloat16} 引数を KTOConfig に渡すことで、これを行うことができます。
from trl import KTOConfig
training_args = KTOConfig(
model_init_kwargs={"dtype": torch.bfloat16},
)from_pretrained()のすべてのキーワード引数がサポートされていることに注意してください。
PEFTでアダプターを学習
🤗 PEFT ライブラリとの緊密な統合をサポートしており、モデル全体を学習させる代わりに、アダプターを学習して Hub で共有することを、すべてのユーザーが手軽に行えます。
from datasets import load_dataset
from trl import KTOTrainer
from peft import LoraConfig
dataset = load_dataset("trl-lib/kto-mix-14k", split="train")
trainer = KTOTrainer(
"Qwen/Qwen2-0.5B-Instruct",
train_dataset=dataset,
peft_config=LoraConfig(),
)
trainer.train()PeftModelの学習を継続することもできます。そのためには、まずPeftModelをKTOTrainerの外で読み込み、peft_config引数を渡さずにそのままトレーナーに直接渡します。
アダプターを学習する際は、学習されるのが新しいパラメータのみであるため、フルファインチューニングよりも高い学習率を通常使用します。
KTOによるツール呼び出し
KTOTrainerは、tool calling機能を持つモデルのファインチューニングを完全にサポートしています。この場合、各データセットの例には以下を含める必要があります。
- ツール呼び出し(
tool_calls)やツール応答(toolロールのメッセージ)を含む、会話メッセージ(プロンプトと補完) tools列に表示される利用可能なツールのリスト。通常、JSON スキーマとして提供されます
期待されるデータセットの構造の詳細については、Dataset Format — Tool Callingセクションを参照してください。
ビジョン言語モデルの学習
KTOTrainerは、Vision-Language Models (VLMs) の学習を完全にサポートしています。VLMを学習するには、image列(サンプルごとに1枚の画像)またはimages列(サンプルごとに画像のリスト)を含むデータセットを指定してください。期待されるデータセットの構造の詳細については、Dataset Format — Vision Datasetセクションを参照してください。
from trl import KTOConfig, KTOTrainer
from datasets import load_dataset
trainer = KTOTrainer(
model="Qwen/Qwen2.5-VL-3B-Instruct",
args=KTOConfig(max_length=None),
train_dataset=load_dataset("trl-internal-testing/zen-image", "conversational_unpaired_preference", split="train"),
)
trainer.train()VLMでは、切り詰めを行うと画像トークンが削除され、トレーニング中にエラーが発生する可能性があります。これを回避するには、KTOConfigで
max_length=Noneを設定してください。これにより、モデルは画像トークンを切り詰めずに、シーケンス全体の長さを処理できます。KTOConfig(max_length=None, ...)
max_lengthは、データセット全体で切り詰めによって画像トークンが削除されないことを確認した場合にのみ使用してください。
スクリプトの例
KTO手法を用いてモデルを学習するためのサンプルスクリプトを提供しています。スクリプトはtrl/scripts/kto.pyで利用できます。
Qwen2 0.5B モデルでUltraFeedback データセットを用いてKTOスクリプトをテストするには、以下のコマンドを実行してください:
accelerate launch trl/scripts/kto.py \
--model_name_or_path Qwen/Qwen2-0.5B-Instruct \
--dataset_name trl-lib/kto-mix-14k \
--num_train_epochs 1 \
--output_dir Qwen2-0.5B-KTO使用のコツ
Mixture of Expertsモデル向け: 補助損失の有効化
MOEは、エキスパート間の負荷がほぼ均等に分配されている場合に最も効率的です。
好適性チューニング時にMOEを同様に訓練するために、ロードバランサーの補助損失を最終損失に追加することが有効です。
このオプションは、モデル設定(例: MixtralConfig)で output_router_logits=True を設定することで有効になります。
補助損失が総損失にどれだけ寄与するかを調整するには、モデル設定でハイパーパラメータ router_aux_loss_coef=...(デフォルト: 0.001)を使用します。
バッチサイズに関する推奨事項
1ステップあたりのバッチサイズは4以上、実効バッチサイズは16から128の範囲に設定してください。実効バッチサイズが大きくても、1ステップあたりのバッチサイズが不適切な場合、KTOにおけるKL推定値の精度が低下します。
学習率の推奨
beta の各設定には、学習性能が低下する前に許容できる最大学習率が存在します。デフォルト設定の beta = 0.1 では、ほとんどのモデルにおいて学習率は通常 1e-6 を超えないようにすべきです。beta が小さくなるにつれて、学習率もそれに応じて小さくする必要があります。一般的に、学習率は 5e-7 から 5e-6 の範囲に保つことを強く推奨します。データセットが小さい場合でも、この範囲外の学習率の使用は推奨しません。代わりに、より多くのエポックを設定して、より良い結果を得るようにしてください。
不均衡データ
の desirable_weight および undesirable_weight の KTOConfig は、好ましい/正の例と好ましくない/負の例の損失に付与される重みを指します。デフォルトでは、両方とも1です。ただし、どちらかの例がより多い場合は、少ない方のタイプの重みを上げ、(desirable_weight 正の例の数) と (undesirable_weight 負の例の数) の比率が 1:1 から 4:3 の範囲になるようにしてください。
KTOTrainer
クラス trl.KTOTrainer
< source >( model: str | PreTrainedModel | PeftModelref_model: transformers.modeling_utils.PreTrainedModel | None = Noneargs: trl.trainer.kto_config.KTOConfig | 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オブジェクト。因果言語モデルのみサポートされています。
- 文字列。huggingface.co上のモデルリポジトリにホストされている事前学習モデルのmodel id、またはsave_pretrainedを使用してモデルの重みを保存したディレクトリへのパス(例:
- ref_model (PreTrainedModel, 省略可能) —
参照ログ確率を計算するために使用される参照モデル。指定された場合、このモデルが参照ポリシーとして直接使用されます。PeftModel は指定できません。None の場合、トレーナーは model に対応する初期ポリシー、つまり KTO トレーニング開始前のモデル状態を自動的に使用します。
- 指定された場合、このモデルは参照ポリシーとして直接使用されます。PeftModelにはできません。
Noneの場合、トレーナーはmodelに対応する初期ポリシー、つまりKTOトレーニング開始前のモデル状態を自動的に使用します。
- args (KTOConfig、任意) —
このトレーナーの設定です。
Noneの場合、デフォルトの設定が使用されます。 - data_collator (
DataCollator, 任意) — 処理済みのtrain_datasetまたはeval_datasetの要素のリストからバッチを形成するために使用する関数。 モデルが言語モデルの場合はDataCollatorForUnpairedPreferenceが、ビジョン言語モデルの場合はDataCollatorForVisionUnpairedPreferenceがデフォルトとして使用されます。カスタムコレーターでは、パディングの前にシーケンスを切り詰める必要があります。トレーナーは、コレーション後の切り詰めは適用しません。 - train_dataset (Dataset または IterableDataset) —
学習に使用するデータセット。このトレーナーは 非対応ペアの好み タイプをサポートしています。サンプルの形式は次のいずれかです:
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の場合、モデルはラップされません。
Kahneman-Tversky Optimization (KTO) 手法用の Trainer です。このアルゴリズムは、論文 KTO: Model Alignment as Prospect Theoretic Optimization で初めて提案されました。このクラスは Trainer クラスのラッパーであり、そのすべての属性とメソッドを継承します。
例:
>>> from trl import KTOTrainer
>>> from datasets import load_dataset
>>> dataset = load_dataset("trl-lib/kto-mix-14k", split="train")
>>> trainer = KTOTrainer(
... model="Qwen/Qwen2.5-0.5B-Instruct",
... train_dataset=dataset,
... )
>>> trainer.train()train
< source >( 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
グローバルステップ数、トレーニング損失、およびメトリクスを含むオブジェクト。
メインの学習エントリポイント。
モデルを保存するため、from_pretrained()を使用して再読み込みできます。
メインプロセスからのみ保存します。
push_to_hub
< source >( 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 にアップロードします。
KTOConfig
クラス trl.KTOConfig
< source >( 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 = 'sequential'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 = 1024pad_to_multiple_of: int | str | None = 'auto'precompute_ref_log_probs: bool = Falseprecompute_ref_batch_size: int | None = Noneloss_type: str = 'kto'beta: float = 0.1desirable_weight: float = 1.0undesirable_weight: float = 1.0activation_offloading: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512 )
モデルを制御するパラメータ
- model_init_kwargs (
dict[str, Any], オプション) —model引数が文字列として指定された場合、KTOTrainer の from_pretrained に渡すキーワード引数です。プロセッシングクラスの読み込み時にもrevisionの値が使用されます。 - trust_remote_code (
bool, optional, defaults toFalse) — 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より長いシーケンスは右側から切り詰められます。Noneの場合、切り詰めは行われません。 - 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 (
str, 省略可, デフォルトは"kto") — 使用する損失の種類。可能な値は以下の通りです: - beta (
float、任意、デフォルトは0.1) — 参照モデルからの逸脱を制御するパラメータです。βの値が大きいほど、参照モデルからの逸脱は少なくなります。 - desirable_weight (
float、任意、デフォルトは1.0) — 好ましい損失は、この係数によって重み付けされます。これにより、好ましいペアと好ましくないペアの数の不均衡を補正します。 - undesirable_weight (
float、任意、デフォルトは1.0) — 好ましくないペアと好ましいペアの数が等しくない場合に備え、好ましくない損失はこの係数で重み付けされます。 - 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を設定する必要があります。
KTOTrainerの構成クラスです。
このクラスには、KTO学習に固有のパラメータのみが含まれています。学習引数の完全なリストについては、TrainingArgumentsのドキュメントを参照してください。なお、このクラス内のデフォルト値は、TrainingArgumentsのものと異なる場合があります。
HfArgumentParser を使用すると、このクラスをコマンドラインで指定できる argparse の引数に変換できます。
これらのパラメータは、TrainingArgumentsとは異なるデフォルト値を持っています:
logging_steps: デフォルト値が500ではなく10になります。gradient_checkpointing: デフォルト値がFalseではなくTrueに変更されました。bf16:fp16が設定されていない場合、デフォルトでFalseではなくTrueになります。learning_rate:5e-5ではなく、デフォルト値が1e-6に変更されました。train_sampling_strategy:"random"ではなく、デフォルトが"sequential"に変更されました。KL分散項を推定する損失タイプ("apo_zero_unpaired"を除くすべて)は、各サンプルのKL補完が固定順序のバッチ内の隣接サンプルに対して事前計算されるため、シーケンシャルサンプリングを必要とします。その他の戦略はこのペアリングを壊します。