💡強化学習(RL)ガイド

強化学習(RL)についてと、Unsloth を使って GRPO により DeepSeek-R1 推論モデルをトレーニングする方法を学びます。初心者から上級者までの完全なガイドです。

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

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

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

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

🦥あなたが学ぶこと

  1. RLとは?RLVR?PPO?GRPO?RLHF?RFT?は 「運だけで十分?」 強化学習において?

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

この記事では、GRPO、強化学習(RL)および報酬関数について、初心者から上級者向けまで必要なこと、ヒント、そして Unslotharrow-up-rightでのGRPOの基本的な使い方をカバーします。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の概念を一般化したのはOpenAIで、 RLHFarrow-up-right (Human Feedbackからの強化学習)では、 「エージェント」 に質問( 状態)に対して人間がより有用と評価する出力を生成させるよう学習させます。

例えばChatGPTのサムズアップ/サムズダウンはRLHFプロセスで使えます。

PPOの式

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

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

  1. その 生成ポリシー(現在学習中のモデル)

  2. その 参照ポリシー(元のモデル)

  3. その バリューモデル(平均報酬推定器)

我々は 報酬モデル を使って現在の環境の報酬を計算し、目標は これを最大化することです!

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 の提供で一般化しました。

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

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)で「aha」モーメントを達成できましたが、それには2枚のA100(合計160GB VRAM)が必要でした。今ではUnslothを使えば単一の5GB VRAM GPUだけで同じ「aha」モーメントを達成できます。

  • 以前はGRPOはフルファインチューニングのみ対応でしたが、我々はこれをQLoRAとLoRAでも動作するようにしました

  • 20Kのコンテキスト長 例えば1プロンプトあたり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を使用することを推奨します。

  • GRPOを適用するモデルは少なくとも 1.5Bのパラメータ が望ましいです。小さいモデルは「考える」トークンを正しく生成できないことがあります。

  • GRPOの GPU VRAM要件 QLoRA 4ビットの場合、一般的なルールはモデルのパラメータ量=必要なVRAM量です(少ないVRAMでも動かせますが、安全のための目安です)。設定するコンテキスト長が長いほどVRAMが多く必要になります。LoRAの16ビットは最低でも4倍のVRAMを使用します。継続的なファインチューニングは

  • 可能で、GRPOをバックグラウンドで実行し続けることができます。 サンプルノートブックでは、我々は

  • GSM8Kデータセット を使用しています、これは現時点でR1スタイル訓練で最も人気のある選択肢です。ベースモデルを使用する場合はチャットテンプレートを用意してください。

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

  • GRPOの訓練損失追跡は現在Unslothに直接組み込まれており、wandbなどの外部ツールは不要です。すべての報酬関数に関する完全なログ詳細(集計された総報酬関数を含む)を含みます。

  • 報酬関数/検証器

サポートされていないモデルでのRL:

vLLMでサポートされていないモデル(例: Qwen3.5など)でもUnslothでRLを実行できます。 fast_inference=False fast_inference=False

📋強化学習において、

報酬関数 検証器 はモデルの出力を評価する上で異なる役割を果たします。一般的には同じものと解釈することもできますが、技術的には同一ではなく、通常は併用されます。 生成された応答が正しいか間違っているかを判定します。

はモデルの出力を評価する上で異なる役割を果たします。一般的には同じものと解釈することもできますが、技術的には同一ではなく、通常は併用されます。:

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

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

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

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

:

  • 例:答えが間違っていれば罰則(-1、-2など)を与え、正解なら正のスコア(+1、+2)を与えることがあります。

  • 正確性以外の基準、例えば長すぎることや読みやすさの低さに基づいて罰則を与えることもできます。

  • 主な違い

検証器は正誤を確認するがスコアは付けない。:

  • 報酬関数はスコアを割り当てるが必ずしも正誤を直接検証するわけではない。 はモデルの出力を評価する上で異なる役割を果たします。一般的には同じものと解釈することもできますが、技術的には同一ではなく、通常は併用されます。 報酬関数は

  • 報酬関数はスコアを割り当てるが必ずしも正誤を直接検証するわけではない。 検証器を利用できるが、技術的には同じものではありません。

  • 報酬関数の理解 GRPOの主目的は報酬を最大化し、単に訓練データを暗記して再現するのではなく、回答がどのように導出されたかを学習することです。 各訓練ステップで、GRPOは

モデルの重みを調整し

報酬を最大化します。このプロセスはモデルを段階的に微調整します。

  • 通常のファインチューニング (GRPOなし)は単に 次の語予測確率を最大化するだけで

  • 報酬を最適化するわけではありません。GRPOは 報酬関数を最適化する ように働きます。単に次の単語を予測するだけではありません。 データを 複数エポックで再利用することができます。 デフォルトの報酬関数は

  • あらかじめ定義して様々なユースケースで使うことができますし、ChatGPTやローカルモデルに生成してもらうこともできます。 報酬関数や検証器を設計する唯一の正しい方法はありません—可能性は無限です。ただし、適切に設計され意味のあるものである必要があります。設計が不十分な報酬は意図せずモデル性能を低下させることがあります。 報酬関数の例

  • 以下の例を参照できます。生成物をChatGPT 4oやLlama 3.1(8B)などのLLMに入力し、評価する報酬関数と検証器を設計できます。例えば「回答があまりにも機械的に聞こえる場合は3点減点する」といったルールを設定できます。これにより品質基準に基づいて出力が洗練されます。 例 #1:簡単な算術タスク

  • 質問:

🪙答え:

報酬関数1:

数字が検出された場合 →

  • 数字が検出されない場合 → "2 + 2"

  • 報酬関数2: "4"

  • その数字が正解と一致する場合 →

    • 間違っている場合 → +1

    • 合計報酬: -1

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

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

    • 受信メール -3

  • 送信メール 報酬関数:

回答に必須キーワードが含まれている場合 →

  • 数字が検出されない場合 → 回答が理想的な応答と完全に一致する場合 →

  • 報酬関数2: 回答が長すぎる場合 →

  • 受取人の名前が含まれている場合 →

    • 署名ブロック(電話、メール、住所)がある場合 → +1

    • Unslothの近接度ベース報酬関数 +1

    • もし我々の -1

    • 高度なGRPO Colabノートブック +1

    • を見ていれば、我々が完全にゼロから構築した +1

カスタムの近接度ベース報酬関数

を作成していることに気づくでしょう。これは正解に近い答えに報酬を与えるよう設計された柔軟な関数で、幅広いタスクに適用できます。 我々の例ではQwen3(Base)で推論を有効にし、特定のタスクへ誘導しています事前ファインチューニング戦略を適用してGRPOが形式学習に偏るのを避ける 正規表現ベースの一致で評価精度を向上させる 汎用的なプロンプト(例:「考えて」)を超えたカスタムGRPOテンプレートを作成する

  • 例:

  • think

  • の代わりに、例えば

  • <start_working_out></end_working_out> 近接度ベースのスコアリングを適用する — モデルはより近い答えに対してより多くの報酬を得る(例:10の代わりに9を予測する方が3よりは良い)一方で外れ値は罰せられるGSM8Kの報酬関数 他の例では、人気があり効果的であると示されている

  • @willccbb

による既存のGSM8Kの報酬関数を使用しています:

correctness_reward_func – 正確なラベル一致に報酬を与えます。arrow-up-right int_reward_func

  • – 整数のみの回答を促進します。 soft_format_reward_func

  • – 構造をチェックしますが小さな改行の不一致は許容します。 strict_format_reward_func

  • – 応答の構造がプロンプト(改行を含む)と一致することを保証します。 xmlcount_reward_func

  • – 応答内に各XMLタグがちょうど1つずつ存在することを確保します。 vLLMの使用

  • あなたは今や をファインチューニングスタックに直接使用でき、スループットを大幅に向上させながら、同時にモデルのファインチューニングと推論を行うことができます!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未満でファインチューニングと高速推論の利点をひとまとめに得られます!高速推論を使用するには、まず vllm をインストールし、fast_inference を使ってUnslothをインスタンス化してください:

🧮# pip install unsloth vllm

model_name = "unsloth/Llama-3.2-3B-Instruct", vLLMarrow-up-right fast_inference = True,

が、標準的な実装は

GPU VRAM要件(QLoRA 4ビット) 我々の新しいメモリ効率の良い線形カーネルはGRPOのメモリ使用を8倍以上削減します。これにより68.5GBのメモリを削減しつつ、torch.compileの助けで実際には高速になります!我々は賢い 510.8GB(Unslothで90%少ない)を要します。.

  1. GRPOの Unslothの勾配チェックポイント継続的なファインチューニングは

  2. アルゴリズムを活用しています。これは中間活性化を非同期にシステムRAMにオフロードしながらわずか1%の遅延しか生じません。これにより52GBのメモリを削減します。

  3. Unslothは基盤となる推論エンジン(vLLM)と同じGPU/CUDAメモリ空間を共有して使用します。他パッケージの実装とは異なり、これによりさらに16GBのメモリ削減が可能です。 指標arrow-up-right 標準 + FA2

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

42GB
Unsloth
414GB

GRPOメモリコスト(GB)

9.8GB

78.3GB

推論コスト(GB)

0GB

16GB

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

2.5GB

総メモリ使用量

54.33GB(90%少ない)

510.8GB

510.8GB

典型的な標準GRPO実装では、GRPO損失を計算するためにサイズ(8, 20K)のロジットを2つ作成する必要があります。これは 2 * 2 bytes * 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 bytes * 32層 * 20K * 1024 = バッチあたり2.5GBになります。我々はvLLMのバッチサイズを8に設定するところですが、VRAM節約のため計算では1のままにします。そうでないとKVキャッシュに20GB必要になります。

🎥 Unsloth RL 3時間ワークショップビデオ

さらに読むべき資料

Nathan LambertのRLHF本は必読です!

https://rlhfbook.com/c/11-policy-gradients.html

🎓Yannic KilcherのGRPOに関するYouTube動画も必見です!

  1. https://docs.unsloth.ai/ai-engineers-2025 にあります。arrow-up-right

データセットの準備方法や強化学習+GRPOの背後にある説明を学ぶのに最適です

ローカルでのGRPOをあなたのデバイス上で

素晴らしい!
(注:元のJSONの最後のキーは "t368" でしたが、翻訳のために上記で"ローカルでのGRPOをあなたのデバイス上で" を t366 に充て、その後に補完の短い肯定を t367 として追加しました)

最終更新

役に立ちましたか?