2023年から2024年にかけて、RLHF(Reinforcement Learning from Human Feedback)のランドスケープは二項対立の構図でした:
- PPO (Proximal Policy Optimization): 「正統」だが高コストな選択肢。トレーニングの安定性を維持するために、Policy Modelと同等のサイズを持つ Critic Model (Value Network) をロードする必要があり、VRAM消費量が倍増します(2x Parameters + Optimizer States)。70B以上のモデルにとって、これは高価なH100クラスターのコストを意味します。さらに、PPOのハイパーパラメータ感度(Hyperparameter Sensitivity)は高く、
kl_coeffやclip_rangeの調整で多くのエンジニアを疲弊させました。 - 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)
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)
モデルを 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)
🛠️ 導入・実行チェックリスト
- データクリーニング (最重要): GRPOは、モデルが探索中に偶然「正解」にたどり着くことに依存しています。Base Modelの正答率が1%にも満たない場合、GRPOは機能しません(コールドスタート問題)。
- Action: まず高品質なCoTデータ(OpenO1やDeepSeekの蒸留データなど)を使用して SFT (Supervised Fine-Tuning) を行い、モデルが基本的な
<think>フォーマットを理解できるようにします。
- Reward Engineering: 単一の疎な報酬(正解/不正解)だけで済ませないでください。
- Action: Process Reward(フォーマットが正しい、ステップが明確)と Outcome Reward(答えが正しい)を混合させます。
- Group Size ():
- Action: VRAMが許す限り、 は大きい方が良いです。推奨は です。Group Sizeが大きいほど、ベースライン推定の精度が向上します。
- KL発散の監視:
- Action: Criticがなくとも、KLの爆発は依然としてトレーニング崩壊の主因です。TensorBoardでKLが急上昇している場合は、
betaを大きくするか、learning_rateを下げてください。
🔚 結論
PPOの時代が終わったわけではありませんが、推論(Reasoning) や コード生成 の領域において、GRPOとその派生形 (DAPO/GSPO) は支配的な地位を確立しました。これらは、より少ないVRAMでより強力な探索能力を提供します。
- 通常のファインチューニングであれば:GRPO が現在のスイートスポットです。
- 長文CoTで不安定になる場合:DAPO のDynamic Sampling戦略を試してください。
- MoEなどの巨大モデルをトレーニングする場合:GSPO が必須です。
