松尾研LLMコンペ2025が開催されました。その中でDynamic Fine-Tunning (DFT) という強化学習手法を実施したのですが、残念ながら精度向上には寄与しませんでした。その考察を行います。
精度は向上しませんでしたが、行った実験から以下の部分は正しいのではないかと考えています。
- 数学などの論理展開を行う学習において、尤度が低いトークンが悪影響を与えている(過度に教師データに適合しすぎている)
- 強化学習のように自身が生成した回答を用いて学習する方が有効である
DFTについて
DFTは、通常のSFTの損失関数が予測した単語の対数尤度であるのに対して、その予測単語の尤度で重み付けを行うことで、尤度の低い単語に対して損失の値がpeakyになるのを防ぐ手法です。
損失関数は以下です。
\mathcal{L}_{\text{DFT}}(\theta) = \mathbb{E}_{(x, y^*) \sim \mathcal{D}}\left[-\sum_{t=1}^{|y^*|} \text{sg}(\pi_{\theta}(y_t^* | y_{<t}^*, x)) \log \pi_{\theta}(y_t^* | y_{<t}^*, x)\right].
またDFTは、SFTを重点サンプリングしたオン方策の強化学習として解釈し、その重点サンプリングを打ち消すようにしたものとみなせます。詳細は著者論文を参考にしてください。
論文中では、SFTと同様にエキスパートの用意した論理で学習した場合や、オフライン強化学習として数学の問題からモデルが生成した回答のうち正答したものだけを用いてDFTした場合が検証されていました。DFTはSFTを上回っていました。
実験設定
今回はQwen/Qwen3-30B-A3B-Thinking-2507をベースラインとしており、これに対して事後学習を行っています。コンペでは最終的にQwen/Qwen3-235B-A22B-Instruct-2507を使うことを想定していたため、予備実験として最も近しいと思われるものを選択しました。
データセットは、SFT_006_origin_2を使用しています。また、DFT論文の4.2節のオフライン強化学習設定と合わせた場合として、
DFT_30B-Thinking_006_origin_1を使用しています。この2つのデータセットの違いは、回答を生成したモデルです。前者はDeepSeek-R1-0528ですが、後者はQwen3-30B-A3B-Thinking-2507です。回答の生成方法自体はこちらをご覧ください。
学習については、verlで実験した場合とms-swift megatronで実験した場合が存在します。ms-swift megatronのほうが高速であったためです。また、学習はLoraで行っています。パラメータについては、どの実験でも共有のパラメータはAppendixを参照ください。なお、コンペで試行錯誤した都合上、
評価は今回のコンペ対象であるHLEからサンプリングした300問で行っています。評価モデルはGPT5-nanoだった気がします。(直接関わっておらず
)
結果
まず、verlを使用した場合の結果を以下に示します。これらはデータセットとして、SFT_006_origin_2を使用しています。結果のとおりSFT、DFTどちらの精度もベースラインより低下しています。だたし、DFTのほうが下落幅が小さくなっています。数学などの論理展開を行う学習において、尤度が低いトークンが悪影響を与えている(過度に教師データに適合しすぎている)という点自体は、ある程度真であると考えられます。
| 全体 | |
|---|---|
| Baseline | 11.85 |
| SFT | 9.71 |
| DFT | 11.07 |
次に、DFTにおける工夫に移ります。結果は以下の表の通りです。この実験は、高速化のためにms-swift megatronにて行っています。
| 手法 | Math | Physics | Biology/Medicine | Humanities/Social Science | Computer Science/AI | Engineering | Chemistry | Other | 全体 |
|---|---|---|---|---|---|---|---|---|---|
| Baseline | 18.03 | 0.00 | 10.00 | 12.00 | 0.00 | 0.00 | 0.00 | 9.52 | 11.15 |
| DFT | 13.22 | 3.85 | 3.33 | 8.33 | 0.00 | 0.00 | 7.69 | 4.76 | 8.21 |
| DFT-chord | 13.22 | 3.85 | 0.00 | 12.50 | 4.35 | 0.00 | 0.00 | 4.76 | 8.24 |
| DFT-rslora | - | - | - | - | - | - | - | - | 5.19 |
| DFT-reinforce | 13.01 | 0.00 | 10.00 | 8.00 | 8.33 | 0.00 | 0.00 | 9.52 | 9.23 |
まず、Baseline自体の精度が下がっています。ここは、評価時の温度パラメータが先程は0.6であるのに対して、こちらが0.2です。コンペ中0.2のほうが安定的であるという提案が途中でなされたためです。(実際には、そうでもなく、最後に3回の評価になりました。)
次に、DFT自体の精度の落ちもさらに増加しています。verlとms-swift megatronのフレームワークによるこの違いは後ほど考察します。
DFT-chordは、こちらの研究を模倣し損失関数に変更を行ったものです。変更後の損失関数は以下です。
\mathcal{L}_{\text{DFT-chord}}(\theta) = \mathbb{E}_{(x, y^*) \sim \mathcal{D}}\left[-\sum_{t=1}^{|y^*|} \text{sg}(\pi_{\theta}(y_t^* | y_{<t}^*, x))(1-\text{sg}(\pi_{\theta}(y_t^* | y_{<t}^*, x)) \log \pi_{\theta}(y_t^* | y_{<t}^*, x)\right].
DFT-rsloraはrsloraを用いてDFTを行ったものです。評価結果はrsloraを用いたほうが更に悪化しています。学習データ、開発データでのlossは改善していました。そのため、本データがHLEに有効であるか疑義がでる結果となりました。
最後に、DFT-reinforceです。これは、データセットとしてDFT_30B-Thinking_006_origin_1を用いた場合です。こちら方が良い精度となっています。よって、強化学習のように自身が生成した回答を用いて学習する方が有効であると考えられます。実際RAMENチームで、最終的に採用し精度が向上したDPOでも同様の減少がみられていました。
タスクごとに見ていくと、どの結果においても、残念ながら数学での精度が下落しています。数学タスクで有効であると論文で主張されていたため、驚きの結果です。数学のレベルが異なることなどが要因としているのではないかと考えます。実際、物理やコンピュータサイエンスでは精度が上昇している場合があります。HLEではこれらも、一般の感覚からすれば数学と思える問題が多くありました。
なお、verlとms-swift megatronの差異ですが、主な点として以下が挙げられます。
- ms-swift megatronで高速化のためにcross_entorpy_loss_fusionを使用している
- loraの適用先がどちらもall-linearであるものの、me-swift megatronではmoeのエキスパート選択にloraが適用されていない
- verlでは、data.filter_overlong_prompts=Trueによって、長過ぎるデータが切られている
これらの内どれかが、上記差分になっていると考えています。
上記、うまく行く場合をすべて組み合わせると、精度が向上する可能性もあると考えます。
まとめ
今回は、コンペ中に試したDFTという手法がうまく行かなかった事例とその考察を紹介しました。全体的な精度自体は向上しませんでしたが、以下については概ね正しいのではないかと考えています。
- 数学などの論理展開を行う学習において、尤度が低いトークンが悪影響を与えている(過度に教師データに適合しすぎている)
- 強化学習のように自身が生成した回答を用いて学習する方が有効である
DFTのような手法はオンライン強化学習のようにロールアウトがないため、うまく行けば高速化が容易です。一方、HLEのようなタスクで手法の検証するのは非常に難易度が高いとも感じました。本記事が、後続の方の一助になれば幸いです。
謝辞
本プロジェクトは、国立研究開発法人新エネルギー・産業技術総合開発機構(以下「NEDO」)の「日本語版医療特化型LLMの社会実装に向けた安全性検証・実証」における基盤モデルの開発プロジェクトの一環として行われます。
Appendix
全実験共通の学習時のパラメータ
- Vert使用時
data.max_length=16384 \
data.train_batch_size=128 \
data.micro_batch_size_per_gpu=1 \
data.truncation='left' \
+data.filter_overlong_prompts=True \
+data.pad_to_max_length=False \
+model.use_flash_attention=True \
model.partial_pretrain=$MODEL_NAME \
model.fsdp_config.model_dtype='bf16' \
model.lora_rank=16 \
model.lora_alpha=32 \
+model.lora_dropout=0.05 \
+model.gradient_checkpointing=True \
+trainer.optimizer_cpu_offload=True \
optim.lr=2e-5 \
optim.lr_scheduler=cosine \
optim.warmup_steps_ratio=0.1 \
optim.weight_decay=0.01 \
optim.betas=[0.9,0.95] \
optim.clip_grad=1.0 \
trainer.total_epochs=1 \
- ms-swift megatron使用時
--train_type lora \
--lazy_tokenize true \
--lora_rank 16 \
--lora_alpha 32 \
--target_modules all-linear \
--expert_model_parallel_size 4 \
--tensor_model_parallel_size 2 \
--sequence_parallel true \
--micro_batch_size 4 \
--global_batch_size 128 \
--recompute_granularity full \
--recompute_method uniform \
--recompute_num_layers 1 \
--finetune true \
--enable_dft_loss true \
--cross_entropy_loss_fusion true \
--lr 2e-5 \
--lr_warmup_fraction 0.1 \
--clip_grad 1.0 \
--adam_beta1 0.9 \
--adam_beta2 0.95 \
--weight_decay 0.01 \
--lora_dropout 0.05 \
--max_epochs 1 \
--truncation_strategy left \
--max_length 16384 \
--num_workers 8 \
--dataset_num_proc 8 \
--no_save_optim true \
--no_save_rng true \
--attention_backend flash \"