GRPOの計算例

# GRPOの計算例

この記事では、GRPO (Generalized Policy Optimization) におけるPolicy比率の計算方法を、具体的な例を用いてわかりやすく解説します。大規模言語モデル (LLM) のチューニングに用いられるGRPOの理解を深める一助となれば幸いです。

GRPO (Generalized Policy Optimization) は、強化学習を用いて大規模言語モデル（LLM）をチューニングする際に利用される重要な手法です。ここでは、旧モデルと現在のモデルにおけるトークンの出現確率を具体例で示し、それらを用いた**Policy比率**の計算方法を詳しく解説します。

---

## 設定と前提

* **語彙サイズ**: 3 (トークン: `A`, `B`, `C`)
* **出力シーケンス長**: 3トークン（例: $y = (y_1, y_2, y_3)$)
* **プロンプト**: $P$
* **目的**: 正解シーケンス: `A B C` を生成する確率を最大化する。
* **報酬**: `A B C` を生成した場合 $R=1$、それ以外は $R=0$。
* **更新前のPolicy**:  $\pi_{\theta_{old}}$ 
* **更新後のPolicy**:  $\pi_{\theta}$ 

報酬については、DeepSeekのように出力の形式に応じた報酬を考慮することもできますが、今回は簡単のため出力の正解・不正解のみで考えます。

**シナリオ**: プロンプト $P$ に対して、モデルがシーケンス `A B C` を生成する過程を考えます。

---

## Policyについて

LLMにおけるPolicyとは、ある入力文に対して、LLMが出力するトークンの確率分布のことを指します。
以下、更新前と更新後のLLMがプロンプト$P$に対して `A B C` を出力する確率を見ていきます。

まず、更新前の古いモデルについて、まだ `A B C` の生成にそれほど最適化されていないと仮定します。

#### ステップ1: 
$P$ から $y_1$ を生成

| token | 確率 $\pi_{\theta_{old}}(\text{token} \| P)$ |
| :------- | :---------------------------------- |
| A        | 0.5                                 |
| B        | 0.3                                 |
| C        | 0.2                                 |
| **合計** | **1.0** |

#### ステップ2: 
$P A$ から $y_2$ を生成

| token | 確率 $\pi_{\theta_{old}}(\text{token} \| P, A)$ |
| :------- | :------------------------------------ |
| A        | 0.2                                   |
| B        | 0.6                                   |
| C        | 0.2                                   |
| **合計** | **1.0** |

#### ステップ3: 
$P A B$ から $y_3$ を生成

| token | 確率 $\pi_{\theta_{old}}(\text{token} \| P, A B)$ |
| :------- | :------------------------------------- |
| A        | 0.3                                    |
| B        | 0.3                                    |
| C        | 0.4                                    |
| **合計** | **1.0** |

この古いモデルでシーケンス **`A B C`** が生成される確率は、各ステップの確率の積です。

```math
\pi_{\theta_{old}}(ABC | P) = \pi_{\theta_{old}}(A | P) \times \pi_{\theta_{old}}(B | P, A) \times \pi_{\theta_{old}}(C | P, A B)
```

```math
= 0.5 \times 0.6 \times 0.4 = \mathbf{0.12}
```

---

続いて、更新後（現在）のモデルについて `A B C` の生成確率が少し高まっていると仮定します。

#### ステップ1: 
$P$ から $y_1$ を生成

| token | 確率 $\pi_{\theta}(\text{token} \| P)$ |
| :------- | :------------------------------- |
| A        | 0.6                              |
| B        | 0.2                              |
| C        | 0.2                              |
| **合計** | **1.0** |

#### ステップ2: 
$P A$ から $y_2$ を生成

| token | 確率 $\pi_{\theta}(\text{token} \| P, A)$ |
| :------- | :-------------------------------- |
| A        | 0.1                               |
| B        | 0.7                               |
| C        | 0.2                               |
| **合計** | **1.0** |

#### ステップ3: 
$P A B$ から $y_3$ を生成

| token | 確率 $\pi_{\theta}(\text{token} \| P, A B)$ |
| :------- | :-------------------------------- |
| A        | 0.2                               |
| B        | 0.2                               |
| C        | 0.6                               |
| **合計** | **1.0** |

以上より、この現在のモデルでシーケンス **`A B C`** が生成される確率は、

```math
\pi_{\theta}(ABC | P) = \pi_{\theta}(A | P) \times \pi_{\theta}(B | P, A) \times \pi_{\theta}(C | P, A B)
```

```math
= 0.6 \times 0.7 \times 0.6 = \mathbf{0.252}
```

今回の例では、更新前の古いモデルと比較をすると、新しいモデルでは `A B C` の生成確率が $0.12$ から $0.252$ に増加したことになります。

---

## Policy比率の計算方法

Policy比率 $r_t(\theta)$ は、各トークン生成ステップにおける新しいPolicyの確率と古いPolicyの確率の比率です。

```math
r_t(\theta) = \frac{\pi_{\theta}(y_t | x, y_{<t})}{\pi_{\theta_{old}}(y_t | x, y_{<t})}
```

シーケンス **`A B C`** が生成された場合を例に計算します。

#### ステップ1: 
$y_1 = A$ のPolicy比率

```math
r_1(\theta) = \frac{\pi_{\theta}(A | P)}{\pi_{\theta_{old}}(A | P)} = \frac{0.6}{0.5} = \mathbf{1.2}
```

#### ステップ2: 
$y_2 = B$ のPolicy比率

```math
r_2(\theta) = \frac{\pi_{\theta}(B | P, A)}{\pi_{\theta_{old}}(B | P, A)} = \frac{0.7}{0.6} \approx \mathbf{1.1667}
```

#### ステップ3: 
$y_3 = C$ のPolicy比率

```math
r_3(\theta) = \frac{\pi_{\theta}(C | P, A B)}{\pi_{\theta_{old}}(C | P, A B)} = \frac{0.6}{0.4} = \mathbf{1.5}
```

---

## シーケンス全体のPolicy比率

GRPOの目的関数では各トークンのPolicy比率が利用されますが、参考としてシーケンス全体のPolicy比率も計算してみましょう。シーケンス全体のPolicy比率 $r(\theta)$ は、各ステップのPolicy比率の積で計算され、これは更新後のモデルが特定のシーケンスを生成する確率が、更新前のモデルと比較して何倍になったかを示します。

```math
r(\theta) = \prod_{t=1}^{T} r_t(\theta) = \frac{\pi_{\theta}(y | x)}{\pi_{\theta_{old}}(y | x)}
```

今回の例では、シーケンス `A B C` について:

```math
r(A B C) = r_1(\theta) \times r_2(\theta) \times r_3(\theta) = 1.2 \times 1.1667 \times 1.5 \approx \mathbf{2.1000}
```

この結果は、現在のモデルが古いモデルと比較して、シーケンス `A B C` を約 **2.1 倍高い確率で生成するようになった**ことを示しています。（実際に計算してみると: $\frac{0.252}{0.12} = 2.1$ となり、一致します。）

## まとめ

本記事では、GRPOの目的関数に含まれる**Policy比率**について、具体的なトークン生成確率の例を用いて詳しく解説しました。このPolicy比率は、モデルが特定の出力を生成する傾向が、更新の前後でどのように変化したかを定量的に示す重要な指標です。GRPOでは、このPolicy比率と報酬やアドバンテージを組み合わせることで、効率的にモデルのPolicyを更新していきます。

GRPOの目的関数全体の詳細やアドバンテージといった他の重要な要素については、関連する他の資料や記事を参照することで、さらに理解を深めることができるでしょう。