💡強化学習(RL)ガイド

強化学習(RL)のすべてと、GRPOを使ってUnslothで自分のDeepSeek-R1推論モデルを訓練する方法を学びます。初心者から上級者までの完全ガイドです。

強化学習とは、「エージェント」が環境と相互作用し、受け取ることで意思決定を学ぶものです フィードバック 次の形での 報酬 または 罰則.

  • 行動: モデルが生成するもの(例: 文)。

  • 報酬: モデルの行動がどれだけ良かったか悪かったかを示す信号(例: 応答は指示に従っていたか?役に立ったか?)。

  • 環境: モデルが取り組んでいる状況やタスク(例: ユーザーの質問に答えること)。

🦥学べること

  1. RLとは? RLVRとは? PPOとは? GRPOとは? RLHFとは? RFTとは? 「必要なのは運だけ?」 RLにとって?

  2. 環境とは? エージェントとは? 行動とは? 報酬関数とは? 報酬とは?

この記事では、GRPO、強化学習(RL)、報酬関数について、ヒントや、GRPOを使う基本とともに、知っておくべきすべて(初級から上級まで)を扱います Unslotharrow-up-right。GRPOの使い方を段階的に学ぶチュートリアルを探している場合は、ガイドをご覧ください ここ.

circle-check

強化学習(RL)とは?

RLの目標は次のとおりです:

  1. 見る可能性を高めること 「良い」 結果を。

  2. 見る可能性を下げること 「悪い」 結果を。

それだけです! 「良い」と「悪い」が何を意味するのか、あるいはそれをどうやって「増やす」「減らす」のか、さらには「結果」とはそもそも何を意味するのかには、複雑な点があります。

たとえば、 パックマンゲーム:

  1. Unsloth パッケージとモデルを使う 環境 はゲーム世界です。

  2. Unsloth パッケージとモデルを使う 行動 として取れるのは、上、左、右、下です。

  3. Unsloth パッケージとモデルを使う 報酬 は、クッキーを食べれば良く、うねうねした敵の1体にぶつかれば悪いです。

  4. RLでは、取るべき「最善の行動」は分かりませんが、中間ステップや最終的なゲーム状態(勝ちか負けか)は観察できます

別の例として、次の質問を与えられたと想像してください: 「2 + 2 は何ですか?」 (4) 整列されていない言語モデルは、3、4、C、D、-10 など、文字通り何でも吐き出します。

  1. 数字のほうが C や D より良いですよね?

  2. たとえば 8 を得るより 3 を得るほうが良いですよね?

  3. 4 を得るのは間違いなく正解です。

私たちは今、 報酬関数!

🏃RLHF、PPOからGRPOとRLVRまで

OpenAIは次の概念を広めました RLHFarrow-up-right (人間のフィードバックによる強化学習)では、私たちは 「エージェント」 を訓練して、質問に対する出力( 状態)を人間により有用だと評価されるものにします。

たとえばChatGPTのサムズアップとサムズダウンは、RLHFのプロセスで利用できます。

PPOの式

clip(..., 1-e, 1+e) 項は、PPOが大きすぎる変化を起こさないようにするために使われます。また、モデルがあまり逸脱しないように、beta を > 0 に設定した KL 項もあります。

RLHFを行うために、 PPOarrow-up-right (近接方策最適化)が開発されました。この場合の エージェント は言語モデルです。実際には3つのシステムで構成されています:

  1. Unsloth パッケージとモデルを使う 生成方策(現在訓練中のモデル)

  2. Unsloth パッケージとモデルを使う 参照方策(元のモデル)

  3. Unsloth パッケージとモデルを使う 価値モデル(平均報酬推定器)

私たちは 報酬モデル を使って現在の環境に対する報酬を計算し、目標は これを最大化すること!

PPOの式は、安定するよう設計されているため、かなり複雑に見えます。ぜひ私たちの AI Engineer トークarrow-up-right をご覧ください。2025年に私たちが行ったRLに関するもので、PPOのより深い数式導出を説明しています。

