💡强化学习(RL)指南
全面了解强化学习(RL),以及如何使用 GRPO 通过 Unsloth 训练你自己的 DeepSeek-R1 推理模型。从入门到高级的完整指南。
强化学习是指一个“代理”通过与环境交互并接收反馈来学习决策的过程, 反馈 以 奖励 或 惩罚.
动作: 模型生成的内容(例如一句话)。
奖励: 指示模型动作好坏的信号(例如:回应是否遵循指令?是否有帮助?)。
环境: 模型正在执行的场景或任务(例如回答用户问题)。
🦥你将学到的内容
什么是 RL?RLVR?PPO?GRPO?RLHF?RFT?是 “运气就是你所需要的一切?” 用于强化学习?
什么是环境?代理?动作?奖励函数?奖励?
本文涵盖了关于 GRPO、强化学习(RL)和奖励函数从入门到高级你需要知道的一切,以及提示和在 Unsloth上使用 GRPO 的基本知识。如果你在找逐步教程来使用 GRPO,请参阅我们的指南 这里.
❓什么是强化学习(RL)?
强化学习的目标是:
增加出现 “好的” 结果的概率。
减少出现 “坏的” 结果的概率。
结果的概率。 就是这样!不过关于“好”和“坏”意味着什么、如何“增加”或“减少”它们、或“结果”到底指什么,存在很多细节。
例如,在 吃豆人 游戏:
该 环境 就是游戏世界。
该 你可以采取的动作有 上、左、右 和 下。 如果你吃到一个饼干就是好的,或撞到那些弯曲的敌人就是坏的。
该 奖励 如果你吃到一个饼干就是好事,或者如果你撞到那些弯曲的敌人就是坏事。
在强化学习中,你无法知道你能采取的“最佳动作”,但你可以观察中间步骤或最终的游戏状态(赢或输)。


另一个例子是,想象给你这样一个问题: “2 + 2 等于多少?” (4)一个未对齐的语言模型可能会吐出 3、4、C、D、-10,任何东西都有可能。
数字比 C 或 D 更好吗?
得到 3 比得到比如 8 要好,对吧?
得到 4 肯定是正确的。
我们刚刚设计了一个 奖励函数!
🏃从 RLHF、PPO 到 GRPO 和 RLVR

OpenAI 普及了 RLHF (来自人类反馈的强化学习),在该方法中我们训练一个 “代理” 针对一个问题(即 状态)生成被人类评为更有用的输出。
例如 ChatGPT 中的点赞和踩可以用于 RLHF 过程。


clip(..., 1-e, 1+e) 项用于强制 PPO 不进行过大的改变。还有一个 beta > 0 的 KL 项用于防止模型偏离过多。
为了进行 RLHF, 采用了 PPO (近端策略优化)。 在这种情况下“代理”就是语言模型。事实上它由 3 个系统组成: 生成策略(当前训练的模型)
该 参考策略(原始模型)
该 价值模型(平均奖励估计器)
该 我们使用
奖励模型 来计算当前环境的奖励,我们的目标是 最大化该奖励 PPO 的公式看起来相当复杂,因为它的设计是为了稳定性。请访问我们在 2025 年关于 RL 的!
AI 工程师演讲 了解有关 PPO 更深入的数学推导。 (组相对策略优化)用于训练他们的 R1 推理模型。与 PPO 的关键区别是:

