# チュートリアル：GRPO で自分専用の推論モデルを学習する

DeepSeek が開発した [GRPO](https://unsloth.ai/blog/grpo) （Group Relative Policy Optimization）は彼らの R1 推論モデルを訓練するためのものです。

### クイックスタート

これらの手順は、事前作成済みの Google Colab 用 [ノートブック](https://unsloth.ai/docs/jp/meru/unsloth-notebooks)です。Unsloth をローカルにインストールする場合は、これらのノートブックを好みのコードエディタにコピーすることもできます。以下のいずれかのノートブックを使用します：

| [**Qwen3.5（4B）**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_5_\(4B\)_Vision_GRPO.ipynb) **- Vision - new** | [**gpt-oss-20b**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-\(20B\)-GRPO.ipynb) **-** GSPO       | [Gemma 3（4B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3_\(4B\)-Vision-GRPO.ipynb) - Vision GSPO         |
| ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| [**Qwen3（4B）**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_\(4B\)-GRPO.ipynb) - Advanced                    | [Qwen3-VL-8B](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_VL_\(8B\)-Vision-GRPO.ipynb) - Vision GSPO | [Llama 3.2（3B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Advanced_Llama3_2_\(3B\)_GRPO_LoRA.ipynb) - Advanced |

{% stepper %}
{% step %}

#### Unslothをインストールする

Colab ノートブックを使用している場合は、クリックしてください **Runtime > Run all**。開始する前にぜひこちらを確認することを強くお勧めします： [ファインチューニング ガイド](https://unsloth.ai/docs/jp/meru/fine-tuning-llms-guide) 。

ローカルにインストールする場合は、正しい [依存関係](https://unsloth.ai/docs/jp/meru/fine-tuning-for-beginners/unsloth-requirements) を確認し、 `pip install unsloth` Linux 上で使用するか、私たちの [Windows インストール ](https://unsloth.ai/docs/jp/meru/install/windows-installation)手順に従ってください。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-313fa39c229225ae9d39b7c7a0d05c9005ddb94c%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### GRPO と報酬関数について学ぶ

始める前に、GRPO、報酬関数、およびそれらの仕組みについて詳しく学ぶことをお勧めします。以下を含む詳細をお読みください： [ヒントとコツ](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/..#basics-tips)[ こちら](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/..#basics-tips).

また、十分な VRAM が必要です。一般的に、モデルのパラメータ数 = 必要な VRAM の量です。Colab では、無料の 16GB VRAM GPU を使用しており、パラメータが最大 16B のモデルまで訓練できます。
{% endstep %}

{% step %}

#### 希望の設定を構成する

最適な結果が得られるように事前に最適な設定を選択しており、モデルは私たちの [サポートされているモデル](https://unsloth.ai/docs/jp/meru/unsloth-model-catalog)の中からお好きなものに変更できます。初心者の場合は他の設定を変更することはお勧めしません。

{% hint style="success" %}
について **高度な GRPO** バッチ処理、生成、訓練パラメータに関するドキュメント、 [ガイドを読んでください！](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/advanced-rl-documentation)
{% endhint %}

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-b1e9fac448706ac87dff7e7eff1298655dda456e%2Fimage.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### データ準備

事前に OpenAI の [GSM8K](https://huggingface.co/datasets/openai/gsm8k) データセットを選択しています。これは学内レベルの数学問題を含みますが、独自のデータセットや Hugging Face 上の公開データセットに変更することも可能です。データセットについて詳しくは [こちら](https://unsloth.ai/docs/jp/meru/fine-tuning-llms-guide/datasets-guide).

をご覧ください。データセットは質問と回答のペア用に少なくとも 2 列を持つ必要があります。ただし、回答は質問からどのようにその答えを導いたかという推論を明かしてはいけません。以下は例です：

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-14a1ee796547f725abbd1097f2b0f9e4e6cc5976%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

モデルに答えを出す前に推論を明示的に述べさせるようデータを構築します。まず、プロンプトと応答の明確なフォーマットを設定します。

```
# モデルに特定のフォーマットを使用するよう指示するシステムプロンプトを定義します
SYSTEM_PROMPT = """
次の形式で回答してください：
<reasoning>
...
</reasoning>
<answer>
...
</answer>
"""

XML_COT_FORMAT = """\
<reasoning>
{reasoning}
</reasoning>
<answer>
{answer}
</answer>
"""
```

さて、データセットを準備するには：

```
import re
from datasets import load_dataset, Dataset


# 異なる形式から回答を抽出するためのヘルパー関数
def extract_xml_answer(text: str) -> str:
    answer = text.split("<answer>")[-1]
    answer = answer.split("</answer>")[0]
    return answer.strip()


def extract_hash_answer(text: str) -> str | None:
    if "####" not in text:
        return None
    return text.split("####")[1].strip()


# GSM8K データセットを準備する関数
def get_gsm8k_questions(split="train") -> Dataset:
    data = load_dataset("openai/gsm8k", "main")[split]
    data = data.map(
        lambda x: {
            "prompt": [
                {"role": "system", "content": SYSTEM_PROMPT},
                {"role": "user", "content": x["question"]},
            ],
            "answer": extract_hash_answer(x["answer"]),
        }
    )
    return data


dataset = get_gsm8k_questions()
```

データセットは回答を抽出し、それらを構造化された文字列としてフォーマットすることで準備されます。
{% endstep %}

{% step %}

#### 報酬関数／検証器

[報酬関数／検証器](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/..#reward-functions-verifier) は、提供したデータセットに基づいてモデルが良好に動作しているかどうかを知らせてくれます。各生成実行は、他の生成の平均スコアに対するパフォーマンスで評価されます。独自の報酬関数を作成することも可能ですが、私たちは既に [Will の GSM8K](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/..#gsm8k-reward-functions) 報酬関数を事前選択しています。これにより、生成ごとに報酬を与える 5 種類の方法があります。

生成結果を ChatGPT 4o や Llama 3.1 (8B) などの LLM に入力し、評価する報酬関数と検証器を設計できます。例えば、生成を選んだ LLM に与え、「答えがあまりにも機械的に聞こえる場合は 3 ポイント減点する」といったルールを設定します。これにより品質基準に基づいて出力が洗練されます。 **例をご覧ください** どのようなものか [こちら](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/..#reward-function-examples).

**メール自動化タスクの例となる報酬関数：**

* **質問：** 受信メール
* **回答：** 送信メール
* **報酬関数：**
  * 回答に必要なキーワードが含まれている場合 → **+1**
  * 回答が理想的な応答と完全に一致する場合 → **+1**
  * 応答が長すぎる場合 → **-1**
  * 宛先の名前が含まれている場合 → **+1**
  * 署名ブロック（電話、メール、住所）が含まれている場合 → **+1**

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-95cd00b6a52b8161b31a2399e25863ee0349920e%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### モデルを訓練する

最適な結果のために事前にハイパーパラメータを選択していますが、変更することも可能です。すべての [パラメータについてはこちら](https://unsloth.ai/docs/jp/meru/fine-tuning-llms-guide/lora-hyperparameters-guide)をご覧ください。 **高度な GRPO** バッチ処理、生成、訓練パラメータに関するドキュメント、 [ガイドを読んでください！](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/advanced-rl-documentation)

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-a22d3475d925d2d858c9fcc228f0e13893eff0f9%2Fimage.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

ために **GRPOConfig** は訓練の主要なハイパーパラメータを定義します：

* `use_vllm`：vLLM を使用した高速推論を有効にします。
* `learning_rate`：モデルの学習速度を決定します。
* `num_generations`：プロンプトごとに生成される完了数を指定します。
* `max_steps`：総訓練ステップ数を設定します。

{% hint style="success" %}
**新機能！** 現在、DAPO、Dr. GRPO およびその他多くの新しい GRPO 技術をサポートしています。次の引数を GRPOConfig で操作して有効にできます：

```python
epsilon=0.2,
epsilon_high=0.28, # 片側
delta=1.5 # 両側

loss_type='bnpo',
# または：
loss_type='grpo',
# または：
loss_type='dr_grpo',
# または：
loss_type='dapo',

mask_truncated_completions=True,
```

{% endhint %}

報酬が時間とともに増加するのが確認できるはずです。最低でも 300 ステップは訓練することをお勧めします（所要時間は約 30 分）が、最適な結果のためにはより長く訓練するべきです。

{% hint style="warning" %}
GRPO モデルが学習しない問題がある場合は、ぜひ私たちの [高度な GRPO ノートブック](https://unsloth.ai/docs/jp/unsloth-notebooks#grpo-reasoning-notebooks) を使用することを強く推奨します。そこにはより優れた報酬関数があり、より速く、より頻繁に結果が得られるはずです。
{% endhint %}

訓練中のモデルがどのように学習しているかを確認できるサンプル回答も表示されます。ステップや XML タグ、試行などを含むものがあり、訓練が進むにつれてより良くなっていき、長い推論チェーンを伴う望ましい出力が得られるようにスコアが上がっていきます。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-f33d6f494605ab9ca69a0b697ed5865dd3a30b18%2Fimage.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### モデルを実行して評価する

再生ボタンをクリックしてモデルを実行します。最初の例では通常回答に推論が含まれておらず、推論を確認するにはまず GRPO で訓練した LoRA 重みを保存する必要があります：

<pre><code><strong>model.save_lora("grpo_saved_lora")
</strong></code></pre>

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-1ab351622655983aeda4d9d6d217cf354cb280be%2Fimage%20(10)%20(1)%20(1).png?alt=media" alt=""><figcaption><p>最初の推論例には推論がありません。LoRA を読み込んでテストすることで推論を明らかにする必要があります。</p></figcaption></figure>

その後 LoRA を読み込みテストします。私たちの推論モデルはかなり優れていますが、訓練時間が約 1 時間程度しかなかったため常に正しいわけではありません。シーケンス長を延ばしてより長く訓練すればさらに良くなります！

その後、モデルを GGUF、Ollama などに保存することができます。詳しくは私たちの [ガイドはこちら](https://unsloth.ai/docs/jp/fine-tuning-llms-guide#id-7.-running--saving-the-model).

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-38fa0c97184487aaa6b259f5b23b7f27345871d8%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

をご覧ください。まだ推論が得られない場合は、訓練ステップが少なすぎるか、報酬関数／検証器が最適でなかった可能性があります。
{% endstep %}

{% step %}

#### モデルを保存する

ファインチューニング済みモデルを保存する方法はいくつかありますが、ここでは最も簡単で一般的な方法に焦点を当てます。詳細は [こちら](https://unsloth.ai/docs/jp/ji-ben/inference-and-deployment)

**16 ビット精度での保存**

以下のコマンドでモデルを 16 ビット精度で保存できます：

```python
# 16 ビット精度で保存
model.save_pretrained_merged("model", tokenizer, save_method="merged_16bit")
```

**Hugging Face Hub へのプッシュ**

モデルを共有するために、 `push_to_hub_merged` メソッドを使って Hugging Face Hub にプッシュします。これにより複数の量子化フォーマットでモデルを保存できます。

```python
# Hugging Face Hub にプッシュ（トークンが必要）
model.push_to_hub_merged(
    "your-username/model-name", tokenizer, save_method="merged_16bit", token="your-token"
)
```

**llama.cpp 用の GGUF 形式での保存**

Unsloth は **GGUFフォーマットに**での保存もサポートしており、これにより互換性が生まれます： **llama.cpp** と **Ollama**.

```python
model.push_to_hub_gguf(
    "your-username/model-name",
    tokenizer,
    quantization_method=["q4_k_m", "q8_0", "q5_k_m"],
    token="your-token",
)
```

GGUF 形式で保存すれば、軽量な環境で簡単にデプロイでき、 **llama.cpp** や他の推論エンジンで使用することができます。
{% endstep %}
{% endstepper %}

## ビデオチュートリアル

ここでは素晴らしい YouTuber の方々が作成したビデオチュートリアルをいくつか紹介します。彼らは素晴らしい内容を提供しています！

{% embed url="<https://www.youtube.com/watch?v=9t-BAjzBWj8>" %}

{% columns %}
{% column width="50%" %}
{% embed url="<https://www.youtube.com/watch?t=3289s&v=bbFEYPx9Hpo>" %}
データセットの準備方法や強化学習＋GRPO の基本の説明を学ぶのに最適です
{% endembed %}

{% embed url="<https://www.youtube.com/watch?v=oF0_eMhzRaQ>" %}
{% endcolumn %}

{% column width="50%" %}
{% embed url="<https://www.youtube.com/watch?v=juOh1afy-IE>" %}

{% embed url="<https://www.youtube.com/watch?v=SoPE1cUz3Hs>" %}
ローカルでの GRPO（自分のデバイス上）
{% endembed %}
{% endcolumn %}
{% endcolumns %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