DeepSeekは GRPOarrow-up-right (グループ相対方策最適化)を開発し、自社のR1推論モデルを訓練しました。PPOとの主な違いは次のとおりです:

  1. Unsloth パッケージとモデルを使う 価値モデルが削除され、 複数回報酬モデルを呼び出して得た統計に置き換えられます。

  2. Unsloth パッケージとモデルを使う 報酬モデルが削除され 代わりに、単なるカスタム報酬関数に置き換えられ、これには RLVR を使用できます。

これは、GRPOが非常に効率的であることを意味します。以前のPPOでは複数のモデルを訓練する必要がありましたが、今では報酬モデルと価値モデルがなくなったため、メモリを節約し、すべてを高速化できます。

RLVR(検証可能な報酬を用いた強化学習) により、解が簡単に検証できるタスクに基づいてモデルへ報酬を与えられます。たとえば:

  1. 数式は簡単に検証できます。例: 2+2 = 4。

  2. コードの出力は、正しく実行されたかどうかを検証できます。

  3. 検証可能な報酬関数を設計するのは難しいことがあり、そのため多くの例は数学かコードです。

  4. GRPOのユースケースはコードや数学だけに限りません。その推論プロセスは、メール自動化、データベース検索、法律、医療のようなタスクも強化でき、データセットと報酬関数に基づいて精度を大きく改善できます。コツは、 ルーブリック、つまり小さな検証可能な報酬のリストを定義することであり、すべてを飲み込む単一の最終報酬ではありません。 OpenAIはこれを自社の 強化学習ファインチューニング(RFT)arrow-up-right の提供で、たとえば広めました。

なぜ「グループ相対」なのか?

GRPOは価値モデルを完全に取り除きますが、それでも 「平均報酬」 を現在の状態に対して推定する必要があります。

Unsloth パッケージとモデルを使う コツは LLM をサンプリングすること! そして、複数の異なる質問にわたるサンプリング過程の統計を通じて平均報酬を計算します。

たとえば「2+2は何?」に対して4回サンプリングします。4、3、D、C が得られるかもしれません。そして、それぞれの答えの報酬を計算し、その後 平均報酬 および 標準偏差を計算し、そのあと Zスコア標準化 します!

これにより アドバンテージ Aが作られ、これを価値モデルの代わりに使います。これで多くのメモリを節約できます!

GRPOのアドバンテージ計算

🤞運(というより忍耐)こそ必要なすべて

RLのコツは、必要なのはたった2つだけだということです:

  1. 質問または指示。たとえば「2+2は何?」や「PythonでFlappy Birdゲームを作って」

  2. 出力が良いか悪いかを検証する報酬関数と検証器。

この2つだけで、私たちは本質的に 言語モデルを無限回呼び出すことができます 。良い答えが出るまでです。たとえば「2+2は何?」に対して、訓練されていない悪い言語モデルは次のように出力します:

0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31**** その後、突然 4.

報酬信号は 0、0、0、0、0、0、0、0、0、0、0、0、0、0、0**** その後、突然 1。

つまり、運と偶然によって、RLは複数の ロールアウトを通じて正しい答えを見つけ出しました。私たちの目標は、良い答え 4 をもっと多く見て、それ以外(悪い答え)はずっと少なくすることです。

したがって、RLの目標は忍耐強くあることです。極限では、正解の確率が少なくとも小さな値(ゼロではない)であれば、それはただ待つゲームです。極限では、あなたは100%確実に正しい答えに遭遇します。

だから私は、RLにとって「必要なのは運だけ」と呼ぶのが好きです。

まあ、より良い表現は、RLにとって「必要なのは忍耐だけ」です。

RLは本質的に私たちに1つのコツを与えてくれます。単に無限に待つ代わりに、「悪い信号」、つまり悪い答えも得られるので、本質的にモデルが悪い解を生成しないように「誘導」できます。つまり、「良い」答えが現れるまで非常に長く待ったとしても、その間にモデルはすでに悪い答えを出さないよう最大限努力するように変化しています。

