💡強化学習(RL)ガイド

強化学習(RL)についてすべて学び、Unsloth を使って GRPO により独自の 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. その 環境 はゲームの世界です。

  2. その 行動 あなたが取れるのは上、左、右、下です。

  3. その 報酬 はクッキーを食べると良く、うねうねした敵にぶつかると悪いです。

  4. RLでは取れる"最良の行動"を事前に知ることはできませんが、中間のステップや最終のゲーム状態(勝ちか負けか)を観察できます。

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

  1. 数字はCやDよりも良いですよね?

  2. 3を出すより8を出すよりはましですよね?

  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. その 生成方策(現在訓練中のモデル)

  2. その 参照方策(元のモデル)

  3. その 価値モデル(平均報酬推定器)

ステップ 4: コードを取得 報酬モデル 現在の環境の報酬を計算するために、そして私たちの目標は これを最大化することです!

PPOの式は安定に設計されているため複雑に見えます。PPOの数学的導出の詳細については私たちが2025年に行った AIエンジニアの講演arrow-up-right を参照してください。

DeepSeekが開発した GRPOarrow-up-right (Group Relative Policy Optimization)をR1推論モデルの訓練に使うため。PPOとの主な違いは:

  1. その 価値モデルが取り除かれ、 報酬モデルを複数回呼び出した統計に置き換えられます。

  2. その 報酬モデルが取り除かれ、 単にカスタム報酬関数に置き換えられ、 RLVR が使用できます。

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

RLVR(検証可能な報酬を用いた強化学習) は、解が容易に検証できるタスクに基づいてモデルを報酬付けすることを可能にします。例えば:

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

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

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

  4. GRPOのユースケースはコードや数学だけではありません — その推論プロセスはメール自動化、データベース検索、法務、医療などのタスクを強化し、データセットと報酬関数に基づいて精度を大幅に向上させることができます — コツは ルーブリック、すなわち小さな検証可能な報酬のリストを定義することであり、最終的な単一の包括的な報酬ではありません。 OpenAIはこれを彼らの 強化学習ファインチューニング(RFT)arrow-up-right の提供などで普及させました。

なぜ「Group Relative」なのか?

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

その トリックは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の目標は忍耐強くあることです — 極限では正しい答えの確率がわずかでも(ゼロでない)存在するなら、それは待つゲームであり、極限で確実に正しい答えに遭遇します。

だから私はRLについてこれを「運がすべて必要」と呼ぶのが好きです。

より良い表現はRLにおいて「忍耐がすべて必要」です。

RLは本質的にトリックを提供します — 単に無限に待つ代わりに、私たちは"悪い信号"、つまり悪い答えを得て、それによってモデルを既に悪い解答を出さないように"導く"ことができます。これは、非常に長く良い答えが出るのを待ったとしても、モデルは既に悪い答えを出さないように変化していることを意味します。

「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)など最大17Bパラメータの任意のモデルを推論・推論型の理由付けモデルに変換できます。

  • Unslothは今や 視覚/マルチモーダルのRL モデルをサポートしています!

  • 最小要件: わずか5GBのVRAMがあれば、任意の1.5Bパラメータ以下のモデルに対してローカルで推論モデルを訓練するのに十分です。

circle-info

に関して 高度なGRPO バッチ処理、生成、訓練パラメータに関する ガイドを読んでください!

