模試を返されたとき、あなたが最初に見るのは素点でしょうか、それとも偏差値でしょうか。素点が62点だと言われても、それが良いのか悪いのかは分かりません。平均が40点なら快挙ですし、平均が85点なら赤信号です。だから私たちは「同じ問題を解いた集団の中で、自分はどこにいたか」を見ます。この、絶対評価ではなく集団内の相対位置で採点するという発想を、そのまま大規模言語モデルの強化学習に持ち込んだのが GRPO(Group Relative Policy Optimization) です。
GRPOは2024年にDeepSeekのShaoらがDeepSeekMath(arXiv:2402.03300)で提案し、2025年のDeepSeek-R1(arXiv:2501.12948)で一気に有名になりました。R1の前身であるDeepSeek-R1-Zeroは、教師ありファインチューニングを一切挟まず、ベースモデルにGRPOだけをかけて推論能力を立ち上げています。論文によれば、AIME 2024のpass@1は学習開始時の15.6%から71.0%まで上がり、多数決を併用すると86.7%に達しました。「解答例を人手で書かせなくても、答え合わせさえできれば推論モデルは育つ」という主張は、この結果が支えています。
GRPOを理解すると、次のような場面で直接役立ちます。
- 推論モデルの学習: 数学・コード・論理パズルのように答え合わせができるドメインで、自前のモデルに長い思考を獲得させる標準的な手段になっています
- RLHFの計算コスト削減: PPOでは学習時に巨大モデルを4つメモリに載せる必要がありましたが、GRPOはcritic(価値関数)を丸ごと捨てるため、学習対象のパラメータと最適化器の状態がおよそ半分になります
- 後続手法を読むための土台: DAPO、Dr.GRPO、RLOOといった2025年以降の手法は、ほぼ全て「GRPOのどこが歪んでいるか」という議論から出発しています
本記事の内容
- PPOがLLMに持ち込むコストと、criticという弱点
- PPOの目的関数からGRPOの目的関数への数式による接続
- グループ正規化アドバンテージ $\hat{A}_i = (r_i – \mathrm{mean}(\mathbf{r}))/\mathrm{std}(\mathbf{r})$ の導出と意味
- クリッピングとKL正則化の置き方(PPOとどこが違うか)
- 検証可能な報酬(RLVR)との組み合わせがなぜ効くのか
- DeepSeek-R1-Zeroの「応答長の自発的増加」と「Aha moment」の解釈
- グループサイズ・報酬ハッキング・std=0といった実装上の落とし穴
- 長さバイアスなど既知の批判と、Dr.GRPO・DAPOによる是正
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- PPO(Proximal Policy Optimization)の理論と実装 — GRPOが出発点にするアルゴリズム
- RLHFの仕組みを3ステップで完全理解する — LLMに強化学習をかける全体像
- 方策勾配法の理論と導出を解説して実装する — アドバンテージとベースラインの基礎
GRPOが解こうとした問題
PPOは学習時に巨大モデルを4つ抱える
LLMをRLHFで調整するとき、標準的なPPOの構成では次の4つのネットワークが同時にメモリに乗ります。
- 方策 $\pi_\theta$(学習対象。勾配と最適化器の状態を持つ)
- 参照方策 $\pi_{\text{ref}}$(凍結。KL正則化の基準)
- 報酬モデル $r_\phi$(人間の選好で事前学習済み)
- 価値関数 $V_\psi$(critic)(学習対象。勾配と最適化器の状態を持つ)
このうち勾配を持つのは1と4です。Adamを使う場合、パラメータ本体に加えて一次・二次モーメントを保持するので、学習対象が2つあると、この重いメモリを2セット確保することになります。criticは通常、方策と同規模のバックボーンに価値ヘッドを付けて作られるため、「もう一つのLLMを丸ごと訓練している」のと変わりません。

図1の左がPPO、右がGRPOです。赤枠が「勾配と最適化器の状態を持つ大きなモデル」で、PPOでは2つ、GRPOでは1つです。GRPOはさらに、学習済みの報酬モデルを検証器(答え合わせのルール)に置き換えることで、推論時に載せるモデルも減らしています。critic一つを消すだけで、学習ステップあたりのメモリと計算がおおむね半減する、というのがGRPOの実務的な売り文句です。
criticはLLMでは特に育てにくい
もっとも、メモリだけが理由なら「小さいcriticを使えばいい」で終わります。GRPOがcriticを捨てたのは、LLMの生成タスクではcriticが構造的に育ちにくいからです。
まず、生成タスクの報酬は末尾にしか発生しません。数学の問題を1000トークンかけて解かせ、最後の答えが合っていれば1、外れていれば0。途中の999トークンには報酬が一切ありません。criticの仕事は「この途中状態から最終的にどれくらいの報酬が得られるか」を予測することですが、これは「解答の書き出しを300トークン見た時点で、この解き筋が最終的に正解にたどり着く確率」を当てろという要求です。人間の採点者でも難しい予測を、価値ヘッド一枚に学習させることになります。
さらに、方策が学習で変わるたびに真の価値関数も変わるので、criticは常に動く標的を追いかけます。criticの推定がずれるとアドバンテージがずれ、アドバンテージがずれると方策が壊れ、壊れた方策が生成したデータでcriticがさらにずれる。この悪循環がPPOによるLLM学習の不安定さの主因の一つです。
そこでGRPOは問いを立て直します。「未来の報酬を予測する審判を育てる」のをやめて、実際に何本も解かせて、その結果を並べて比べればいいのではないか。次節でこの直感を詰めます。
直感: critic を「偏差値」で置き換える
冒頭の模試の比喩に戻りましょう。PPOのcriticは、あなたが解答用紙を書き終える前に「この生徒はだいたい62点くらいだろう」と予想する審判です。予想が当たっていればアドバンテージ $r – V(s)$ は正確ですが、審判の育成コストは高く、しかも当てるのが難しい。
GRPOのやり方は違います。同じ問題を $G$ 人(=同じモデルからの $G$ 本のサンプル)に解かせて、全員の得点を並べるのです。平均より上なら加点、下なら減点。予想する必要はありません。実測した集団があるのだから、その平均をそのままベースラインに使えばよい、という発想です。

