博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。
近期专注: DeepSeek应用,RPA应用研究,主流厂商产品使用,开源RPA 应用等
技术范围: 长期专注java体系,软件架构,DDD,多年java、golang、.Net、redis、nginx、tomcat、mysql、oracle等经验
业务范围: 对传统业务应用技术转型,从数字医院到区域医疗,从院内业务系统到互联网医院及健康服务,从公立医院到私立医院都有一些经历及理解
*** 为大家分享一些思考与积累,欢迎持续关注公众号:【火星求索】 ***
DeepSeek-R1 并不是从零开始训练的。它从一个比较强大LLM (DeepSeek-V3-base)开始,进而成为一个推理大模型。为了做到这一点,使用了强化学习(RL),当 LLM 做了一些有益于推理的事情时,进行奖励,否则进行惩罚。
但这不仅仅是一次简单的训练,而是一系列阶段,称之为流水线。首先尝试纯 RL,看看推理是否会是否可行,这是 DeepSeek-R1-Zero,有点像一个实验。然后,逐级探寻更有组织的不同阶段,给一些开始的数据,让它去执行,再做 RL,然后更多的数据再 RL... 关键是要让这些语言模型更好地思考问题,给更有意义的答案,而不是只吐出单词。
1. R1 的基础:DeepSeek V3
作为基础模型,DeepSeek V3是如何工作的呢?为什么它被称为 MOE?
在DeepSeek V3 中,当输入一个问题时,它首先经过一个记忆系统,通过查找相关信息快速构建上下文。它的主要优势在于决策系统。在理解了输入之后,它使用一个智能路由器在两条路径之间做出选择: 一个用于简单任务 (如简单问题或常见请求) 的快速处理器和一个用于复杂问题 (如分析或专门知识) 的专家系统。这个智能路由器使得 DeepSeekV3 成为一个混合型的专家模型 (MOE),它动态地将每个请求指向最合适的专家组件,以便进行有效的处理。
简单的问题通过快捷路径得到快速、直接的答案,而复杂的查询则通过专家系统得到详细的关注。最后,将这些响应结合成清晰、准确的输出。这也是 DeepSeek R1 实现的起点。
最初的版本 (R1 Zero) 是使用强化学习创建的,其中 DeepSeek v3 充当 RL 的策略模型。RL 的策略模型 (DeepSeek V3) 从采取一个行动开始,这意味着它为一个给定的问题生成一个答案和一些推理,并将其放入其环境中。在这种情况下,环境仅仅是推理任务本身。
在采取行动后,环境会给予奖励。这个奖励就像反馈,它告诉 DeepSeek V3 的行动是多么好。一个积极的奖励意味着它做了正确的事情,也许得到了正确的答案或者推理得很好。这个反馈信号然后回到 DeepSeek-V3-Base,帮助它学习和调整它在未来如何采取行动,以获得更好的奖励。
2.R1的增强学习算法:GRPO
训练 LLM 在计算上极其昂贵,而 RL 增加了更多的复杂性。因此,有许多 RL 算法可用,但是传统的 RL 使用一些判决来帮助主要决策部分 (即 DeepSeek V3) 。这种判决通常与策略模型本身一样庞大和复杂,这基本上使计算成本又增加了一倍。
然而,R1的增强学习算法采用了GRPO。GRPO 做事情的方式不同,因为它指出了一个基线,一种直接从一组行动中得到好结果的参考点。正因为如此,GRPO 根本不需要一个单独的判决模型。这样可以节省大量的计算,并使事情变得更有效率。
GRPO开始于一个问题或提示给一个模型,称为 “旧策略”。GRPO 指示旧策略为同一个问题生成一组不同的答案,而不是只得到一个答案。然后,对每一个答案进行评估,并给出一个奖励分数,以反映这个答案的好坏。GRPO 通过将每个答案与其组内其他答案的平均质量进行比较来计算每个答案的 “优势”。比平均水平好的答案获得积极的优势,差的答案获得消极的优势重要的是,这样做不需要一个单独的评判模型。
然后,这些优势得分被用来更新旧策略,使其更有可能在未来产生优于平均水平的答案。这个更新的模型成为新的 “旧策略”,过程重复,迭代地改进模型。
在这个 GRPO 的背后,有一个复杂的数学问题,简而言之,我称之为 GRPO 的目标函数。GRPO 的目标函数有两个目标,一是提供良好的产出 (高回报) ,同时确保训练过程稳定,不失控。论文中给出的函数很复杂
为了便于理解,可以简化为:
第一个平均结果,即 1/n [...],旨在评估模型在多种不同情境下的平均表现。为此,构建了一个包含各类问题的测试模型。针对每个问题,模型会生成一组可能的答案。通过分析大量问题及其对应的答案组,我们可以计算出一个综合的平均结果。具体而言,每个问题会被输入到一个旧版本的模型中,该模型会生成多个备选答案(例如,答案 1,答案 2,...,答案 G)。这些答案形成一个集合,通过对不同问题的多次评估,我们最终得出了这一平均结果。
SumOf[...]或∑[...] 是指对一组答案中的每个单独的答案进行计算 (例如,答案 1,答案 2,... ,答案 G) ,然后将所有这些计算的结果相加。
然后, 是奖励给出好答案的模型的部分。
RewardPart = SmallerOf(ChangeRatio × Advantage) and SmallerOf(LimitedChangeRatio x Advantage)
ChangeRatio 告诉我们,给出这个答案的机会是随着新模型的出现而增加还是减少。
ChangeRatio = 用新模型回答问题的概率/用旧模型回答问题的概率 -改变了多少
具体来说,它着眼于:
-
用新模型回答问题的概率: 新模型给出特定答案的可能性有多大。
-
用旧模型回答问题的概率: 旧模型给出相同答案的可能性有多大。
接下来,Advantage 得分告诉我们一个答案与同一组中的其他答案相比有多好或多坏。计算结果如下:
Advantage = (答案得分- 分组平均得分 )/组内分数分布 -得分提高了多少
-
答案得分: 给予具体答案的奖励。
-
小组平均得分: 小组所有答案的平均奖励得分。
-
组内分数的分布: 组内答案分数的差异程度。
Advantage得分表达了一个答案是否比组内的平均水平更好,以及这个答案好多少。
LimitedChangeratio 是 ChangeRatio 的修改版本。它确保 ChangeRatio 不会摇摆太远,保持模型的学习稳定。
LimitedChangeRatio = Limit(ChangeRatio -between(1+h,1-j))-ChangeRatio
这个极限是由一个h的小值决定的,可以确保变化不会太剧烈。
SmallerOf [...] 函数在两个选项之间选择较小的值:
-
ChangeRatio × Advantage: : 答案可能性的变化,乘以其优势得分。
-
LimitedChangeratio × Advantage: 答案可能性的变化,但变化率有限。
通过选择较小的值,该模型确保了学习过程保持平稳,并且不会对性能的较大变化作出过度反应。结果是 “好的回答奖励”,鼓励模型在不过度补偿的情况下进行改进。
最后,我们减去 StayStablePart。这是为了防止新模型与旧模型发生太大的变化。
StayStablePart = beta x DifferenceFromReferenceModel - 贴近旧模型
ReferenceModel 测量新模型与参考模型 (通常是旧模型) 的差异。本质上,它有助于评估与前一个模型相比新模型所做的更改。Beta 值控制模型应该在多大程度上接近参考模型。更大的测试版意味着模型将优先考虑更接近旧模型的行为和输出,防止过多的偏差。
简而言之,StayStablePart 确保模型是逐步学习的,而不是盲目地跳跃。
3. R1的前奏: DeepSeek R1 Zero
R1 Zero是为了让事情变得简单直接。它们使用了一个基于规则的奖励系统,而不是使用一个神经网络来判断答案。例如一个简单的数学问题,2+3*4是多少?系统知道正确答案是 14。它查看 DeepSeek V3 生成的输出,并特别检查 标记内部。如果 标签包含 “14”(或者相同的数字) ,它会得到一个正的奖励,比如 + 1。如果它是错误的,它得到 0 奖励,甚至可能是一个负数的奖励 。
DeepSeek R1 Zero 还需要学习如何正确地构建它的推理结构,为了能够使用 和 标签,获得正确的格式会获得一个小的奖励值。检查模型输出是否正确地将推理过程包含在 ... 中,并将最终答案包含在 ... 中。
DeepSeek R1 的论文明确提到在初始探索阶段避免使用 DeepSeek-R1-Zero 的神经奖励模型,以防止注入攻击并降低复杂性。为了使奖励模型有效,研究者设计了一个特定的训练模板。这个模板作为一个蓝图,指导 DeepSeek-v3-Base 在强化学习过程中如何构建它的响应。例如:
A conversation between User and Assistant. The user asks a question, and
the Assistant solves it. The assistant first thinks about the reasoning
process in the mind and then provides the user with the answer. The reasoning
process and answer are enclosed within <think> </think> and <answer> </answer>
tags respectively, i.e., <think> reasoning process here </think>
<answer> answer here </answer>. User: {prompt} Assistant:
{prompt} 是我们插入数学问题的地方。比如什么是 2 + 3 * 4?重要的部分是那些 和 标记。这种结构化的输出对于研究人员以后探索模型的推理步骤非常重要。
我们期望模型生成一个符合模板的输出,比如:
<think>
Order of operations:
multiply before add. 3 * 4 = 12. 2 + 12 = 14
</think>
<answer>
14
</answer>
DeepSeek 有意让这个模板保持简单,并将重点放在结构上,而不是告诉模型如何推理。
R1 Zero的 RL 训练过程
第一步是使用旧的策略,即 DeepSeek-v3-base 模型,在强化学习更新之前生成多个可能的输出。例如,在一个训练迭代中,假设 GRPO 采样一组 G = 4 的输出:
-
o1: 2 + 3 = 5, 5 * 4 = 20 20 (Incorrect order of operations)
-
o2: 3 * 4 = 12, 2 + 12 = 14 14 (Correct)
-
o3: 14 (Correct, but missing tags)
-
o4: ...some gibberish reasoning... 7 (Incorrect and poor reasoning)
每个输出将在评估和分配奖励的基础上评估正确性和推理质量。为了引导模型更好地进行推理,基于规则的奖励系统开始发挥作用。每项产出都根据以下情况分配奖励:
-
准确性奖励: 答案是否正确。
-
格式奖励: 推理步骤是否使用 标记进行了正确的格式化。
假设分配结果如下:
Output | Accuracy Reward | Format Reward | Total Reward |
---|---|---|---|
o1 (Incorrect reasoning) | 0 | 0.1 | 0.1 |
o2 (Correct with reasoning) | 1 | 0.1 | 1.1 |
o3 (Correct but missing tags) | 1 | 0 | 1.0 |
o4 (Incorrect and poor reasoning) | 0 | 0.1 | 0.1 |
该模型应该学会偏爱具有较高回报的产出,同时减少产生不正确或不完整产出的可能性。为了确定每个输出在多大程度上改善或恶化了模型性能,使用奖励值计算Advantage。这一Advantage通过加强更好的产出,有助于优化策略。
为此,计算第一次的平均奖励为(0.1+1.1+1+0.1)/4 = 0.575, 标准差近似为0.5,计算每个Advantage:
Ai =( Ri -平均奖励)/标准差
则:
A1 = (0.1 -0.575)/0.5 约 -0.95
A2 = (1.1-0.575)/0.5 约 1.05
A3 = (1-0.575)/0.5 约 0.85
A4 = (0.1- 0.575)/0.5 月-0.95
因此,输出的O2 和O3 应该奖励,而O1和O4则需要惩罚。
GRPO 然后使用计算出的Advantage来更新策略模型 (DeepSeek-V3) ,以增加产生具有高Advantage (如 o2 和 o3) 的输出概率,并降低具有低优势或负优势 (如 o1 和 o4) 的输出概率。
更新策略根据以下因素调整模型权重:
-
策略比率: 在新策略和旧策略下生成输出的概率。
-
剪切机制: 防止过大的更新,可能破坏训练的稳定性。
-
KL-Divergence 惩罚: 确保更新不会偏离原始模型太远。
这确保了在下一次迭代中,模型更有可能生成正确的推理步骤,同时减少不正确或不完整的响应。因此, RL 是一个迭代过程。上述步骤使用不同的推理问题重复了数千次。每次迭代都逐渐提高模型的能力:
-
执行正确的操作顺序
-
提供逻辑推理步骤
-
始终使用正确的格式
随着时间的推移,模型从错误中学习,在解决推理问题时变得更加准确和有效。
R1 Zero 的两个主要问题
在 DeepSeek-R1 Zero 使用 V3 模型上的 RL 训练过程创建之后,研究人员发现训练过的模型在推理测试中表现得非常好,甚至在像 AIME 2024 这样的任务上获得了类似于 OpenAI-01-0912 的得分。这表明在语言模型中使用强化学习来鼓励推理是一种很有前途的方法。
DeepSeek 的研究人员指出,该模板是有意简单和结构重点。它避免了对推理过程本身施加任何特定于内容的约束。主要的问题是 标签中的推理过程很难阅读,使得人类很难跟踪和分析。
另一个问题是语言混合,当问到多语言问题时,模型有时会在同一个答案中混合语言,导致不一致和混乱的输出。混乱的推理和语言混乱,是明显的障碍。
解决这两个问题,可能是将最初的 R1 Zero模型到 R1的主要动机。
4. R1 的训练
4.1 冷启动数据
为了解决 R1 零问题并确保 DeepSeek 的推理准确性,研究人员采取了冷启动数据收集策略,其中包括监督微调(Supervised Fine-Tuning, SFT)。具体而言,研究人员为 DeepSeek-V3 提供了一系列示例问题及其详细且逐步的解决方案,这些解决方案被称为“思维链”(Chain-of-Thought, CoT)。其核心思想是通过示例引导模型学习,使其能够逐步掌握并模仿这种逻辑严谨的推理风格,从而提升其问题解决能力。
对于我们的示例问题 “2 + 3 * 4是多少”,它们可能会显示如下提示:
Problem Examples with Solutions:
Problem: What's the square root of 9 plus 5?
Solution: | special_token | First, find the square root of 9, which is 3.
Then, add 5 to 3. 3 + 5 equals 8. | special_token | Summary: The answer is 8.
Problem: Train travels at 60 mph for 2 hours, how far?
Solution: | special_token | Use the formula: Distance = Speed times Time.
Speed is 60 mph, Time is 2 hours. Distance = 60 * 2 = 120 miles.
| special_token | Summary: Train travels 120 miles.
Problem: What is 2 + 3 * 4?
Solution:
这些 | special _ token | 东西只是将推理步骤从摘要中分离出来的标记,使模型能够清楚地了解结构。看过这些例子之后,模型应该学会以类似的格式给出答案。
| special_token | Following order of operations (PEMDAS/BODMAS),
do multiplication before addition. So, first calculate 3 * 4 = 12.
Then, add 2 to 12. 2 + 12 = 14. | special_token | Summary: The answer is 14.
收集数据的另一种方法是,直接提示模型不仅要解决问题,而且还要明确地一步一步地展示其推理过程,然后再次检查其答案。这是为了促进更仔细和周到的问题解决。例如:
Problem: Solve this, show reasoning step-by-step, and verify:
What is 2 + 3 * 4?
希望得到的结果包括推理步骤和验证部分:
| special_token | Reasoning: To solve 2 + 3 * 4, I need to use order of
operations. Multiplication comes before addition.
Step 1: Calculate 3 * 4 = 12.
Step 2: Add 2 to the result from step 1: 2 + 12 = 14.
Verification: Checking order of operations again, yes, multiplication
is before addition. Calculation looks right.
| special_token | Summary: The answer is 14.
另外,可以使用已经训练过的 R1 Zero 模型的输出。即使 R1 Zero 有问题,它也可以推理一下,并使用人工标注使其更清晰、更结构化,并纠正任何错误。
最终得到的冷启动数据非常好,这是因为:
-
高质量的推理例子: 每个例子都显示了良好的,逐步推理。
-
一致的、可读的格式: | special _ token | 格式使所有东西都统一且易于处理。
-
人类检查: 他们确保过滤掉任何不好的例子,所以数据是干净和可靠的。
在得到冷启动数据之后,进行监督微调 (SFT)。SFT 第一阶段的核心思想是使用监督式学习来教 DeepSeek-v3-Base 如何生成高质量的结构化推理输出。基本上,向模型展示许多好的推理例子,并要求它学习模仿这种风格。
对于 SFT,我们需要将冷启动数据格式化为输入/目标对。也就是说,对于数据集中的每个推理问题,创建“输入 = 提示或问题描述本身”。
微调过程始于 Input: Prompt + Target Reasoning,其中我们提供一个问题和一个结构化推理示例。这将训练模型 (DeepSeek-V3-Base Model) 生成结构良好的响应。在 “预测下一个令牌” 中,模型按照推理顺序生成下一个单词。这将与 “比较目标令牌 (计算损失)” 中使用损失函数的实际下一个令牌进行比较。较高的损失意味着预测偏离了正确的标记。在更新模型参数中,反向传播和优化器调整模型的权重以改进其预测。这个过程循环往复,在许多输入-目标对上重复,逐渐提高每次迭代的模型结构化推理技巧。
4.2 面向推理的增强学习
DeepSeek R1使用了相同的 GRPO 算法,但这一阶段真正的升级是奖励系统,增加了一些新的且重要的语言一致性奖励!语言一致性奖励是如何略微提高正确答案的总奖励的,甚至为错误答案也会提供一个小的正面奖励,只要它保持语言一致性。
这个 RL 训练循环跟我们之前看到的 DeepSeek R1 Zero 训练循环一样:
-
生成多个输出。
-
提炼奖励,包括语言一致性。
-
使用 GRPO 进行优势估计。
-
对模型进行训练,使其有利于高优势输出。
-
重复这个过程。
对于推理数据,希望获得绝对最好的例子来进一步训练模型。为了做到这一点,DeepSeek使用了一种叫做拒绝抽样的技术。对于“ 2 + 3 * 4是多少”这样的问题,他们会从前一阶段的模型中产生许多输出。想象一下得到的输出类似于 20 (wrong) 和 14 … (right, reasoned)。然后会评估每个输出的正确性 (答案是 “14”) 和推理的可读性。只保留正确和合理的最佳输出,而拒绝其他输出。
对于复杂推理,一种用于判断推理质量的生成奖励模型。严格的过滤器会删除混合语言、漫无边际的推理或不相关的代码。这个过程产生了大约 60 万个高质量的推理样本。除了精确的推理数据,DeepSeek还增加了非推理数据 (约 20 万个样本) 作为一般技能: 写作、质量保证、翻译等等,有时还为复杂任务增加了思维链。
SFT 第二阶段使用下一个令牌预测对组合数据集 上的前一个模型检查点进行训练。这一阶段进一步改进了使用来自拒绝抽样的顶层示例的推理,并将模型推广到更广泛的任务,保持用户友好性。拒绝抽样就是拒绝低于标准的样品,只保留最好的,以产生高质量的训练数据。
最后的奖励信号变成了准确性、帮助性和无害性得分的加权组合。
现在得到的训练数据包括:
-
不同的组合,包括推理问题
-
一般QA提示
-
写作任务
-
偏好对,人工指出两个模型输出中哪一个在有益性和无害性方面更好。
训练过程遵循一个迭代的 RL 循环 (可以使用 GRPO) ,基于来自这个不同数据的组合报酬信号优化模型。经过多次迭代训练,该模型得到改进,以便在推理性能和一致性 (有益性 / 无害性) 之间取得良好的平衡。一旦实现了这种平衡,就可以在流行的基准数据集上对模型进行评估,并超过其他模型的性能。
4.3 蒸馏
在 DeepSeek 团队创造出性能良好的 DeepSeek R1 之后,进一步为社区提炼出性能更好的更大的模型,蒸馏过程的工作原理如下:
* 数据准备: 收集 80 万推理样本。
* DeepSeek-R1 输出: 对于每个样本,来自教师模型 (DeepSeek-R1) 的输出被用作学生模型的目标。
* 监督微调 (SFT) : 学生模型 (例如,Qwen-1.5 B,美洲驼 -14B) 在这 80 万个样本上进行微调,以匹配 DeepSeek-R1 的输出。
* 蒸馏后的模型: 学生模型现在被提炼成更小的版本,但保留了 DeepSeek-R1 的大部分推理能力。
结果就是得到了一个更小、更快、具有良好推理能力的模型,可以进行部署。
5. 一句话小结
基于DeekSeek-V3 的基础模型,通过纯增强学习得到DeepSeek-R1-Zero,再利用结构化训练得到DeepSeek-R1,然后利用CoT逐步提升推理技巧,同时以蒸馏的方式得到一个拥有较好推理能力的SLM。
最后
如果你觉得这篇文章对你有帮助,欢迎点赞、转发、评论!
公众号【火星求索】发送deepseek即可获取【清华大学DeepSeek 从入门到精通 系列】四连弹,以及可以获取收集整理的各种资料。