> For the complete documentation index, see [llms.txt](https://unsloth.ai/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/vision-reinforcement-learning-vlm-rl.md).

# Vision強化学習（VLM RL）

Unslothを使って、GRPOとRLでVision/マルチモーダルモデルを学習しましょう！

Unsloth は現在、以下を用いた vision/multimodal RL をサポートしています [Qwen3-VL](/docs/jp/moderu/tutorials/qwen3-how-to-run-and-fine-tune/qwen3-vl-how-to-run-and-fine-tune.md), [Gemma 3](/docs/jp/moderu/tutorials/gemma-3-how-to-run-and-fine-tune.md) およびその他のモデル。Unsloth 独自の [重み共有](/docs/jp/meru/reinforcement-learning-rl-guide.md#what-unsloth-offers-for-rl) とカスタムカーネルにより、Unsloth は VLM RL を **1.5～2倍高速にし、** は **VRAM を90%削減し、**、さらに **15倍長いコンテキスト** 長を FA2 構成よりも実現します。精度低下はありません。この更新では Qwen の [GSPO](#gspo-rl) アルゴリズムも導入されています。

Unsloth は無料の Colab T4 GPU 上で GSPO/GRPO を使って Qwen3-VL-8B を学習できます。他の VLM でも動作しますが、より大きな GPU が必要になる場合があります。Gemma は vLLM が [を Bfloat16 に制限するため、](/docs/jp/moderu/tutorials/gemma-3-how-to-run-and-fine-tune.md#unsloth-fine-tuning-fixes)T4 より新しい GPU が必要です。そのため、Colab では NVIDIA L4 を推奨します。私たちのノートブックは、画像や図を含む数理問題を解きます：

* **Qwen-3 VL-8B** （vLLM 推論）**:** [Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_VL_\(8B\)-Vision-GRPO.ipynb)
* **Qwen-2.5 VL-7B** （vLLM 推論）**:** [Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2_5_7B_VL_GRPO.ipynb) •[ Kaggle](https://www.kaggle.com/notebooks/welcome?src=https://github.com/unslothai/notebooks/blob/main/nb/Kaggle-Qwen2_5_7B_VL_GRPO.ipynb\&accelerator=nvidiaTeslaT4)
* **Gemma-3-4B** （Unsloth 推論）： [Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3_\(4B\)-Vision-GRPO.ipynb)

Unsloth に vLLM VLM 統合もネイティブに追加したので、vLLM 推論を使うにはモデル初期化時に以下を有効にするだけです。 `fast_inference=True` フラグを。提供してくれた [Sinoué GAD](https://github.com/unslothai/unsloth/pull/2752) に特別な感謝を。 [最初のノートブック](https://github.com/GAD-cell/vlm-grpo/blob/main/examples/VLM_GRPO_basic_example.ipynb) のおかげで VLM RL の統合が容易になりました！

この VLM サポートには、さらにメモリ効率が高く高速な RL を実現する最新の更新も統合されており、 [スタンバイ機能](/docs/jp/meru/reinforcement-learning-rl-guide/memory-efficient-rl.md#unsloth-standby)を含み、他の実装と比べて速度低下を独自に抑えます。

{% hint style="info" %}
使えるのは `fast_inference` に対応した VLM のみです。Llama 3.2 Vision のような一部のモデルは vLLM なしでしか実行できませんが、それでも Unsloth では動作します。
{% endhint %}

```python
os.environ['UNSLOTH_VLLM_STANDBY'] = '1' # vLLM でメモリ効率の高い GRPO を有効化するため
model, tokenizer = FastVisionModel.from_pretrained(
    model_name = "Qwen/Qwen2.5-VL-7B-Instruct",
    max_seq_length = 16384, # 画像をコンテキストに収めるため、これだけ大きくする必要があります
    load_in_4bit = True, # LoRA 16bit の場合は False
    fast_inference = True, # vLLM の高速推論を有効化
    gpu_memory_utilization = 0.8, # メモリ不足なら下げる
)
```

また、vLLM は vision/encoder レイヤーの LoRA をサポートしていないことにも注意してください。そのため、LoRA アダプタを読み込む際は `finetune_vision_layers = False` を設定します。\
ただし、transformers/Unsloth 経由で推論を使うなら、vision レイヤーも学習できます。

```python
# パラメータ効率の高いファインチューニングのためにモデルへ LoRA アダプタを追加
model = FastVisionModel.get_peft_model(
    model,

    finetune_vision_layers     = False,# fast_inference はまだ finetune_vision_layers をサポートしていません :(
    finetune_language_layers   = True, # 言語層をファインチューニングしない場合はFalse
    finetune_attention_modules = True, # Attention層をファインチューニングしない場合はFalse
    finetune_mlp_modules       = True, # MLP層をファインチューニングしない場合はFalse

    r = lora_rank, # 0 より大きい任意の数を選択！ 推奨は 8, 16, 32, 64, 128
    lora_alpha = lora_rank*2, # *2 で学習が高速化します
    use_gradient_checkpointing = "unsloth", # メモリ使用量を削減
    random_state = 3407,
)
```

## :butterfly:Qwen 2.5 VL Vision RL の問題と癖

Qwen 2.5 VL の RL 中に、次のような推論出力が見られることがあります：

{% code overflow="wrap" %}

```
 addCriterion
 <tool_call>\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n\n addCriterion\n\n 自動生成\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n addCriterion\n\n\n addCriterion\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
```

{% endcode %}

これも [報告](https://github.com/QwenLM/Qwen2.5-VL/issues/759) されています。Qwen2.5-VL-7B-Instruct の出力でも、予期しない結果として「addCriterion」が見られました。実際、私たちもこれを確認しています！Unsloth ではない環境、bfloat16 と float16 のマシン、その他の手法も試しましたが、依然として発生します。例えば 165 番目の項目、すなわち `train_dataset[165]` の [AI4Math/MathVista](https://huggingface.co/datasets/AI4Math/MathVista) データセットは以下です：

{% code overflow="wrap" %}

```
図は、レースカーのドライバーが車をサーキットの壁に衝突させる際の進路を真上から見た図である。衝突直前、彼は壁となす角が30°の直線上を速度 $v_i=70 \mathrm{~m} / \mathrm{s}$ で走行している。衝突直後、彼は壁となす角が10°の直線上を速度 $v_f=50 \mathrm{~m} / \mathrm{s}$ で走行している。彼の質量 $m$ は $80 \mathrm{~kg}$ である。衝突は $14 \mathrm{~ms}$ 続く。衝突中のドライバーに加わる平均力の大きさはいくらか？
```

{% endcode %}

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

そして上記のような意味不明な出力が得られます。addCriterion の追加を罰する報酬関数、または意味不明な出力を罰する報酬関数を追加することもできます。しかし、別の方法としては、より長く学習させることです。たとえば、約60ステップ後になって初めて、モデルが RL を通じて実際に学習しているのが見られます：

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

{% hint style="success" %}
強制すると `<|assistant|>` の生成時にこれを行うと、これは Instruct モデルなので、当然ながらこの種の意味不明な結果の発生は減ります。ただし、次のセクションで説明するように、悪い生成を罰する報酬関数を追加するのが依然として最善です。
{% endhint %}

## :medal:意味不明な出力を減らすための報酬関数

を罰するために `addCriterion` と意味不明な出力を罰するよう、報酬関数を編集して `addCriterion` と改行の過剰使用を罰するようにしました。

```python
def formatting_reward_func(completions,**kwargs):
    import re
    thinking_pattern = f'{REASONING_START}(.*?){REASONING_END}'
    answer_pattern = f'{SOLUTION_START}(.*?){SOLUTION_END}'

    scores = []
    for completion in completions:
        score = 0
        thinking_matches = re.findall(thinking_pattern, completion, re.DOTALL)
        answer_matches = re.findall(answer_pattern, completion, re.DOTALL)
        if len(thinking_matches) == 1:
            score += 1.0
        if len(answer_matches) == 1:
            score += 1.0

        # addCriterion の問題を修正
        # https://docs.unsloth.ai/new/vision-reinforcement-learning-vlm-rl#qwen-2.5-vl-vision-rl-issues-and-quirks を参照
        # addCriterion と改行が過剰な場合にペナルティを与える
        if len(completion) != 0:
            removal = completion.replace("addCriterion", "").replace("\n", "")
            if (len(completion)-len(removal))/len(completion) >= 0.5:
                score -= 2.0

        scores.append(score)
    return scores
```

## :checkered\_flag:GSPO 強化学習

この更新ではさらに GSPO（[Group Sequence Policy Optimization](https://arxiv.org/abs/2507.18071)）も追加されました。これは Alibaba の Qwen チームによって作成された GRPO の派生版です。彼らは、明示的には advantage が各トークンごとにスケールしたり変化したりしないにもかかわらず、GRPO が暗黙的に各トークンの重要度重みを生じさせることに気づきました。

このことから GSPO が生まれ、これは個々のトークンの尤度ではなく、シーケンスの尤度に重要度を割り当てるようになりました。これら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では、advantage がテンソルが合計される前に各行をトークンの logprob にスケールしていることが分かります。本質的には、そのスケーリングは各トークンではなくシーケンス全体に与えられたにもかかわらず、各トークンに同じスケーリングが適用されています。これを示す簡単な図を以下に示します：

<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 の Logprob 比率を advantage で行ごとにスケーリング</p></figcaption></figure>

式2では、各シーケンスの logprob 比率が、Logprob 比率を計算した後に合計されて指数化され、その結果得られたシーケンス比率だけが行ごとに advantage で乗算されることが示されています。

<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 のシーケンス比率を advantage で行ごとにスケーリング</p></figcaption></figure>

GSPO の有効化は簡単で、必要なのは `importance_sampling_level = "sequence"` フラグを GRPO 設定で指定するだけです。

```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",
)
```

総じて、Unsloth は現在 VLM vLLM の高速推論により、メモリ使用量を90%削減するだけでなく、GRPO と GSPO で1.5～2倍の高速化も実現します！

強化学習についてさらに読みたい場合は、こちらの RL ガイドをご覧ください：

[Reinforcement Learning](/docs/jp/meru/reinforcement-learning-rl-guide.md)

***著者：** 大きな感謝を* [*Keith*](https://www.linkedin.com/in/keith-truongcao-7bb84a23b/) *そして* [*Datta*](https://www.linkedin.com/in/datta0/) *この記事への貢献に対して！*


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/vision-reinforcement-learning-vlm-rl.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
