たきびAIラボ TAKIBI · AI · LAB
💻AI開発 比較 公開 2026.06.12

GRPO・DAPO・DPOの使い分け実践ガイド

検証可能報酬ありのタスクでDeepSeek-R1流RLファインチューニングを選ぶ判断基準

GRPOの仕組みと訓練不安定の原因、DAPOがGRPOを改善する4技術、DPOとの適用タスク差を実務目線で比較。TRL v1.0のGRPOTrainer・DPOTrainer・SFTTrainerを使った実装コードと手法選択フローを実務エンジニア向けに解説する。

読了 約18分
GRPO・DAPO・DPOの使い分け実践ガイド:検証可能報酬ありのタスクでDeepSeek-R1流RLファインチューニングを選ぶ判断基準

数学の証明、コード生成、構造化データ抽出——答えが正しいかどうかをプログラムで即座に判定できるタスクにLLMを特化させたいとき、どの手法でファインチューニングすればいいのか迷うエンジニアは多い。DPOは手軽だと聞いたけれど、DeepSeek-R1はGRPOというRL手法を使っていると論文に書いてあった。DAPOという改良版もあるらしい……という状況だ。

この記事では、GRPOとDAPOとDPOの「具体的な仕組みの違い」「適用すべきタスク類型」「必要なデータ形式」「TRL v1.0での実装コスト」を実務エンジニア向けに整理する。SFT vs RL という大分類の話や、スケール別アルゴリズムランキングの研究紹介ではなく、実際にGPUを動かす前に知っておくべき設計判断の材料を提供する。

GRPO の仕組みと訓練不安定の原因

GRPOは2024年に登場したDeepSeekMathで提案され、2025年1月の「DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning」(DeepSeek-AI、2025年1月22日公開)で広く知られるようになった強化学習アルゴリズムだ。

同一プロンプトから n 個の応答を生成して相対報酬で更新する

GRPOの核心は「グループ内相対報酬」にある。

  1. 同一のプロンプト q に対して、現在の方策 π_θ から G 個(グループサイズ)の応答 (o₁, o₂, …, o_G) を生成する
  2. 各応答に対して報酬 r_i を計算する(数学なら答えが正しければ1、不正解なら0など)
  3. グループ内の報酬を平均と標準偏差で正規化してアドバンテージ A_i = (r_i - μ_r) / σ_r を算出する
  4. PPO と同様のクリップ付き目的関数でポリシーを更新するが、価値関数(Value Network)を持たない

価値関数が不要になるため、PPOに比べてGPUメモリを40〜60%削減できると報告されている。これはPPOがアクター・クリティックの2モデルを同時に保持する必要があるのに対して、GRPOは単一のポリシーモデルだけで動作するからだ。

検証可能報酬(Verifiable Reward)との相性

GRPOが真価を発揮するのは、報酬関数をプログラムで定義できるタスクだ。

  • 数学: 最終答えが正しいか否か(sympy や文字列マッチで判定)
  • コード生成: テストケースが全通過するか(subprocess でユニットテスト実行)
  • 構造化出力: 生成されたJSONが特定のスキーマを満たすか(Pydanticで検証)
  • ツール呼び出し: 正しいAPIが正しいパラメータで呼ばれたか

逆に「どちらの文章がより自然か」という主観的な評価には向かない。

訓練不安定:エントロピー崩壊と勾配爆発

GRPOには実用上の課題が2つある。

エントロピー崩壊: 訓練が進むにつれてポリシーのエントロピーが単調に低下し、モデルが似たような応答しか生成しなくなる。グループ内の応答が全て同じになると、相対報酬が全てゼロになってグラジェントが消える。この「収束の早すぎ」によって、本来探索できるはずの解法パターンが訓練初期に失われてしまう。

後期の不安定化: 訓練の後半で報酬が急落し、グラジェントが突然スパイクすることがある。最悪の場合、勾配爆発に至る。長い推論チェーン(Chain-of-Thought)を生成する設定では特に顕著で、これを「On GRPO Collapse」と呼ぶ研究も出ている。

大規模・長期の訓練でこれらの問題が表面化したため、DAPOが開発された。

DAPO の 4 つの改善:GRPO の弱点を解消する

DAPOは「DAPO: An Open-Source LLM Reinforcement Learning System at Scale」(Qiying Yu ら、ByteDance Seed・Tsinghua AIR・香港大学、2025年3月18日投稿・2025年5月20日改訂)で提案された。GRPOをベースに4つの変更を加えている。

1. Clip-Higher: エントロピー崩壊の防止

GRPOのクリップ範囲はPPOと同様に対称(例: [1-ε, 1+ε])だが、DAPOはこれを非対称にする。具体的には上限のクリップ値 ε_high を下限の ε_low より大きくする。

