TL;DR
- Qwen3-Next-80B-A3B-Instruct をベースに、医師国家試験データで GRPO / GSPO / CHORD の 3 手法を並べて post-training した記録
- 3 手法とも GRPO の派生: GSPO は importance ratio を token-level から sequence-level (幾何平均) に変更、CHORD は GRPO loss に SFT loss を μ で凸結合
- 結果 (accuracy, Base 比):
- 医師国試 (igakuqa, N=1122): GRPO 90.3 (+0.8) / GSPO 90.2 (+0.7) / CHORD 90.4 (+0.9) (Base 89.5、天井効果あり全手法 n.s.)
- 専門医試験 (specialist, N=3757): GRPO 71.1 (+2.1, p=0.0013) / GSPO 70.9 (+1.9, p=0.0036) / CHORD 70.0 (+1.0, p=0.119)
- specialist で GRPO / GSPO は Base 比 p<0.01 で有意、CHORD は有意差に達せず。手法間 (GRPO vs GSPO, GRPO vs CHORD, GSPO vs CHORD) は有意差なし
- 診療科別では最良手法が分散: GRPO 5 科 (耳鼻科 +8.6 が最大) / GSPO 5 科 (肝臓 +5.2) / CHORD 3 科 (整形外科 +2.8)。全科で一貫リードする手法は無し
- フォーマット遵守率は 3 手法とも 100% (
[ans]...[/ans]パース失敗 0.0%)
はじめに
RAMENチームとして医師国家試験のデータで Qwen3 系列に post-training をかけた一本になります。今回のテーマは、同じベースモデル (Qwen3-Next-80B-A3B-Instruct) に対して RL 系 3 手法 (GRPO / GSPO / CHORD) を並べて回して、どの手法がどこに効いたのかを見ることです。
つまり、
「GRPO を軸として、その派生である GSPO・CHORD を実際に走らせたときに、医療 MCQ タスクの accuracy にはどのような違いが出るのか」
を実験的に切り分ける、という記事になります。
関連する記事は以下です:
- 本記事 — 3 手法をアルゴリズム面で並べ、実験結果を横断で見る
-
報酬関数の設計 — rule-based reward 2 本 (
ophtho/chinese) の中身 - CHORD の実装と実験 — CHORD 単体の実装差分・ハイパラ・SFT データ設計・CHORD の結果に関する詳細考察
CHORD の詳細と結果の考察は CHORD の実装と実験 に記述しています。本記事では概要のみを扱います。
目次
- GRPO / GSPO / CHORD は何を変えたか
- 実験セットアップ
- 結果
- 結果を分けた要因の考察
1. GRPO / GSPO / CHORD は何を変えたか
3 つのアルゴリズムがそれぞれ GRPO のどこを変えたもの として位置づけられるか、という視点で並べます。GSPO も CHORD も、系譜としては GRPO の派生になります。
1.1 共通土台: GRPO
GRPO (Group Relative Policy Optimization) は DeepSeek-R1 系で使われている、PPO からの派生です。PPO の value function (critic) を捨てて、代わりに同一プロンプトに対する G 個のサンプルの報酬平均をベースラインに使うのがコアアイデアになります。
流れをそのまま図にすると以下です:
Advantage は group 内の報酬を平均・標準偏差で標準化して作ります:
A_i = (r_i - mean(r_1, r_2, ..., r_G)) / std(r_1, r_2, ..., r_G)
記号の意味:
-
A_i:i番目の completion に対する advantage -
r_i:i番目の completion に対する報酬 (rule-based reward 2 本の合成値) -
G: 同一プロンプトに対するサンプル数 (今回は 16) -
mean(...)/std(...): group 内 G 個の報酬の平均 / 標準偏差
この advantage を PPO と同じ形の loss で最適化します:
L_GRPO = -E_i [ min( ρ_t · A_i, clip(ρ_t, 1-ε, 1+ε) · A_i ) ] + β · KL(π_θ || π_ref)
記号の意味:
-
L_GRPO: GRPO の loss (最小化対象) -
E_i: group 内 G 個のサンプルに対する期待値 -
ρ_t: tokentにおける importance ratio (下の式で定義) -
A_i: 上で標準化した advantage -
clip(・, 1-ε, 1+ε): ratio を1-ε〜1+εに切り詰める clipping 関数 -
ε: clipping の幅 (GRPO のデフォルトは 0.2) -
β: ベースモデルからの KL ペナルティ係数 (今回は 0.1) -
π_θ: 現在の学習中モデル -
π_ref: 参照モデル (今回は Base 80B そのもの) -
KL(π_θ || π_ref):π_θとπ_refの Kullback-Leibler ダイバージェンス
そして token-level の importance ratio ρ_t は以下です:
ρ_t = π_θ(y_t | x, y_<t) / π_θ_old(y_t | x, y_<t)
記号の意味:
-
ρ_t: token 位置tにおける importance ratio -
π_θ(y_t | x, y_<t): 現在の学習中モデルが、promptxと直前までの生成y_<tを条件に、次 tokeny_tを出す確率 -
π_θ_old(y_t | x, y_<t): rollout 時点 (パラメータ更新前) のモデルが出していた同じ確率 -
x: 入力プロンプト (医師国試の MCQ 1 問) -
y_t: 位置tにサンプルされた token -
y_<t: 位置tより前に生成された token 列
要点は 3 つです:
- critic なし — value function を学習しなくて済むので、大規模モデルでは実装・メモリの両方で楽になります
- group 内標準化 advantage — 同一プロンプトの他 completion との相対順位が学習信号になります
- KL to reference — ベースモデルから離れすぎない縛り (β で調整)
医師国試の MCQ での動作イメージは「同じ問題を 16 回サンプルし、正解した回答を強化する」になります。
1.2 GSPO: token-level ratio → sequence-level ratio
GSPO (Group Sequence Policy Optimization) は Qwen チームが提案した、GRPO の importance ratio を token ごとではなく sequence ごと に取る派生手法です。
GRPO で token ごとに定義されていた ρ_t を、系列全体の幾何平均 (対数尤度差の平均) に置き換えます:
ρ_seq = ( π_θ(y | x) / π_θ_old(y | x) )^(1/|y|)
= exp( (1/|y|) · Σ_t [ log π_θ(y_t | x, y_<t) - log π_θ_old(y_t | x, y_<t) ] )
記号の意味:
-
ρ_seq: 系列全体で 1 個の importance ratio -
π_θ(y | x): 現在の学習中モデルが promptxから完成した系列y全体を出す確率 -
π_θ_old(y | x): rollout 時点のモデルが同じ系列を出していた確率 -
|y|: 系列yの token 長 -
Σ_t [...]: 系列内の全 token に対する対数尤度差の総和 -
exp(・): 指数関数 (対数尤度差の平均を確率比に戻す)
変わったのはここだけで、advantage 計算・KL ペナルティ・報酬設計はすべて GRPO と共通です。GRPO の loss 式内の ρ_t · A_i が ρ_seq · A_i に置き換わる形になります。
なぜ sequence-level にするか。token-level の ratio は MoE モデルで分散が大きくなりやすい (expert のルーティングが確率的に揺れるため、同じ入力でも π_θ_old と π_θ で異なる expert が選ばれ、その 1 token だけ ratio が跳ねる) というのが動機になります。sequence 単位で幾何平均を取ると、その跳ねが平均化で吸収されます。
長さ 5 の系列 y_1 y_2 y_3 y_4 y_5 について、y_3 で expert が入れ替わって ratio が 2.5 まで跳ねた ケースを考えます。GRPO と GSPO で、その ratio が loss にどう効くかを並べると以下のようになります。
GRPO: token 位置ごとに 別々の ratio が loss に掛かる
y_3 の位置だけ ratio が 2.5 になっており、その token の勾配寄与だけが 2.5 倍で叩かれます。他の 4 token は静かなまま、y_3 だけが暴れる形になります。
GSPO: 系列全体を幾何平均した 1 個の ratio が全 token に掛かる
5 個の ratio の幾何平均 (1.0 × 1.1 × 2.5 × 0.9 × 1.0)^(1/5) ≈ 1.19 を、y_1 から y_5 まで同じ値で全 token に掛けます。y_3 で発生した跳ね (2.5) は他 4 token (1.0 前後) との平均化で 1.19 に丸まり、系列全体の勾配寄与が穏やかにスケールされる形になります。
GRPO は跳ねた ratio をその token の勾配にそのまま渡すのに対し、GSPO は跳ねを系列全体で平均化してから渡します。MoE モデルのように rollout ごとに ratio が跳ねやすい設定で、この平均化が学習の安定性に寄与する構造です。
実運用上は clipping range が非常にタイトになります。今回の実験では以下の設定です:
--importance_sampling_level sequence \
--epsilon 3e-4 \
--epsilon_high 4e-4
GRPO のデフォルト ε=0.2 に対して 3 桁小さい 値になります。ratio が幾何平均で 1 の近傍に収まる想定のもとでの clipping 幅です。
1.3 CHORD: GRPO + SFT の凸結合 (詳細は別記事)
CHORD (Continuous Hybrid On-policy and off-policy Refinement with Dynamic weighting) は、on-policy RL の loss に off-policy SFT の loss を μ の重みで混ぜるアルゴリズムです。式は 1 本で書けます:
L_CHORD = (1 - μ_t) · L_GRPO + μ_t · L_SFT
記号の意味:
-
L_CHORD: CHORD の最終 loss -
L_GRPO: 1.1 で定義した GRPO の loss (on-policy 側) -
L_SFT: 追加で用意した SFT データセットに対する token-level の NLL (off-policy 側) -
μ_t: ステップtにおける混合重み (0 〜 1 の範囲)
μ_t はステップに応じてスケジューリングされ、典型的には「Warmup 0 → Peak → Decay to Valley」の形で、学習序盤ほど SFT を強く効かせ、後半は RL に主導権を渡す形になります。
オプションで token 単位の重み φ_t = p_t (1 - p_t) を SFT loss にかける拡張 (CHORD-φ) もあります。
φ_t = p_t · (1 - p_t)
記号の意味:
-
φ_t: token 位置tにおける SFT loss への追加重み -
p_t: 現在のモデルが、SFT データの正解 tokeny_t*に割り当てている確率π_θ(y_t* | x, y_<t*)
モデルがまだ確信を持てていない token (p_t ≈ 0.5) に SFT を強く焼き付ける重み付けです。
ms-swift への差し込み・μ スケジューラの実装・φ 関数の切り分け・SFT データ生成の詳細と、CHORD 結果の詳しい考察は CHORD 実装記事 にまとめています。わかりやすく言うと「GRPO の loss に SFT を μ で混ぜたもの」ということになります。
1.4 一枚表で比較する
3 手法の位置づけを 1 枚の表にまとめると以下になります:
| 観点 | GRPO | GSPO | CHORD |
|---|---|---|---|
| 由来 | DeepSeek-R1 系 | Qwen | Trinity-RFT |
| GRPO からの差分 | (base) | ratio を sequence-level に | SFT loss を μ で混合 |
| Advantage | group 標準化 | group 標準化 | group 標準化 (GRPO と同じ) |
| Importance ratio | token-level | sequence-level (幾何平均) | token-level (GRPO と同じ) |
| 追加ハイパラ | β, ε | ε (非常に小さい) | μ_peak, μ_valley, warmup, decay, φ |
| 追加データ | 不要 | 不要 | SFT データセットが必要 |
| 想定用途 | 汎用 | MoE / 大規模系列 | 教材 (SFT) が手元にある場面 |
3 手法とも「group ベースラインで advantage を作って、それを何かに掛ける」という骨格は共通で、GSPO は掛ける相手 (ratio) を、CHORD は loss に足すものを変えている、という関係になります。
2. 実験セットアップ
2.1 ベースモデルと学習リソース
| 項目 | 内容 |
|---|---|
| ベースモデル | Qwen3-Next-80B-A3B-Instruct (80B MoE) |
| 学習フレームワーク | ms-swift (release/3.11) + Megatron-LM (core_r0.14.0) |
| コンテナ | swift3.9.3.sif (Singularity) |
| 学習リソース | 8 nodes × 8 GPU (GSPO のみ 12 nodes × 8 GPU) |
2.2 学習データ (GRPO/GSPO と CHORD で構成が違う)
3 手法のうち、GRPO / GSPO は RL データのみ、CHORD は RL データ + SFT データ、という構成の違いがあります。CHORD だけデータの品目が 1 種類多い形です。
| 手法 | RL データ | SFT データ |
|---|---|---|
| GRPO |
igakuqa.jsonl (医師国試 2001-2022, MCQ + [ans] 形式) |
— |
| GSPO |
igakuqa.jsonl (同上) |
— |
| CHORD |
igakuqa.jsonl (同上) |
sft_igakuqa.jsonl (自然言語 QA + 5 部構成の医療文) |
GRPO / GSPO の RL データはすべて MCQ を [ans]選択肢[/ans] タグ形式に統一しています。詳細は 報酬設計記事 に記述しています。
CHORD の SFT データは generate_chord.py の 2 段合成パイプラインで作った「自然言語質問 → 5 部構成の医療文」形式のデータで、MCQ とは入出力フォーマットが異なる構成です。
2.3 評価データ
| データセット | 内容 | 全問題数 |
|---|---|---|
| igakuqa | 医師国試 (2023-2025) | 1,122 問 |
| specialist_exam_test_v2 | 専門医試験 (13 診療科) | 3,757 問 |
データリークなし — 学習は 2022 年以前、評価は 2023-2025 年です。
2.4 報酬関数
3 手法共通で 2 本の rule-based reward を使用しています:
| 名前 | 重み | 動作 |
|---|---|---|
ophtho |
1.5 |
[ans]...[/ans] を抽出して gold と set 単位で完全一致 → 1.0 / それ以外 → 0.0 |
chinese |
1.0 | 「。」区切りの文でひらがな/カタカナを 1 文字も含まない文が 2 文連続したら 0.0 / それ以外 1.0 |
ophtho は名前は眼科由来ですが実装は完全に汎用です。chinese は Qwen3 系の中国語モード滑りを罰する副報酬になります。詳細は 報酬設計記事 側で書いています。
2.5 ハイパラ
3 手法の設定を並べると以下です:
| ハイパラ | GRPO | GSPO | CHORD |
|---|---|---|---|
| lr | 1e-6 | 1e-6 | 1e-6 |
| β (KL) | 0.1 | 0.1 | 0.1 |
| ε (clip) | 0.2 | 3e-4 / 4e-4 | 0.2 |
| global_batch_size | 512 | 512 | 512 |
| num_generations | 16 | 16 | 16 |
| max_length | 4096 | 4096 | 4096 |
| temperature | 0.9 | 0.9 | 0.9 |
| max_epochs | 5 | 5 | 5 |
| reward_weights (ophtho, chinese) | (1.5, 1.0) | (1.5, 1.0) | (1.5, 1.0) |
| steps_per_generation | 5 | 3 | 5 |
| SFT データ併用 | — | — | あり (μ_peak=0.1, μ_valley=0.01, decay_steps=500, φ=off) |
| ノード数 | 8 | 12 | 8 |
3. 結果
3.1 全体数値
医師国家試験 (igakuqa, N=1122)
| Model | 2023 | 2024 | 2025 | All | All (text only) |
|---|---|---|---|---|---|
| Base 80B | 87.9 | 89.8 | 90.5 | 89.5 | 93.6 |
| GRPO | 88.8 | 91.0 | 90.8 | 90.3 (+0.8) | 94.2 (+0.6) |
| GSPO | 88.5 | 91.2 | 90.5 | 90.2 (+0.7) | 94.1 (+0.5) |
| CHORD | 89.1 | 91.0 | 90.8 | 90.4 (+0.9) | 94.1 (+0.5) |
年度別推移をプロットすると以下のようになります:
専門医試験 (specialist, N=3757)
| Model | All | All (text only) |
|---|---|---|
| Base 80B | 69.0 | 73.0 |
| GRPO | 71.1 (+2.1) | 74.8 (+1.8) |
| GSPO | 70.9 (+1.9) | 74.5 (+1.5) |
| CHORD | 70.0 (+1.0) | 73.9 (+0.9) |
igakuqa は Base 89.5% と天井が近く、3 手法とも +0.7 〜 +0.9 pt の狭いレンジに収まっています。specialist のほうが振れ幅が広い形になります。
3.2 統計検定 (McNemar 検定, vs Base)
igakuqa — 全手法 n.s. (天井効果)
| 比較 | p 値 | 判定 |
|---|---|---|
| Base vs GRPO | 0.349 | n.s. |
| Base vs GSPO | 0.396 | n.s. |
| Base vs CHORD | 0.282 | n.s. |
specialist — GRPO/GSPO は有意、CHORD は有意差なし
| 比較 | p 値 | 判定 |
|---|---|---|
| Base vs GRPO | 0.0013 | ** |
| Base vs GSPO | 0.0036 | ** |
| Base vs CHORD | 0.119 | n.s. |
手法間 (specialist)
| 比較 | p 値 | 判定 |
|---|---|---|
| GRPO vs GSPO | 0.775 | n.s. |
| GRPO vs CHORD | 0.076 | n.s. (やや GRPO 有利傾向) |
| GSPO vs CHORD | 0.128 | n.s. |
手法間には統計的な有意差はありません。GRPO / GSPO は Base に対して有意な改善、CHORD だけ Base 比の有意差に達しませんでした。
3.3 診療科別の得意 / 不得意
specialist 13 診療科について、Base 80B からの差分を可視化すると以下のようになります:
各手法が最大改善を叩き出した科を並べると:
| 手法 | 特に効いた科 | Base からの改善幅 |
|---|---|---|
| GRPO | 耳鼻科 / 神経内科 / 麻酔科 / 内科 | +8.6 / +5.9 / +3.3 / +2.1 |
| GSPO | 肝臓 / 産婦人科 / 消化器 / 外科 | +5.2 / +4.8 / +2.6 / +2.0 |
| CHORD | 整形外科 / 心臓外科 / 救急 | +2.8 / +2.4 / +1.7 |
最良手法は科によって異なり、GRPO: 5 科, GSPO: 5 科, CHORD: 3 科 という分布になっています。全科で一貫してリードする手法は存在しませんでした。
3.4 フォーマット遵守率
全モデル × 全データセットで [ans]...[/ans] パース失敗率 0.0% です。CHORD も含めてフォーマット崩壊は起きていません。
4. 結果を分けた要因の考察
4.1 GRPO と GSPO はほぼ同着
GRPO と GSPO は specialist で 71.1 / 70.9、igakuqa で 90.3 / 90.2 と、ほぼ同じ数値です。McNemar 検定 (specialist) でも p = 0.775 で有意差なしになりました。
GSPO は sequence-level importance ratio によって MoE 特有の rollout 分散を抑える手法で、想定効果は accuracy への直接効果ではなく学習安定性 (loss 曲線の滑らかさ・divergence 率) に現れる性質のものです。今回の 5 epoch × 500-step クラスの学習長では GRPO 側も発散せずに収束したため、GSPO のメリットは accuracy 差として現れませんでした。
診療科別の分布を見ると、GRPO は耳鼻科 (+8.6) / 神経内科 (+5.9) といった Base で相対的に弱かった科で伸び、GSPO は肝臓 (+5.2) / 産婦人科 (+4.8) といった別の科で伸びる形で、総合値としては相殺される分布になっています。
4.2 CHORD が有意差に達しなかった件
specialist で CHORD だけ有意差に達しませんでした (p = 0.119)。原因の切り分けと今後の可能性は CHORD の実装と実験 の考察節に記述しています。本記事ではその結果のみを記録します。
4.3 診療科別ばらつきの解釈
診療科ごとに最良手法が違う (GRPO: 5 科, GSPO: 5 科, CHORD: 3 科) 分布は、以下のように読めます。
- Base の科別到達度と残余改善余地の関数: Base が元々弱い科 (耳鼻科 54.7%, 心臓外科 63.3%, 神経内科 62.9% など) のほうが改善余地が大きく、手法ごとに埋められる余地の形が違う
- 報酬信号は科を区別しない: 今回の報酬は正解 / 不正解の二値で、診療科を明示的に区別する信号は入れていません。手法ごとに動きやすい知識回路の癖が、科別スコアに間接的に現れる形になります
GRPO の耳鼻科 +8.6 pt は、Base が 54.7% と 13 科中で最も低かったことと、GRPO の token-level ratio が頻度の低い専門用語への学習圧を通しやすいことの組み合わせで説明できます。GSPO の肝臓 (+5.2) / 産婦人科 (+4.8) は、sequence-level ratio が長めの推論を一括で評価する性質と、これらの科の問題が複数症状の統合判断寄りであることに整合します。CHORD の整形外科 / 心臓外科 / 救急でのリードは、SFT データ (5 部構成の医療文) が「症状 → 対応 → 受診目安」という記述構造を持っており、手術系 / 急性期系の科の推論と結果的に噛み合った形と読めます。
いずれも observational な解釈で、3 手法 × 13 科の 39 セルでは科と手法を組み合わせて使い分ける結論を出すには母数不足です。「手法ごとに得意な科の分布が違う」という事実の観察に留める、というのが現状の位置づけになります。
謝辞
この成果は、NEDO(国立研究開発法人新エネルギー・産業技術総合開発機構)の 委託業務(JPNP25006)の結果得られたものです。
参考文献
- Shao et al. (2024) "DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models" arXiv:2402.03300 — GRPO の原典
- Zheng et al. (2025) "Group Sequence Policy Optimization" arXiv:2507.18071 — GSPO の原典
- Wu et al. (2025) "CHORD: On-Policy Reinforcement Learning with Off-Policy Supervision" arXiv:2508.11408 — CHORD の原典
- DeepSeek-AI (2025) "DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning" arXiv:2501.12948 — GRPO を活用した代表的な後続研究
学習済みモデル (HuggingFace)

