👁️‍🗨️Vision 強化学習(VLM RL)

Unsloth を使って GRPO と RL によりビジョン/マルチモーダルモデルをトレーニングしましょう!

Unsloth は現在、視覚/マルチモーダル強化学習を次のものでサポートしています , Gemma 3 およびその他。Unsloth の独自の 重み共有 とカスタムカーネルにより、Unsloth は VLM 強化学習を可能にします 1.5–2× 速く、 使用します 90% 少ない VRAM、および有効にします FA2 構成より 15× 長いコンテキスト 長さを、精度低下なしで。このアップデートはまた Qwen の や Dr. GRPO のような他のものに設定することもできる点に注意。 アルゴリズムも導入します。

Unsloth は GSPO/GRPO で Qwen3-VL-8B を無料の Colab T4 GPU で学習できます。他の VLM も動作しますが、より大きな GPU が必要な場合があります。Gemma は vLLM が Bfloat16 に制限するため T4 より新しい GPU を必要とし、Colab では NVIDIA L4 を推奨します。私たちのノートブックは画像や図を含む数値数学の問題を解きます:

また、vLLM の VLM 統合を Unsloth にネイティブに追加したので、vLLM 推論を使用するにはモデル初期化時に単に fast_inference=True フラグを有効にするだけです。特別な感謝を Sinoué GADarrow-up-right に、 最初のノートブックarrow-up-right を提供して VLM 強化学習の統合を容易にしてくれたことに!

この VLM サポートは、さらにメモリ効率が良く高速な RL に向けた最新のアップデートも統合しており、そこには私たちの スタンバイ機能も含まれています。これは他の実装と比較して速度低下を独自に制限します。

circle-info

使用できるのは fast_inference のみで、vLLM がサポートする VLM に限られます。Llama 3.2 Vision のような一部モデルは vLLM なしでのみ動作しますが、Unsloth ではそれでも動作します。

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 は視覚/エンコーダ層に対する LoRA をサポートしないことに注意することも重要です。したがって設定してください finetune_vision_layers = False LoRA アダプタを読み込むとき。 ただし、transformers/Unsloth 経由の推論を使用する場合は視覚層を訓練することも可能です。

# パラメータ効率の良い微調整のためにモデルに 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, # 注意層を微調整しない場合は 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,
)

🦋Qwen 2.5 VL 視覚強化学習の問題点と特異性

Qwen 2.5 VL の RL 中に、次のような推論出力が表示されることがあります:

これは 報告されましたarrow-up-right また、Qwen2.5-VL-7B-Instruct の出力で予期しない結果 "addCriterion" としても報告されています。実際、私たちもこれを確認しました!Unsloth 以外の環境や bfloat16、float16 のマシンなど様々な条件を試しましたが、それでも発生するようです。例えば項目 165、つまり train_dataset[165] からの AI4Math/MathVistaarrow-up-right データセットは以下の通りです:

そして上記の意味不明な出力が得られます。addCriterion の追加を罰する報酬関数や、意味不明な出力を罰する報酬関数を追加することもできます。しかし別のアプローチとしては、より長く学習させることです。例えば大体 60 ステップ後にモデルが実際に RL で学習しているのが見られます:

circle-check

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

を罰するために、 addCriterion および意味不明な出力を罰するように、報酬関数を編集して addCriterion と改行を過度に penalize するようにしました。

🏁GSPO 強化学習

このアップデートではさらに GSPO(Group Sequence Policy Optimizationarrow-up-right)を追加します。これは Alibaba の Qwen チームが作った GRPO の変種です。彼らは GRPO が各トークンに対して重要度重みを暗黙に生じさせることに気づきましたが、明示的な優位度(advantages)は各トークンごとにスケールしたり変化したりしないことに着目しました。

これにより GSPO が作られ、各トークンの個別の尤度ではなくシーケンスの尤度に重要度を割り当てるようになりました。これら二つのアルゴリズムの違いは、Qwen と Alibaba の GSPO 論文でも以下のように示されています:

GRPO アルゴリズム、出典: Qwenarrow-up-right
GSPO アルゴリズム、出典: Qwenarrow-up-right

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

優位度で行ごとにスケーリングされた GRPO の対数確率比

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

優位度で行ごとにスケーリングされた GSPO のシーケンス比

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

総じて、Unsloth は VLM vLLM 高速推論によりメモリ使用量を 90% 削減するとともに、GRPO と GSPO で 1.5–2× の高速化を実現します!

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

Reinforcement Learning Guide

著者: 心からの感謝を Keitharrow-up-right および Dattaarrow-up-right この記事に貢献してくれたことに感謝します!

最終更新

役に立ちましたか?