「2+2は何?」の例では - 0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31**** その後、突然 4.

悪い答えが出たので、RLはモデルに悪い答えを出力しないよう影響を与えます。つまり時間とともに、私たちはモデルの出力分布を悪い答えから慎重に「刈り込む」または遠ざけています。これは RL が 効率的であることを意味します。なぜなら、私たちは単に無限に待つのではなく、モデルをできるだけ「正解空間」へ押しやろうと積極的に試みているからです。

triangle-exclamation

🦥UnslothがRL向けに提供するもの

  • 15GBのVRAMで、Unslothを使えば、Llama 3.1(8B)、Phi-4(14B)、Mistral(7B)、Qwen2.5(7B)など、最大170億パラメータの任意のモデルを推論モデルへ変換できます

  • Unsloth は現在、 Vision/マルチモーダル向けRL モデルをサポートしています!

  • 最小要件: わずか5GBのVRAMで、自分専用の推論モデルをローカルで訓練できます(15億パラメータ以下の任意のモデル向け)

circle-info

フル 高度なGRPO のバッチ処理、生成、訓練パラメータに関するドキュメントは、 ガイドをご覧ください!

GRPOノートブック:

circle-check
  • まったく推論が得られない場合は、十分な訓練ステップがあること、そして 報酬関数/検証器 が機能していることを確認してください。報酬関数の例も提供しています ここ.

  • 以前のデモでは、Qwen2.5(3B)で独自の「aha」モーメントを達成できることが示されましたが、2xA100 GPU(160GB VRAM)が必要でした。今ではUnslothにより、わずか1枚の5GB VRAM GPUで同じ「aha」モーメントを達成できます。

  • 以前はGRPOはフルファインチューニングでしかサポートされていませんでしたが、私たちはこれをQLoRAとLoRAでも動作するようにしました

  • 2万コンテキスト長 たとえば、プロンプトあたり8生成の場合、UnslothはLlama 3.1(8B)でわずか54.3GBのVRAMしか使いません。一方、標準実装(+ Flash Attention 2)では 510.8GB(Unslothは90%少ない).

  • ご注意ください。これはDeepSeekのR1蒸留モデルをファインチューニングしたり、R1からの蒸留データをチューニングに使ったりすることではありません。これらはUnslothがすでにサポートしていたものです。これは、GRPOを使って標準モデルを本格的な推論モデルへ変換することです。

テスト例では、Phi-4 を GRPO でわずか100ステップしか訓練していないにもかかわらず、結果はすでに明確です。GRPOなしのモデルには thinking token がありませんが、GRPOで訓練したものにはあり、さらに正しい答えもあります。

💻GRPOで訓練する

Unsloth と GRPO を使って任意のオープンLLMを推論モデルに変換する方法のチュートリアルについては、 こちらを参照.

circle-check

GRPOがモデルをどう訓練するか

  1. 各質問と回答のペアについて、モデルは複数の可能な応答(例: 8通りのバリエーション)を生成します。

  2. 各応答は報酬関数を使って評価されます。

  3. 訓練ステップ:

    • 300行のデータがあれば、それは300訓練ステップです(3エポック訓練するなら900ステップ)。

    • 質問ごとの生成応答数を増やすこともできます(例: 8から16へ)。

  4. モデルは毎ステップ重みを更新することで学習します。

circle-exclamation