GRPOノートブック:

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

  • 以前のデモではQwen2.5(3B)で「なるほど」モーメントを達成できることを示しましたが、それは2台のA100(合計160GB VRAM)を必要としました。今ではUnslothを使えば単一の5GB VRAM GPUで同じ「なるほど」モーメントを達成できます。

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

  • で、 20Kのコンテキスト長 例えばプロンプトごとに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なしのモデルは思考トークンを持っていませんが、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の最新バージョンを使用してください。

  • 少なくとも 1.5Bパラメータ のモデルにGRPOを適用することが推奨されます。小さなモデルは思考トークンを正しく生成しない可能性があります。

  • GRPOの GPU VRAM要件 QLoRA 4-bitの場合、一般的なルールはモデルのパラメータ数=必要なVRAM量です(より少ないVRAMで動かせる場合もありますが、安全側に見積もっています)。コンテキスト長を長く設定するほどVRAMは増えます。LoRAの16ビットは最低でも4倍のVRAMを使用します。

  • 連続的なファインチューニングは 可能であり、GRPOをバックグラウンドで継続して実行しておけます。

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

  • ベースモデルを使う場合はチャットテンプレートを用意してください。

  • GRPOで訓練すればするほど良くなります。GRPOの最良の点は大量のデータが不要なところです。必要なのは優れた報酬関数/検証器だけで、訓練に費やす時間が長いほどモデルは良くなります。報酬対ステップは時間とともに次のように増加することを期待してください:

  • GRPOの訓練損失の追跡は現在Unslothに直接組み込まれており、wandbのような外部ツールは不要です。すべての報酬関数の完全なログ詳細が含まれており、合計集約報酬関数自体も記録されます。

📋報酬関数/検証器

強化学習では、 報酬関数検証器 はモデルの出力を評価する上で異なる役割を果たします。一般的には同じものと解釈することもできますが、技術的には同一ではありません。ただし通常は一緒に使用されるため大きな問題ではありません。

検証器:

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

  • 数値スコアを割り当てるのではなく、単に正誤を検証します。

  • 例:モデルが"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の近接ベース報酬関数

当社の Advanced GRPO Colab Notebookを確認すると、私たちは完全にゼロから構築した カスタムの近接ベース報酬関数 を作成しており、正解により近い回答に報酬を与えるよう設計されています。この柔軟な関数は幅広いタスクに適用できます。

  • 例ではQwen3(Base)で推論を有効にし、特定タスクへ導くようにしています。

  • GRPOが単にフォーマットを学習してしまうデフォルトの傾向を避けるために、事前ファインチューニング戦略を適用してください。

  • 正規表現ベースのマッチングで評価精度を高めてください。

  • 汎用的なプロンプト(例: think)を超えたカスタムGRPOテンプレートを作成してください。 例:

  • <start_working_out></end_working_out>

近接ベースのスコアリングを適用 — モデルはより近い答えに多くの報酬を得ます(例:10の代わりに9を予測する方が3よりはまし)一方で外れ値は罰則を受けます。

GSM8Kの報酬関数 他の例では、@willccbbによる既存のGSM8K報酬関数を使用しています。arrow-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%以上削減します!例えば20Kのコンテキスト長でプロンプトごとに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ビットは最低でも4倍のVRAMを使用します。

  2. 当社の新しいメモリ効率の良い線形カーネルはGRPOでのメモリ使用を8倍以上削減します。これにより68.5GBのメモリが節約され、実際にはtorch.compileの助けにより高速にもなっています!

  3. 私たちはスマートな Unslothの勾配チェックポイントarrow-up-right アルゴリズムを活用しています。これは中間活性化を非同期にシステムRAMへオフロードしつつわずか1%の遅延で動作します。これにより52GBのメモリが削減されます。

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

指標
Unsloth
標準 + FA2

訓練時メモリコスト(GB)

42GB

414GB

GRPOメモリコスト(GB)

9.8GB

78.3GB

推論コスト(GB)

0GB

16GB

20Kコンテキスト長の推論KVキャッシュ(GB)

2.5GB

2.5GB

合計メモリ使用量

54.33GB(90%削減)

510.8GB

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

Unslothは長いコンテキストのGRPOでメモリ使用を8倍削減するため、20Kコンテキスト長でも追加でわずか9.8GBのVRAMしか必要としません!

またKVキャッシュを16bitから取得する必要があります。Llama 3.1 8Bは32層を持ち、KとVの両方がサイズ1024です。したがって20Kコンテキスト長のメモリ使用量 = 2 * 2バイト * 32層 * 20Kコンテキスト長 * 1024 = バッチあたり2.5GBになります。vLLMのバッチサイズは8に設定しますが、VRAM節約のため計算では1にしておきます。さもなければKVキャッシュに20GB必要になります。

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

🎓さらなる参考文献

  1. Nathan LambertのRLHF本は必読です! 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

最終更新

役に立ちましたか?