これによってポリシーが「今よりずっと高い確率」で正解を出す方向への学習を妨げなくなる。その結果、エントロピーが適切なレベルで維持され、多様な探索が続く。

2. Dynamic Sampling: 効果のないバッチを排除

GRPOでは「グループ内の全応答が正解」または「全応答が不正解」のプロンプトが発生することがある。この場合、相対報酬は全てゼロになってグラジェントも消える——計算資源を浪費するだけだ。

DAPOではこのようなプロンプトをフィルタリングし、有効なグラジェントが存在するバッチサイズを一定に保つ。難易度が高すぎるプロンプト(全不正解)も低すぎるプロンプト(全正解)も自動的に除外されるため、訓練効率が上がる。

3. Token-Level Policy Gradient Loss: 応答長バイアスの除去

元のGRPOでは報酬を応答全体に割り当て、シーケンス長で正規化する。これは短い応答と長い応答でグラジェントの大きさが変わることを意味し、短い応答が不当に強く学習されてしまう。

DAPOではシーケンスごとの平均ではなく、バッチ全体のトークン数で正規化する。長い推論チェーンを含む応答でも適切な重みで学習できる。

4. Overlong Reward Shaping: 長すぎる応答のノイズ低減

応答が最大トークン長を超えてカットされると、報酬シグナルにノイズが混じる。正解が含まれているかどうかをカット後の応答から正確に判定できないからだ。DAPOでは超長応答に対してペナルティを与える報酬シェーピングを導入し、無用に長い応答を生成するインセンティブを排除する。

DAPO の実績

DAPO論文では、Qwen2.5-32Bをベースモデルに使用してAIME 2024で50点を達成し、DeepSeek-R1-Zero-Qwen-32B(47点)を50%少ない訓練ステップで上回ったと報告している。ただしこれは特定のベースモデルと数学ベンチマークでの結果であり、あらゆる設定に同様の改善が得られるとは限らない点に注意が必要だ。

DPO の位置付け:静的選好データ・オフライン・実装が軽い

DPOは「人間の選好からの直接最習(Direct Preference Optimization)」で、GRPOとは根本的に異なるアプローチだ。

  • オフライン学習: 事前に収集した (chosen, rejected) ペアの静的データセットを使う。訓練中にモデルが新たな応答を生成しない
  • 報酬関数が不要: 「どちらが良いか」という選好ラベルがあれば動く。プログラムで判定できない場合でも適用できる
  • 実装が軽い: オンラインRLのようなロールアウトを大量に生成する必要がないため、GRPOの1/3〜1/4程度のGPUメモリで訓練できる

一方で「現在のモデルが生成しない応答パターン」を探索する能力はなく、静的なデータの分布を超えることが難しい。また、選好判定が難しいタスク(答えの正誤が曖昧)では品質にばらつきが出やすい。

3 手法の詳細比較

データ形式の違い

手法データ形式ラベル
SFT{"text": "完全な応答"}不要(次トークン予測)
DPO{"prompt": "...", "chosen": "良い応答", "rejected": "悪い応答"}選好ペア
GRPO{"prompt": "数学の問題文など"}不要(報酬関数で動的に算出)

GRPOはプロンプトだけがあれば動く。答えを判定する報酬関数はコードで別に書く。

計算コストの目安

手法訓練中のモデルGPU メモリ(目安)収束速度
SFTポリシー 1 本速い
DPOポリシー + 参照モデル 2 本中(SFTの約2倍)速い
GRPOポリシー 1 本 + ロールアウト生成中〜高(num_generations に依存)やや遅い

GRPOでは1プロンプトあたり num_generations(デフォルト8〜16)個の応答を生成するため、バッチメモリが膨らみやすい。TRL公式では num_generations=4 から始めて徐々に上げることを推奨している。

タスク類型別の適用指針

タスク推奨手法理由
数学・論理推論DAPO > GRPO正解が自動検証可能。長い思考チェーンにはDAPOが安定
コード生成(テストあり)DAPO > GRPOテスト通過率が報酬関数として使える
構造化データ抽出GRPO / DAPOスキーマ適合チェックが報酬関数になる
対話品質・トーン調整DPO選好は主観的で自動検証が難しい
安全性・有害コンテンツ抑制DPO人間フィードバックが正確に反映される
全体的な指示追従底上げSFT最速・最小コストで基礎能力を上げる

HuggingFace TRL v1.0 での実装

HuggingFace は2026年4月にTRL v1.0をリリースし、SFT・報酬モデリング・DPO・GRPOを一つのライブラリに統合した。Unslothカーネルとの統合によりSFT・DPOでは訓練速度が最大2倍、メモリ使用量が最大70%削減されると報告されている。