基本 / ヒント

  • 少なくとも 300ステップ は、実際に報酬が増加するまで待ってください。まずまずの結果を得るには、最低12時間は訓練する必要があるかもしれません(これがGRPOの仕組みです)が、もちろん必須ではなく、いつでも停止できます。

  • 最適な結果のためには少なくとも 500行のデータを用意してください。10行のデータでも試せますが、多いほうが良いです。

  • 各訓練実行は、モデル、データ、報酬関数/検証器などによって常に異なります。そのため、300ステップを最小値として書いてはいますが、場合によっては1000ステップ以上必要になることもあります。つまり、さまざまな要因に依存します。

  • UnslothでローカルにGRPOを使っている場合、エラーが出たら「pip install diffusers」も実行してください。また、vLLMの最新バージョンも使用してください。

  • GRPOは少なくとも 15億パラメータ のモデルに適用することが推奨されます。より小さいモデルでは thinking token を正しく生成できない可能性があるためです。

  • GRPOの GPU VRAM 要件 QLoRA 4-bit向けについては、一般的なルールとして、モデルのパラメータ数 = 必要なVRAM量です(より少ないVRAMでも使えますが、これは安全のためです)。設定するコンテキスト長が長いほど、必要なVRAMも増えます。LoRA 16-bit は少なくとも4倍以上のVRAMを使用します。

  • 継続的なファインチューニングは 可能で、GRPOをバックグラウンドで動かし続けることができます。

  • サンプルノートブックでは、 GSM8K データセットを使用しています。これは現在、R1スタイル訓練で最も人気のある選択肢です。

  • ベースモデルを使っている場合は、チャットテンプレートがあることを確認してください。

  • GRPOで多く訓練するほど良くなります。GRPOの最も良い点は、それほど多くのデータすら必要ないことです。必要なのは優れた報酬関数/検証器だけで、訓練にかける時間が長いほど、モデルはより良くなります。報酬とステップの関係は、時間の経過とともに次のように増加していくと考えてください:

  • GRPOの訓練損失追跡は現在Unslothに直接組み込まれており、wandb などの外部ツールは不要になりました。総合集約報酬関数そのものを含め、すべての報酬関数について完全なログ詳細が含まれています。

未対応モデルでのRL:

vLLMでサポートされていないモデルでも、たとえば Qwen3.5。単に fast_inference=False をモデル読み込み時に設定してください。

📋報酬関数 / 検証器

強化学習では、 報酬関数検証器 は、モデルの出力を評価する上で異なる役割を果たします。一般的には同じものとして解釈することもできますが、技術的には同じではありません。ただし通常は互いに組み合わせて使われるため、それほど重要ではありません。

検証器:

  • 生成された応答が正しいか誤っているかを判定します。

  • 数値スコアは割り当てず、正しさを検証するだけです。

  • 例: モデルが「2+2」に対して「5」を生成した場合、検証器はそれを「誤り」と判定してラベル付けします(正解は4なので)。

  • 検証器はコード(例: Python)を実行して、手動評価を必要とせずにロジック、構文、正しさを検証することもできます。

報酬関数:

  • 検証結果(または他の基準)を数値スコアに変換します。

  • 例: 答えが誤っていればペナルティ(-1、-2など)を与え、正しければ正のスコア(+1、+2)を与えることがあります。

  • 正しさ以外の基準、たとえば長すぎることや可読性の低さに基づいてペナルティを与えることもできます。

主な違い:

  • A 検証器 は正しさを確認しますが、採点はしません。

  • A 報酬関数 はスコアを割り当てますが、それ自体が必ずしも正しさを検証するわけではありません。

  • 報酬関数は できる 検証器を使うことが、技術的には同じものではありません。

報酬関数を理解する

GRPOの主な目標は、報酬を最大化し、単に訓練データから応答を記憶して再現するのではなく、答えがどのように導かれたかを学習することです。

  • 各訓練ステップで、GRPOは モデルの重みを調整し て報酬を最大化します。このプロセスにより、モデルは段階的にファインチューニングされます。

  • 通常のファインチューニング (GRPOなし)では、ただ 次単語予測確率を最大化するだけ であり、報酬に対する最適化はしません。GRPOは 報酬関数に対して最適化し 、単に次の単語を予測するのではありません。

  • あなたは データを再利用 して複数エポックにわたって使うことができます。

  • デフォルトの報酬関数 は、幅広いユースケースで使えるよう事前定義することもできますし、ChatGPT/ローカルモデルに生成させることもできます。

  • 報酬関数や検証器を設計する唯一の正しい方法はありません。可能性は無限です。ただし、適切に設計され意味のあるものでなければなりません。粗雑に作られた報酬は、意図せずモデル性能を低下させる可能性があるからです。

