从零开始绘制DeepSeek R1架构和训练流程


从零开始绘制DeepSeek R1架构和训练流程

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

数据STUDIO社区是国内外知名的机器学习与Python社区,受众覆盖国内外硕博生、高校老师以及企业研究人员。
社区的愿景是促进国内外自然语言处理,机器学习学术界、产业界和广大爱好者之间的交流和进步,特别是初学者同学们的进步。
来源|知乎
作者|lucas大叔
在讨论技术细节之前,先简单介绍一下DeepSeek-R1并非是从无到有从头开始训练的。相反,他们从一个相当聪明的LLM开始,他们已经有了DeepSeek-V3[1],但他们想让它成为一个推理超级明星。
为了做到这一点,他们使用了强化学习(简称RL),当LLM做出有利于推理的事情时,就会奖励它,否则就会惩罚它。
但这不仅仅是一个简单的训练环节。它就像是一大堆步骤,称之为管道。他们首先尝试了纯RL,看看推理是否会自行出现,这就是DeepSeek-R1-Zero,有点像一个实验。然后对于真正的DeepSeek-R1,他们通过不同的阶段使其更有条理。他们给它一些起始数据令其运行,然后进行RL,然后是更多数据,然后是更多RL……就像是一步步升级!
关键在于让这些语言模型更好地思考问题并给出明智的答案,而不仅仅是说出一些单词。在研究每个步骤的细节之前,这就是超简短的概览介绍。
正如之前所说,DeepSeekR1训练不是从零开始构建的,而是使用DeepSeekV3作为基座模型。所以我们需要了解V3的工作原理以及为什么它被称为MOE?
DeepSeekV3的运行主要有两条路径。当输入一个问题时,它首先会经过记忆系统,通过查找相关信息来快速构建上下文。可以把它想象成快速回忆你以前遇到过的类似情况。
它的主要优势在于其决策系统。在理解输入后,它会使用智能路由在两条路径之间做出决定:快速处理器用于处理简单任务(如简单问题或常见请求),专家系统用于处理复杂问题(如分析或专业知识)。
路由让DeepSeekV3成为混合专家模型(MOE)
因为它会动态地将每个请求定向到最合适的专家组件以进行有效处理。
简单的问题通过快捷方式获得快速、直接的答案,而复杂的查询则通过专家系统得到详细关注。最后,这些响应被组合成清晰、准确的输出。
现在我们已经了解了DeepSeekv3的思维方式,它是DeepSeekR1实现的起点,我所说的起点是指它创建了DeepSeekR1Zero版本,这是在创建最终版本之前存在一些错误的初始版本。
初始版本(R1Zero)是使用强化学习创建的,其中DeepSeekv3充当RL代理(采取行动的参与者)。让我们首先直观地了解一下它的工作原理。
RL代理(DeepSeekV3)首先采取行动(Action),这意味着它会针对放入其Environment中的给定问题生成答案和一些推理。在这种情况下,Environment就是推理任务本身。
采取行动后,环境会给出奖励(Reward)。此奖励就像反馈,它告诉DeepSeekV3基座模型其行动有多好。积极的奖励意味着它做对了某件事,可能得到了正确的答案或推理得很好。然后,此反馈信号返回到DeepSeek-V3-Base,帮助它学习和调整未来如何采取行动以获得更好的奖励。
在接下来的部分中,我们将讨论这个带有奖励模型的RL设置以及他们使用的RL算法,并尝试使用我们的文本输入来解决它。
训练LLM的计算成本极其昂贵,而RL则增加了更多的复杂性。
因此,有许多RL算法可用,但正如你所知,传统RL使用一种称为“ctritic”的东西来帮助主要决策部分(“参与者(actor)”,即DeepSeekV3)。这个critic通常与actor本身一样大和复杂,这基本上使计算成本翻倍。
然而,GRPO的做法有所不同,因为它会根据一组操作的结果直接找出基线,即良好操作的参考点。因此,GRPO根本不需要单独的critic模型。这节省了大量计算并提高了效率。
它首先向称为“旧策略(OldPolicy)”的模型提出问题或提示。GRPO不会只得到一个答案,而是指示旧策略针对同一问题生成一组不同的答案。然后评估每个答案并给出奖励分数,以反映其好坏或可取性。
GRPO通过将每个答案与同一组中其他答案的平均质量进行比较来计算其“优势(Advantage)”。高于平均水平的答案获得正优势,低于平均水平的答案获得负优势。至关重要的是,这无需单独的critic模型即可完成。
然后,这些优势分数会用于更新旧策略,使其更有可能在未来产生优于平均水平的答案。更新后的模型将成为新的“旧策略”,这个过程不断重复,不断改进模型。
显然,在GRPO背后是复杂的数学。总之,我们可以称之为GRPO背后的目标函数。
GRPO的目标函数有两个目标,一个是给出好的输出(高奖励),同时确保训练过程稳定且不会失控。原始函数很吓人,但我们会将其重写为更简单的形式,而不会失去其实际意义。
让我们逐一分析。首先,AverageResult[…]或1/n[…]指的是评估在许多不同情况下平均发生的情况。我们提出包含各种问题的模型。对于每个问题,该模型都会生成一组答案。通过查看许多问题及其各自的答案组中的这些答案,我们可以计算出平均结果。
在此过程中,问题被输入到旧模型中,该模型会产生多个答案(例如,答案1、答案2、……、答案G)。这些答案形成一组,通过评估不同问题中该组答案,我们得出平均结果。
SumOf[..]或∑[…]是指对一组答案(例如,答案1、答案2、…、答案G)中的每个答案进行计算,然后将所有这些计算的结果相加。
接下来是奖励部分。这是奖励模型给出良好答案的部分。它的内部有点复杂,让我们放大一下:
ChangeRatio告诉我们,使用新模型后,给出此答案的概率是增加了还是减少了。具体来说,它关注的是:
新模型的答案机会:新模型给出特定答案的可能性有多大。
旧模型的答案机会:旧模型给出相同答案的可能性有多大。
接下来,Advantage分数表明一个答案与同一组中的其他答案相比有多好或多差。其计算方法如下:
Answer’sScore:对特定答案给予的奖励。
AverageScoreofGroup:组内所有答案的平均奖励分数。
SpreadofScoresinGroup:组内答案分数的差异有多大。
Advantage分数告诉我们一个答案是否比小组内的平均水平更好,以及好多少。
LimitedChangeRatio是ChangeRatio的修改版本。它确保ChangeRatio不会波动太大,从而保持模型的学习稳定。限制由一个称为Epsilon的小值决定,以确保变化不会太剧烈。
最后,SmallerOf[…]函数在两个选项中选取较小的值:
ChangeRatio×Advantage:答案可能性的变化乘以其优势得分。
LimitedChangeRatio×Advantage:相同,但变化率有限。
最后,我们减去StayStablePart。这是为了防止新模型与旧模型变化太大。它不是很复杂,但让我们放大它:
DifferenceFromReferenceModel衡量新模型与参考模型(通常是旧模型)的差异程度。本质上,它有助于评估新模型与前一个模型相比所做的更改。
Beta值控制模型应与参考模型保持多近的距离。较大的Beta值意味着模型将优先保持与旧模型的行为和输出的接近程度,从而防止偏差过大。让我们将其形象化:
简而言之,StayStablePart确保模型逐步学习并且不会出现疯狂的跳跃。
现在已经了解了主要的理论概念,让我们使用文本输入来了解创建R1Zero的奖励模型是如何运作的。
请记住,对于R1Zero,他们保持了简单和直接。他们没有使用复杂的神经网络来判断答案(就像他们在后期阶段可能使用的那样),而是使用了基于规则的奖励系统。
对于我们的数学问题:“2+3*4等于多少?”
系统知道正确答案是14。它将查看DeepSeekV3(我们的RL代理)生成的输出,并特别检查标签内部。
如果标签包含“14”(或数值相同的内容),它会得到正奖励,比如说+1。如果它错了,它会得到0奖励,甚至可能是负奖励(尽管本文现阶段为了简单起见重点关注0)。
但是DeepSeekR1Zero还需要学习正确地构建其推理,并且可以使用和标签,正确使用格式的奖励较小。
检查模型输出是否正确地将推理过程包含在…内,并将最终答案包含在…内。
DeepSeekR1论文明确提到避免使用DeepSeek-R1-Zero的神经奖励模型,以防止奖励黑客攻击并降低初始探索阶段的复杂性
为了使奖励模型有效,研究人员设计了特定的训练模板。该模板充当蓝图,指导DeepSeek-V3-Base如何在强化学习过程中构建其响应。
让我们看一下原始模板并将其逐一分解:

{prompt}是插入数学问题的地方,例如2+3*4等于多少?。重要的是和标签。这种结构化输出对于研究人员以后窥探模型的推理步骤非常重要。
当训练DeepSeek-R1-Zero时,我们使用此模板为其提供提示。对于示例问题,输入将如下所示:

并且我们期望模型生成符合模板的输出,例如:
有趣的是,DeepSeek团队有意让这个模板保持简单并专注于结构,而不是告诉模型如何推理。
尽管论文没有指定RL预训练的确切初始数据集,但我们假设它应该以推理为中心。
第一步是使用旧策略(即强化学习更新之前的DeepSeek-V3-Base模型)生成多个可能的输出。在一次训练迭代中,假设GRPO采样一组G=4个输出。
例如,模型针对我们的文本输入生成以下四个输出:Whatis2+34?
o1:(2+3=5,5
4=2020操作顺序不正确)
o2:(34=12,2+12=1414正确)
o3:(14正确,但缺少标签)
o4:(…somegibberishreasoning…7不正确且推理不充分)
每个输出将根据正确性和推理质量进行评估并分配奖励。
为了引导模型更好地推理,基于规则的奖励系统开始发挥作用。每个输出都会根据以下条件分配奖励:
准确度奖励:答案是否正确。
格式奖励:推理步骤是否用标签正确格式化。
假设奖励分配如下:
该模型应该学会青睐具有更高奖励的输出,同时降低产生不正确或不完整输出的概率。
为了确定每个输出对模型性能的改善或恶化程度,我们使用奖励值计算优势(advantage)。优势有助于通过强化更好的输出来优化策略。
为此,让我们计算平均第一次奖励。
标准差(近似)=0.5,现在计算每个输出的优势。
产出o2和o3获得正优势,意味着应鼓励它们。产出o1和o4获得负优势,意味着应阻止它们。
然后,GRPO使用计算出的优势来更新策略模型(DeepSeek-V3-Base),以增加生成具有高优势的输出(如o2和o3)的概率,并降低具有低优势或负优势的输出(如o1和o4)的概率。
更新根据以下内容调整模型权重:
政策比率(PolicyRatios):新政策与旧政策下产生产出的概率。
剪辑机制(ClippingMechanism):防止过大的更新导致训练不稳定。
KL散度惩罚(KL-DivergencePenalty):确保更新不会偏离原始模型太远。
这确保在下一次迭代中,模型更有可能生成正确的推理步骤,同时减少不正确或不完整的响应。
因此,强化学习是一个迭代过程。使用不同的推理问题重复上述步骤数千次。每次迭代都会逐渐提高模型的以下能力:
执行正确的操作顺序
提供逻辑推理步骤
始终使用正确的格式
整体训练循环如下:
随着时间的推移,模型会从错误中学习,从而变得更加准确和有效地解决推理问题。
在V3模型上使用强化学习训练流程创建DeepSeek-R1Zero后,研究人员发现训练后的模型在推理测试中表现非常出色,甚至在AIME2024等任务上的得分与OpenAI-01-0912等更高级的模型相当。这表明使用强化学习(RL)来鼓励语言模型进行推理是一种很有前途的方法。
但他们也注意到DeepSeek-R1-Zero存在一些关键问题,需要修复才能在实际中使用和进行更广泛的研究。
DeepSeek的研究人员表示,该模板刻意设计得简单且注重结构。它避免对推理过程本身施加任何特定于内容的限制。例如,它没有说:
“你必须使用逐步的推理”(它只是说“推理过程”,而让模型来定义其含义)。
“你必须运用反思推理”
“你必须使用特定的解决问题策略”主要问题是标签内的推理过程难以阅读,从而导致人类难以理解和分析。
另一个问题是语言混合,当被问及多语言问题时,模型有时会在同一个回答中混合多种语言,导致输出不一致和混乱。如果你用西班牙语问它问题。突然间,它的“思维”就会变成英语和西班牙语的混杂!这些问题,混乱的推理和语言混乱,是明显的障碍。
这是他们将最初的R1Zero模型改造为R1的两个主要原因
在下一部分中,将介绍他们如何将R1zero模型改进为R1模型,从而提高其性能并帮助其胜过所有其他模型(无论是开源的还是封闭的)。
为了解决R1Zero问题并真正正确地进行DeepSeek推理,研究人员进行了冷启动数据收集并加入了监督微调。
你可以将其视为在真正激烈的强化学习训练之前为模型打下良好的推理基础。基本上,他们想教会DeepSeek-V3Base良好的推理是什么样的以及如何清晰地呈现它。
他们为DeepSeek-V3Base提供了一些问题示例以及非常详细的分步解决方案,称为思维链(CoT)。这个想法是让模型通过示例进行学习,并开始模仿这种分步推理风格。
让我们直观地理解基于示例的学习:
对于示例问题Whatis2+3
4?,他们可能会显示如下提示:
|special_token|只是将推理步骤与Summary分开的标记,使模型能够清楚地学习结构。
看到这些例子后,模型应该学会以类似的格式给出答案,例如Whatis2+34?
直接提示
他们收集数据的另一种方式是直接提示模型不仅解决问题,而且还逐步明确地展示其推理,然后仔细检查其答案。
这是为了促进更加谨慎和周到的解决问题。
对于Whatis2+3
4?提示可能是:
他们确实期望输出包含推理步骤和验证部分:
后处理细化
他们甚至使用了已经训练过的R1Zero模型的输出。尽管R1Zero存在问题,但它可以进行一些推理。因此,他们采用了R1Zero的输出,并让人工注释者对其进行注释,使其更加清晰、更有条理,并纠正错误。
例如,混乱的R1Zero输出可能是:
人类对其进行完善,使其更加清晰且格式更好。
细化过程的可视化是这样的:
他们最终得到的冷启动数据非常好,因为:
高质量的推理示例:每个示例都展示了良好的、循序渐进的推理。
一致、可读的格式:|special_token|格式使一切统一且易于处理。
人工检查:他们确保过滤掉任何不好的例子,以便数据干净可靠。
获得冷启动数据后,进行监督微调(SFT)。
SFT第1阶段的核心思想是使用监督学习教DeepSeek-V3-Base如何产生高质量、结构化的推理输出。
基本上,我们向模型展示许多好的推理例子并要求它学习模仿这种风格。
对于SFT,我们需要将冷启动数据格式化为输入-目标对。对于数据集中的每个推理问题,创建一对如下的对:
输入=提示或问题描述本身
这是输入到模型中的内容,我们的目标是相应的结构良好的推理和答案
这是希望模型学习生成的理想输出。我们在告诉模型:
当你看到这个输入(问题),我们希望你给出这个目标输出(合理的推理和答案)。
与其用详细的文本解释它,让你很难理解,让我们先把它形象化,以便有一个更容易的SFT解释。
微调过程从输入开始:提示+目标推理,我们提供问题和结构化的推理示例。这会训练模型(DeepSeek-V3-Base模型)生成结构良好的响应。
在预测下一个token时,模型生成推理序列中的下一个单词。使用损失函数将其与比较目标token中的实际下一个token进行比较。损失越大,意味着预测距离正确token越远。
在更新模型参数时,反向传播和优化器会调整模型的权重以改善其预测。此过程循环往复,在许多输入-目标对上重复,每次迭代都会逐渐改善模型结构化推理能力。
他们在SFT中为DeepSeekV3提供了推理教育,但为了真正提高其推理能力,研究人员引入了面向推理的学习!
在这里,我们采用SFT微调的DeepSeek-V3模型,并通过强化学习推动它变得更好。
他们确实使用了相同的GRPO算法,但此阶段真正的升级是奖励系统。他们添加了一些新的、非常重要的语言一致性奖励!
还记得R1Zero有时会对语言感到困惑并开始混杂它们吗?为了解决这个问题,专门增加了对保持语言一致性的奖励。这个想法很简单,如果你用英语问问题,我们希望推理和答案也是用英语。
让我们直观地看一下语言一致性奖励的计算:
为了理解上图,让我们重新回顾之前的示例输出o1和o2,并看看奖励如何随着这一新的语言一致性奖励而变化。为简单起见,我们假设目标语言是英语。
让我们看看这些奖励如何在示例输出中发挥作用。考虑第一个输出o1,它错误地计算了“2+34”,但用英语呈现了其有缺陷的推理:
对此,准确度奖励自然为0,因为答案是错误的。但是,由于假设推理100%使用目标语言(本例中为英语),因此语言一致性奖励为1。
当我们计算RL阶段的总奖励时,我们会将这些结合起来。如果我们为准确度奖励分配权重1,为语言一致性奖励分配较小的权重(例如0.2),则o1的总奖励变为。
现在考虑输出o2,它正确地解决了问题并且用英语给出了理由:
此输出因正确答案而获得完美准确度奖励1。假设其推理也是100%英语,它还会获得语言一致性奖励1。使用与之前相同的权重,o2的总奖励为
请注意,只要保持语言一致性,语言一致性奖励就会略微提高正确答案的总奖励,甚至会为错误答案o1提供小幅正奖励。
这个RL训练循环遵循我们之前看到的相同的DeepSeekR1Zero训练循环:
生成多个输出。
完善奖励,包括语言一致性。
使用GRPO进行优势估计。
训练模型以支持高优势输出。
重复该过程!
对于推理数据,DeepSeek团队希望获得绝对最佳的示例来进一步训练模型。为此,他们使用了一种称为拒绝抽样的技术。
为了完善推理数据,DeepSeek使用了拒绝抽样。对于“Whatis2+3
4?”,他们会从上一阶段的模型中生成许多输出。想象一下得到20(错误)和14…(正确,推理)这样的输出。
然后,他们会评估每个输出的正确性(答案“14”)和推理的可读性。只有正确且推理充分的最佳输出才会被保留,而其他输出则会被拒绝。
对于复杂推理,使用生成奖励模型来判断推理质量。严格的过滤器会删除混合语言、杂乱无章的推理或不相关的代码。此过程会产生约600k个高质量推理样本。
除了细化的推理数据外,他们还添加了用于通用技能的非推理数据(约20万个样本):写作、问答、翻译等,有时还使用思路链来完成复杂的任务。
最后,SFT第2阶段使用下一个token预测在组合数据集(细化推理+非推理)上训练上一个模型checkpoint。此阶段使用来自拒绝采样的顶级示例进一步改进推理,并将模型推广到更广泛的任务,同时保持用户友好性。
这就是拒绝抽样,拒绝低于标准的样本,只保留最好的样本,以生成高质量的训练数据
在SFT第2阶段之后,我们已经让DeepSeekV3能够推理、一致地说话,甚至可以很好地处理一般任务!但为了真正使其成为顶级的AI助手,我们进行了研究,使其与人类价值观保持一致。这就是强化学习适用于所有场景(RL第2阶段)的使命!将其视为使DeepSeekR1真正安全的最后润色。
对于我们的例子“Whatis2+3*4?”虽然准确性奖励仍然强化正确答案,但奖励系统现在还会考虑:
有用性,评估摘要(如果生成)是否除了答案之外还提供了有用的背景信息。
无害性,检查整个输出内容是否安全且无偏见。这些通常由根据人类偏好训练的单独奖励模型进行评估。最终的奖励信号成为准确性、有用性和无害性分数的加权组合。
现在,训练数据包括
多样化组合,包括推理问题
常规QA提示
写作任务
以及偏好对,其中人类指出两个模型输出中哪一个在有用性和无害性方面更好。
训练过程遵循迭代RL循环(可能使用GRPO),根据来自这些多样化数据的组合奖励信号来优化模型。
经过多次迭代训练,模型会不断完善,在推理性能和对齐(有用性/无害性)之间取得良好的平衡。一旦达到这种平衡,该模型就会在流行的基准数据集上进行评估,并超越其他模型的性能。
他们的最终检查点,高度优化的版本被命名为DeepSeek-R1
在DeepSeek团队能够创建性能良好的DeepSeekR1之后,他们进一步将更大的模型蒸馏成更小的模型,以便为社区提供性能更高的模型,蒸馏过程的工作方式如下:
数据准备:收集800k个推理样本。
DeepSeek-R1输出:对于每个样本,来自教师模型(DeepSeek-R1)的输出用作学生模型的目标。
监督微调(SFT):学生模型(例如,Qwen-1.5B、Llama-14B)在这800k个样本上进行微调,以匹配DeepSeek-R1输出。
蒸馏模型:学生模型现在被蒸馏成更小的版本,但保留了DeepSeek-R1的大部分推理能力。
结果:获得更小、更快、具有良好推理能力的模型,随时可以部署。
[1]DeepSeek-V3:https ://github.com/deepseek-ai/DeepSeek-V3
长按👇关注-数据STUDIO-设为星标,干货速递


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录