pip install trl

SFTTrainer の最小サンプル

from trl import SFTTrainer, SFTConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
from datasets import Dataset

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B")

dataset = Dataset.from_list([
    {"text": "<|im_start|>user\n問題\n<|im_end|>\n<|im_start|>assistant\n解答<|im_end|>"},
])

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    args=SFTConfig(output_dir="./sft_output", max_seq_length=2048),
    train_dataset=dataset,
)
trainer.train()

DPOTrainer の最小サンプル

from trl import DPOTrainer, DPOConfig
from datasets import Dataset

dataset = Dataset.from_list([
    {
        "prompt": "フィボナッチ数列のPythonコードを書いてください",
        "chosen": "def fib(n):\n    a, b = 0, 1\n    ...",   # 良い応答
        "rejected": "フィボナッチとは黄金比に関連する数列です...",  # 悪い応答
    }
])

trainer = DPOTrainer(
    model=model,
    ref_model=ref_model,  # 参照モデル(通常はSFT済みモデル)
    tokenizer=tokenizer,
    args=DPOConfig(output_dir="./dpo_output", beta=0.1),
    train_dataset=dataset,
)
trainer.train()

GRPOTrainer の最小サンプル

from trl import GRPOTrainer, GRPOConfig

# 報酬関数:コードが実行できるか判定する例
def code_reward_fn(completions, **kwargs):
    rewards = []
    for completion in completions:
        try:
            exec(completion, {})
            rewards.append(1.0)
        except Exception:
            rewards.append(0.0)
    return rewards

dataset = Dataset.from_list([
    {"prompt": "2つの数の最大公約数を求めるPython関数を書いてください"},
])

trainer = GRPOTrainer(
    model=model,
    tokenizer=tokenizer,
    reward_funcs=code_reward_fn,
    args=GRPOConfig(
        output_dir="./grpo_output",
        num_generations=8,        # グループサイズ(4〜16が一般的)
        max_completion_length=512,
        per_device_train_batch_size=2,
    ),
    train_dataset=dataset,
)
trainer.train()

実務でのファインチューニング手法選択フロー

実際にどの手法を選ぶかは、以下のチェックリストで判断できる。

BUYING GUIDE

手法選択チェックリスト

  1. 01

    正解の自動検証が可能か?

    YES → GRPO/DAPOの候補入り。NO → DPOかSFTを優先

  2. 02

    選好ペアデータを用意できるか?

    YES → DPOが使える。NO → GRPOまたはSFT

  3. 03

    推論チェーンを長くしたい(CoT)か?

    YES → DAPO推奨(Token-Level PGLossとOverlong Reward Shaping)

  4. 04

    計算予算が限られているか?

    YES → SFT → DPO → GRPOの順に検討。GRPOは生成コスト大

  5. 05

    ベースモデルの基礎能力が十分か?

    NO → まずSFTで底上げしてからGRPO/DAPOに進む

  6. 06

    大規模・長期の訓練を予定しているか?

    YES → GRPOよりDAPOを選ぶ(エントロピー崩壊リスク低減)

典型的な進め方は「SFT → GRPO/DAPO」の二段階だ。SFTで基本的な指示追従を固め、次にGRPOで検証可能タスクに特化させる。DeepSeek-R1の論文でも、最終的なDeepSeek-R1には人間可読な出力を担保するためSFTが組み合わされている。

注意点

報酬ハッキングへの警戒

GRPOやDAPOでは報酬関数の設計が品質を左右する。「実行可能なコードか」だけを報酬にすると、空の関数や pass だけのコードを生成してテストをパスするモデルが生まれることがある。報酬関数には複数の条件(正確さ・簡潔さ・安全性)を組み合わせることが重要だ。

チェックポイント管理

GRPOは訓練後半に突然不安定化することがあるため、こまめにチェックポイントを保存しておく(save_steps=100 など)。最良チェックポイントを自動選択する load_best_model_at_end=True の活用も有効だ。

DAPOの実装状況

DAPOは2025年3月の論文発表から日が浅く、2026年6月時点でTRLに正式統合されているかどうかはリリースノートで確認が必要だ。NVIDIA NeMo-RL にはDAP解説ガイドが含まれており、実装の参考になる。DAPO論文のコードリポジトリも公開されている(dapo-sia.github.io)。

ベースモデルの選択

GRPOとDAPOは「モデルが既に持っている解法のパターン」を強化するアプローチだ(ReasonMaxxerの研究が示唆している通り)。ベースモデルに目的タスクの能力がほとんどない場合は、GRPOを掛けても意味のある報酬シグナルが得られない。事前にSFTまたは高品質な継続事前学習でベースモデルの能力を確保しておくことが成功の鍵だ。

