PPOとDPOに別れを:GRPO、DAPO、GSPO徹底解説 —— 次世代LLMアライメント技術スタック

The LLM Alignment Frontier A Deep Dive into PPO, DPO, GRPO, DAPO, and GSPO

2023年から2024年にかけて、RLHF(Reinforcement Learning from Human Feedback)のランドスケープは二項対立の構図でした:

  1. PPO (Proximal Policy Optimization): 「正統」だが高コストな選択肢。トレーニングの安定性を維持するために、Policy Modelと同等のサイズを持つ Critic Model (Value Network) をロードする必要があり、VRAM消費量が倍増します(2x Parameters + Optimizer States)。70B以上のモデルにとって、これは高価なH100クラスターのコストを意味します。さらに、PPOのハイパーパラメータ感度(Hyperparameter Sensitivity)は高く、kl_coeffclip_range の調整で多くのエンジニアを疲弊させました。
  2. DPO (Direct Preference Optimization): 「効率的」な代替案。RLの問題を二値分類(Preference Learning)に変換することで、Critic Modelを排除しました。しかし2025年現在、DPOは 推論集約型タスク(Reasoning/CoT) において限界があることが判明しています。DPOは本質的に「スタイル調整」を行うものであり、真の「探索と活用(Exploration & Exploitation)」ではありません。RLのように試行錯誤(Rollout)を通じて、より優れた解法パスを発見することは困難です。

現在の課題(Pain Point): PPOのような高価なVRAMコストをかけずに、RLのような強力な「探索(Search)」能力(DeepSeek-R1レベルの推論能力)を備えたアルゴリズムが必要です。

その答えが、Group-Based Policy Optimization ファミリー:GRPO、DAPO、そして GSPO です。


🏗️ アーキテクチャの進化:TokenレベルからGroupレベルへ

1. GRPO (Group Relative Policy Optimization)

出典: DeepSeek-Math / DeepSeek-R1 Paper

GRPO はこのパラダイムシフトの基礎です。その核心的な革新は、Critic Modelを完全に排除した点にあります。

動作原理:
PPOがベースライン を推定するためにValue Networkに依存するのに対し、GRPOは「グループ統計」をベースラインとして利用します。
同一のプロンプト に対して、モデルは出力のグループ をサンプリングします(例:)。
各出力のアドバンテージ(Advantage)は、グループ内の正規化によって計算されます:

主な利点:

  • VRAM節約: Policy ModelとReference Model(KL発散計算用)をロードするだけで済みます。
  • 推論に最適: 複数のパスをサンプリングすることで、モデルは「どの推論ステップが優れているか」を自動的に学習し、数学やコード生成タスクに非常に適しています。

2. DAPO (Decoupled Clip & Dynamic Sampling)

出典: DAPO Paper (ArXiv 2025)

GRPOはVRAM問題を解決しましたが、長い思考の連鎖(Long Chain-of-Thought)トレーニングにおいて、エントロピー崩壊(Entropy Collapse)やトレーニングの不安定さを招くことがあります。DAPOは大規模推論トレーニングに特化した最適化版です。

主な改善点:

  • Clip-Higher: 従来のPPO/GRPOは更新幅(Clip)を制限します。DAPOは推論タスクにおいて上限を緩和(Clip-Higher)することで、モデルが局所解に早期収束するのを防ぎ、多様性を維持します。
  • Dynamic Sampling: 「全正解」または「全不正解」のプロンプトグループを動的にフィルタリングします。サンプリングした 個すべてが満点または0点の場合、勾配に識別力(Variance=0)がなく、計算リソースの無駄です。DAPOは動的な再サンプリングを行い、勾配の有効性を保証します。

3. GSPO (Group Sequence Policy Optimization)

出典: GSPO Paper (ArXiv 2025)

モデルを MoE (Mixture of Experts) アーキテクチャ(Qwen3-MoEやDeepSeek-V3など)に拡張する場合、TokenレベルのGRPO更新はExpertルーティングのスパース性(Sparsity)により不安定になる可能性があります。

核心ロジック:
GSPOは最適化の粒度を Tokenレベル から Sequenceレベル に引き上げました。

  • Token-level (GRPO): 各トークンが独自の Importance Ratio を持つ。
  • Sequence-level (GSPO): シーケンス全体で単一の Importance Ratio を共有する。

この手法は、超大規模モデルのトレーニングにおいて非常に強力なロバスト性を示し、特にMoEモデルのRouter崩壊を防ぐ上で有効です。


📊 アルゴリズム決定マトリクス

特性 PPO DPO GRPO DAPO GSPO
Critic Model ✅ 必要 (高コスト) ❌ 不要 ❌ 不要 ❌ 不要 ❌ 不要
主なシナリオ 汎用 RLHF チャット/スタイル調整 数学/コード/推論 長文推論 (CoT) MoE/超巨大モデル
VRAM消費
実装複雑度 極めて高い
安定性 低 (敏感) 極めて高い