図2は $G = 6$ の例です。同じ問題に6本の解答を生成し、検証器が2本を正解($r=1$)、4本を不正解($r=0$)と判定しました。グループの平均は $1/3$、標準偏差は $\sqrt{2}/3 \approx 0.471$ なので、正解には $\hat{A} = +1.41$、不正解には $\hat{A} = -0.71$ が付きます。合計するとちょうどゼロになる点に注目してください。グループ内で「誰かの加点は誰かの減点」という配分になっており、critic は最後まで登場しません。
ここまでが直感です。次は、この置き換えがPPOの目的関数からどう出てくるのかを、式で追いかけます。
PPOの目的関数から出発する
LLMの生成をトークン単位のMDPとして書く
プロンプト $q$ に対して応答 $o = (o_1, o_2, \ldots, o_{|o|})$ を生成する過程は、状態を「これまでのトークン列」、行動を「次のトークン」とするマルコフ決定過程として書けます。方策は
$$
\pi_\theta(o \mid q) = \prod_{t=1}^{|o|} \pi_\theta(o_t \mid q, o_{ です。PPOはトークンごとの重要度比 $$
\rho_t(\theta) = \frac{\pi_\theta(o_t \mid q, o_{ を使い、クリッピング付きの代理目的関数 $$
L^{\text{CLIP}}(\theta) = \mathbb{E}_t\left[\min\left(\rho_t(\theta)\hat{A}_t, \ \mathrm{clip}(\rho_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t\right)\right]
$$ を最大化します。ここまではPPOの記事と同じです。問題は $\hat{A}_t$ をどう作るか、の一点に絞られます。 PPOはGAE(Generalized Advantage Estimation)でアドバンテージを作ります。1ステップのTD誤差を $\delta_t = r_t + \gamma V_\psi(s_{t+1}) – V_\psi(s_t)$ として $$
\hat{A}_t^{\text{GAE}} = \sum_{l=0}^{\infty}(\gamma\lambda)^l \delta_{t+l}
$$ でした。$\delta_t$ の中に $V_\psi$ が2回現れている通り、PPOのアドバンテージはcriticなしでは1文字も書けません。criticを外すというのは、この $\hat{A}_t$ を別の何かで作り直すということです。 しかも、末尾でしか報酬が出ない生成タスクでは $r_t = 0$($t < |o|$)なので、途中のTD誤差は $\delta_t = \gamma V_\psi(s_{t+1}) - V_\psi(s_t)$、つまりcriticの推定値の差分だけになります。中間報酬がない以上、途中トークンの良し悪しの情報はcriticの中にしか存在しない。criticの品質がそのまま学習信号の品質になるという、極めて脆い構造です。 GRPOはここで割り切ります。「どのトークンが良かったか」を推定するのを諦め、応答1本まるごとに1つのアドバンテージを与えて、その応答の全トークンに同じ値を配るのです。 $$
\hat{A}_{i,t} = \hat{A}_i \quad (\forall t = 1, \ldots, |o_i|)
$$ これは情報を捨てる操作なので、当然コストがあります。1000トークンのうち1トークンだけ計算ミスをして不正解になった場合でも、全1000トークンが等しく「悪い」と評価されてしまう。しかし裏を返せば、捨てた分だけバイアスの源であるcriticが不要になるわけです。GAEでいう $\lambda = 1$(モンテカルロ推定)に振り切った選択と見ることもできます。バイアスを消して分散を受け入れ、その分散はグループ内での比較で潰す、という設計です。 では、応答1本のアドバンテージ $\hat{A}_i$ をどう作るか。ここが本記事の核心です。 方策勾配定理から、期待報酬 $J(\theta) = \mathbb{E}_{o \sim \pi_\theta}[r(q, o)]$ の勾配は $$
\nabla_\theta J(\theta) = \mathbb{E}_{o \sim \pi_\theta}\left[\nabla_\theta \log \pi_\theta(o \mid q)\, r(q, o)\right]
$$ です。この推定量は分散が非常に大きいので、通常はベースライン $b(q)$ を引きます。重要なのは、$b$ が $o$ に依存しない限り、何を引いても勾配の期待値は変わらないことです。実際、 $$
\mathbb{E}_{o \sim \pi_\theta}\left[\nabla_\theta \log \pi_\theta(o\mid q)\, b(q)\right]
= b(q) \sum_o \pi_\theta(o\mid q)\, \frac{\nabla_\theta \pi_\theta(o\mid q)}{\pi_\theta(o\mid q)}
$$ と書けます。$\pi_\theta$ が約分できるので、和と微分を入れ替えて $$
= b(q)\, \nabla_\theta \sum_o \pi_\theta(o \mid q) = b(q)\, \nabla_\theta 1 = 0
$$ となり、ベースライン項の寄与はきれいに消えます。criticが担っていた $V(s)$ も、要するに「分散を減らすためのベースライン」でした。であれば、criticでなくても分散が減る $b(q)$ を用意できればよい、ということになります。 理想的なベースラインは、そのプロンプトから得られる報酬の期待値 $$
V(q) = \mathbb{E}_{o \sim \pi_\theta(\cdot\mid q)}\left[r(q, o)\right]
$$ です。criticは、この $V(q)$ をニューラルネットで予測しようとしていました。しかしGRPOは同じ $q$ から $G$ 本の応答 $o_1, \ldots, o_G$ を実際にサンプルしています。ならば $$
\hat{V}(q) = \frac{1}{G}\sum_{j=1}^{G} r_j = \mathrm{mean}(\mathbf{r})
$$ というモンテカルロ推定を直接ベースラインに使えばよい。これがGRPOの第一歩です。追加のパラメータもネットワークもいりません。必要なのは、同じプロンプトに複数回答えさせるという、推論バッチを少し組み替えるだけの実装変更です。 厳密には注意点があります。ベースライン $\mathrm{mean}(\mathbf{r})$ は $r_i$ 自身を含んでいるので、$o_i$ と独立ではありません。先ほどの「ベースラインを引いても不偏」の証明は使えないので、直接計算します。 $$
\mathbb{E}\left[\nabla_\theta \log \pi_\theta(o_i)\left(r_i – \frac{1}{G}\sum_{j=1}^{G} r_j\right)\right]
$$ 和を $j = i$ の項とそれ以外に分けます。$j \neq i$ の項は $o_j$ が $o_i$ と独立なので期待値が分離でき、$\mathbb{E}[\nabla_\theta \log \pi_\theta(o_i)] = 0$ より消えます。残るのは $j = i$ の項だけで、 $$
= \left(1 – \frac{1}{G}\right)\mathbb{E}\left[\nabla_\theta \log \pi_\theta(o_i)\, r_i\right]
= \left(1 – \frac{1}{G}\right)\nabla_\theta J(\theta)
$$ となります。つまり方向は真の方策勾配と完全に一致し、大きさだけ $(1-1/G)$ 倍に縮む。学習率の定数倍にすぎないので実害はありません。$G = 8$ なら0.875倍です。 なお、この $1/G$ の縮みすら嫌うなら、自分を除いた平均 $b_i = \frac{1}{G-1}\sum_{j\neq i} r_j$ を使えば完全に不偏になります。これがRLOO(Ahmadian et al., 2024)の「leave-one-out ベースライン」です。GRPOとRLOOの差は本質的にはこの一点で、両者は近い親戚です。 GRPOのアドバンテージは、平均を引くだけでは終わりません。 $$
\hat{A}_i = \frac{r_i – \mathrm{mean}(\mathbf{r})}{\mathrm{std}(\mathbf{r})}
$$ 標準偏差で割る操作は、統計でいう標準化そのものです。狙いは2つあります。 第一に、報酬のスケールに対する不変性です。検証器が0/1を返そうが0/100を返そうが、フォーマット報酬を0.1だけ足そうが、標準化後のアドバンテージは変わりません。報酬設計をいじるたびに学習率を調整し直す手間から解放されます。 第二に、バッチ内でアドバンテージのスケールが揃うことです。1つのバッチには易しい問題と難しい問題が混ざっていますが、標準化すればどのグループも平均0・標準偏差1のアドバンテージを出すので、特定の問題が勾配を独占することがなくなります。 ただし、平均を引くのと違って標準偏差で割るのは非線形な操作なので、勾配の期待値を保存しません。ここでGRPOは明確に「不偏性を捨てて実用的な安定性を取った」わけで、この選択が後で述べる批判の火種になります。 検証可能な報酬(正解=1、不正解=0)を使う場合、アドバンテージは驚くほど単純な形になります。$G$ 本中 $k$ 本が正解、正解率を $p = k/G$ とすると、$\mathrm{mean}(\mathbf{r}) = p$、$\mathrm{std}(\mathbf{r}) = \sqrt{p(1-p)}$ です。これを代入すると、正解した応答に付くアドバンテージは $$
\hat{A}_{+} = \frac{1 – p}{\sqrt{p(1-p)}} = \sqrt{\frac{1-p}{p}} = \sqrt{\frac{G-k}{k}}
$$ 不正解の応答に付くアドバンテージは $$
\hat{A}_{-} = \frac{0 – p}{\sqrt{p(1-p)}} = -\sqrt{\frac{p}{1-p}} = -\sqrt{\frac{k}{G-k}}
$$ となります。$k\hat{A}_+ + (G-k)\hat{A}_- = \sqrt{k(G-k)} – \sqrt{k(G-k)} = 0$ で、確かに合計はゼロです。 この式が示す事実は重要です。二値報酬のGRPOでは、アドバンテージはグループ内の正解率だけで決まります。応答の中身も長さも一切関係ありません。 図3の左がGRPO($\mathrm{std}$ で割る)です。$G=8$ で1本しか正解しなかった難問では、その1本に $\sqrt{7} \approx 2.65$ という大きなアドバンテージが付きます。一方、8本中7本が正解する易しい問題では、正解の加点は $1/\sqrt{7} \approx 0.38$ しかありません。希少な成功ほど強く増幅されるという、自動カリキュラムのような性質が式から自然に出てきます。 右は標準偏差で割らない場合で、$\hat{A}_+ = 1 – p$ と線形になります。難問を重視する傾向は残りますが、増幅は $\sqrt{\cdot}$ ほど急ではありません。左右を見比べると、標準偏差での割り算が「問題の難易度に応じた重み付け」を暗黙に導入していることが分かります。これが利点か歪みかは、後の批判の節で検討します。 これでアドバンテージの正体が分かりました。次は、これをPPOのクリッピング目的関数に載せて、GRPOの完成形を組み立てます。 以上をまとめると、GRPOの目的関数は次のように書けます。 $$
\begin{aligned}
\mathcal{J}_{\text{GRPO}}(\theta) = \mathbb{E}\Bigg[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\Big\{
&\min\Big(\rho_{i,t}(\theta)\hat{A}_i,\ \mathrm{clip}\big(\rho_{i,t}(\theta), 1-\epsilon, 1+\epsilon\big)\hat{A}_i\Big) \\
&- \beta\, \mathbb{D}_{\text{KL}}\big[\pi_\theta \,\|\, \pi_{\text{ref}}\big]_{i,t}\Big\}\Bigg]
\end{aligned}
$$ ここで期待値は $q \sim P(Q)$、$\{o_i\}_{i=1}^{G} \sim \pi_{\theta_{\text{old}}}(\cdot \mid q)$ について取ります。各部品の役割を確認しましょう。 PPOと構造は瓜二つですが、決定的に違うのは $\hat{A}$ の作り方と、KL項の置き場所です。順に見ます。 クリッピングの意味はPPOと変わりません。同じロールアウトを複数エポック使い回すと、$\pi_\theta$ が $\pi_{\theta_{\text{old}}}$ から離れて重要度比が暴れます。それを $[1-\epsilon, 1+\epsilon]$ に押し込めるのがクリッピングです。 図4の左は $\hat{A}_i > 0$(グループ内で相対的に良い応答)の場合です。$\rho > 1+\epsilon$ になると目的関数が平らになり、勾配がゼロになります。「良い応答だからといって、一度の更新でその確率を1.2倍以上には上げさせない」というブレーキです。右は $\hat{A}_i < 0$ の場合で、今度は $\rho < 1-\epsilon$ で平らになり、悪い応答の確率を下げすぎることを防ぎます。 左図の橙の点線は、後述するDAPOの「clip-higher」です。上限だけを $1+\epsilon_{\text{high}}$ に緩めることで、低確率トークンの確率を上げる余地を残しています。上限が厳しいと、もともと確率の低いトークン(=新しい発想)が伸びる前に頭打ちになり、方策のエントロピーが早期に潰れてしまうためです。 ここがGRPOの見落とされやすい相違点です。RLHFの標準的なPPO実装では、KL罰則を報酬に埋め込みます。 $$
r_t^{\text{PPO}} = r_\phi(q, o) – \beta \log \frac{\pi_\theta(o_t \mid q, o_{ この報酬をGAEに流し込むので、KL罰則はcriticの推定を経由してアドバンテージに混ざります。つまりKLの効き方は、criticの精度に依存してしまいます。 対してGRPOは、KL項を報酬に混ぜず、目的関数に独立した正則化項として直接足します。上の完成形で $-\beta \mathbb{D}_{\text{KL}}$ が $\min(\cdot)$ の外に出ているのはそのためです。アドバンテージの計算経路とKL罰則の経路が完全に分離されるので、$\beta$ を動かしたときの挙動が読みやすくなります。 もう一つ、KLの推定量の選び方にも工夫があります。GRPOはSchulmanの「k3推定量」を使います。$\rho = \pi_{\text{ref}}(o_{i,t}) / \pi_\theta(o_{i,t})$ とおいて $$
\mathbb{D}_{\text{KL}}\big[\pi_\theta \,\|\, \pi_{\text{ref}}\big]_{i,t} = \rho – \log \rho – 1
$$ です。この式が本当にKLの不偏推定になっていることを確かめておきましょう。$o_{i,t}$ は $\pi_\theta$ からサンプルされているので、$\mathbb{E}_{\pi_\theta}[\rho] = \sum \pi_\theta \cdot \frac{\pi_{\text{ref}}}{\pi_\theta} = 1$ です。よって $$
\mathbb{E}_{\pi_\theta}\left[\rho – \log\rho – 1\right] = 1 – \mathbb{E}_{\pi_\theta}\left[\log \frac{\pi_{\text{ref}}}{\pi_\theta}\right] – 1 = \mathbb{E}_{\pi_\theta}\left[\log \frac{\pi_\theta}{\pi_{\text{ref}}}\right] = D_{\text{KL}}(\pi_\theta \| \pi_{\text{ref}})
$$ となり、確かに不偏です。しかも $f(\rho) = \rho – \log\rho – 1$ は $\rho > 0$ で凸、$f(1) = 0$、$f'(1) = 0$ なので、常に非負です。 図5に3つの推定量を並べました。素朴な $k_1 = -\log\rho$ も期待値としては不偏ですが、$\log\rho > 0$ の領域で値が負になります。KLは定義上非負なのに、1サンプルごとの罰則が負になるということは、「参照モデルから離れたのにご褒美が出る」瞬間が生じるということです。$k_2 = \frac{1}{2}(\log\rho)^2$ は非負ですが偏りがあります。$k_3$ だけが不偏と非負を両立し、分散も $k_1$ より小さい。トークンごとに罰則を計算する用途では、この性質が効きます。詳しくはKLダイバージェンス完全ガイドも参照してください。 なお、$\beta$ をどう置くかは論争的です。検証可能な報酬で長時間学習させる場合、参照モデルへの拘束はむしろ探索を阻害するとして、後述のDAPOではKL項そのものを外しています。「参照モデルから離れてはいけない」という前提は、モデルの振る舞いを大きく変えたい推論学習では必ずしも正しくないからです。 数式を追ったところで、アドバンテージ計算を実際のコードで確認しましょう。 出力は順に 最後の「全員正解」に注目してください。全ての報酬が同じだと分子も分母もゼロになり、 続いて損失本体です。トークンごとのlog確率が揃っている前提で書きます。 コードを読むと、GRPOがPPOのどこを差し替えたのかが一目で分かります。 GRPOの威力が最大化されるのは、RLVR(Reinforcement Learning with Verifiable Rewards、検証可能な報酬による強化学習)と組み合わせたときです。RLVRという呼び名はTülu 3(Lambert et al., 2024)で広まりました。報酬を学習済みニューラルネットではなく、決定的なプログラムで与えます。 DeepSeek-R1-Zeroの報酬はまさにこの構成で、精度報酬とフォーマット報酬だけを使い、ニューラルな報酬モデルは使っていません。論文はその理由を明示的に述べています。ニューラルな報酬モデルは大規模なRLで報酬ハッキングを起こしやすく、しかも報酬モデル自体の再学習に追加のリソースが必要だから、というものです。 学習された報酬モデルは、方策から見れば「騙せる相手」です。方策は報酬モデルの弱点を探し、人間には価値のない出力で高スコアを取る方法を必ず見つけます。これが報酬ハッキングです。強化学習の枠組みでは、方策は与えられた報酬を最大化することしかしません(ベルマン方程式の導出と解釈で見た通り、最適方策は報酬の定義に完全に従属します)。報酬の定義が現実の目的とわずかにずれていれば、そのずれは最適化によって拡大されます。 検証器はこの弱点をかなり塞ぎます。数式の答えが合っているかどうかは、方策がどんなに巧妙な文章を書いても変えられません。報酬信号にノイズがなく、しかも方策の進化に対して固定されているので、いくら学習を回しても報酬が壊れません。GRPOのように「報酬をグループ内で正規化して強い勾配に変換する」アルゴリズムでは、報酬のノイズがそのまま学習の不安定さになるため、決定的な報酬との相性は特に良いのです。 「正解か不正解かの2値では情報が粗すぎるのでは」という疑問は自然です。ところが、グループ相対化がこれを解決します。 1本しか生成しなければ報酬は0か1の2通りですが、$G=8$ 本生成すれば、そのグループの正解率は $0/8, 1/8, \ldots, 8/8$ の9通りの値を取ります。個々の報酬は2値でも、グループの正解率は問題の難易度を測る連続に近い量になるのです。図3で見た通り、アドバンテージはこの正解率だけの関数でした。つまりGRPOは、2値の答え合わせから「この問題はこのモデルにとってどれくらい難しいか」を毎ステップ推定し、それを学習信号の強度に変換しています。 しかも増幅は $\sqrt{(1-p)/p}$ という形なので、まぐれで解けた難問には強い正の勾配、ほぼ解ける易問にはわずかな勾配しか流れません。明示的にカリキュラムを組まなくても、モデルの実力の少し上にある問題が自動的に重視されるわけです。R1-Zeroが素のベースモデルから推論を立ち上げられた理由の一端は、ここにあります。 一方で、RLVRの適用範囲は検証器が書ける範囲に限られます。「この要約は読みやすいか」「この返答は思いやりがあるか」を判定するプログラムは書けません。そうしたタスクでは、結局は報酬モデルか、DPOのような選好データを直接使う手法に頼ることになります。GRPOはRLHF全般の置き換えではなく、検証可能なドメインに特化して強い手法だと理解しておくのが正確です。 ここまでで仕組みは揃いました。次は、この仕組みを実際にベースモデルへ適用したときに何が起きたかを見ます。 R1-Zeroの学習で最も印象的な観測は、学習が進むにつれてモデルの平均応答長が伸び続けたことです。重要なのは、報酬に長さの項が一切なかったという点です。「長く考えたら加点」とは誰も言っていないのに、モデルは自分から長く考えるようになりました。 図6の右がこの現象の概念図です(実測値ではなく、傾向を示す模式的な曲線です)。左の図は後述する長さバイアスの話なので、いまは右だけ見てください。 なぜ長さが伸びるのかは、GRPOの構造から素直に説明できます。難しい問題では、途中で立ち止まって検算する・別の解法を試す・場合分けを増やすといった行動が正解率を上げます。正解率が上がれば、その応答は正のアドバンテージを受け取る。すると、そうした行動を引き起こすトークン(「Wait」「Let me reconsider」など)の確率が上がる。結果として、長さは目的ではなく、正解率という目的の副産物として伸びていきます。強化学習の言葉でいえば、長い思考は道具的(instrumental)に選択されているわけです。 これは、Chain-of-Thought推論をプロンプトで指示するのとは根本的に違います。CoTは「段階的に考えてください」と人間が外から指示する手法ですが、R1-Zeroではどれくらい長く、どういう手順で考えるかをモデル自身が報酬から発見しています。テスト時計算量(test-time compute)の配分を、学習を通じて獲得したと言い換えてもよいでしょう。 R1論文が紹介した有名なエピソードが「Aha moment」です。学習の途中段階で、モデルが解答の途中で立ち止まり、擬人的な口調で自分の解法を見直し始めた、というものです。論文には「Wait, wait. Wait. That’s an aha moment I can flag here.」といった出力が引用されています。 この現象をどう解釈すべきかは慎重になるべきところです。「モデルが突然賢くなった」という読み方は行き過ぎでしょう。より妥当なのは、「立ち止まって見直す」という振る舞い自体は事前学習の段階で既にレパートリーに存在しており、GRPOがそれを前面に引き上げたという解釈です。方策勾配は新しい行動を無から作るのではなく、既にある行動の確率を上げ下げするだけの操作だからです。人間が書いたテキストには、途中で考え直す文章が大量に含まれています。それが正解率を上げる行動である以上、報酬はその確率を押し上げます。 とはいえ、この観測が示す意味は小さくありません。どういう思考手順が有効かを人間が教えなくても、報酬だけで自己検証や再考が前面化することを示したからです。複数の解答を並べて多数決を取るSelf-Consistencyが推論時に外側でやっていたことを、GRPOは学習時に内側へ取り込んだ、という見方もできます。 R1-Zeroには明確な弱点もありました。論文が挙げているのは可読性の低さと言語混在です。報酬は答えが合っているかしか見ていないので、思考過程が人間に読めるかどうかは最適化されません。英語と中国語が1つの応答の中で混ざることもありました。報酬に書かれていないことは最適化されない、という強化学習の基本がそのまま出た形です。 DeepSeek-R1はこの弱点に対して、GRPOの前に少量の高品質な「cold-start」データで教師ありファインチューニングを挟み、さらに言語一貫性の報酬を加える、という多段の構成を取りました。ここから読み取れる教訓は明快です。GRPOとRLVRは能力を引き上げるが、人間にとっての使いやすさは別途、報酬か初期化で面倒を見る必要があるということです。 $G$ はGRPO最大の設計変数です。トレードオフは明快で、$G$ を増やすとベースライン $\mathrm{mean}(\mathbf{r})$ の推定精度が上がり、勾配の分散が減ります。一方、生成コストは $G$ に比例して増えます。しかもGRPOの計算時間の大半は方策更新ではなくロールアウト(生成)なので、$G$ は総コストにほぼ線形に効きます。 図7の左は、その問題の真の正解率を $p$ としたときに、$G$ 本が全て同じ結果になる確率 $p^G + (1-p)^G$ です。これが「そのグループが学習信号を一切生まない確率」になります。$G=4$ では $p=0.5$ の問題でも12.5%が無駄になり、$p=0.2$ なら44%が無駄です。$G$ を増やすとこの確率は急速に下がりますが、$p$ が0や1に極端に近い問題は $G=64$ でも救えません。モデルにとって難しすぎる問題・易しすぎる問題は、$G$ をいくら増やしても学習に寄与しないのです。 右は $p$ が一様分布だと仮定したときの有効グループ率 $1 – 2/(G+1)$ と、それを生成コスト $G$ で割った値です。有効グループ率は $G$ とともに単調に上がりますが、コストあたりの効率は $G$ が小さいほど良い。したがって $G$ の選択は「勾配の分散をどこまで許容するか」と「1ステップにどれだけ生成予算を使えるか」の妥協点になります。$G$ を増やすより、無信号になる問題をデータ側で除外するほうが効率が良い場面が多いという示唆も、この図から読み取れます。 グループ内の全応答が同じ報酬になると、アドバンテージが $0/0$ になります。実装での対処は3通りあります。 問題は、学習が進むほど1と2の状況が増えることです。モデルが強くなると易しい問題は全問正解になり、無信号のグループが増えます。学習後半でバッチの有効サンプル数が減り、実効的な勾配のノイズが増える。DAPOがDynamic Samplingを導入したのは、この「学習が進むほど信号が痩せていく」現象への対処です。 検証可能な報酬でも、ハッキングは消えません。実際に観測される典型例を挙げます。 対策としては、フォーマット報酬の重みを精度報酬より十分小さくすること、検証器を厳格に書いて回帰テストを持つこと、そして学習中に生成サンプルを人間が定期的に目視することです。報酬が上がっているのに実力が上がっていないという兆候は、報酬曲線だけを見ていると絶対に気づけません。 長い思考を許す学習では、最大生成長で応答が打ち切られる(truncate)ケースが頻発します。打ち切られた応答に機械的に報酬0を与えると、「長い思考」そのものに強い罰が入り、せっかく伸び始めた思考長が潰れます。DAPOのOverlong Reward Shapingは、打ち切り長に近づくにつれて罰を段階的に強める形にして、この急激な罰を和らげています。 そのほか実装で踏みやすい点を挙げておきます。$\pi_{\theta_{\text{old}}}$ のlog確率は生成時のものをそのまま保存するのが基本ですが、推論エンジンと学習フレームワークで数値が微妙にずれることがあり、比 $\rho$ が学習開始前から1を外れることがあります。また、アドバンテージの正規化をグループ単位で行うのかバッチ全体で行うのかは実装によって異なり、後者を選ぶとGRPOの「グループ相対」という性質が薄まります。数式のどこで平均を取っているかを、必ずコードと突き合わせて確認してください。 GRPOの定式化に対する最も鋭い批判は、Liuらの「Understanding R1-Zero-Like Training: A Critical Perspective」(2025)です。この論文はGRPOに2つの系統的なバイアスがあると指摘しました。 第一は、応答長による偏り(length bias)です。目的関数の $\frac{1}{|o_i|}\sum_t$ という平均が犯人です。応答 $i$ の総寄与は、トークン数で割ってから足しているので、応答の長さによらず一定になります。つまり、誤答($\hat{A}_i < 0$)を100トークンで書いても2000トークンで書いても、受け取る総ペナルティは同じです。 図6の左がこれを示しています。赤線がGRPOで、誤答の総ペナルティは長さに対して水平です。緑線は分母を定数にした場合で、総ペナルティが長さに比例して増えます。GRPOの側では、誤答を長く書くことのコストがゼロなので、勾配は誤答を長く伸ばす方向に系統的に偏ります。学習中に応答長が伸びるのは推論の獲得だと解釈されがちですが、少なくとも一部はこの正規化が生んだ人工物だ、というのが指摘の核心です。 第二は、問題の難易度による偏り(difficulty bias)です。$\mathrm{std}(\mathbf{r})$ で割る操作が、正解率が0か1に近い問題ほど大きな重みを与えます。図3の左で見た $\sqrt{(1-p)/p}$ の急な立ち上がりがそれです。自動カリキュラムとして機能する面もありますが、同時に同じ問題が過剰に重み付けされるという副作用があります。 Dr.GRPO(GRPO Done Right)の処方箋は単純で、この2つの割り算をやめることです。トークン方向は $1/|o_i|$ ではなく定数で割り、標準偏差での正規化も外して $\hat{A}_i = r_i – \mathrm{mean}(\mathbf{r})$ とします。論文は、この修正で応答長の不自然な増加が抑えられ、トークン効率が改善すると報告しています。実装上は数行の変更にすぎませんが、目的関数の意味は大きく変わります。 もう一つの主要な改良がDAPO(Decoupled Clip and Dynamic sAmpling Policy Optimization、2025)です。4つの技術を組み合わせています。 さらにDAPOはKL項そのものを外しています。推論能力の獲得では方策が参照モデルから大きく離れることこそが目的なので、$\pi_{\text{ref}}$ への拘束が邪魔になる、という判断です。GRPOの原型からKLが消えるという事実は、「GRPOの本質はKL正則化ではなく、グループ相対アドバンテージにある」ことを裏側から示しています。 最後に、近接する手法との関係を整理しておきます。 PPOとの関係: GRPOはPPOのクリッピング構造をそのまま受け継ぎ、アドバンテージの作り方だけを差し替えた手法です。criticを群平均で置き換えたPPO、と言ってしまってよいでしょう。 RLOOとの関係: 群でベースラインを作る発想は同じで、leave-one-outにするか自分を含む平均にするか、標準偏差で割るか割らないか、という差です。Dr.GRPOの修正を全て適用したGRPOは、RLOOにかなり近づきます。 DPOとの関係: DPOも「良い応答と悪い応答を相対的に比較する」という点ではGRPOと似た構造を持ちます。ただしDPOは人間が事前に作った選好ペアを使うオフライン手法で、学習中に新しい応答を生成しません。GRPOは毎ステップ自分で $G$ 本生成して自己採点するオンライン手法です。「人間の好みに寄せる」のがDPO、「検証器に対して正解率を上げる」のがGRPO、と目的からして違います。 本記事では、GRPO(Group Relative Policy Optimization)をPPOとの差分から解説しました。 GRPOの本質は、「未来を予測する審判を育てる」のをやめて「実際に何度も試して比べる」に切り替えた点にあります。critic不要という設計は、生成コストが安く並列化しやすいLLMだからこそ成立する割り切りであり、その意味でGRPOはLLM時代に合わせて再設計された方策勾配法と言えます。 次のステップとして、以下の記事も参考にしてください。PPOのアドバンテージにはcriticが埋め込まれている
ならばトークンごとの評価を諦める
グループ相対アドバンテージの導出
ベースラインは何を引いても不偏である
群平均は $V(q)$ のモンテカルロ推定そのもの
群平均を引くと勾配は $(1 – 1/G)$ 倍になる
なぜ標準偏差でも割るのか
二値報酬なら閉じた形が出る

GRPOの目的関数
完成形
クリッピングはPPOと同じ役割を果たす

KL項の置き方がPPOと違う

核心部分の実装
import numpy as np
def group_advantages(rewards, eps=1e-4, normalize_std=True):
"""グループ内の報酬を正規化してアドバンテージにする。
rewards : 同一プロンプトに対する G 本の応答の報酬
normalize_std=False にすると Dr.GRPO と同じ「std で割らない」版になる
"""
r = np.asarray(rewards, dtype=np.float64)
adv = r - r.mean() # 群平均をベースラインに
if normalize_std:
adv = adv / (r.std() + eps) # eps は std=0 のゼロ割回避
return adv
for name, r in [("難問(1/8正解)", [1, 0, 0, 0, 0, 0, 0, 0]),
("中問(2/8正解)", [1, 1, 0, 0, 0, 0, 0, 0]),
("易問(7/8正解)", [1, 1, 1, 1, 1, 1, 1, 0]),
("全員正解", [1, 1, 1, 1, 1, 1, 1, 1])]:
a = group_advantages(r)
print(f"{name}: 正解 {a.max():+.3f} / 不正解 {a.min():+.3f}")
+2.645 / -0.378、+1.732 / -0.577、+0.378 / -2.645、+0.000 / +0.000 です。前半3つは先ほど導出した閉じた形と完全に一致します。$\sqrt{7} = 2.6458$、$\sqrt{3} = 1.7321$、$1/\sqrt{3} = 0.5774$ ですから、式のチェックとしても使えます。eps のおかげでゼロ割は回避されますが、アドバンテージが全て0になって学習信号が完全に消えます。この挙動は後で詳しく扱います。def grpo_loss(logp_new, logp_old, logp_ref, adv, mask,
eps_clip=0.2, beta=0.04):
"""GRPO の損失(最小化する形)。配列はすべて (G, T)。
mask : パディングを除くための 0/1 マスク
"""
ratio = np.exp(logp_new - logp_old) # トークンごとの重要度比
a = adv[:, None] # 応答内の全トークンで共通
surrogate = np.minimum(ratio * a,
np.clip(ratio, 1 - eps_clip, 1 + eps_clip) * a)
log_rho = logp_ref - logp_new # log(pi_ref / pi_theta)
kl = np.exp(log_rho) - log_rho - 1.0 # k3 推定量(常に非負)
per_token = surrogate - beta * kl
per_seq = (per_token * mask).sum(axis=1) / mask.sum(axis=1) # 1/|o_i|
return -per_seq.mean() # 目的関数の最大化 = 損失の最小化
ratio の計算と np.minimum によるクリッピングはPPOそのままで、変わったのは a = adv[:, None] の一行、つまりcriticが返す時刻依存のアドバンテージが、応答単位のスカラーをブロードキャストしたものに置き換わった点だけです。KL項が surrogate から引かれており、報酬側に混ぜられていないことも確認できます。per_seq を作るときの / mask.sum(axis=1) が、数式の $1/|o_i|$ に対応します。何気ない一行に見えますが、この割り算が後述する「長さバイアス」の正体です。実装を読むときはここに印を付けておいてください。RLVRとの組み合わせがなぜ効くのか
報酬モデルを検証器に置き換える
報酬ハッキングの主要経路が塞がれる
0/1の報酬が連続的な学習信号に化ける
限界: 検証器が書けない領域には使えない
DeepSeek-R1-Zeroで観測されたこと
応答が自発的に長くなる

「Aha moment」の中身と、その解釈
R1-Zeroの弱点と、R1が加えたもの
実装上の注意点
グループサイズ $G$ をどう選ぶか

$\mathrm{std}(\mathbf{r}) = 0$ をどう扱うか
報酬ハッキングは検証器でも起きる
\boxed{} に入れるだけで、途中の推論はでたらめ。文字列一致の検証器はこれを見抜けない打ち切りとその他の数値的な注意
既知の批判と改良
Dr.GRPO: 2つの正規化が入れるバイアス
DAPO: 大規模学習で効いた4つの修正
GRPOはどこに位置づけられるか
まとめ