FAQ

よくある質問

クリックで展開。

GRPOとDPOを同時に使うことはできますか?

GRPOとDPOは訓練フェーズを分けて順番に適用することが一般的です。まずDPOで対話品質を整えてから、GRPOで数学・コードの推論精度を高める、あるいは逆順にするといったマルチステージが可能です。TRLは両トレーナーを同一のコードベースで使えるため、切り替えコストは低いです。

DAPOはTRLに実装されていますか?

2025年3月の論文発表時点では公式TRLには含まれていませんでしたが、NVIDIA NeMo-RLへのDAPC統合ガイドが公開されています。TRL本体への統合状況はTRLのGitHubリリースノートで最新情報を確認してください。GRPOTrainerのパラメータを手動で調整することでDAPOの挙動に近づけることも可能です(Clip-HigherはGRPOConfigのepsilon_highパラメータに相当します)。

num_generations はいくつに設定するのが適切ですか?

TRL公式では4〜16の範囲が推奨されています。グループサイズが大きいほど報酬の推定が安定しますが、メモリと時間のコストが比例して増えます。最初はnum_generations=4で動作確認をして、メモリに余裕があれば8や16に増やすのが実際的なアプローチです。

DPOに使う「chosen/rejected」ペアはどうやって作りますか?

よくある方法は3つです。①強いモデル(GPT-4oなど)に「これより良い応答・悪い応答」を生成させる、②現在のモデルが生成した複数の応答を人手で評価してペアを作る、③Constitution AI流にモデル自身に自分の応答を評価させる(Anthropicの手法)。DPOの品質は選好ラベルの信頼度に直結するため、ノイジーなラベルは精度を下げます。

GRPOで数学タスクを学習するとき、報酬関数の実装で気をつけることは?

最終答えの抽出方法が重要です。「\boxed42」のようなLaTeX形式の答えを正規表現で抽出して正解と比較するのが基本ですが、数値の表現ゆれ(42 vs 42.0 vs 42/1)や複数ステップある証明問題では中間報酬が必要なケースもあります。単純な文字列マッチだと見かけ上の精度が実力を上回ることがあるため、sympyによる数式等価チェックを組み合わせることをお勧めします。

まとめ

GRPO・DAPO・DPOの選び分けは「答えをプログラムで検証できるかどうか」と「計算予算」が軸になる。

  • GRPOは DeepSeek-R1 が採用したオンラインRL手法で、価値関数なしに推論能力を強化できるが、エントロピー崩壊と訓練不安定が大規模・長期訓練での課題
  • DAPOは Clip-Higher・Dynamic Sampling・Token-Level PGL・Overlong Reward Shapingの4技術でその課題を解消し、Qwen2.5-32BでAIME 2024 50点を達成している
  • DPOは静的な選好データで動くオフライン手法で、対話品質や安全性チューニングに適する

実装はHuggingFace TRL v1.0(2026年4月リリース)でGRPOTrainerDPOTrainerSFTTrainerが統一されており、同一のAPIから試せる。まずSFTで基礎を固めてGRPOへ進む二段階が現時点での典型的な実務パターンだ。

次に読むおすすめ


GRPOで訓練したモデルを本番に乗せる際、LoRAアダプタ管理やモデルのLoRAマージ方法も課題になります。実務でのアダプタ運用設計に悩んでいる方は、こちらの記事も合わせて参考にしてください:

【2026年最新】主要AIツール5つに自腹課金して徹底比較!生産性が劇的に変わる「用途別・最強の1つ」の選び方(note)

GRPOやDAPOで強化したモデルを実際の業務でどう使い分けるかを、主要AIツールの使用感を踏まえて掘り下げています。


関連記事

参考リンク

  • DeepSeek-AI「DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning」arXiv:2501.12948(2025年1月22日) — GRPOがDeepSeek-R1でどのように使われているかの原論文
  • Qiying Yu ら(ByteDance Seed・Tsinghua AIR・HKU)「DAPO: An Open-Source LLM Reinforcement Learning System at Scale」arXiv:2503.14476(2025年3月18日投稿、同年5月20日改訂) — DAPOの4改善点と実験結果の原論文
  • TRL v1.0 Post-Training Blog(HuggingFace) — TRL v1.0リリースの公式ブログ
  • TRL GRPOTrainer ドキュメント — GRPOTrainerのパラメータ一覧
  • DAPO公式サイト — DAPOのコードリポジトリとドキュメント
  • NVIDIA NeMo-RL DAP解説ガイド — NeMo-RL環境でのDAPC実装手順