🪙報酬関数の例

以下の例を参照できます。生成結果を ChatGPT 4o や Llama 3.1(8B)のような LLM に入力し、それを評価する報酬関数と検証器を設計できます。たとえば、任意のLLMに生成結果を入力して、「答えがロボットっぽすぎるなら3点減点する」というルールを設定します。これは品質基準に基づいて出力を改善するのに役立ちます

例 #1: 単純な算術タスク

  • 質問: "2 + 2"

  • 回答: "4"

  • 報酬関数 1:

    • 数字が検出されたら → +1

    • 数字が検出されなければ → -1

  • 報酬関数 2:

    • その数字が正解と一致したら → +3

    • 不正解なら → -3

  • 合計報酬: すべての報酬関数の合計

例 #2: メール自動化タスク

  • 質問: 受信メール

  • 回答: 送信メール

  • 報酬関数:

    • 答えに必須キーワードが含まれていたら → +1

    • 答えが理想的な応答と完全一致したら → +1

    • 応答が長すぎたら → -1

    • 受信者の名前が含まれていたら → +1

    • 署名ブロック(電話、メール、住所)が存在したら → +1

Unsloth 距離ベース報酬関数

私たちの 高度なGRPO Colabノートブックを見たことがあるなら、私たちが カスタム距離ベース報酬関数 を完全にゼロから作成していることに気づくでしょう。これは正解により近い答えに報酬を与えるよう設計されており、この柔軟な関数は幅広いタスクに適用できます。

  • 私たちの例では、Qwen3(Base)で推論を有効にし、特定のタスクへ導いています

  • GRPOがデフォルトで書式だけを学びがちな傾向を避けるため、事前ファインチューニング戦略を適用する

  • 正規表現ベースの一致で評価精度を向上させる

  • 次のような汎用プロンプトを超えたカスタムGRPOテンプレートを作成する 考える、たとえば、 <start_working_out></end_working_out>

  • 近接ベースのスコアリングを適用する — モデルはより近い答えにより多くの報酬を得ます(例: 10の代わりに9を予測するのは、3より良い)一方、外れ値にはペナルティが与えられます

GSM8K 報酬関数

私たちの他の例では、既存の GSM8K 報酬関数を @willccbbarrow-up-right によるものとして使用しており、人気があり、かなり効果的であることが示されています:

  • correctness_reward_func – 正確なラベル一致に報酬を与えます。

  • int_reward_func – 整数のみの答えを促します。

  • soft_format_reward_func – 構造を確認しますが、小さな改行の不一致は許容します。

  • strict_format_reward_func – 改行を含め、応答構造がプロンプトに一致することを保証します。

  • xmlcount_reward_func – 応答内に各 XML タグがちょうど1つずつあることを保証します。

🧮vLLM を使う

今では vLLMarrow-up-right をファインチューニングスタックに直接使えるようになり、はるかに高いスループットが得られ、モデルのファインチューニングと推論を同時に行えます! 1x A100 40GB では、Unsloth の動的 4bit 量子化を使った Llama 3.2 3B Instruct で、およそ 4000 トークン/秒が期待できます。16GB の Tesla T4(無料 Colab GPU)では、300 トークン/秒が得られます。 また、vLLM と Unsloth を一緒に読み込む際の二重メモリ使用も魔法のように取り除き、Llama 3.1 8B で約5GB、Llama 3.2 3B で3GBの節約を可能にしました。Unsloth はもともと、Llama 3.3 70B Instruct を 1x 48GB GPU でファインチューニングでき、Llama 3.3 70B の重みは 40GB の VRAM を使用していました。もし二重メモリ使用を取り除かなければ、Unsloth と vLLM を一緒に読み込む際には 80GB 以上の VRAM が必要になります。 しかし Unsloth なら、48GB 未満の VRAM で、高速推論の利点を得ながらファインチューニングも1つのパッケージで行えます! 高速推論を使うには、まず vllm をインストールし、fast_inference を指定して Unsloth を初期化します:

