
DeepSeek-R1是如何训练出来的?
此前,我们介绍了《DeepSeek R1 技术简要总结》,主要结合 DeepSeek R1 的技术报告来梳理了其中的大致流程,没有关注细节。现在我们来着重关注 R1 的训练细节,来看看 R1 究竟是如何一步一步训练出来的。
文章目录
此前,我们介绍了《DeepSeek R1 技术简要总结》,主要结合 DeepSeek R1 的技术报告来梳理了其中的大致流程,没有关注细节。现在我们来着重关注 R1 的训练细节,来看看 R1 究竟是如何一步一步训练出来的。
1. 前言
1.1 OpenAI o1
2024 年 9 月,OpenAI 发布了其 o1 模型,该模型经过大规模强化学习训练,使其具有“高级推理”能力,但并未从未公开分享。DeepSeek 复制了这种推理行为,并公布了他们方法的全部技术细节。
OpenAI 的 o1 模型标志着训练大型语言模型 (LLM) 的新范式。它引入了所谓的 "think"
token,模型在 "think"
token 内来思考问题。
这个 "think"
token 界定了模型的思路链 (CoT) 推理。明确划分了模型“思考”的起点和终点,并展示生成了模型是如何“思考”问题。
o1 的结论之一是,随着测试时间计算的增加,性能得到了提高,即模型生成的 token 越多,其响应就越好,如下图的 OpenAI 报告:
在上图中,y 轴表示模型在 AIME(数学问题)上的表现,而 x 轴表示计算时间。
- 左图展示了 LLM 的著名缩放定律(scaling law),模型 训练的时间(训练计算时间)越长,其性能就越好。
- 右图展示了,模型生成的 token 越多(测试计算时间), 其性能就越好。
1.2 DeepSeek R1
2025 年 1 月,DeepSeek 发表了论文: “DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning” 。这篇论文似乎揭开了 o1 背后的秘密。
它引入了两个模型:
(1)DeepSeek-R1-Zero。专门基于强化学习(RL)进行训练;
(2)DeepSeek-R1。监督微调(SFT)和 RL 的混合训练。
下面主要介绍 DeepSeek-R1 相关的内容。
2.DeepSeek-R1-Zero(仅RL训练)
强化学习 (RL) 是一种机器学习方法,其中模型不是通过明确的示例来训练模型,而是通过反复试验来学习。它的工作原理是将奖励信号传递给与模型参数没有明确函数关系的模型。
DeepSeek-R1-Zero 我们关注三个关键细节:提示模板(prompt template)、奖励反馈以及 GRPO 算法(组相对策略优化)。
2.1 提示模板(prompt template)
用于训练的模板如下所示,其中{prompt}
可能替换成复杂数学、编码和逻辑推理等数据集的问题。注意<answer>
和 <think>
:
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:
这里最关注的是极简的提示策略。这是 DeepSeek 有意为之,以避免模型响应出现偏差 ,并观察其在强化学习过程中的自然演变。
2.2 奖励反馈
RL 奖励由两个组成部分:准确度奖励、格式奖励。
(1)准确度奖励。由于训练数据集由具有明确正确答案的问题组成,因此使用简单的基于规则的策略来评估响应准确度。
(2)格式奖励。使用基于规则的格式奖励来确保在思考标签之间生成推理标记。比如推理内容必须在 <think>
和 </think>
之间。
2.3 GRPO(组相对策略优化)
最后是如何将奖励转化为模型参数更新,DeepSeek 提出一种 GRPO 算法。
GRPO 结合了一系列响应来更新模型参数。为了保证训练稳定,还将裁剪和 KL 散度正则化项纳入损失函数。裁剪确保优化步骤不会太大,正则化确保模型预测不会发生太大变化。
这是 GRPO 完整的损失函数:
图中内容如下:
J
GRPO
(
θ
)
=
[
1
G
∑
i
=
1
G
min
(
π
θ
(
o
i
∣
q
)
π
θ
old
(
o
i
∣
q
)
A
i
,
clip
(
π
θ
(
o
i
∣
q
)
π
θ
old
(
o
i
∣
q
)
,
1
−
ϵ
,
1
+
ϵ
)
A
i
)
−
β
D
KL
(
π
θ
∣
∣
π
ref
)
]
J_{\text{GRPO}}(\theta) = \left[ \frac{1}{G} \sum_{i=1}^{G} \min \left( \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{\text{old}}}(o_i|q)} A_i, \text{clip} \left( \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{\text{old}}}(o_i|q)}, 1-\epsilon, 1+\epsilon \right) A_i \right) - \beta D_{\text{KL}} \left( \pi_\theta || \pi_{\text{ref}} \right) \right]
JGRPO(θ)=[G1i=1∑Gmin(πθold(oi∣q)πθ(oi∣q)Ai,clip(πθold(oi∣q)πθ(oi∣q),1−ϵ,1+ϵ)Ai)−βDKL(πθ∣∣πref)]
其中解释如下:
- 概率比率的裁剪:如果概率比率偏离1太多(即小于 1 − ϵ 1-\epsilon 1−ϵ 或大于 1 + ϵ 1+\epsilon 1+ϵ),则将其裁剪到 [ 1 − ϵ , 1 + ϵ ] [1-\epsilon, 1+\epsilon] [1−ϵ,1+ϵ] 范围内。这有助于防止更新时出现过大的梯度变化。
- 正则化项:使用 KL 散度作为正则化项,确保新策略 π θ \pi_\theta πθ 不会与参考策略 π ref \pi_{\text{ref}} πref 相差太大。其中 β \beta β 是该正则化项的权重。
- G G G:一组样本的数量。
- ϵ \epsilon ϵ:一个小的正数,通常小于1。
- β \beta β:KL散度项的权重。
- q q q:输入查询或问题。
- o i o_i oi:第 i i i 个来自先前策略(即旧模型)的输出样本。
- A i A_i Ai:第 i i i 个输出样本的归一化奖励(在组级别)。
- π θ ( o i ∣ q ) \pi_\theta(o_i|q) πθ(oi∣q):当前模型在给定输入 q q q 时生成输出 o i o_i oi 的概率。
- π θ old ( o i ∣ q ) \pi_{\theta_{\text{old}}}(o_i|q) πθold(oi∣q):旧模型在给定输入 q q q 时生成输出 o i o_i oi 的概率。
- π θ ( o i ∣ q ) π θ old ( o i ∣ q ) \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{\text{old}}}(o_i|q)} πθold(oi∣q)πθ(oi∣q):新模型相对于旧模型生成 o i o_i oi 的似然性。当奖励 A i A_i Ai 较大时,我们希望这个值较大。
2.4 推理的结果
R1-Zero 最引人注目的结果是,它输出了我们认为的有效推理策略。
(1)训练时间越长,输出的思考内容越长
从图中可以看到,随着训练迭代的步数增加,输出思考的内容更长,即思考越久。
(2)类似人类的内心独白来反思过去的回答
R1-Zero 的回答可能会出现中间步骤反思此前回答是否出错的的环节,这种行为类似人类的思考。比如,我问以下问题:
牧场上有一片青草,牛每天吃草,草每天以均匀的速度生长,这片青草供给10头牛可吃20天,供给15头牛吃,可以吃10天,供给25头牛吃,可吃几天?
回答如下:
...
其实正确的方式应该是,每天草的生长量是5c,而牛每天吃掉25c,所以每天草的实际减少量是(25c -5c)=20c,即每天草减少20c。但是初始草量是G=100c,所以总天数应该是G/(每天净消耗量)=100c /20c=5天。不过这样算的话,答案就是5天?但让我再仔细检查一下。
或者,可能我的分析有误。正确的逻辑应该是,草每天生长r=5c,而牛每天吃25c,所以净消耗是每天吃掉25c,同时草生长5c,因此每天草的总量减少25c -5c=20c。而初始草量是100c,所以天数就是100c /20c=5天。那这样的话,答案就是5天?
...
在中间步骤会反思本次的分析内容,然后进行纠错。
2.5 R1-Zero 的问题
尽管 R1-Zero 的“思维过程”提供了一个人类可读的窗口,但学习到的 CoT 有时会出现可读性问题和语言混合问题,这可能表明它的推理开始偏离人类容易理解的东西。
3. DeepSeek-R1(SFT + RL)
为了缓解 R1-Zero 的可解释性问题,在 R1-Zero 的基础上探索了一种多步骤训练策略,该策略同时利用了监督微调 (SFT) 和 RL。该策略产生了 DeepSeek-R1,这是一种性能更好的模型,如今越来越受到关注。整个训练过程可以分为 4 个步骤。
3.1 步骤 1:使用推理数据进行 SFT
为了帮助模型在学习如何进行推理时走上正轨,R1 首先采用了 SFT(监督微调)。
这一方法利用了来自各种来源的数千个长链思维(CoT)示例,包括少量样例提示(即展示如何思考问题的示例)、直接提示模型使用反思和验证,以及从 R1-Zero中 提炼的合成数据。
这样做的两个主要优点:
- 向模型明确显示所需的响应格式;
- 精选的推理示例可以为模型提供更好的性能。
3.2 步骤 2:R1-Zero 风格 RL(+语言一致性奖励)
在 SFT 之后对模型应用 RL 训练步骤,与 R1-Zero 的实现方式相同,并且在奖励反馈中添加了一个语言一致性奖励,以持续激励语言输出保持一致。
之所以将语言一致性奖励添加到奖励中,是因为 R1-Zero 倾向于混合语言,这使得人类不容易阅读。
3.3 步骤 3:混合数据的 SFT
此时,该模型在推理任务上的表现可能已经与 R1-Zero 相当或更好。然而,这个中间模型并不太实用,因为它试图对任何输入(例如,“你好”)进行推理,而这对事实问答、翻译和创意写作来说是不必要的。因此,研究者进行了另一轮 SFT,使用了包含推理(60万示例)和非推理(20万示例)的数据。
这里的推理数据是由步骤 2 中生成的模型产生的。此外,还包括了一些样例,这些样例使用了一个大语言模型(LLM)评判器来将模型预测与真实答案进行比较。
非推理数据则来自两个来源:第一,用于训练 DeepSeek-V3(基础模型)的 SFT 数据集;第二,由 DeepSeek-V3 生成的合成数据。需要注意的是,其中包含了一些不使用链式思维(CoT)的样例,以确保模型不会在每次响应中都使用“思考标记”。
3.4 步骤 4:RL + RLHF
最后,再进行一轮强化学习,其中包括 R1-Zero 风格的推理训练(RL)以及基于人类反馈的强化学习(RLHF),而后者有助于提升模型的有用性和无害性。
整个流程的结果是 DeepSeek-R1,它在推理任务上表现出色,同时也是一个可以正常聊天的 AI 助手。
参考
[1] https://towardsdatascience.com/how-to-train-llms-to-think-o1-deepseek-r1/
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
欢迎关注知乎/CSDN:SmallerFL
也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤
更多推荐
所有评论(0)