DeepSeek 开发了 GRPO 价值模型被移除,
该 替换为多次调用奖励模型得到的统计数据。 奖励模型被移除
该 并被仅包含自定义奖励函数所取代,这些函数 可以与 RLVR 一起使用。
这意味着 GRPO 极其高效。之前 PPO 需要训练多个模型——现在移除奖励模型和价值模型后,我们可以节省内存并提升一切速度。
RLVR(具有可验证奖励的强化学习) 允许我们基于易于验证其解的任务来奖励模型。例如:
数学等式可以很容易被验证。例如 2+2 = 4。
代码输出可以被验证为是否正确执行。
设计可验证的奖励函数可能很困难,因此大多数示例是数学或代码。
GRPO 的用例不仅限于代码或数学——其推理过程可以增强电子邮件自动化、数据库检索、法律和医学等任务,基于你的数据集和奖励函数大幅提高准确性——关键是定义一个 评分标准 —— 即一系列较小的可验证奖励,而不是一个最终的、包罗万象的单一奖励。 OpenAI 在他们的 强化学习微调(RFT) 服务中推广了这一点,例如。
为什么叫“组相对”?
GRPO 完全移除了价值模型,但我们仍然需要估计当前状态下的 “平均奖励” 。
该 技巧是对 LLM 进行抽样!然后我们通过跨多个不同问题的抽样过程统计来计算平均奖励。

例如对于“2+2 等于多少?”我们抽样 4 次。可能得到 4、3、D、C。我们然后为这些答案中的每一个计算奖励,再计算 平均奖励 和 标准差,然后 进行 Z 分数标准化 !
这样会产生 优势 A,我们将用它来替代价值模型。这节省了大量内存!

🤞运气(准确说耐心)就是你所需要的一切
强化学习的诀窍是你只需要两样东西:
一个问题或指令,例如 “2+2 等于多少?”、“用 Python 创建一个 Flappy Bird 游戏”
一个用于验证输出好坏的奖励函数和验证器。
只要有这两样东西,我们基本上可以 无限次调用一个语言模型 直到我们得到一个好答案。例如对于“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。
因此通过运气和机遇,强化学习在多次 展开中设法找到正确答案。我们的目标是让正确答案 4 出现得更多,而其他(错误答案)显著减少。
所以强化学习的目标是要有耐心——在极限情况下,只要正确答案的概率至少为一个很小的正数(非零),这就是一个等待游戏——在极限下你一定会遇到正确答案。
所以我喜欢把它称为“运气就是你所需要的一切”用于强化学习。
更合适的说法是对强化学习来说“耐心就是你所需要的一切”。

强化学习本质上给了我们一个技巧——与其单纯等待无限次,我们会得到“坏信号”,即错误答案,而我们可以实质上“引导”模型尽量不生成错误解。这意味着尽管你为一个“好”答案等待了很久,模型已经发生了改变,尽力不输出错误答案。
在“2+2 等于多少?”的例子中—— 0、cat、-10、1928、3、A、B、122、17、182、172、A、C、BAHS、%$、#、9、-192、12.31**** 然后突然出现 4.
既然我们得到了错误答案,强化学习会影响模型尽量不输出错误答案。这意味着随着时间推移,我们在有意识地“修剪”或将模型的输出分布从错误答案中移开。这意味着强化学习是 高效的,因为我们并非只是等待无穷,我们在积极地“推动”模型尽可能进入“正确答案空间”。
如果概率始终为 0,那么强化学习永远不会奏效。这也是为什么人们喜欢从已经经过指令微调的模型进行强化学习,这类模型能在一定程度上合理地遵循指令——这会把正确答案的概率大概率提升到非零。
🦥Unsloth 为强化学习提供的功能
在 15GB 显存下,Unsloth 允许你将任何最多 17B 参数的模型(如 Llama 3.1(8B)、Phi-4(14B)、Mistral(7B)或 Qwen2.5(7B))转换为推理模型
Unsloth 现在支持 视觉/多模态 的 强化学习 模型!
最低要求: 仅需 5GB 显存就足以在本地训练你自己的推理模型(对于任何 1.5B 参数或更小的模型)
对于 高级 GRPO 有关批处理、生成和训练参数的文档, 阅读我们的指南!
GRPO 笔记本:
我们支持 GSPO 以及大多数其他新的 GRPO 技术。你可以在 GRPOConfig 中通过以下参数启用:
之前的演示显示,你可以用 Qwen2.5(3B)实现你自己的“恍然大悟”时刻——但那需要 2 张 A100 GPU(160GB 显存)。现在,使用 Unsloth,你只需一张 5GB 显存的 GPU 就能实现相同的“恍然大悟”时刻。
以前 GRPO 仅支持全量微调,但我们已经使其可与 QLoRA 和 LoRA 一起工作
在 20K 上下文长度 例如在每个提示生成 8 个样本时,Unsloth 对 Llama 3.1(8B)只使用 54.3GB 显存,而标准实现(+ Flash Attention 2)需要 510.8GB(Unsloth 节省 90%).
请注意,这并不是微调 DeepSeek 的 R1 蒸馏模型或使用来自 R1 的蒸馏数据进行微调(Unsloth 已经支持)。这是使用 GRPO 将标准模型转换为完整的推理模型。
在一个测试示例中,即使我们只用 100 步用 GRPO 训练 Phi-4,结果已经很明显。未使用 GRPO 的模型没有思考标记,而使用 GRPO 训练的模型有思考标记并且也给出正确答案。

