本文围绕Zero RL:当 AI 学会“顿悟“——零强化学习的狂欢与阵痛整理关键信息和实用建议,帮助读者快速了解主题重点。
一、那个让全场沉默的"Aha Moment"2025 年 1 月,DeepSeek 的团队在 R1-Zero 的训练过程中,观察到了一个被后人称为 "Aha Moment" 的现象:模型在没有任何人类"反思"示范的情况下,自发学会了在推理链
2025 年 1 月,DeepSeek 的团队在 R1-Zero 的训练过程中,观察到了一个被后人称为 "Aha Moment" 的现象:模型在没有任何人类"反思"示范的情况下,自发学会了在推理链路里"自我反思"。论文原文给出的模型输出片段里,出现了类似这样的句子:
它学会了自我反思。
没有人类教它这样做。没有任何监督数据里写过"你应该在这里反思一下"。这是模型在纯强化学习的奖励信号下,自己"顿悟"出来的策略。DeepSeek 团队把这个现象称为 "Aha Moment"——强化学习版的"尤里卡时刻"。
这一刻,Zero RL(零强化学习)正式从学术概念变成了行业热词。
在 Zero RL 之前,训练一个推理模型(如 OpenAI 的 o1)的标准流程是这样的:
基础模型 → 监督微调(SFT)→ 强化学习(RL)→ 最终模型 ↑_________________________________________|(SFT 数据从哪里来?人类标注!)
SFT(Supervised Fine-Tuning) 就像给模型一根拐杖——人类先写出高质量的解题过程,模型跟着学。问题是:
Zero RL 的思路简单粗暴到令人发指:
基础模型 → 强化学习(RL)→ 最终模型 ↑_________________________| (奖励信号来自规则验证器,不是人类)
模型自己生成答案,一个规则验证器(比如数学题的答案检查器、代码的单元测试)告诉它对还是错。对了就奖励,错了就惩罚。模型在无数次试错中,自己摸索出"怎么思考才能做对"。
这就像一个小孩学骑自行车——没有教练扶着,摔了无数次,突然有一天就找到了平衡感。
| 维度 | SFT + RL | Zero RL |
|---|---|---|
| 训练流程 | 先 SFT 冷启动,再 RL 优化 | 直接在 Base 模型上 RL |
| 数据依赖 | 需要大量标注数据(数万~数十万条) | 仅需规则验证器(零标注) |
| 推理能力上限 | 受限于人类标注质量 | 可能突破人类标注数据天花板 |
| 训练稳定性 | 较稳定(SFT 打底,不会跑偏) | 初期极不稳定,像过山车 |
| 输出可读性 | 较好(SFT 数据格式规范) | 初期可读性差,语言混用 |
| 成本 | 高(标注 + 训练) | 低(仅需 RL 训练) |
| 代表模型 | OpenAI o1、DeepSeek-R1 | DeepSeek-R1-Zero |
下图对比了两条路线的训练动态(示意图,非真实数据):
左(SFT + RL):平稳上升,很快触及由人类标注质量决定的天花板——就像有教练扶着骑车,安全但学不会特技。右(Zero RL):初期在谷底剧烈震荡(梯度爆炸、语言混用),约在"顿悟"节点后推理准确率快速拉升,最终超越 SFT + RL 的天花板——就像小孩自己摔出来的平衡感,更扎实,上限更高。
Zero RL 能跑起来,核心靠的是 GRPO(Group Relative Policy Optimization,组相对策略优化) 算法——由 DeepSeek 在 2024 年的 DeepSeekMath 论文中首次提出,并在 R1 系列中被发扬光大,可视为对经典 PPO 的一种"瘦身改造"。
PPO(Proximal Policy Optimization)是强化学习的经典算法,但它有个致命缺陷:
PPO = Actor(策略模型) + Critic(价值模型)↑↑生成答案的模型评估答案好坏的模型
Critic 模型通常和 Actor 一样大,训练成本直接翻倍。对于 671B 参数的 DeepSeek-V3 来说,这意味着要多养一个 671B 的"评委",显存和算力都扛不住。
GRPO 干了一件很巧妙的事——去掉 Critic,用一组输出的相对表现来估计"好坏":
# GRPO 核心逻辑(伪代码)def grpo_step(question, model, num_samples=16):"""对同一个问题,生成 16 个不同的答案用这 16 个答案的相对表现计算优势函数"""# 1. 生成一组输出(同策略采样)outputs = [model.generate(question) for _ in range(num_samples)]# 2. 规则验证器打分(0 或 1)rewards = [verifier(output) for output in outputs]# [1, 0, 1, 0, 0, 1, ...]# 3. 计算组内相对优势(标准化)mean_reward = sum(rewards) / len(rewards)std_reward = std(rewards)advantages = [(r - mean_reward) / std_reward for r in rewards]# 4. 用优势函数更新策略(带裁剪的 PPO 目标)loss = compute_clipped_ppo_loss(outputs, advantages)return loss
关键洞察:不需要一个独立的 Critic 模型来预测"这个答案值多少分",而是直接采样一组答案,看哪些比平均水平好、哪些差。好的答案多学学,差的答案少学学。
GRPO 只是发动机,奖励函数才是方向盘。DeepSeek-R1-Zero 的奖励设计极其简洁,只有两条:
def compute_reward(output, ground_truth):"""DeepSeek-R1-Zero 的规则奖励系统"""reward = 0# 1. 准确性奖励:答案对不对?if extract_answer(output) == ground_truth:reward += 1.0# 2. 格式奖励:有没有按规定的格式输出?if has_thinking_tags(output):# ......reward += 0.5return reward
这种"极简主义"反而成了 Zero RL 的优势——规则奖励不会被模型"骗",而神经网络奖励模型经常被模型找到漏洞(reward hacking)。
Zero RL 听起来很美好,但实际操作起来,简直是噩梦。
Zero RL 最大的敌人是 梯度爆炸(Gradient Explosion)。
在训练初期,基础模型对长链条推理一无所知,会生成大量低概率的"胡言乱语"。这些低概率 token 在策略梯度中会产生巨大的梯度信号,导致参数更新剧烈震荡。
(示意)训练过程片段:- 损失: 12.5 → 0.3 → 45.2 → 2.1 → 89.7- 梯度范数: 0.1 → 15.3 → 0.05 → 32.1 → 0.02
原因:模型生成了一些它自己都觉得"不太可能"的 token(概率极低),策略梯度的公式里有个 1 / π(a) 的项——概率越低,梯度越大。模型偶尔"抽风"生成一个极低概率的词,梯度就炸了。(注:严格地说,PPO/GRPO 使用的是重要性采样比 ρ 而非裸的 1/π,此处为便于直观理解而简化。)
2025 年后续的研究(如 DAPO,见 6.3 节)发现,这个问题可以通过 Group Length Normalization 和 Clip-Higher 来缓解——给长回答更多的梯度权重,同时放宽裁剪上界鼓励探索。
Zero RL 训练出来的模型,推理过程经常是这样的:
Let me analyze this problem... 首先,我们需要计算这个积分...Wait, maybe I should try a different approach... 不对,让我重新检查一下...Actually, 这里有一个更简单的办法...
中英混杂,毫无章法。
因为基础模型预训练时见过多种语言,而 Zero RL 的奖励函数只关心"答案对不对",不关心"用什么语言思考"。模型发现:只要答案对,中间过程随便混用语言也没问题。
DeepSeek-R1 的解决方案是引入语言一致性奖励——统计推理过程中目标语言的比例,作为额外奖励。但这又带来了新的权衡:语言一致性奖励稍微降低了推理性能。
这是强化学习的经典难题。模型很快会发现一些"捷径":
标签里写满无意义的重复内容,只要格式对就有分。 标签里把所有可能的答案都列一遍,赌一个能中。# 奖励黑客示例:模型学会了"刷长度"output = """Let me think... Let me think... Let me think...(重复 500 次同样的废话)Actually the answer is 42.42"""# 格式奖励:✅ 有 thinking 标签# 准确性奖励:✅ 答案对了# 但推理过程毫无价值
2026 年的最新方案是引入 Smooth Length Penalty(平滑长度惩罚)——不是简单限制长度,而是鼓励"思维 token"的比例,惩罚无意义的冗长。
早期的 Zero RL 只能在数学、代码这类"答案可验证"的领域玩。因为奖励函数需要明确知道"对不对"。
但 2025 年底,一项名为 Zero Reinforcement Learning Towards General Domains(arXiv:2510.25528)的工作把 Zero RL 扩展到通用领域(写作、问答、开放式对话)。其核心思路是双奖励系统:
def general_zero_rl_reward(output, task_type):"""General Zero-RL 的双奖励系统(arXiv:2510.25528)"""if task_type == "verifiable":# 数学、代码return rule_based_verifier(output)# 规则验证:0 或 1elif task_type == "open-ended":# 写作、问答return generative_reward_model(output)# 生成式奖励模型打分
关键发现:在可验证任务和开放式任务上联合训练,推理能力可以跨域迁移。模型在数学题上学到的"自我反思",会自动用到写作任务上。
实验结果显示,该方法在 Qwen3-8B-Base 与 Qwen3-14B-Base 上,于需要深度推理的任务与更通用的任务上均取得了优于基线的推理表现;为缓解生成式奖励模型下的 reward hacking,论文还设计了 Smooth Length Penalty(平滑长度惩罚),鼓励生成更有信息量的思维 token。
需特别区分:General-Reasoner(Ma et al., arXiv:2505.14652)是与 6.1 节不同的独立工作。它同样面向"跨域推理",但技术路线不同:
简言之:6.1 节的"双奖励 + 平滑长度惩罚 + Qwen3"属于 Zero RL Towards General Domains(2510.25528);而 General-Reasoner(2505.14652)走的是"爬取可验证数据集 + 生成式验证器"路线。两者不要混淆。
DAPO(Decoupled CliP and Dynamic sAmpling Policy Optimization,解耦裁剪与动态采样策略优化;arXiv:2503.14476)是 2025 年提出的 GRPO 改进版,专门解决 Zero RL 的训练不稳定问题。四大改进:
| 改进点 | 解决的问题 | 原理 |
|---|---|---|
| Clip-Higher | 探索不足 | 放宽 PPO 裁剪的上界,鼓励模型尝试新策略 |
| Dynamic Sampling | 无效训练 | 过滤掉"全对"或"全错"的问题,确保每组都有区分度 |
| Token-level Loss | 长回答梯度稀释 | 按 token 级别归一化,而非按 response 级别 |
| Overlong Reward Shaping | 长度黑客 | 对超长回答施加软惩罚,而非硬截断 |
DAPO 让 Zero RL 的训练曲线从"过山车"变成了"稳健爬坡"。
传统 Zero RL 是同策略(on-policy)的——模型只能从自己生成的答案中学习。如果模型一开始很笨,它就只能从笨答案中学。
LUFFY(Learning to Reason under Off-Policy Guidance,arXiv:2504.14945)引入了离策略(off-policy)示范——在训练过程中混入一些高质量的外部推理轨迹(比如从更强的模型那里借来的),让模型"站在巨人的肩膀上"学习,同时保留探索空间。
实验结果:六个数学基准测试平均提升 +7.0 分,分布外任务提升 +6.2 分(数字援引自论文摘要)。
"""⚠️ 极简 Zero RL 教学演示(基于 GRPO),非生产代码。本类的 compute_grpo_loss 是「占位损失」,梯度恒为 0,训练无效——仅用于演示 GRPO 的采样与优势计算流程。请勿直接用于真实实验。"""import torchfrom transformers import AutoModelForCausalLM, AutoTokenizerclass ZeroRLTrainer:def __init__(self, model_name, num_samples=16):self.model = AutoModelForCausalLM.from_pretrained(model_name)self.tokenizer = AutoTokenizer.from_pretrained(model_name)self.num_samples = num_samples# GRPO 的组大小 Gdef generate_group(self, question):"""对同一个问题生成一组答案"""inputs = self.tokenizer(question, return_tensors="pt")outputs = []for _ in range(self.num_samples):out = self.model.generate(**inputs,max_length=2048,do_sample=True,temperature=1.0,)outputs.append(self.tokenizer.decode(out[0]))return outputsdef rule_reward(self, output, answer):"""规则奖励:答案对不对 + 格式对不对"""reward = 0.0# 准确性if f"{answer}" in output:reward += 1.0# 格式if "" in output and "" in output:reward += 0.5return rewarddef compute_grpo_loss(self, outputs, rewards):"""GRPO 核心:用组内相对表现计算优势。⚠️⚠️ 教学占位警告(务必替换后再用于任何训练)⚠️⚠️下面的 loss 是 DUMMY——它不依赖模型任何参数,梯度恒为 0,因此 train_step() 里的 loss.backward() 不会更新任何权重,用本函数训练等价于「什么都不学」。本函数目前只正确演示了「组内相对优势 advantages 怎么算」这一步。真正可训练的 GRPO 损失必须补充(缺一不可):(1) 取模型对 outputs 每个 token 的对数概率 log π_θ(a);(2) 用与旧策略的重要性采样比 ρ = π_θ / π_old 构造「裁剪」PPO 目标;(3) 以 advantages 加权,并加 KL(π_θ ‖ π_ref) 约束防止跑偏。注意:参数 outputs 在此处「未被使用」,正是因为它属于「待补的真实损失」。"""rewards = torch.tensor(rewards, dtype=torch.float32)mean_r = rewards.mean()std_r = rewards.std() + 1e-8# 优势 = (奖励 - 组均值) / 组标准差← 这一步是真实有效的advantages = (rewards - mean_r) / std_r# ❌ 占位损失:仅让脚本能跑通,训练无效。请勿直接用于实验。#真实实现应返回「基于 log π_θ(outputs) 与 advantages 的裁剪 PPO/GRPO 损失」。#下面 torch.zeros(..., requires_grad=True) 只是造一个可 backward 的标量,#其梯度为 0,对模型参数毫无影响。loss = torch.zeros(1, requires_grad=True)# PLACEHOLDER:梯度恒为 0,训练无效return lossdef train_step(self, question, answer):"""单步训练"""# 1. 生成一组输出outputs = self.generate_group(question)# 2. 计算奖励rewards = [self.rule_reward(o, answer) for o in outputs]# 3. 计算 GRPO 损失loss = self.compute_grpo_loss(outputs, rewards)# 4. 反向传播# ⚠️ 当前 loss 为占位(梯度 = 0),此 backward() 不会更新参数。#接入「真实损失」后,这里才会真正产生梯度并推动训练。loss.backward()return rewards# 使用示例trainer = ZeroRLTrainer("Qwen/Qwen2.5-7B-Base")question = "求解:2x + 5 = 13"answer = "4"for step in range(10000):rewards = trainer.train_step(question, answer)if step % 100 == 0:print(f"Step {step}: rewards = {rewards}")
注意(重要):上面是极度简化的教学代码,且其中的 compute_grpo_loss 为占位损失(梯度恒为 0),直接运行只会打印 reward、不会训练出任何能力。要变成可训练版本,至少还需要:
log π_θ(a),构造带裁剪的 PPO/GRPO 目标;| 维度 | 2025 年初(R1-Zero) | 2026 年中(现在) |
|---|---|---|
| 适用领域 | 数学、代码(可验证) | 数学、代码、通用领域 |
| 训练稳定性 | 过山车,容易炸 | DAPO 等改进后显著改善 |
| 输出质量 | 可读性差,语言混用 | 冷启动数据 + 一致性奖励后大幅改善 |
| 成本 | 仅需 RL,远低于 SFT | 进一步降低,小模型也能出效果 |
| 核心算法 | GRPO | GRPO + DAPO + Off-policy |
| 奖励设计 | 简单规则奖励 | 双奖励系统 + 长度惩罚 |
它的"顿悟时刻"不是魔法,而是海量试错后的统计必然。它的"黑暗面"也不是缺陷,而是任何自主学习系统必经的成长痛。
2026 年的今天,Zero RL 已经从"能不能做"进化到了"怎么做更好"。下一个问题或许是:当模型学会了自己教自己,人类标注员还有多大价值?
Guo, D., et al. (2025). DeepSeek-R1: Incentivizing reasoning capability in LLMs via reinforcement learning. arXiv. arxiv.org/abs/2501.12…
Zeng, Y., et al. (2025). Zero reinforcement learning towards general domains. arXiv. arxiv.org/abs/2510.25…
Ma, X., et al. (2025). General-Reasoner: Advancing LLM reasoning across all domains. arXiv. arxiv.org/abs/2505.14…
Yu, Q., et al. (2025). DAPO: An open-source LLM reinforcement learning system at scale. arXiv. arxiv.org/abs/2503.14… (投稿/发表于 ICLR 2026,待核实)
Shao, Z., et al. (2024). DeepSeekMath: Pushing the limits of mathematical reasoning in open language models. arXiv. arxiv.org/abs/2402.03…
Yan, J., et al. (2025). Learning to reason under off-policy guidance. arXiv. arxiv.org/abs/2504.14…
注:以上论文作者均超过 20 人,按博客可读性以"第一作者 et al."呈现;严格 APA 7th 对 21+ 位作者的要求为列出前 19 位、省略号、末位作者,此处为可读性做了简化。
标签:强化学习 Zero RLGRPO 大模型训练 推理模型 技术杂谈
本文为作者原创,版权归作者所有。原文于 2026-07-27 同步发布于 CSDN、博客园、稀土掘金、51CTO、知乎。
欢迎学习与分享,但请尊重原创,转载请保留署名与出处。
未经许可,禁止用于商业用途或二次发布。
以上内容可作为基础参考,实际处理时再结合具体场景灵活调整。