💻 実装:TRLを使用したGRPO

2025年末現在、Hugging Faceの trl ライブラリはGRPOをネイティブサポートしています。これが多くのエンジニアリングチームにとっての標準的な実装パスです。

1. 環境準備

pip install trl transformers accelerate bitsandbytes

2. コアコード実装 (GRPOTrainer)

注意: 这里的鍵は Reward Function の設計にあります。GRPOはルールベースの報酬(コードの通過率、数学の正答一致など)に非常に適しています。

import torch
from datasets import load_dataset
from trl import GRPOTrainer, GRPOConfig
from transformers import AutoTokenizer, AutoModelForCausalLM

# 1. パスとモデルの設定
model_id = "deepseek-ai/deepseek-r1-distill-llama-8b"
output_dir = "./grpo_reasoning_v1"

# 2. 報酬関数の定義 (Reward Functions)
# GRPOは複数の報酬関数の並列処理をサポートし、最終報酬はそれらの加重和または合計になります
def correctness_reward_func(prompts, completions, answer, **kwargs):
    """
    補完内容に正解が含まれているかチェックします。
    """
    rewards = []
    for completion, gold_answer in zip(completions, answer):
        # 単純な文字列一致ロジック。実運用ではより複雑なパーサーを使用推奨
        if str(gold_answer) in completion:
            rewards.append(1.0)
        else:
            rewards.append(0.0)
    return rewards

def format_reward_func(completions, **kwargs):
    """
    モデルに特定のCoTフォーマット(例:<think>...</think>)を強制します
    """
    rewards = []
    for completion in completions:
        if "<think>" in completion and "</think>" in completion:
            rewards.append(0.5)
        else:
            rewards.append(0.0)
    return rewards

# 3. データセットの読み込み
# 'prompt' と 'answer' 列を含むデータセットを想定
dataset = load_dataset("json", data_files="math_reasoning_data.jsonl", split="train")

# 4. GRPOの設定
training_args = GRPOConfig(
    output_dir=output_dir,
    num_train_epochs=1,
    per_device_train_batch_size=4,  # VRAMが許す限り大きく
    gradient_accumulation_steps=4,
    learning_rate=5e-6,             # GRPOは通常、低いLRを必要とします
    logging_steps=10,
    max_completion_length=1024,     # CoTを収容するために十分な長さを確保
    num_generations=8,              # G: プロンプトごとのサンプリング数 (Group Size)
    beta=0.04,                      # KLペナルティ係数
    fp16=True,
)

# 5. Trainerの初期化
# GRPOTrainerはPolicy ModelのロードとGroup Samplingを自動処理します
trainer = GRPOTrainer(
    model=model_id,
    args=training_args,
    train_dataset=dataset,
    reward_funcs=[correctness_reward_func, format_reward_func],
)

# 6. トレーニング開始
print("🚀 Starting GRPO Training...")
trainer.train()
trainer.save_model(output_dir)

🛠️ 導入・実行チェックリスト

  1. データクリーニング (最重要): GRPOは、モデルが探索中に偶然「正解」にたどり着くことに依存しています。Base Modelの正答率が1%にも満たない場合、GRPOは機能しません(コールドスタート問題)。
  • Action: まず高品質なCoTデータ(OpenO1やDeepSeekの蒸留データなど)を使用して SFT (Supervised Fine-Tuning) を行い、モデルが基本的な <think> フォーマットを理解できるようにします。
  1. Reward Engineering: 単一の疎な報酬(正解/不正解)だけで済ませないでください。
  • Action: Process Reward(フォーマットが正しい、ステップが明確)と Outcome Reward(答えが正しい)を混合させます。
  1. Group Size ():
  • Action: VRAMが許す限り、 は大きい方が良いです。推奨は です。Group Sizeが大きいほど、ベースライン推定の精度が向上します。
  1. KL発散の監視:
  • Action: Criticがなくとも、KLの爆発は依然としてトレーニング崩壊の主因です。TensorBoardでKLが急上昇している場合は、beta を大きくするか、learning_rate を下げてください。

🔚 結論

PPOの時代が終わったわけではありませんが、推論(Reasoning)コード生成 の領域において、GRPOとその派生形 (DAPO/GSPO) は支配的な地位を確立しました。これらは、より少ないVRAMでより強力な探索能力を提供します。

  • 通常のファインチューニングであれば:GRPO が現在のスイートスポットです。
  • 長文CoTで不安定になる場合:DAPO のDynamic Sampling戦略を試してください。
  • MoEなどの巨大モデルをトレーニングする場合:GSPO が必須です。