新智元报道
编辑:Aeneas 好困
【新智元导读】不到10美元,3B模型就能复刻DeepSeek的顿悟时刻了?来自荷兰的开发者采用轻量级的RL算法Reinforce-Lite,把复刻成本降到了史上最低!同时,微软亚研院的一项工作,也受DeepSeek-R1启发,让7B模型涌现出了高级推理技能。
复刻DeepSeek的神话,还在继续。
之前,UC伯克利的博士只用30美元,就复刻了DeepSeek中的顿悟时刻,震惊圈内。
这一次,来自荷兰阿姆斯特丹的研究人员Raz,再次打破纪录,把复刻成本降到了史上最低——
只要10美元,就能复现DeepSeek顿悟时刻!
Raz本人也表示,自己惊讶极了。
即使是一个非常简单的强化学习设置,并没有太多RL算法的复杂性(比如PPO、TRPO、GRPO等),也能在有限的计算资源下产生涌现的结果。
在具体设计过程中,他特别考虑强化学习中LLM中的应用和传统强化学习问题(如机器人、Atari游戏等)在状态空间和动作空间的不同。
因此,Raz选择从非常简单的RL算法——Reinforce-Lite入手。
采用轻量级强化学习算法——Reinforce-Lite生成的推理过程之一。我们将一步步看到,端到端的强化学习微调模型如何表现出智能、回溯、自我反思、逻辑推理等迹象
结果,令人出乎意料的事情发生了:只用不到10美元的成本,他就在一个3B模型上复刻了DeepSeek的顿悟时刻。
几乎就像是这个3B模型本身就具备了做出惊人事情的潜力,我们需要的,只是通过正确的方式赋予它一定的自主性而已。
接下来,让我们看一下Raz的博客,感受一下这次超经济实惠的AI推理,是怎样突破的。
复刻DeepSeek顿悟时刻,只用不到10美元
我们能否在计算资源有限(只有48GB RTX6000显卡和10美元)的情况下,让一个3B模型具备回溯、自我反思、逻辑推理等推理能力?
研究人员猜测,通过强化学习也许能做到。
强化学习是最强大的学习算法之一,它一次又一次地为我们带来令人惊叹的成果。
DeepMind的AlphaGo、OpenAI的DOTA 2、MuJoCo和Atari实验、LLM的RLHF对齐,以及最近DeepSeek全面布局的RL技术,无比证明它的强大威力。
然而,由于RL有许多动态部分,一涉及到众多组件,强化学习就变得复杂了。
在此过程中,强化学习需要精心设计重要元素,如合适的信用分配机制、演员-评论员的适当超参数调整、强化学习算法类型(基于模型/无模型)等,这就导致了强化学习在更广泛的范围内应用受限。
如果在LLM环境中使用强化学习,可能涉及的模型可以多达5个:
策略模型:正在训练的模型
旧策略模型:用于计算替代目标
参考模型:用于计算KL散度(KL-divergence)
奖励模型:用于学习奖励函数
评判模型: 用于计算价值函数
3B模型端到端强化学习训练的计算需求
由于涉及众多组件,不仅带来了计算负担,还带来了训练稳定性方面的复杂性和挑战。
因此,研究人员开始思考:能否从零开始重新构想整个算法,回归第一性原理?
他们的答案就是——一个简单的替代方案,Reinforce-Lite。
这种方法消除了对替代目标比率和旧策略模型的需求,通过单一策略神经网络来稳定训练过程,同时,还能为模型注入推理能力。
为此,我们需要理解的第一个问题就是——
使用替代目标比率(如PPO/GRPO)是过度优化?
OpenAI vs DOTA 5v5:基于大规模强化学习训练
在MuJoCo、Atari、Dota等传统强化学习环境中,PPO对每个批次进行多次更新是至关重要的,这是因为在这些环境中数据收集成本非常高昂,而重复使用样本可以提高样本效率。
然而在LLM中,这种方法既无必要,又会带来巨大的计算开销。
LLM可以并行生成多样化的响应,自然形成丰富的数据集,因此就无需重复更新。
所有响应都可以使用相同的策略网络生成,一旦在序列生成结束时获得奖励,就可以进行梯度反向传播。
此外,在文本生成这样的高维动作空间中,每个batch多次更新可能导致过拟合,而非有意义的策略改进。
相反,如果每个batch单次更新,再结合分组归一化等技术,就可以在显著降低计算成本的同时,保持训练稳定性。
考虑到LLM训练本身就需要大量资源,在不影响性能的前提下简化优化过程,显然是更有效的选择。
从技术角度来看,这也消除了为计算替代目标比率而保留旧策略模型的需求。
LLM强化学习与经典强化学习的区别
总之,在这个算法中——
移除KL散度,不需要参考模型 ❌ ——改用梯度裁剪。虽然不是自适应的方法,但能有效完成任务。
移除替代目标 ,不需要旧策略模型 ❌
使用分组相对奖励进行优势计算(类似DeepSeek的GRPO方式),不需要价值网络 ❌
这样,我们就得到了一个轻量级的强化学习算法。
通过以上简化,优化问题最终就回归为经典的Reinforce算法——
Reinforce-Lite
在优势计算方面,研究人员采用分组相对策略优化(GRPO)的归一化技术,将每个问题的10个回应结果作为一组,并通过其归一化方法来降低梯度更新中的方差。
让我们来看看它在PyTorch中的具体实现。
def reinforce_lite(batch, policy_model, tokenizer, device, step, save_dir):
policy_model.train()
prompts, targets = zip(*batch)
batch_size = len(prompts)
evaluated_group = 0
all_logprobs = []
all_rewards = []
all_responses = []
all_lengths = []
for group_idx in range(config.GROUP_SIZE):
formatted_prompts = [format_prompt(p, tokenizer) for p in prompts]
inputs = tokenizer(
formatted_prompts,
return_tensors="pt",
padding=True,
truncation=True,
max_length=config.MAX_SEQ_LENGTH
).to(device)
generate_kwargs = {
**inputs,
"max_new_tokens": config.MAX_NEW_TOKENS,
"do_sample": True,
"temperature": 0.7,
"top_p": 0.9,
"pad_token_id": tokenizer.pad_token_id,
"return_dict_in_generate": True,
}
if group_idx == evaluated_group:
generated = policy_model.generate(**generate_kwargs)
generated_ids = generated.sequences
outputs = policy_model(
generated_ids,
attention_mask=(generated_ids != tokenizer.pad_token_id).long()
)
prompt_length = inputs.input_ids.shape[1]
response_length = generated_ids.shape[1] - prompt_length
if response_length > 0:
logits = outputs.logits[:, prompt_length-1:-1, :]
response_tokens = generated_ids[:, prompt_length:]
log_probs = torch.log_softmax(logits, dim=-1)
token_log_probs = torch.gather(log_probs, -1, response_tokens.unsqueeze(-1)).squeeze(-1)
sequence_log_probs = token_log_probs.sum(dim=1)
else:
sequence_log_probs = torch.zeros(batch_size, device=device)
else:
with torch.no_grad():
generated = policy_model.generate(**generate_kwargs)
sequence_log_probs = torch.zeros(batch_size, device=device)
responses = tokenizer.batch_decode(
generated.sequences[:, inputs.input_ids.shape[1]:],
skip_special_tokens=True
)
rewards = torch.tensor([get_reward(resp, tgt) for resp, tgt in zip(responses, targets)], device=device)
all_responses.extend(responses)
all_rewards.append(rewards)
all_logprobs.append(sequence_log_probs)
all_lengths.extend([len(r.split()) for r in responses])
rewards_tensor = torch.stack(all_rewards)
logprobs_tensor = torch.stack(all_logprobs)
evaluated_rewards = rewards_tensor[evaluated_group]
others_rewards = torch.cat([
rewards_tensor[:evaluated_group],
rewards_tensor[evaluated_group+1:]
], dim=0)
baseline = others_rewards.mean(dim=0)
advantages = (evaluated_rewards - baseline) / (others_rewards.std(dim=0) + 1e-8)
advantages = torch.clamp(advantages, -2.0, 2.0)
policy_loss = -(logprobs_tensor[evaluated_group] * advantages.detach()).mean()
return policy_loss, rewards_tensor.mean().item(), policy_loss.item(), 0.0, all_responses[0], all_lengths
初始化一个经过指令微调的LLM,并通过合适的提示词使其在 标签中包含推理步骤。
为模型输出定义一个奖励函数(例如,在GSM8K基准中的正确率)。通过正则表达式从标签中提取数值,并与数据集中的实际答案进行比较。
通过直接计算相对于奖励的梯度来优化策略,无需使用替代损失函数。
采用分组相对归一化优势计算值,从而消除对批评模型的依赖。采用10作为分组大小。
使用标准的对数概率梯度技巧对模型进行更新
为了验证自己的假设,研究人员将使用GSM8K,这是一个包含小学数学问题及其答案的Grade School Math 8K数据集,格式如下:
问题:Natalia在4月份向她的48个朋友卖出了发夹,而在5月份她售卖的发夹数量是4月份的一半。Natalia在4月和5月总共售卖了多少个发夹?
Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May?
答案:Natalia在5月售卖了48/2 = <<48/2=24>>24个发夹。Natalia在4月和5月总共售卖了48+24 = <<48+24=72>>72个发夹。#### 72
Natalia sold 48/2 = <<48/2=24>>24 clips in May. Natalia sold 48+24 = <<48+24=72>>72 clips altogether in April and May. #### 72
虽然答案中就包含了完整的推理步骤,但让研究人员感兴趣的,只有###后的最终答案。
对此,研究人员引导策略模型,以 格式输出了最终答案,并用它来验证模型计算的答案是否正确。
这更像是一个蒙特卡洛问题——在每个回合结束时,才能获得奖励。
def format_prompt(question: str) -> str:
return f"""<|begin_of_text|><|start_header_id|>user<|end_header_id|>
Solve this math problem: {question}
Show your reasoning first in , then put the final answer in \\boxed {{}}.
奖励建模
研究人员把奖励机制设计得很简单易懂,对于策略模型:
答案错误时,给予负奖励-1
答案正确时,给予正奖励+1
def get_reward(completion: str, target: str) -> float:
reward = -1.0
try:
completion = completion.strip()
start_tag = " "
end_tag = ""
start_idx = completion.rfind(start_tag)
if start_idx != -1:
substring_after_start = completion[start_idx + len(start_tag):]
end_idx = substring_after_start.find(end_tag)
if end_idx != -1:
answer = substring_after_start[:end_idx].strip()
if not answer and end_idx > 0:
answer = substring_after_start[:end_idx].strip()
numbers = ''.join(char for char in answer if char.isdigit() or char == '.')
if numbers:
generated_num = float(numbers)
target_num = float(str(target).strip())
if abs(generated_num - target_num) < 1e-6:
reward = 1.0
except Exception as e:
pass
return reward
训练设置
接下来,研究人员使用Reinforce-Lite算法,在RTX A6000显卡上训练了3B模型,训练时间为12小时,并采用大小为10的分组。
在训练初期,可以观察到:模型不断尝试增加输出序列/输出token的长度,但会经常遇到内存溢出(OOM)问题,这就限制了模型尝试更长的推理过程,并从中有效学习。
奖励图表展示的是分组响应的平均得分。 理想情况下,平均值越接近1,表示模型在大多数采样响应中的准确率越高。
在这次实验中,研究人员只训练了数百次迭代,可以观察到当策略模型尝试不同策略时,得分会出现一定波动。
这种波动可以通过熵正则化来平衡探索与利用之间的关系,这是他们未来探索的一个方向。
对比测试Reinforce-Lite和Instruct模型
研究在GSM8K数据集上评估了Reinforce-Lite,发现在有限训练时间内,Reinforce-Lite相比指令模型在得分上实现了小幅提升。
具体来说,Meta Llama 3.2模型提升了2.0%(从70.5提升至72.5),而在FP16格式下运行的Phi 3.5 Instruct则提升了0.6%(从83.4提升至84.0)。
推理轨迹分析
观察一些推理轨迹后可以发现,经过Reinforce-Lite微调的模型展现出了多种推理能力,包括:
逻辑思维
搜索策略
结果验证
通过表格进行中间计算
试错方法等
注意!这些推理轨迹,在常规的指令模型中均未观察到。
比如在下图中,模型展现出了基本的数学推理能力。它能够通过代数表达式设立问题,并通过解方程来求解。
过程中,它能识别出不合理的解,在原方案不可行时选择调整解决方案,最终还能通过比较不同选择的成本,来做出最优决策。
在这道题中,模型表现出的处理包含条件推理和纠错的能力,也令人印象深刻。
它首先设定了问题背景,计算派对开始时的总人数。然后根据已知条件(总共40人,1/4人离开),计算出有10人离开派对。
然而,在计算离开的女性人数时,模型居然得出了一个负数,它意识到了自己的推理中,一定出现了逻辑错误。
为此,它重新审视了情况,修正了自己的推理,正确计算出派对上剩下了8名女性,从而得出正确答案。
这道题中,模型设定初始绷带数量为x,根据给定条件将绷带数量的变化转换为代数方程,但解出的方程结果是x=-6。
它意识到自己的错误后,回顾了之前的步骤,识别出自己在计算第三天的绷带使用量时犯了错。 修正方程后,它重新计算出了正确结果。
整个过程中,它展现出了较强的自我纠错和逻辑推理能力,能在复杂计算过程中发现并修正问题。
关键要点总结
总结来说,这项研究主要有以下发现。
结构化推理能力提升
从生成的序列中可以观察到,经过RL微调的模型在评估得分上实现了小幅提升。
简化算法复杂度,无需PPO的复杂性
研究表明,对LLM进行微调只需要一个策略网络即可,无需采用PPO的复杂机制。
优化计算效率
Reinforce-Lite作为一个计算友好型算法,支持端到端的RL训练,同时显著降低了训练复杂度。
增强模型自主性
算法成功地赋予了LLM自主能力,让模型会通过尝试不同策略来获取奖励。
更长的推理回合,需要更多内存
随着训练的进行,可以发现模型倾向于进行更长的推理过程,但在使用48GB GPU训练3GB模型(FP16)时,如果超过1024个token,就会频繁出现内存溢出问题。
在没有KL散度的情况下确保稳定性
研究人员发现,使用简单的梯度裁剪就能有效替代KL散度计算,这是一种高效的替代方案,用于防止策略偏离。在整个训练过程中,模型策略保持稳定,未出现剧烈波动。
DeepSeek-R1启发,7B模型实现高级推理技能
巧的是,最近来自微软亚洲研究院的一项工作,也证明了RL的巨大潜力——通过有效且稳定的RL训练后,一个7B模型,居然就发展出了反思、验证和总结的高级推理技能!
而这些技能,在逻辑语料库中是完全缺失的。
受DeepSeek-R1成功的启发,研究团队探索了基于规则的强化学习(RL)在大规模推理模型中的潜力。
论文地址:https://arxiv.org/abs/2502.14768
为了分析推理机制,他们选择了具有可控复杂度和直接答案验证方式的「合成逻辑谜题」作为训练数据。
在此过程中,团队取得了一些关键性的技术突破,并促成了有效且稳定的RL训练:
一个着重强调思考和回答过程的system prompt
一个用于惩罚取巧输出的严格格式奖励函数
一个能实现稳定收敛的简单训练方案
其中,训练框架采用REINFORCE++算法和来自DeepSeek-R1的奖励设计进行后训练。
随着RL训练的进行,可以观察到模型自然地分配更多的训练步骤用于推理。这种计算扩展从生成数百个token扩展到数千个token,使其能够更深入地探索和完善其思维过程。
结果显示,只有70亿参数的Qwen2.5-7B,在经过5K个逻辑问题的训练后,就发展出了一些在逻辑语料库中原本不存在的高级推理技能——如反思、验证和总结能力。
研究中,考验模型的这道逻辑题是这样的。
问题:一个非常特殊的岛屿上只住着骑士和骗子。骑士总是说真话,骗子总是说谎。你遇到两位岛民:Zoey和Oliver。Zoey说:「Oliver不是骑士。」Oliver说:「Oliver是骑士且Zoey是骗子。」请问,谁是骑士,谁是骗子?
正确答案:(1)Zoey是骗子;(2)Oliver是骑士。
这个「骑士与骗子」谜题,因其合成设计和逻辑精确性而非常适合进一步分析。
首先,谜题对于模型来说都是未见过大数据,非常适合用来测试泛化能力。
其次,通过改变字符数量(2到8个)和逻辑运算的复杂性(1到4种布尔运算符组合),可以调节难度。
而且,每个谜题都有一个单一、明确的正确答案,正确性由生成算法保证。解答需要严格的演绎推理,因此减少了奖励作弊的风险。
总之,每个谜题都遵循正式规则构建,能确保每个问题都有一个独特的解决方案,并可以确定性地验证。这消除了自然语言任务中常见的模糊性,使我们能够清晰地区分真正的推理能力和表面上的记忆。
在奖励建模中,研究在模型输出中不断检测作弊行为,并不断改进奖励设计。
最终,他们设计出了一种几乎无法作弊的基于规则的奖励系统,仅包含两种奖励类型:格式奖励和答案奖励。
以下就是不同的推理模型和通用模型在不同难度的K&K逻辑谜题上的表现。
在RL训练后,可以在模型中观察到以下涌现的行为。
1. 会出现犹豫和自我验证
在思考环节,模型会不时使用「我不是完全确定,让我们重新检查这一步」这类反思性表达。
这种自我审视的行为特征在预训练阶段是完全不存在的,而是通过奖励正确答案、惩罚错误答案的强化学习机制逐步培养形成的。
2. 多轮径探索和回溯
经过RL训练后,模型会主动提出多个解决方案(「让我们测试两种可能性」),并通过回溯来检查解决方案的一致性。
3. 应用公式
尽管训练数据集中并未包含,但模型不仅能够通过系统性试错方法解决谜题,还自主整合了形式逻辑推理能力(比如运用「如果P,则Q」的逻辑蕴含公式),这种推理模式与人类的问题解决方式高度相似。
4.忽然开始说中文
模型在分析问题陈述时会临时插入中文表达,随后又能自然地转换为英语来提供解决方案。
这一现象表明,模型正在使用语言混合机制作为一种潜在的备选处理策略,或是形成了某种特殊的内部表征模式。
在具有挑战性的数学基准测试AIME和AMC上,模型展现出了卓越的泛化能力——成绩分别提高了125%和38%。
这种跨领域泛化能力表明,RL训练的推理启发式方法发展出了抽象的问题解决模式,而不是依赖于特定领域的模式匹配。
所以,这项研究的训练期间,也出现「顿悟时刻」了吗?
换句话说就是,在强化学习过程中,模型的推理能力是否会发生显著的飞跃,出现多步验证或反思,而且这些行为不是在训练语料中明确植入的,而是模型与RL环境的互动所自然产生的?
研究人员发现,模型并没有出现「等一下,等一下」这样特定的语言表述,但图4显示出,它在第10步时表现出了一些复杂的推理行为(例如自我反思、探索、验证、总结)。
由此,研究人员的结论是,RL学习过程可能没有突如其来的「顿悟时刻」——复杂的推理行为并不是在某个特定的训练步骤中突然出现的。
1. 反思性词汇(如「检查」和「验证」)的频率缓慢增加(a)-(c);2. 会话性短语(例如「让我们」)和谨慎词汇(例如「还」)变得更加频繁(d)-(e);3. 中文词汇开始出现在英文回复中(f)。所有这些词汇的频率都在稳步发展,没有突然的跳跃,表明可能不存在明显的「顿悟时刻」
除了上述技术贡献外,研究还有几个有趣的发现:
更长的回答并不能保证更好的推理。长度本身不是评估训练时间的有效指标。最有效的推理来自最短路径。
语言混合会阻碍推理。这一观察强调了在奖励建模中需要语言一致性惩罚。
增加「思考」token确实有帮助。RL训练自然地提高了与反思相关词汇的频率,表明某些token频率与性能之间存在相关性。
监督微调(SFT)依赖记忆;RL实现泛化。SFT严重依赖记忆,往往导致表面的捷径学习,而RL则在最小依赖数据集结构的情况下自我演化。
冷启动是一个优势,但非必需。无论是从基础模型还是指令模型开始,训练动态都保持惊人的相似性,尽管后者表现略好。
课程学习仍然重要。在固定的数据筛选比例下,精心设计的课程学习方法总是优于随机打乱。
参考资料:
https://huggingface.co/papers/2502.14768
https://medium.com/@rjusnba/overnight-end-to-end-rl-training-a-3b-model-on-a-grade-school-math-dataset-leads-to-reasoning-df61410c04c6