💻使用 GRPO 进行训练
关于如何使用 Unsloth 与 GRPO 将任何开源 LLM 转换为推理模型的教程, 请参见此处.
对于 高级 GRPO 有关批处理、生成和训练参数的文档, 阅读我们的指南!
GRPO 如何训练一个模型
对于每个问答对,模型会生成多个可能的回答(例如,8 个变体)。
每个回答都使用奖励函数进行评估。
训练步骤:
如果你有 300 行数据,那就是 300 个训练步骤(或训练 3 个 epoch 则为 900 步)。
你可以增加每个问题生成的回答数量(例如从 8 增加到 16)。
模型通过在每一步更新其权重来学习。
如果您的 GRPO 模型没有学习到,强烈建议使用我们的 高级 GRPO 笔记本 ,因为它具有更好的奖励函数,您应该能更快且更频繁地看到结果。
基础/提示
至少等待 300 步 以便奖励真正上升。为了获得不错的结果,你可能需要进行至少 12 小时的训练(这就是 GRPO 的工作方式),但请记住这并非强制,你可以随时停止。
为了获得最佳结果,至少准备 500 行数据。你可以尝试仅用 10 行数据,但数据越多越好。
每次训练运行会因你的模型、数据、奖励函数/验证器等而有所不同,所以尽管我们写了 300 步作为最小值,有时可能需要 1000 步或更多。因此这取决于多种因素。
如果你在本地使用 Unsloth 与 GRPO,请在出现错误时“pip install diffusers”。同时请使用最新版本的 vLLM。
建议将 GRPO 应用于至少有 1.5B 参数 的模型,以便正确生成思考标记,因为较小的模型可能无法做到这一点。
关于 GRPO 的 GPU 显存要求 对于 QLoRA 4-bit,一般规则是模型参数量 = 你需要的显存量(你可以使用更少显存,但此规则用于安全估算)。你设置的上下文长度越大,所需显存越多。LoRA 的 16-bit 至少会使用 4 倍以上的显存。
持续微调是 可行的,你可以让 GRPO 在后台一直运行。
在示例笔记本中,我们使用了 GSM8K 数据集,目前这是 R1 风格训练最受欢迎的选择。
如果你使用的是基础模型,确保你有一个聊天模板。
你用 GRPO 训练得越多,效果越好。GRPO 最棒的部分是你甚至不需要那么多数据。你所需要的是一个很好的奖励函数/验证器,训练时间越长模型会越好。预计你的奖励随步骤增加会像这样上升:

GRPO 的训练损失跟踪现在已直接内置到 Unsloth 中,无需像 wandb 等外部工具。它现在包含所有奖励函数的完整日志细节,包括总聚合奖励函数本身。

