# 强化学习（RL）指南

强化学习是指一个“智能体”通过与环境交互并接收 **反馈** ，其形式为 **奖励** 或 **惩罚**.

* **动作：** 模型生成的内容（例如一句话）。
* **奖励：** 一个信号，表示模型的动作有多好或多差（例如回答是否遵循指令？是否有帮助？）。
* **环境：** 模型正在处理的场景或任务（例如回答用户的问题）。

### :sloth:你将学到什么

1. 什么是 RL？RLVR？PPO？GRPO？RLHF？RFT？“ <mark style="background-color:green;">**“Luck is All You Need?”**</mark> ”是否适用于 RL？
2. 什么是环境？智能体？动作？奖励函数？奖励？

本文涵盖你需要了解的关于 GRPO、强化学习（RL）和奖励函数的一切内容（从入门到进阶），以及技巧和使用 GRPO 与 [Unsloth](https://github.com/unslothai/unsloth)的基础知识。如果你正在寻找使用 GRPO 的分步教程，请看我们的指南 [这里](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo).

{% hint style="success" %}
**2026年1月15日更新：** [超长上下文 RL](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/grpo-long-context) 来了！用 380K 上下文窗口训练 gpt-oss。

**2025年11月26日更新：** 我们在 Unsloth 中引入了 FP8 精度的 RL 和 GRPO！ [阅读博客](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/fp8-reinforcement-learning)
{% endhint %}

## :question:什么是强化学习（RL）？

RL 的目标是：

1. **增加看到&#x20;**<mark style="background-color:green;">**“好”**</mark>**&#x20;结果的概率。**
2. **减少看到&#x20;**<mark style="background-color:red;">**“坏”**</mark>**&#x20;结果的概率。**

**结果的概率。** 就是这样！

{% columns %}
{% column width="50%" %}
关于“好”和“坏”分别意味着什么，或者我们如何去“增加”或“减少”它，以及“结果”到底指什么，都有很多细节。 **例如，在**:

1. 吃豆人游戏 <mark style="background-color:green;">**中，**</mark> 环境
2. 吃豆人游戏 <mark style="background-color:blue;">**是游戏世界。**</mark> 你可以采取的动作有上、左、右和下。
3. 吃豆人游戏 <mark style="background-color:purple;">**奖励**</mark> 如果你吃到饼干，它们就是好的；如果你撞到那些曲折的敌人，它们就是坏的。
4. 在 RL 中，你无法知道你能采取的“最佳动作”，但你可以观察中间步骤，或者最终的游戏状态（赢或输）
   {% endcolumn %}

{% column %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-e853f7e6da505ee587642314b98180ebf840252c%2FRL%20Game.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="50%" %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-30bade1550c877bb7f79075c80ac79476b0ecd76%2FMath%20RL.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}

{% column %}
另一个例子是假设你被问到： <mark style="background-color:blue;">**“2 + 2 等于多少？”**</mark> （4）一个未对齐的语言模型可能会输出 3、4、C、D、-10，几乎任何东西。

1. 数字总比 C 或 D 好，对吧？
2. 得到 3 总比得到 8 好，对吧？
3. 得到 4 显然是正确的。

我们刚刚设计了一个 <mark style="background-color:orange;">**奖励函数**</mark>!
{% endcolumn %}
{% endcolumns %}

### :person\_running:从 RLHF、PPO 到 GRPO 和 RLVR

{% columns %}
{% column %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-5d0c90e4b45507d3e12c8b938cbd1679cd38f4f9%2FRLHF.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}

{% column %}
OpenAI 普及了 [RLHF](https://en.wikipedia.org/wiki/Reinforcement_learning_from_human_feedback) （基于人类反馈的强化学习）这一概念，我们训练一个 <mark style="background-color:red;">**“智能体”**</mark> 为一个问题（ <mark style="background-color:yellow;">**状态**</mark>）生成由人类评为更有用的输出。

例如，ChatGPT 中的点赞和点踩可以用于 RLHF 过程。
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-1e1dff9c921e787e669dee79c41a76db89e882e7%2FPPO.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-f6156f2c519baf81e6ef286476f4092037303799%2FPPO%20formula.png?alt=media" alt=""><figcaption><p>PPO 公式</p></figcaption></figure>

clip(..., 1-e, 1+e) 这一项用于强制 PPO 不要进行过大的更新。还有一个 KL 项，beta 设为 > 0，用于强制模型不要偏离太多。
{% endcolumn %}

{% column %}
为了进行 RLHF， [<mark style="background-color:red;">**PPO**</mark>](https://en.wikipedia.org/wiki/Proximal_policy_optimization) （近端策略优化，Proximal Policy Optimization）被开发出来。在这里， <mark style="background-color:blue;">**智能体**</mark> 就是语言模型。实际上它由 3 个系统组成：

1. 吃豆人游戏 **生成策略（当前训练中的模型）**
2. 吃豆人游戏 **参考策略（原始模型）**
3. 吃豆人游戏 **价值模型（平均奖励估计器）**

我们使用 **奖励模型** 来计算当前环境的奖励，我们的目标是 **最大化它**!

PPO 的公式看起来相当复杂，因为它的设计目标是稳定。想了解更深入的 PPO 数学推导，请访问我们在 2025 年做的 [AI 工程师演讲](https://docs.unsloth.ai/ai-engineers-2025) 关于 RL 的更多内容。
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-4f4e188edbcad4f53aaa4a626bc5b2fd01334574%2FGRPO%20%2B%20RLVR.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}

{% column %}
DeepSeek 开发了 [<mark style="background-color:red;">**GRPO**</mark>](https://unsloth.ai/blog/grpo) （组相对策略优化，Group Relative Policy Optimization）来训练他们的 R1 推理模型。与 PPO 的关键区别是：

1. 吃豆人游戏 **价值模型被移除，** 改为使用多次调用奖励模型得到的统计结果。
2. 吃豆人游戏 **奖励模型被移除，** 并且替换为仅使用自定义奖励函数， <mark style="background-color:blue;">**RLVR**</mark> 可被使用。
   {% endcolumn %}
   {% endcolumns %}

这意味着 GRPO 极其高效。以前 PPO 需要训练多个模型——现在移除了奖励模型和价值模型后，我们可以节省内存并让一切更快。

<mark style="background-color:orange;">**RLVR（带可验证奖励的强化学习，Reinforcement Learning with Verifiable Rewards）**</mark> 使我们能够基于那些容易验证答案的任务来奖励模型。例如：

1. 数学方程可以很容易验证。例如 2+2=4。
2. 代码输出可以验证其是否正确执行。
3. 设计可验证的奖励函数可能很难，因此大多数示例都是数学或代码。
4. GRPO 的用例不只是代码或数学——它的推理过程还能增强电子邮件自动化、数据库检索、法律和医学等任务，并根据你的数据集和奖励函数大幅提高准确率——关键在于定义一个 <mark style="background-color:yellow;">**评分标准——即一组更小、可验证的奖励，而不是一个最终吞噬一切的单一奖励。**</mark> OpenAI 在他们的 [强化学习微调（RFT）](https://platform.openai.com/docs/guides/reinforcement-fine-tuning) 产品中将其普及。

{% columns %}
{% column %} <mark style="background-color:red;">**为什么是“组相对”？**</mark>

GRPO 完全移除了价值模型，但我们仍然需要估计 <mark style="background-color:yellow;">**“平均奖励”**</mark> 在当前状态下的值。

吃豆人游戏 **技巧是对 LLM 进行采样**！然后我们通过对多个不同问题的采样过程进行统计来计算平均奖励。
{% endcolumn %}

{% column %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-29e188e5adc6de1e62c841e6cd9e34a2dae4994a%2FGroup%20Relative.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}
例如，对于“2+2 等于多少？”，我们采样 4 次。可能得到 4、3、D、C。然后我们计算这些答案各自的奖励，再计算 **平均奖励** 和 **标准差**，然后 <mark style="background-color:red;">**进行 Z 分数标准化**</mark> ！

这会生成 <mark style="background-color:blue;">**优势 A**</mark>，我们将用它来替代价值模型。这能节省大量内存！
{% endcolumn %}

{% column %}

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-d40a73cd48b05b9205810a1946f4fc1dce81ae7d%2FStatistics.png?alt=media" alt=""><figcaption><p>GRPO 优势计算</p></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

### :fingers\_crossed:Luck（好吧，是耐心）就是你所需要的一切

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\*\*\*\*\*\*\*\*&#x20;**<mark style="color:绿色;">**然后突然变成 4**</mark>**.***

***奖励信号一开始是 0、0、0、0、0、0、0、0、0、0、0、0、0、0、0\*\*\*\*\*\*\*\*&#x20;**<mark style="color:绿色;">**然后突然变成 1。**</mark>*

所以，凭借运气和偶然，RL 成功在多个 <mark style="background-color:yellow;">**rollout**</mark>中找到了正确答案。我们的目标是让模型更频繁地看到正确答案 4，而让其余（错误答案）少得多。

<mark style="color:蓝色;">**因此 RL 的目标是要有耐心——从极限上说，如果正确答案的概率至少是一个很小的数（不是 0），那这本质上就是一个等待游戏——在极限情况下，你 100% 一定会遇到正确答案。**</mark>

<mark style="background-color:blue;">**所以我喜欢把它称作 RL 的“Luck Is All You Need”。**</mark>

<mark style="background-color:orange;">**不过更好的说法是 RL 的“Patience is All You Need”。**</mark>

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-4f0cb4803aa22583e88dfa8de8061b66bbe6a6b1%2FLuck%20is%20all%20you%20need.png?alt=media" alt="" width="375"><figcaption></figcaption></figure>

RL 本质上给了我们一个技巧——与其单纯地等待无穷久，我们会得到“坏信号”，也就是坏答案，然后我们就可以基本上“引导”模型尽量不要生成坏解。这意味着，虽然你可能等了很久才等到一个“好”答案出现，但模型实际上已经被改变为尽最大努力不输出坏答案。

在“2+2 等于多少？”这个例子中—— ***0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31\*\*\*\*\*\*\*\*&#x20;**<mark style="color:绿色;">**然后突然变成 4**</mark>**.***

既然我们得到了坏答案，RL 就会影响模型尽量不要输出坏答案。这意味着随着时间推移，我们正在谨慎地“修剪”或将模型的输出分布从坏答案中移开。这意味着 RL 是 <mark style="color:蓝色;">**高效的**</mark>，因为我们并不是只是在无穷等待，而是在主动尝试把模型尽可能“推”向“正确答案空间”。

{% hint style="danger" %}
**如果概率一直是 0，那么 RL 永远不会起作用**。这也是为什么人们喜欢基于一个已经做过指令微调的模型来进行 RL，因为它可以在一定程度上较好地遵循指令——这会把概率很可能提升到 0 以上。
{% endhint %}

## :sloth:Unsloth 为 RL 提供什么

* 在 15GB VRAM 下，Unsloth 允许你将任何最多 170 亿参数的模型，如 Llama 3.1（8B）、Phi-4（14B）、Mistral（7B）或 Qwen2.5（7B）转换为推理模型
* **Unsloth 现在支持** [**视觉/多模态 RL**](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/vision-reinforcement-learning-vlm-rl) **模型！**
* **最低要求：** 只需 5GB VRAM 就足以在本地训练你自己的推理模型（适用于任何 15 亿参数或更小的模型）

{% columns %}
{% column %}
{% content-ref url="reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo" %}
[tutorial-train-your-own-reasoning-model-with-grpo](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo)
{% endcontent-ref %}
{% endcolumn %}

{% column %}
{% content-ref url="reinforcement-learning-rl-guide/vision-reinforcement-learning-vlm-rl" %}
[vision-reinforcement-learning-vlm-rl](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/vision-reinforcement-learning-vlm-rl)
{% endcontent-ref %}
{% endcolumn %}
{% endcolumns %}

{% hint style="info" %}
对于 **高级 GRPO** 关于批处理、生成和训练参数的文档， [请阅读我们的指南！](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/advanced-rl-documentation)
{% endhint %}

### GRPO 笔记本：

| [**Gemma 4 E2B**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma4_\(E2B\)_Reinforcement_Learning_Sudoku_Game.ipynb) - **新** | [Qwen3-VL-8B](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_VL_\(8B\)-Vision-GRPO.ipynb) - 视觉 GSPO | [Gemma 3（4B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3_\(4B\)-Vision-GRPO.ipynb) - 视觉 GSPO              |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| [**Qwen3.5（4B）**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_5_\(4B\)_Vision_GRPO.ipynb) **- 视觉 -&#x20;*****新***        | [gpt-oss-20b](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-\(20B\)-GRPO.ipynb) GSPO             | [Llama 3.2（3B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Advanced_Llama3_2_\(3B\)_GRPO_LoRA.ipynb) - 高级        |
| [Qwen3（4B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_\(4B\)-GRPO.ipynb) - 高级                                          | [Phi-4（14B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Phi_4_\(14B\)-GRPO.ipynb)                     | [DeepSeek-R1-0528-Qwen3-8B](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/DeepSeek_R1_0528_Qwen3_\(8B\)_GRPO.ipynb) |
| [Mistral v0.3（7B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Mistral_v0.3_\(7B\)-GRPO.ipynb)                                 | [Llama 3.1（8B）](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_\(8B\)-GRPO.ipynb)                | [Qwen3-8B - **FP8**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_8B_FP8_GRPO.ipynb) （L4）                    |

{% hint style="success" %}
我们支持 [**GSPO**](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/advanced-rl-documentation/gspo-reinforcement-learning) 以及大多数其他新的 GRPO 技术。你可以在 GRPOConfig 中使用以下参数来启用：

```python
epsilon=0.2,
epsilon_high=0.28, # 单边
delta=1.5 # 双边

loss_type='gspo',
# 或者：
loss_type='grpo',
# 或者：
loss_type='dr_grpo',

mask_truncated_completions=True,
```

{% endhint %}

* 如果你没有得到任何推理过程，请确保你的训练步数足够，并确认你的 [奖励函数/验证器](#reward-functions-verifier) 正在正常工作。我们提供了奖励函数示例 [这里](#reward-function-examples).
* 此前的演示表明，你可以用 Qwen2.5（3B）实现自己的“aha”时刻——但那需要 2 张 A100 GPU（160GB VRAM）。现在，借助 Unsloth，你只需一张 5GB VRAM 的 GPU 就能达到同样的“aha”时刻。
* 以前，GRPO 仅支持全参数微调，但我们已经让它可以与 QLoRA 和 LoRA 一起工作
* 在 [**20K 上下文长度**](#grpo-requirement-guidelines) 下，例如每个提示 8 个生成，Unsloth 仅使用 Llama 3.1（8B）的 54.3GB VRAM，而标准实现（+ Flash Attention 2）需要 **510.8GB（Unsloth 少 90%）**.
* 请注意，这并不是对 DeepSeek 的 R1 蒸馏模型进行微调，也不是使用 R1 的蒸馏数据进行调优——这些 Unsloth 之前就已支持。这里是在使用 GRPO 把标准模型转换为一个完整的推理模型。

在一个测试示例中，尽管我们只用 GRPO 训练了 Phi-4 100 步，结果已经非常明显。未使用 GRPO 的模型没有思考 token，而使用 GRPO 训练的模型有思考 token，并且答案也是正确的。

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-5ae836156344a7c22241d0f76dbea09d58e04f8f%2Fprompt%20only%20example.png?alt=media" alt=""><figcaption></figcaption></figure>

## :computer:使用 GRPO 进行训练

想了解如何使用 Unsloth 和 GRPO 将任何开源 LLM 转换为推理模型的教程， [请看这里](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/tutorial-train-your-own-reasoning-model-with-grpo).

{% hint style="success" %}
对于 **高级 GRPO** 关于批处理、生成和训练参数的文档， [请阅读我们的指南！](https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide/advanced-rl-documentation)
{% endhint %}

### **GRPO 如何训练模型**

1. 对于每个问答对，模型会生成多个可能的回复（例如 8 个变体）。
2. 每个回复都会通过奖励函数进行评估。
3. 训练步骤：
   * 如果你有 300 行数据，那么就是 300 个训练步骤（如果训练 3 个 epoch，则是 900 步）。
   * 你可以增加每个问题生成的回复数量（例如从 8 个增加到 16 个）。
4. 模型通过每一步更新其权重来学习。

{% hint style="warning" %}
如果你的 GRPO 模型没有学到东西，我们强烈建议使用我们的 [高级 GRPO 笔记本](https://unsloth.ai/docs/zh/unsloth-notebooks#grpo-reasoning-notebooks) 因为它有更好的奖励函数，你应该会更快、更频繁地看到结果。
{% endhint %}

### 基础/技巧

* 至少等待 **300 步** ，让奖励真正上升。为了获得像样的结果，你可能需要至少投入 12 小时（这就是 GRPO 的工作方式），但请记住这不是强制的，因为你可以随时停止。
* 为了获得最佳结果，至少准备 **500 行数据**。你可以用仅 10 行数据试一试，但更多会更好。
* 每次训练都会因模型、数据、奖励函数/验证器等不同而有所差异，所以虽然我们写的是 300 步作为最低值，但有时可能需要 1000 步或更多。因此，这取决于多种因素。
* 如果你在本地使用 Unsloth 进行 GRPO，请在出现错误时也执行“pip install diffusers”。此外，请使用最新版本的 vLLM。
* 建议至少将 GRPO 应用于一个 **15 亿参数** 的模型，以便正确生成思考 token，因为更小的模型可能无法做到。
* 关于 GRPO 的 [**GPU VRAM 需求**](#grpo-requirement-guidelines) **针对 QLoRA 4-bit**，一般规则是模型参数量 = 你需要的 VRAM 量（你可以用更少的 VRAM，但这是为了保险起见）。你设置的上下文长度越大，所需 VRAM 越多。LoRA 16-bit 至少会使用 4 倍更多的 VRAM。
* **持续微调是** 可行的，你可以把 GRPO 直接放在后台运行。
* 在示例笔记本中，我们使用 [**GSM8K 数据集**](#gsm8k-reward-functions)，这是当前最流行的 R1 风格训练选择。
* 如果你使用的是基础模型，请确保你有一个聊天模板。
* 用 GRPO 训练得越多越好。GRPO 最好的地方在于你甚至不需要太多数据。你只需要一个很棒的奖励函数/验证器，而训练时间越长，你的模型就会越好。随着时间推移，你的奖励与步数曲线应当像这样上升：

  <figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-e44683faa4765a3b803edd4c02c4b468e45cc91d%2Funnamed.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
* GRPO 的训练损失跟踪现在已直接集成到 Unsloth 中，不再需要 wandb 等外部工具。它现在包含所有奖励函数的完整日志细节，包括总的聚合奖励函数本身。

<figure><img src="https://2657992854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-58d958e1a3bfd968f1b1a4995a28261aa6413337%2FScreenshot%202025-02-20%20at%2004-52-52%20Copy%20of%20Yet%20another%20copy%20of%20Llama3.1_(8B)-GRPO.ipynb%20-%20Colab.png?alt=media" alt=""><figcaption></figcaption></figure>

### 在不受支持的模型上进行 RL：

你也可以用 Unsloth 在 vLLM 不支持的模型上运行 RL，例如 [Qwen3.5](https://unsloth.ai/docs/zh/mo-xing/qwen3.5/fine-tune)。只需在加载模型时设置 `fast_inference=False` 。

```python
from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="unsloth/Qwen3.5-4B",
    fast_inference=False,
)
```

## :clipboard:奖励函数 / 验证器

在强化学习中， **奖励函数** 和 **验证器** 在评估模型输出时扮演不同角色。一般来说，你可以把它们理解成同一回事，但严格来说它们并不是，不过这并不太重要，因为它们通常会一起使用。

**验证器**:

* 判断生成的回复是正确还是错误。
* 它不赋予数值分数——它只是验证正确性。
* 示例：如果模型对“2+2”生成“5”，验证器会检查并将其标记为“错误”（因为正确答案是 4）。
* 验证器也可以执行代码（例如 Python）来验证逻辑、语法和正确性，而无需人工评估。

**奖励函数**:

* 将验证结果（或其他标准）转换为数值分数。
* 示例：如果答案错误，它可能给出惩罚（-1、-2 等），而正确答案可能得到正分（+1、+2）。
* 它也可以基于正确性之外的标准进行惩罚，例如过长或可读性差。

**关键区别**:

* 一个 **验证器** 检查正确性，但不评分。
* 一个 **奖励函数** 给出分数，但不一定自行验证正确性。
* 奖励函数 *可以* 使用验证器，但它们在技术上并不相同。

### **理解奖励函数**

GRPO 的主要目标是最大化奖励并学习答案是如何得出的，而不仅仅是记住并复现训练数据中的回复。

* 每进行一步训练，GRPO 都会 **调整模型权重** 以最大化奖励。这个过程会逐步对模型进行微调。
* **常规微调** （不使用 GRPO）只会 **最大化下一个词的预测概率** ，但不会针对奖励进行优化。GRPO **优化的是奖励函数** ，而不仅仅是预测下一个词。
* 你可以 **重复使用数据** 跨多个 epoch。
* **默认奖励函数** 可以预先定义，以用于广泛的使用场景，或者你也可以让 ChatGPT/本地模型为你生成它们。
* 设计奖励函数或验证器没有唯一正确的方法——可能性是无穷的。不过，它们必须设计良好且有意义，因为糟糕的奖励设计可能会无意中降低模型性能。

### :coin:奖励函数示例

你可以参考下面的示例。你可以将你的生成结果输入到像 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 笔记本**](#grpo-notebooks)，你会注意到我们创建了一个 **自定义的基于接近度的奖励函数** ，完全从零构建，旨在奖励更接近正确答案的回复。这个灵活的函数可以应用于各种任务。

* 在我们的示例中，我们在 Qwen3（Base）中启用推理，并将其引导到特定任务
* 应用预微调策略，避免 GRPO 默认只学习格式化的倾向
* 通过基于正则表达式的匹配提高评估准确率
* 创建超越通用提示词的自定义 GRPO 模板，例如 `think`，例如， `<start_working_out></end_working_out>`
* 应用基于接近度的评分——模型越接近正确答案，获得的奖励越高（例如，预测 9 而不是 10，比预测 3 更好），而异常值会受到惩罚

#### GSM8K 奖励函数

在我们的其他示例中，我们使用了由 [@willccbb](https://x.com/willccbb) 提供的现有 GSM8K 奖励函数，它很流行，并且已被证明相当有效：

* **correctness\_reward\_func** – 奖励精确标签匹配。
* **int\_reward\_func** – 鼓励仅输出整数的答案。
* **soft\_format\_reward\_func** – 检查结构，但允许轻微的换行不匹配。
* **strict\_format\_reward\_func** – 确保回复结构与提示匹配，包括换行。
* **xmlcount\_reward\_func** – 确保回复中每个 XML 标签都且仅出现一次。

## :abacus:使用 vLLM

你现在可以直接在你的微调栈中使用 [vLLM](https://github.com/vllm-project/vllm/) ，这能带来更高的吞吐量，并允许你同时对模型进行微调和推理！在 1x A100 40GB 上，使用 Unsloth 对 Llama 3.2 3B Instruct 的动态 4bit 量化，速度大约可达 4000 tokens/s。在 16GB Tesla T4（免费的 Colab GPU）上，你可以达到 300 tokens/s。\
\
我们还神奇地移除了同时加载 vLLM 和 Unsloth 时的双重内存占用，Llama 3.1 8B 可节省约 5GB，Llama 3.2 3B 可节省 3GB。Unsloth 最初可以在 1x 48GB GPU 上微调 Llama 3.3 70B Instruct，而 Llama 3.3 70B 权重本身就占用 40GB VRAM。如果不移除双重内存占用，那么将 Unsloth 和 vLLM 一起加载时，我们就需要 >= 80GB VRAM。\
\
但借助 Unsloth，你仍然可以在少于 48GB VRAM 的单个套件中完成微调，并获得快速推理的好处！要使用快速推理，首先安装 vllm，然后用 fast\_inference 实例化 Unsloth：

```python
# pip install unsloth vllm
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/Llama-3.2-3B-Instruct",
    fast_inference = True,
)
```

## :white\_check\_mark: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-bit 至少会使用 4 倍更多的 VRAM。
2. 我们新的面向 GRPO 的内存高效线性 kernel 将内存使用量削减了 8 倍或更多。这减少了 68.5GB 的内存，同时借助 torch.compile 实际上还更快！
3. 我们利用了我们智能的 [Unsloth 梯度检查点](https://unsloth.ai/blog/long-context) 算法，这是我们之前发布的。它会以异步方式将中间激活值智能卸载到系统 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 Cache（GB） | 2.5GB          | 2.5GB    |
| 总内存使用量                    | 54.33GB（少 90%） | 510.8GB  |

在典型的标准 GRPO 实现中，你需要创建两个大小为 (8, 20K) 的 logits 来计算 GRPO 损失。这需要 2 \* 2 字节 \* 8（生成数）\* 20K（上下文长度）\* 128256（词表大小）= 78.3GB VRAM。

Unsloth 为长上下文 GRPO 节省 8 倍内存，因此在 20K 上下文长度下，我们只需要额外 9.8GB 的 VRAM！

我们还需要以 16bit 存储 KV Cache。Llama 3.1 8B 有 32 层，K 和 V 的大小都是 1024。因此，20K 上下文长度的内存使用量 = 2 \* 2 字节 \* 32 层 \* 20K 上下文长度 \* 1024 = 每个 batch 2.5GB。我们会将 vLLM 的 batch size 设为 8，但为了节省 VRAM，在计算中我们将其保持为 1。否则，你将需要 20GB 的 KV cache。

## 🎥 Unsloth RL 3 小时工作坊视频

{% embed url="<https://www.youtube.com/watch?v=OkEGJ5G3foU>" %}

## :mortar\_board:延伸阅读

1. Nathan Lambert 的 RLHF 书籍是必读！ <https://rlhfbook.com/c/11-policy-gradients.html>
2. Yannic Kilcher 的 GRPO YouTube 视频也必读！ <https://www.youtube.com/watch?v=bAWV_yrqx4w>
3. 我们在 2025 年 AI Engineer World's Fair 举办了一个 3 小时工作坊。幻灯片和其他材料在 <https://docs.unsloth.ai/ai-engineers-2025>
4. 通过 Unsloth 的高级 GRPO 笔记本。 <https://docs.unsloth.ai/basics/reinforcement-learning-guide/tutorial-train-your-own-reasoning-model-with-grpo>
5. 基于基础模型的 GRPO 笔记本： <https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_(4B)-GRPO.ipynb>

## 视频教程

以下是一些由优秀 YouTuber 制作的视频教程，我们认为它们非常棒！

{% embed url="<https://www.youtube.com/watch?v=9t-BAjzBWj8>" %}

{% columns %}
{% column width="50%" %}
{% embed url="<https://www.youtube.com/watch?t=3289s&v=bbFEYPx9Hpo>" %}
非常适合了解如何准备数据集，以及强化学习 + GRPO 基础知识背后的解释
{% endembed %}

{% embed url="<https://www.youtube.com/watch?v=oF0_eMhzRaQ>" %}
{% endcolumn %}

{% column width="50%" %}
{% embed url="<https://www.youtube.com/watch?v=juOh1afy-IE>" %}

{% embed url="<https://www.youtube.com/watch?v=SoPE1cUz3Hs>" %}
在你自己的设备上本地运行 GRPO
{% endembed %}
{% endcolumn %}
{% endcolumns %}


---

# Agent Instructions: Querying This Documentation

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

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/zh/kai-shi-shi-yong/reinforcement-learning-rl-guide.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
