TRL documentation
CPO Trainer
CPO Trainer
概要
Haoran Xu、Amr Sharaf、Yunmo Chen、Weiting Tan、Lingfeng Shen、Benjamin Van Durme、Kenton Murray、および Young Jin Kim による論文 Contrastive Preference Optimization: Pushing the Boundaries of LLM Performance in Machine Translation で提案された Contrastive Preference Optimization (CPO) についてです。CPO は、機械翻訳 (MT) タスクにおいて、適切ではあるが完璧ではない翻訳を生成することを避けるようモデルを訓練します。ただし、CPO は DPO ロスの一般的な近似であり、チャットなどの他のドメインにも適用できます。
CPOは、SFTの2つの根本的な欠点を軽減することを目的としています。第一に、SFTは予測出力とゴールドスタンダードな参照データとの乖離を最小化するという手法により、モデルの性能が本質的にトレーニングデータの品質レベルに制限されてしまいます。第二に、SFTには、モデルが翻訳における誤りを拒否するのを防ぐ仕組みがありません。CPOの目的関数は、DPOの目的関数から導出されています。
クイックスタート
この例では、CPO手法を用いてモデルを学習する方法を示します。ベースモデルにはQwen 0.5Bモデルを使用します。好意データにはUltraFeedbackデータセットを使用します。データセットのデータはここで確認できます:
以下は、モデルを学習するためのスクリプトです:
# train_cpo.py
from datasets import load_dataset
from trl.experimental.cpo import CPOConfig, CPOTrainer
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/ultrafeedback_binarized", split="train")
training_args = CPOConfig(output_dir="Qwen2-0.5B-CPO")
trainer = CPOTrainer(model=model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset)
trainer.train()以下のコマンドを使用してスクリプトを実行します:
accelerate launch train_cpo.py
期待されるデータセットの型
CPOには好みデータセットが必要です。experimental.cpo.CPOTrainerは、会話形式と標準形式の両方のデータセット形式をサポートしています。会話形式のデータセットが提供されると、トレーナーは自動的にデータセットにチャットテンプレートを適用します。
記録されたメトリクス
学習と評価の実行中、以下のメトリクスを記録します:
rewards/chosen: ベータでスケーリングされた、選択された応答に対するポリシーモデルの平均対数確率rewards/rejected: 拒否された応答に対するポリシーモデルの平均対数確率をベータでスケーリングした値rewards/accuracies: 選択された報酬が対応する拒否された報酬より大きくなる頻度の平均rewards/margins: 選択された報酬と対応する拒否された報酬の平均差nll_loss: 選択された応答に対するポリシーモデルの平均負対尤度損失
CPOのバリアント
Simple Preference Optimization (SimPO)
Simple Preference Optimization(SimPO)は、Yu Meng、Mengzhou Xia、Danqi Chen によって提案された、参照モデルを使用せずに DPO よりもシンプルかつ効果的な好み最適化アルゴリズムです。SimPO の主要な設計は、(1) 暗黙の報酬として長さ正規化された対数尤度を使用すること、および (2) Bradley-Terry ランキング目的関数にターゲット報酬マージンを組み込むことです。公式コードは princeton-nlp/SimPO で入手できます。
論文の要旨は以下の通りです:
Direct Preference Optimization (DPO) は、人間のフィードバックからの強化学習 (RLHF) における報酬関数を再パラメータ化し、シンプルさと学習の安定性を高めるために広く使用されているオフラインの選好最適化アルゴリズムです。本研究では、よりシンプルでありながらより効果的なアプローチである SimPO を提案します。SimPO の効果は、シーケンスの平均対数確率を暗黙の報酬として利用するという重要な設計に帰因されます。この報酬の定式化はモデルの生成とよりよく整合し、参照モデルの必要性を排除するため、計算とメモリ効率が高まります。さらに、Bradley-Terry 目的関数にターゲット報酬マージンを導入し、勝利した応答と敗北した応答の間のマージンを大きくすることを促すことで、アルゴリズムの性能をさらに高めます。Mistral や Llama3 などのベースモデルと指示チューニング済みモデルの両方を含む、最先端のさまざまな学習設定において、SimPO を DPO とその最新のバリアントと比較しました。AlpacaEval 2、MT-Bench、そして最近の挑戦的な Arena-Hard ベンチマークを含む、広範な指示追従ベンチマークで評価しました。私たちの結果は、応答の長さを大幅に増加させることなく、SimPO が既存のアプローチを一貫してかつ大幅に上回ることが示されています。具体的には、SimPO は AlpacaEval 2 で最大 6.4 ポイント、Arena-Hard で最大 7.5 ポイント DPO を上回りました。Llama3-8B-Instruct をベースに構築した私たちの最高性能モデルは、AlpacaEval 2 で 44.7 という驚異的な長さ制御済み勝率を達成し、リーダーボードで Claude 3 Opus を上回り、Arena-Hard では 33.8 の勝率を記録しました。これにより、最も強力な 8B オープンソースモデルとなりました。
SimPO損失は、報酬マージンの追加、長さ正規化のサポート、およびBC正則化の不使用という代替損失であるため、experimental.cpo.CPOTrainerに統合されています。この損失を使用するには、experimental.cpo.CPOConfigでloss_type="simpo"とcpo_alpha=0.0を有効にし、simpo_gammaを推奨値に設定してください。
CPO-SimPO
CPOとSimPOの併用も提供しており、これによりより安定した学習と性能の向上を実現できます。詳細はCPO-SimPO GitHubを参照してください。この手法を使用するには、experimental.cpo.CPOConfigでloss_type="simpo"を設定し、cpo_alphaをゼロ以外の値に設定してSimPOを有効にするだけです。
AlphaPO
Aman Gupta、Shao Tang、Qingquan Song、Sirou Zhu、Jiwoo Hong、Ankan Saha、Viral Gupta、Noah Lee、Eunki Kim、Jason Zhu、Natesh Pillai、および S. Sathiya Keerthi による AlphaPO — Reward shape matters for LLM alignment(AlphaPO)手法も、experimental.cpo.CPOTrainer に実装されています。AlphaPO は、SimPO の損失関数の文脈において、報酬関数の形状に変換を適用する代替手法です。論文の要旨は以下の通りです。
Reinforcement Learning with Human Feedback (RLHF) とそのバリアントは、大規模言語モデル (LLM) が指示に従い、人間の価値観を反映するように効果的にアラインメントさせるための大きな進歩を遂げてきました。より最近では、Direct Alignment Algorithms (DAAs) が登場し、RLHF の報酬モデリング段階をスキップし、学習中のポリシーを直接報酬の関数として特徴付けることでこれを回避しています。DAAs の人気のある例としては、Direct Preference Optimization (DPO) や Simple Preference Optimization (SimPO) などが挙げられます。これらの手法は、好ましい応答の確率が望ましくない形で低減される現象である likelihood displacement に苦しむことが多いです。本論文では、DAAs において報酬 (関数) の形状が重要であると主張します。私たちは、標準的な log 報酬を超えて報酬関数の形状を変更するのを助ける α パラメータを活用する新しい DAA 手法である AlphaPO を紹介します。AlphaPO は、likelihood displacement と overoptimization に対する細粒度の制御を維持するのに役立ちます。DAAs の中で最も高性能なものの一つである SimPO と比較すると、AlphaPO は Mistral-7B と Llama3-8B の instruct バージョンにおいて、アラインメント性能が約 7% から 10% 相対的に向上し、同じモデルにおいて DPO に対して 15% から 50% の相対的な改善を実現します。提示された分析と結果は、報酬の形状の重要性と、トレーニングダイナミクスに影響を与え、アラインメント性能を向上させるためにそれを体系的に変更する方法を強調しています。
論文で説明されているようにこの損失を使用するには、experimental.cpo.CPOConfig で推奨されている値を alpha と simpo_gamma に設定するとともに、loss_type="alphapo" を設定できます。これにより、loss_type="simpo" と cpo_alpha=0.0 が自動的に設定されます。あるいは、loss_type="simpo" と cpo_alpha=0.0 を手動で設定し、alpha と simpo_gamma を推奨値に設定することもできます。この手法の他のバリアントも可能であり、例えば loss_type="ipo" を設定し、alpha をゼロ以外の任意の値に設定する方法などが挙げられます。
損失関数
CPOアルゴリズムは複数の損失関数をサポートしています。損失関数は、experimental.cpo.CPOConfigのloss_typeパラメータで設定できます。サポートされている損失関数は以下の通りです。
loss_type= | 説明 |
|---|---|
"sigmoid"(デフォルト) | 好意データが与えられた場合、Bradley-Terryモデルに従って二値分類器をフィッティングできます。実際、DPOの著者たちは、logsigmoidを用いた正規化された尤度に対するシグモイド損失を提案し、ロジスティック回帰をフィッティングしています。 |
"hinge" | RSOの著者らは、SLiC論文からの正規化尤度に対してヒンジ損失を使用することを提案しています。この場合、betaはマージンの逆数です。 |
"ipo" | IPO の著者は、DPO アルゴリズムのより深い理論的理解を提供し、過学習の問題を特定するとともに、代替となる損失関数を提案しています。この場合、beta は、選択された補完と拒否された補完のペアの対数尤度比の差の逆数であり、したがって beta が小さいほど、この差は大きくなります。論文によると、この損失は補完の対数尤度に対して平均化されます(DPO は単純に合計するのみです)。 |
"simpo" | SimPOメソッドは、experimental.cpo.CPOTrainerにも実装されています。SimPOは、報酬マージンを追加し、長さ正規化を許可し、BC正則化を使用しない代替の損失関数です。この損失関数を使用するには、experimental.cpo.CPOConfigでloss_type="simpo"とcpo_alpha=0.0を設定し、simpo_gammaを推奨値に設定するだけです。 |
"alphapo" | AlphaPOメソッドは、experimental.cpo.CPOTrainerにも実装されています。これは、loss_type="simpo"とcpo_alpha=0.0を自動的に設定する構文上の糖衣です。AlphaPOは、alphaパラメータがゼロでない場合、SimPO損失の文脈において報酬関数の形状に変換を適用します。 |
Mixture of Expertsモデル向け: 補助損失の有効化
MOEは、エキスパート間の負荷がほぼ均等に分配されている場合に最も効率的です。
好適性チューニング時にMOEを同様に訓練するために、ロードバランサーの補助損失を最終損失に追加することが有効です。
このオプションは、モデル設定でoutput_router_logits=Trueを設定することで有効になります(例: MixtralConfig)。
補助損失が総損失にどれだけ寄与するかを調整するには、モデル設定でハイパーパラメータrouter_aux_loss_coef=...(デフォルト: 0.001)を使用します。
CPOTrainer
クラス trl.experimental.cpo.CPOTrainer
< source >( model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, str, NoneType] = Noneargs: trl.experimental.cpo.cpo_config.CPOConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | dict[str, datasets.arrow_dataset.Dataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.image_processing_utils.BaseImageProcessor | transformers.feature_extraction_utils.FeatureExtractionMixin | transformers.processing_utils.ProcessorMixin | None = Nonemodel_init: collections.abc.Callable[[], transformers.modeling_utils.PreTrainedModel] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR] = (None, None)preprocess_logits_for_metrics: collections.abc.Callable[[torch.Tensor, torch.Tensor], torch.Tensor] | None = Nonepeft_config: PeftConfig | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalLoopOutput], dict] | None = None )
パラメータ
- model (PreTrainedModel) — 学習対象のモデルです。AutoModelForSequenceClassification を使用するのが望ましいです。
- args (experimental.cpo.CPOConfig) — 学習に使用するCPO設定引数です。
- data_collator (
DataCollator) — 学習に使用するデータコラレーター。None が指定された場合、デフォルトのデータコラレーター (experimental.utils.DPODataCollatorWithPadding) が使用されます。これは、ペアのシーケンスからなるデータセットに対して、バッチ内のシーケンスの最大長までシーケンスをパディングします。 - train_dataset (Dataset) — 学習に使用するデータセット。
- eval_dataset (Dataset) — 評価に使用するデータセット。
- processing_class (PreTrainedTokenizerBase、BaseImageProcessor、FeatureExtractionMixin または ProcessorMixin、任意) — データを処理するために使用される処理クラスです。指定された場合、モデルの入力を自動的に処理するために使用され、モデルとともに保存されます。これにより、中断されたトレーニングを再開したり、ファインチューニングされたモデルを再利用したりすることが容易になります。
- model_init (
Callable[[], transformers.PreTrainedModel]) — 学習に使用するモデルの初期化関数です。None が指定された場合、デフォルトのモデル初期化関数が使用されます。 - callbacks (
list[transformers.TrainerCallback]) — 学習に使用するコールバックです。 - optimizers (
tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR]) — 学習に使用するオプティマイザーとスケジューラーです。 - preprocess_logits_for_metrics (
Callable[[torch.Tensor, torch.Tensor], torch.Tensor]) — メトリクスの計算前に logits を前処理するために使用する関数。 - peft_config (PeftConfig, 任意) — 学習に使用する PEFT 設定です。PEFT 設定を渡すと、モデルは PEFT モデルでラップされます。
- compute_metrics (
Callable[[EvalPrediction], dict], 省略可) — メトリクスを計算するために使用する関数。EvalPredictionを引数に取り、メトリクス名をキーとし、その値をバリューとする辞書を返す必要があります。
CPOTrainerを初期化します。
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 にアップロードします。
CPOConfig
クラス trl.experimental.cpo.CPOConfig
< 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 = '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 = -1max_length: int | None = 1024max_completion_length: int | None = Nonebeta: float = 0.1label_smoothing: float = 0.0loss_type: str = 'sigmoid'disable_dropout: bool = Truecpo_alpha: float = 1.0simpo_gamma: float = 0.5alpha: float = 0.0generate_during_eval: bool = Falseis_encoder_decoder: bool | None = Nonemodel_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falsedataset_num_proc: int | None = None )
パラメータ
- max_length (
intまたはNone、任意、デフォルトは1024) — バッチ内のシーケンス(プロンプト + 補完)の最大長です。デフォルトのデータコラテーターを使用する場合は、この引数が必須です。 - max_completion_length (
int, 任意) — 補完の最大長。デフォルトのデータコラテーターを使用する場合、かつモデルがエンコーダーデコーダーである場合は、この引数が必須です。 - beta (
float、任意、デフォルトは0.1) — 参照モデルからの逸脱を制御するパラメータです。βが大きいほど、参照モデルからの逸脱は小さくなります。IPO損失(loss_type="ipo")の場合、βは論文でτと表記される正則化パラメータです。 - label_smoothing (
float、任意、デフォルトは0.0) — ラベルスムーthingの係数です。デフォルトのデータコラテーターを使用する場合は、この引数が必須です。 - loss_type (
str, 省略可, デフォルトは"sigmoid") — 使用する損失の種類。使用可能な値は以下の通りです: - disable_dropout (
bool、任意、デフォルトはTrue) — モデル内で dropout を無効にするかどうかを指定します。 - cpo_alpha (
float、任意、デフォルトは1.0) — CPO学習におけるBC正則化項の重み。 - simpo_gamma (
float、任意、デフォルト値は0.5) —loss_type="simpo"の場合にのみ使用される、SimPO損失のターゲット報酬マージンです。 - alpha (
float、任意、デフォルトは0.0) — すべての損失タイプにおいて報酬関数の形状を制御する Alpha パラメータです。alpha=0(デフォルト)の場合、標準的な対数尤度報酬を使用します。alpha != 0の場合、AlphaPO の論文に示される AlphaPO 変換r = (1 - p^(-alpha)) / alphaを適用します。このパラメータはすべての損失タイプで機能します。 - generate_during_eval (
bool、省略可能、デフォルトはFalse) —Trueの場合、評価中にモデルから生成された補完をW&BまたはCometに記録します。 - is_encoder_decoder (
bool, 省略可) —model引数の代わりにmodel_init引数(callable)を使用してモデルをインスタンス化する場合は、callable が返すモデルがエンコーダー・デコーダーモデルであるかどうかを指定する必要があります。 - model_init_kwargs (
dict[str, Any]、省略可) — 文字列からモデルをインスタンス化する際にAutoModelForCausalLM.from_pretrainedに渡すキーワード引数です。revisionの値は、処理クラスの読み込み時にも使用されます。 - trust_remote_code (
bool、省略可、デフォルトはFalse) — HubからカスタムのPythonコードを同梱したモデルを読み込むことを許可するかどうか。from_pretrainedに転送されます。 - dataset_num_proc (
int, 省略可) — データセットの処理に使用するプロセス数。
experimental.cpo.CPOTrainer用の設定クラスです。
このクラスには、CPO学習に固有のパラメータのみが含まれています。学習引数の完全なリストについては、TrainingArgumentsのドキュメントを参照してください。なお、このクラスのデフォルト値は、TrainingArgumentsのものと異なる場合があります。
HfArgumentParser を使用すると、このクラスをコマンドラインで指定できる argparse の引数に変換できます。
これらのパラメータは、TrainingArgumentsとは異なるデフォルト値を持っています:
logging_steps: デフォルト値が500ではなく10になります。gradient_checkpointing: デフォルト値がFalseではなくTrueに変更されました。bf16:fp16が設定されていない場合、デフォルトでFalseではなくTrueになります。learning_rate:5e-5ではなく、デフォルト値が1e-6に変更されました。