在不受支持的模型上进行强化学习:
你也可以在 Unsloth 上对 vLLM 不支持的模型运行强化学习,例如 Qwen3.5。只需在加载模型时设置 您可以在 Unsloth 中运行 Qwen3.5 的强化学习,尽管 vLLM 不支持它,通过设置 即可。
📋奖励函数 / 验证器
在强化学习中, 奖励函数 和 验证器 在评估模型输出时扮演不同的角色。一般来说,你可以将它们理解为相同的东西,然而从技术上讲它们并不相同,但这并不重要,因为它们通常结合使用。
验证器:
确定生成的回答是正确还是错误。
它不分配数值分数——它只是验证正确性。
示例:如果模型对“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>应用基于接近度的评分——对于更接近的答案模型会获得更多奖励(例如预测 9 比预测 3 比预测 10 更好),而异常值会被惩罚
GSM8K 奖励函数
在我们的其他示例中,我们使用了由 @willccbb 提供的现有 GSM8K 奖励函数,
它很受欢迎并被证明相当有效: correctness_reward_func
– 奖励精确标签匹配。 int_reward_func
– 鼓励仅返回整数答案。 soft_format_reward_func
– 检查结构但允许轻微的换行不匹配。 strict_format_reward_func
– 确保响应结构与提示匹配,包括换行。 xmlcount_reward_func
🧮– 确保响应中每种 XML 标签恰好出现一次。
使用 vLLM 该设置适用于托管提供者、自托管端点、 你现在可以在微调堆栈中直接使用
✅GRPO 需求指南
在使用 Unsloth 进行 GRPO 时,我们通过多种技巧将 VRAM 使用量比使用 Flash Attention 2 的标准实现智能地减少超过 90%!例如,在 20K 上下文长度、每个提示 8 个生成的情况下,Unsloth 对于 Llama 3.1 8B 仅使用 54.3GB 的 VRAM,而标准实现则需要 510.8GB(Unsloth 节省 90%).
关于 GRPO 的 QLoRA 4-bit 的 GPU VRAM 要求一般规则是模型参数量 = 你需要的显存量(你可以使用更少显存,但此规则用于安全估算)。你设置的上下文长度越大,所需显存越多。LoRA 的 16-bit 至少会使用 4 倍以上的显存。
我们用于 GRPO 的新型内存高效线性核将内存使用量降低了 8 倍或更多。这节省了 68.5GB 内存,同时借助 torch.compile 实际上更快!
我们利用我们智能的 Unsloth 梯度检查点 算法(我们之前发布过)。它会将中间激活异步地卸载到系统 RAM,同时仅慢约 1%。这节省了 52GB 内存。
Unsloth 还与底层推理引擎(vLLM)共享相同的 GPU/CUDA 内存空间,这与其他包中的实现不同。这节省了 16GB 内存。
训练内存成本(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 实现中,你需要创建两个大小为 (8, 20K) 的 logits 来计算 GRPO 损失。这需要 2 * 2 字节 * 8(生成数量) * 20K(上下文长度) * 128256(词汇表大小)= 78.3GB 的 VRAM。
Unsloth 为长上下文 GRPO 削减了 8 倍的内存使用,因此在 20K 上下文长度下我们只需额外 9.8GB 的 VRAM!
我们还需要以 16bit 从 KV 缓存中读取。Llama 3.1 8B 有 32 层,K 和 V 的大小均为 1024。因此 20K 上下文长度的内存使用 = 2 * 2 字节 * 32 层 * 20K 上下文长度 * 1024 = 每批次 2.5GB。我们会将 vLLM 的批量大小设为 8,但为节省 VRAM 在计算中我们将其设为 1。否则你将需要 20GB 的 KV 缓存。
🎥 Unsloth 强化学习 3 小时研讨会视频
🎓进一步阅读
Nathan Lambert 的 RLHF 书是必读! https://rlhfbook.com/c/11-policy-gradients.html
Yannic Kilcher 的 GRPO YouTube 视频也是必看! https://www.youtube.com/watch?v=bAWV_yrqx4w
我们在 2025 年 AI 工程师世界博览会上做了一个 3 小时的工作坊。幻灯片和其他材料在 https://docs.unsloth.ai/ai-engineers-2025
或在其他推理引擎中轻松部署于轻量级环境中。
视频教程
最后更新于
这有帮助吗?

