# GSPO 強化学習

私たちは GSPO を導入します。これは以下の変種です： [GRPO](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/..#from-rlhf-ppo-to-grpo-and-rlvr) Alibaba の Qwen チームが作成しました。彼らは、GRPO が各トークンの重要度重みを取るときに、本質的には利得（advantages）が各トークンごとにスケールしたり変化したりしないという観察に気づきました。これが GSPO の作成につながり、現在は個々のトークンの尤度ではなくシーケンス全体の尤度に重要度を割り当てます。

* 無料の GSPO ノートブックを次の目的でご利用ください： [**gpt-oss-20b**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-\(20B\)-GRPO.ipynb) および [**Qwen2.5-VL**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2_5_7B_VL_GRPO.ipynb)

Unsloth で GSPO を有効にするには、次を設定してください： `importance_sampling_level = "sequence"` を GRPO の設定に入れます。これら2つのアルゴリズムの違いは、以下の Qwen と Alibaba の GSPO 論文にも示されています：

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-45d743dd5dcd590626777ce09cfab61808aa8c24%2Fimage.png?alt=media" alt="" width="563"><figcaption><p>GRPO アルゴリズム、出典： <a href="https://arxiv.org/abs/2507.18071">Qwen</a></p></figcaption></figure>

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-ee755850cbe17482ce240dde227d55c62e9a3e64%2Fimage.png?alt=media" alt="" width="563"><figcaption><p>GSPO アルゴリズム、出典： <a href="https://arxiv.org/abs/2507.18071">Qwen</a></p></figcaption></figure>

式 1 では、優位度がテンソルを合計する前に各行をトークンの対数確率にスケーリングすることが見て取れます。本質的に、各トークンには同じスケーリングが与えられますが、そのスケーリングは個々のトークンではなくシーケンス全体に与えられていたものです。これの簡単な図は以下に示せます：

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-b3c944808a15dde0a7ff45782f9f074993304bf1%2FCopy%20of%20GSPO%20diagram%20(1).jpg?alt=media" alt="" width="286"><figcaption><p>優位度で行ごとにスケーリングされた GRPO の対数確率比</p></figcaption></figure>

式 2 は、各シーケンスの対数確率比が計算された後に合計・指数化され、その結果得られたシーケンス比のみが行ごとに優位度と乗算されることを示しています。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-62fc5b50921e79cce155d2794201c9b96faf941e%2FGSPO%20diagram%20(1).jpg?alt=media" alt="" width="313"><figcaption><p>優位度で行ごとにスケーリングされた GSPO のシーケンス比</p></figcaption></figure>

GSPO を有効にするのは簡単で、GRPO の設定で次の `importance_sampling_level = "sequence"` フラグを設定するだけです。

```python
training_args = GRPOConfig(
    output_dir = "vlm-grpo-unsloth",
    per_device_train_batch_size = 8,
    gradient_accumulation_steps = 4,
    learning_rate = 5e-6,
    adam_beta1 = 0.9,
    adam_beta2 = 0.99,
    weight_decay = 0.1,
    warmup_ratio = 0.1,
    lr_scheduler_type = "cosine",
    optim = "adamw_8bit",
    # beta = 0.00,
    epsilon = 3e-4,
    epsilon_high = 4e-4,
    num_generations = 8,    
    max_prompt_length = 1024,
    max_completion_length = 1024,
    log_completions = False,
    max_grad_norm = 0.1,
    temperature = 0.9,
    # report_to = "none", # ロギングを Weights & Biases に行いたい場合は "wandb" に設定
    num_train_epochs = 2, # 簡易テスト用。完全な学習には増やしてください
    report_to = "none"
    
    # GSPO は以下：
    importance_sampling_level = "sequence",
    
    # Dr GRPO / GAPO 等
    loss_type = "dr_grpo",
)
```
