DeepSeek-R1 模型及GRPO算法学习
总结DeepSeek-R1 模型算法,并对其中的GRPO算法做一些学习补充。
DeepSeek-R1 论文总结
提出了通过强化学习提升大语言模型推理能力的方法,开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型,在多个推理任务上表现出色,并开源模型推动研究发展。
该研究旨在用纯强化学习(RL)提高语言模型推理能力 ,探索 LLMs 在无监督数据下通过 RL 自我进化的潜力。
在多个任务场景上达到了和openai-o1模型近乎持平的效果:
主要贡献
-
在基础模型上直接进行强化学习
-
直接将强化学习(RL)应用于基础模型,而不依赖监督微调(SFT)。这种方法使模型能够探索用于解决复杂问题的思维链(CoT),从而开发出了 DeepSeek - R1 - Zero。 DeepSeek - R1 - Zero 展现出了自我验证、反思以及生成较长思维链等能力,这对研究界来说是一个重要的里程碑。
这是首个通过公开研究验证大语言模型(LLM)的推理能力可以纯粹通过强化学习来激励,而无需监督微调。
-
开发 DeepSeek - R1 模型流程。包含两个强化学习(RL)阶段,旨在发现改进的推理模式并契合人类偏好,还包括两个监督微调(SFT)阶段,它们是模型推理和非推理能力的基础。
推理能力(reasoning capabilities): 如数学问题,根据已知条件可以严格推断出来一个结论。
非推理能力(non-reasoning capabilities): 不涉及逻辑推理,如翻译,生成某种风格的文本等。
-
-
对小模型进行蒸馏,也达到了不错的效果
传统的方法针对标注的样本,用SFT + RL的方法对小模型进行学习。本文用大模型对小模型进行蒸馏,仅使用SFT,也达到了比较好的效果。
DeepSeek-R1-Zero: 在base模型上直接进行RL
针对推理任务,没有用到有监督的数据。
GRPO 强化学习算法
参考论文GRPO,对每一个question q, 从旧模型 π θ o l d \pi_{\theta_{old}} πθold采样一组输出 { o 1 , o 2 , . . . , o G } \{o_1, o_2, ..., o_G\} {o1,o2,...,oG}, 然后最大化如下目标函数:
J G R P O ( θ ) = E [ q ∼ P ( Q ) , o i i = 1 G ∼ π θ o l d ( O ∣ q ) ] = 1 G ∑ i = 1 G ( min ( π θ ( o i ∣ q ) π θ o l d ( o i ∣ q ) A i , clip ( π θ ( o i ∣ q ) π θ o l d ( o i ∣ q ) , 1 − ε , 1 + ε ) A i ) − β D K L ( π θ ∣ ∣ π r e f ) ) \begin{align*} \mathcal{J}_{GRPO}(\theta) &= \mathbb{E}[q \sim P(Q), {o_i}_{i = 1}^{G} \sim \pi_{\theta_{old}}(O|q)] \\ &= \frac{1}{G} \sum_{i = 1}^{G} \left( \min \left( \frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)} A_i, \text{clip} \left( \frac{\pi_{\theta}(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}, 1 - \varepsilon, 1 + \varepsilon \right) A_i \right) - \beta \mathbb{D}_{KL} (\pi_{\theta}||\pi_{ref}) \right) \end{align*} JGRPO(θ)=E[q∼P(Q),oii=1G∼πθold(O∣q)]=G1i=1∑G(min(πθold(oi∣q)πθ(oi∣q)Ai,clip(πθold(oi∣q)πθ(oi∣q),1−ε,1+ε)Ai)−βDKL(πθ∣∣πref))
D K L ( π θ ∣ ∣ π r e f ) = π r e f ( o i ∣ q ) π θ ( o i ∣ q ) − log π r e f ( o i ∣ q ) π θ ( o i ∣ q ) − 1 , \mathbb{D}_{KL} (\pi_{\theta}||\pi_{ref}) = \frac{\pi_{ref}(o_i|q)}{\pi_{\theta}(o_i|q)} - \log \frac{\pi_{ref}(o_i|q)}{\pi_{\theta}(o_i|q)} - 1, DKL(πθ∣∣πref)=πθ(oi∣q)πref(oi∣q)−logπθ(oi∣q)πref(oi∣q)−1,
ε \varepsilon ε 和 β \beta β为超参数, A i A_i Ai为归一化的优势函数。
A i = r i − mean ( r 1 , r 2 , ⋯ , r G ) std ( r 1 , r 2 , ⋯ , r G ) . A_{i} = \frac{r_{i} - \text{mean}\left({r_{1}, r_{2}, \cdots, r_{G}}\right)}{\text{std}\left({r_{1}, r_{2}, \cdots, r_{G}}\right)}. Ai=std(r1,r2,⋯,rG)ri−mean(r1,r2,⋯,rG).
π θ ( o i ∣ q ) \pi_{\theta}(o_i|q) πθ(oi∣q) 代表正在训练的policy模型对于每一个output o i o_i oi 输出的概率。
这里的output o i o_i oi 不是token粒度的,而应该是一个完整的输出。 reward的计算是根据推理任务直接进行逻辑解析。
GRPO 与PPO的区别如下图所示:
GRPO算法的详细迭代过程:
输入参数
- 初始策略模型 π θ i n i t π_{θ_{init}} πθinit:这是算法开始时的初始模型,用于生成策略。
- 奖励模型 r φ r_φ rφ:用于评估生成的输出的质量。
- 任务提示 D D D:包含所有任务的提示或问题,模型将根据这些提示生成输出。
- 超参数 ε , β , μ ε,β,μ ε,β,μ:这些参数用于控制算法的行为,如学习率、折扣因子等。
算法步骤
-
初始化策略模型:将策略模型设置为初始模型 π θ i n i t π_{θ_{init}} πθinit。
-
迭代过程:算法通过多次迭代来优化策略模型。
-
在每次迭代中,首先将参考模型设置为当前的策略模型。
-
对于每一步:
- 从任务提示prompt_list中采样一个batch D b D_b Db。
- 更新旧策略模型为当前策略模型。
- 对于每个问题 q q q ,从旧策略模型中采样 G G G 个输出。
- 计算每个采样输出的奖励。
- 通过组相对优势估计计算每个输出中每个标记的优势A。
-
在GRPO迭代中:
- 通过最大化GRPO目标函数来更新策略模型。
- 使用重放机制连续训练更新奖励模型。
-
输出
- 优化后的策略模型 π θ π_θ πθ:这是经过多次迭代和优化后的最终模型,旨在生成更高质量的输出。
关键概念
- 组相对优势估计:这是一种计算优势的方法,它考虑了同一问题下不同输出之间的相对表现,而不是依赖于一个固定的价值函数。
- 奖励模型的更新:通过重放机制连续训练奖励模型,以确保它能够准确评估输出的质量。
这种算法特别适用于需要生成多个可能解决方案的任务,如自然语言处理中的文本生成,其中可以通过比较不同生成结果的质量来优化模型。GRPO通过减少对价值函数的依赖和利用组内比较来提高训练效率和模型性能。
prompt形式
Reward Model
-
准确性奖励: 数学问题直接要求按照特定格式输出,对比结果本身正确的结果;LeetCode问题直接运行生成的代码。
-
格式奖励: 除准确性奖励模型外,还采用格式奖励模型,强制模型将其思考过程置于 “<think>” 和 “</think>” 标签之间。
-
未采用其他奖励模型的原因:未应用结果或过程的神经网络奖励模型,因为发现神经奖励模型在大规模强化学习过程中可能遭受奖励欺骗问题,并且重新训练奖励模型需要额外的训练资源,还会使整个训练流程复杂化。
效果表现
随着训练步数的增加,性能稳步提升,达到和OpenAI-o1-0912接近的水平。
并且观察到了明显的“进化”现象,随着训练步数的增加,输出平均长度也在增加。意味着LLM似乎自己已经潜移默化学会了进行更多的思考和推理,达到更好的效果。
甚至出现了自主的“Aha Moment”(顿悟时刻)情况,学会自我反思和修正。
缺点
生成的答案可读性相对差、存在混合语言输出情况。
所以需要DeepSeek-R1, 使用一些有监督的数据。
DeepSeek-R1 冷启动强化学习
DeepSeek-R1采用如下4个阶段,将模型能力进一步加强。
冷启动阶段
DeepSeek - R1 相对于 DeepSeek - R1 - Zero 在冷启动数据方面的改进:
-
改进原因:为防止基础模型在强化学习(RL)训练早期不稳定的冷启动阶段出现问题,DeepSeek - R1 构建并收集少量长思维链(CoT)数据来微调作为 RL 初始策略网络(actor)的模型。
-
数据收集方法:探索了多种方法收集长 CoT 数据,如以长 CoT 为示例进行少样本提示,直接提示模型生成带反思和验证的详细答案,以可读格式收集 DeepSeek - R1 - Zero 的输出,并通过人工标注者进行后处理优化结果。收集了数千条冷启动数据来微调 DeepSeek - V3 - Base 作为 RL 的起点。
-
冷启动数据优势
- 可读性:DeepSeek - R1 - Zero 的一个关键局限是内容常不适合阅读,回复可能混合多种语言或缺乏突出答案的 markdown 格式。相比之下,DeepSeek - R1 在创建冷启动数据时,设计了可读模式,在每个回复结尾包含总结,并过滤掉不友好的回复。输出格式定义为 | special_token|<reasoning_process>|special_token|,其中推理过程是查询的 CoT,总结用于概括推理结果。
- 潜力:通过精心设计融入人类先验知识的冷启动数据模式,与 DeepSeek - R1 - Zero 相比,观察到更好的性能表现。认为迭代训练是推理模型更好的方式。
对推理场景进行RL
-
前期微调:在冷启动数据上对 DeepSeek - V3 - Base 进行微调后,应用与 DeepSeek - R1 - Zero 中相同的大规模强化学习训练过程。
-
训练重点:此阶段专注于提升模型的推理能力,特别是在诸如编码、数学、科学和逻辑推理等推理密集型任务上,这些任务涉及定义明确且有清晰解决方案的问题。
-
问题及解决:训练过程中观察到思维链(CoT)常出现语言混合现象,尤其是当强化学习提示涉及多种语言时。为缓解这一问题,在强化学习训练期间引入语言一致性奖励,其计算方式为目标语言单词在 CoT 中的比例。尽管消融实验表明这种对齐会导致模型性能略有下降,但该奖励符合人类偏好,使生成内容更具可读性。
-
最终奖励形成:最后,通过直接将推理任务的准确性和语言一致性奖励相加,形成最终奖励。然后在微调后的模型上应用强化学习训练,直至其在推理任务上达到收敛。
拒绝采样和SFT
拒绝采样和监督微调阶段:
当面向推理的强化学习收敛后,利用得到的checkpoints 为下一轮收集监督微调(SFT)数据。此阶段与初始专注推理的冷启动数据不同,会纳入其他领域的数据,以增强模型在写作、角色扮演等通用任务上的能力。
-
推理数据处理
- 生成方式:精心策划推理提示,并通过对上述强化学习训练的checkpoints 进行拒绝采样来生成推理轨迹。
- 数据集扩展:之前阶段仅包含能用基于规则的奖励评估的数据,此阶段通过纳入额外数据来扩展数据集,部分数据使用生成式奖励模型,将真实数据和模型预测输入 DeepSeek - V3 进行判断。
- 数据筛选:由于模型输出有时混乱且难以阅读,因此过滤掉了语言混合的思维链、长段落和代码块。对于每个提示,采样多个回复并仅保留正确的回复。总共收集了约 60 万条与推理相关的训练样本。
-
非推理数据收集
对于写作、事实问答、自我认知和翻译等非推理数据,采用 DeepSeek - V3 的流程,并复用 DeepSeek - V3 的部分监督微调(SFT)数据集。对于某些非推理任务,在提示回答问题之前,调用 DeepSeek - V3 生成潜在的思维链(CoT);但对于像 “hello” 这样简单的查询,不提供 CoT 回复。最终,总共收集了大约 20 万个与推理无关的训练样本。 -
模型微调
使用上述精心整理的约 80 万个样本的数据集,对 DeepSeek - V3 - Base 进行了两个轮次(epochs)的微调。
通用场景的RL阶段
使模型更符合人类偏好所实施的二次强化学习阶段:
-
目的:旨在提高模型的有用性和无害性,同时优化其推理能力。
-
训练方法:使用奖励信号和多样化提示分布相结合的方式训练模型。
- 推理数据:在数学、代码和逻辑推理领域,遵循 DeepSeek - R1 - Zero 中概述的方法,利用基于规则的奖励来引导学习过程。
- 一般数据:借助奖励模型来捕捉复杂微妙场景中的人类偏好。
-
数据及评估依据:基于 DeepSeek - V3 流程,采用类似的偏好对和训练提示分布。
- 有用性评估:只专注于最终总结,确保评估强调回复对用户的实用性和相关性,同时尽量减少对底层推理过程的干扰。
- 无害性评估:评估模型的整个回复,包括推理过程和总结,以识别和减轻生成过程中可能出现的任何潜在风险、偏差或有害内容。
-
最终效果:奖励信号和多样化数据分布的整合,使我们能够训练出在推理方面表现出色,同时优先考虑有用性和无害性的模型。
蒸馏小模型
- 目的:为让更高效的小模型具备如 DeepSeek - R1 那样的推理能力。
- 方法:直接使用由 DeepSeek - R1 整理的 80 万个样本,对 Qwen和 Llama等开源模型进行微调。
- 使用的基础模型:包括 Qwen2.5 - Math - 1.5B、Qwen2.5 - Math - 7B、Qwen2.5 - 14B、Qwen2.5 - 32B、Llama - 3.1 - 8B 和 Llama - 3.3 - 70B - Instruct。选择 Llama - 3.3 是因其推理能力略优于 Llama - 3.1。
- 蒸馏模型的训练设置:对于蒸馏后的模型,仅应用监督微调(SFT),不包含强化学习(RL)阶段,尽管纳入 RL 可能大幅提升模型性能。这里的主要目标是展示蒸馏技术的有效性,将 RL 阶段的探索留给更广泛的研究社区。
实验结果
DeepSeek-R1:
蒸馏模型:
讨论
- 蒸馏 v.s. RL
从实验结果来看,蒸馏又便宜又实用。用小的模型进行SFT+RL操作,最后的效果远不如直接蒸馏更好。
暂未成功的尝试
过程奖励模型(PRM)
PRM在GRPO的论文中也有实验验证,主要是对模型的中间步骤进行评价和奖励。
-
PRM 的合理性:PRM 是一种合理的方法,可引导模型采用更好的方式来解决推理任务。
-
PRM 的局限性
- 定义困难:在一般推理中,明确界定细粒度的步骤具有挑战性。这意味着难以精确地确定推理过程中每个小步骤的标准和要求。
- 判断正误困难:确定当前中间步骤是否正确是一项艰巨的任务。使用模型进行自动标注可能无法产生令人满意的结果,而人工标注不利于大规模扩展,因为人工标注需要耗费大量人力和时间成本。
- 奖励欺骗与资源消耗:一旦引入基于模型的 PRM,不可避免地会导致奖励欺骗问题。而且重新训练奖励模型需要额外的训练资源,这会使整个训练流程变得复杂。
-
PRM 在实验中的表现:虽然 PRM 在对模型生成的前 N 个回复进行重新排序或辅助引导搜索方面展现出良好能力,但在大规模强化学习过程中,与它所引入的额外计算开销相比,其优势较为有限。
蒙特卡罗树搜索(MCTS)
受 AlphaGo 和 AlphaZero 启发,探索使用 MCTS 来提升测试时计算扩展性。该方法将答案分解为更小部分,让模型系统地探索解决方案空间。具体做法是促使模型生成对应搜索所需特定推理步骤的多个标记。训练时,先收集提示,通过预训练价值模型引导的 MCTS 找到答案,然后用生成的问答对训练策略网络模型和价值模型,并迭代优化过程。
面临的挑战:
-
搜索空间复杂:与国际象棋搜索空间相对明确不同,标记生成存在指数级更大的搜索空间。虽设置每个节点的最大扩展限制,但这可能导致模型陷入局部最优解。
-
价值模型训练困难:价值模型直接影响生成质量,因其指导搜索过程的每一步。训练细粒度价值模型本身就极具难度,这使得模型难以迭代改进。尽管 AlphaGo 成功依赖于训练价值模型逐步提升性能,但由于标记生成的复杂性,此原则在当前设置中难以复制。
所以虽然 MCTS 与预训练价值模型配合时可在推理阶段提高性能,但通过自我搜索迭代提升模型性能仍是重大挑战。
未来的改进方向
- 通用能力:DeepSeek-R1的通用能力仍然不及DeepSeekV3。接下来,将探索如何利用长CoT来提升这些领域的任务表现。
- 语言混合:DeepSeek-R1目前针对中文和英文进行了优化,但是在处理其他语言以及语言遵循方面还是会有问题。
- Prompt Engineering:DeepSeek-R1对Prompt非常敏感。few-shot提示会持续降低其性能。这里建议用户直接描述问题并指定输出格式(采用zero-shot,不要加示例),以获得最佳结果。
- 软件工程任务:由于长时间的评估会影响RL过程的效率,大规模RL尚未在软件工程任务中广泛应用。因此,DeepSeek-R1在软件工程基准测试上未显示出比DeepSeek-V3更大的改进。未来版本将通过在软件工程数据上实施拒绝采样或在RL过程中引入异步评估来提高效率。
参考文献
- DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models
- DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
- DeepSeek-R1论文速读