GRPO 要件ガイドライン

Unsloth を使って GRPO を行うと、複数の工夫により、Flash Attention 2 を使った標準実装と比べて VRAM 使用量を 90% 以上も賢く削減できます! たとえば 2万コンテキスト長で、プロンプトあたり8生成の場合、Unsloth はわずか Llama 3.1 8B に対して 54.3GB の VRAMしか使いません。一方、標準実装では 510.8GB(Unslothは90%少ない).

  1. GRPOの QLoRA 4-bit の GPU VRAM 要件については、一般的なルールとして、モデルのパラメータ数 = 必要なVRAM量です(より少ないVRAMでも使えますが、これは安全のためです)。設定するコンテキスト長が長いほど、必要なVRAMも増えます。LoRA 16-bit は少なくとも4倍以上のVRAMを使用します。

  2. 私たちの新しいメモリ効率の高い GRPO 用線形カーネルは、メモリ使用量を 8 倍以上削減します。これにより 68.5GB のメモリを削減しつつ、torch.compile の助けにより実際にはさらに高速です!

  3. 私たちは賢い Unsloth gradient checkpointingarrow-up-right アルゴリズムを活用しています。これは少し前に公開したもので、中間活性をわずか1%遅いだけで非同期にシステムRAMへ賢くオフロードします。これにより 52GB のメモリを削減します。

  4. Unsloth は他パッケージの実装とは異なり、基盤となる推論エンジン(vLLM)と同じ GPU / CUDA メモリ空間も使用します。これにより 16GB のメモリを削減します。

指標
Unsloth
標準 + FA2

訓練メモリコスト (GB)

42GB

414GB

GRPO メモリコスト (GB)

9.8GB

78.3GB

推論コスト (GB)

0GB

16GB

2万コンテキスト長における推論 KV キャッシュ (GB)

2.5GB

2.5GB

合計メモリ使用量

54.33GB(90%少ない)

510.8GB

一般的な標準 GRPO 実装では、GRPO 損失を計算するために (8, 20K) サイズの logits を2つ作成する必要があります。これには、2 * 2 bytes * 8(生成数)* 20K(コンテキスト長)* 128256(語彙サイズ)= 78.3GB の VRAM が必要です。

Unsloth は長文脈 GRPO のメモリ使用量を 8 倍削減するので、2万コンテキスト長でも追加の VRAM はわずか 9.8GB だけで済みます!

また、KV キャッシュを 16bit で保持する必要もあります。Llama 3.1 8B は 32 層あり、K と V はどちらもサイズ 1024 です。したがって、2万コンテキスト長のメモリ使用量 = 2 * 2 bytes * 32 layers * 20K context length * 1024 = バッチあたり 2.5GB です。vLLM のバッチサイズは 8 に設定しますが、VRAM を節約するため、計算上は 1 のままにします。そうしないと KV キャッシュに 20GB 必要になります。

🎥 Unsloth RL 3時間ワークショップ動画

🎓さらに読む

  1. Nathan Lambert の RLHF Book は必読です! https://rlhfbook.com/c/11-policy-gradients.htmlarrow-up-right

  2. Yannic Kilcher の GRPO Youtube 動画も必見です! https://www.youtube.com/watch?v=bAWV_yrqx4warrow-up-right

  3. 私たちは AI Engineer World's Fair 2025 で3時間のワークショップを行いました。スライドやその他の資料は次にあります https://docs.unsloth.ai/ai-engineers-2025arrow-up-right

動画チュートリアル

ここに、私たちが素晴らしいと思う、すばらしい YouTuber たちが作成した動画チュートリアルをいくつか紹介します!

データセットの準備方法や、強化学習 + GRPO の基礎の背景説明を学ぶのに最適
自分のデバイス上でのローカル GRPO

最終更新

役に立ちましたか?