专栏名称: 架构师
架构师云集,三高架构(高可用、高性能、高稳定)、大数据、机器学习、Java架构、系统架构、大规模分布式架构、人工智能等的架构讨论交流,以及结合互联网技术的架构调整,大规模架构实战分享。欢迎有想法、乐于分享的架构师交流学习。
51好读  ›  专栏  ›  架构师

如何从零训练一个LLM:尝试基于0.5B小模型复现DeepSeek-R1的思维链

架构师  · 公众号  ·  · 2025-03-16 22:28

正文

架构师(JiaGouX)
我们都是架构师!
架构未来,你来不来?






1. 前言

本文主要是以两个目的出发:

  • • 第一个是简单地介绍下LLM训练的一个完整流程,侧重点在于帮助认识这个过程,而不是严谨地对每一个剖析细节,因此基本没有公式推导,但一些必要的符号是避免不了的;
  • • 第二个是尝试使用小模型(0.5B)来复现DeepSeek-R1的思维链模式,仅仅是一个demo级别的实践。

(本人水平有限,如若发现有不对的,欢迎交流探讨)


2. 如何从零训练一个LLM

最简单的语言来描述一个LLM的工作(推理)机制:

1.将一段输入文本映射为对应的tokens,然后给到transformer模型,预测下一个token的概率分布,选择概率最高的token(当然,也会有采样topK个概率最高的tokens);

2.本次选择的token + 输入文本的tokens + 之前预测输出的tokens,拼接起来,继续给到transformer模型,预测下一个token的概率分布;

3.重复第2步,直到模型输出代表结束的token;

4.最后,将输出的全部tokens映射回对应的自然语言文本。

2.1 预训练阶段

预训练可以类比一下以前BERT时代【预训练-微调】中预训练的方法,会使用互联网爬取的文本数据,比如wiki、百度百科,这一步是为了让模型获得next token prediction的能力,即 能够基于已知的上文输出未知的下文,预训练得到模型是具备续写的能力 ,比如:

输入
输出
杭州西湖位于
中国浙江省杭州市西湖区龙井路1号,汇水面积为21.22平方千米,湖面面积为6.38平方千米,总面积约60平方千米,为自然与人文景观。

但是呢,一般的提问方式或者说对话方式应该是:

问题
回答
杭州西湖位于什么地方
中国浙江省杭州市西湖区龙井路1号,汇水面积为21.22平方千米,湖面面积为6.38平方千米,总面积约60平方千米,为自然与人文景观。

为什么会产生这种差异呢?

  • • 由于预训练的语料大部分来自于网页,许多都是段落形式的长篇文本,然后按照一定规则进行切分。
  • • 给模型输入前面一段文本,让模型去学习next token prediction的任务,即预测下一段文本,这就导致模型的输出是偏向于续写的
  • • 这便导致了 不符合人类的对话习惯 ,因此产生后续一系列的post-train(后训练)工作。

2.2 Post-Training(后训练)

后训练的步骤一般会涉及以下三个步骤:

  • • 标注数据,进行监督微调学习(SFT,Supervised Fine-Tuning),这也是常常提到的指令微调
  • • 标注对比数据(comparison data),训练一个奖励模型,可以判断模型输出的质量
  • • 通过奖励模型来进行强化学习,进一步提升模型的能力
Post-Training(后训练)
Post-Training(后训练)

2.3 指令微调(SFT)

Supervised Fine-Tuning (SFT)
Supervised Fine-Tuning (SFT)

这一步需要收集 高质量的数据样本,什么样的数据就会让最终的模型呈现出什么样的行为 ,正如上一步所说的,预训练模型是输出是不符合人类对话习惯,而这一步就需要 收集高质量的对话数据,来让模型学习到这种能力

对于先驱者OpenAI来说,无疑是需要巨大的人力成本来收集和标注这些数据的。而对于后来者,我们一方面可以人工标注数据,但更多的往往是从市场上选择某一个或几个强大的模型(比如GPT、DeepSeek) 去蒸馏数据

  • • 设计一个prompt,让LLM生成问题的同时,又附带着回答;
  • • 或者自己有着垂直领域的百科知识,就可以设计Prompt去让LLM生成对应的提问,还可以让LLM对知识数据进行润色和丰富;
  • • 这样我们就可以得到这种一问一答的训练样本来进行监督微调了。
    (当然实际情况往往复杂得多)

总的来说,这一步就是收集对应的数据,然后 加载上一步的预训练模型作为起点,进行监督微调(SFT),让模型学会相应的能力,实现指令对齐

比如现在最为普遍的Chat模型,便是收集符合人类对话习惯的问题(prompt)- 答案(output)。
但是,其实这里的prompt和output可以套到其他的实践场景中,比如意图识别等,prompt对应表达意图行为的描述,output对应预测的意图和提取的参数

2.4 奖励模型(Reward Model,RM)

Reward Modeling (RM)
Reward Modeling (RM)

这一步的目标是 使用上一步的SFT模型作为初始化(最后增加一层分类器),训练一个奖励模型,能够为一条样本进行打分,以此来区分好样本和坏样本。比如下面的例子,chosen明显比rejected的回答更恰当,模型对chosen的打分应该更高

{
    "prompt": "你是谁",
    "chosen": "您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-V3。如您有任何任何问题,我会尽我所能为您提供帮助。",
    "rejected": "有什么可以帮您的?"
}

RM的训练流程大致如下:

  • 给定一个prompt,人工对LLM的多个输出进行比较,标注哪个输出是更符合人类偏好的(更合理)
  • • 或者可以参考数据蒸馏的做法来构造数据,让LLM同时输出好的回答和坏的回答
  • • 有了不同质量的回答数据后,需要 标注好坏对比顺序 ,比如上面例子,标记chosen和rejected的输出,只需要知道chosen>rejected即可
  • • 然后 去训练一个分类Reward Model,训练目标是拉开好样本和坏样本的分数差距,训练好的Reward Model可以为每一条预测对应的分数(结束token的logit)

下面是Reward Model训练样本的一个通用格式:

(chosen和rejected是对于同一个Prompt的不同回答)

奖励模型一方面对于后续的强化学习起着关键作用,一方面在迭代训练也是至关重要。比如,下图为Llama3的训练迭代流程:

1.加载上一步的 SFT模型作为Reward Model的初始化

2.按照上述的思路,不断收集大量的偏好数据pair,训练出一个Reward Model

3.收集一批 ,使用本轮最好的模型,做K次采样生成,这样每个Prompt就得到了K条

4.通过Reward Model对每一个Prompt的采样生成 进行打分,然后筛选出分数最高的top-N个样本,这便是常常提到的 拒绝采样

5.使用留下的top-N的样本作为SFT的训练样本,再加上部分关于特定能力的指令微调数据,训练出一个SFT模型

6.接着,再进入强化学习(DPO)的训练,最后的模型便是本轮最好的模型

7.重复步骤2-6,不断对模型进行迭代优化

Llama3后训练流程
Llama3后训练流程

2.5 强化学习

强化学习流程
强化学习流程

在经过上述的步骤训练出一个SFT模型,最后一般都会在使用强化学习,让模型的能力更上一层楼。今天简单介绍下几种常用的强化学习方法。

在此先引入强化学习中涉及的几种模型的概念:

  • Policy Model(Actor Model) :根据输入文本,预测下一个token的概率分布,输出下一个token也即Policy模型的“动作”。该模型需要训练,是我们 最终得到的模型 ,并由上一步的SFT初始化而来。
  • Value Model(Critic Model) :用于预估当前模型回复的每一个token的收益。接着,还会进一步计算累积收益,累加每一个token的收益时不仅局限于当前token的质量,还需要衡量当前token对后续tokens生成的影响。这个累积收益一般是称为优势,用于衡量当前动作的好坏,也即模型本次回复的好坏,计算的方法一般使用GAE(广义优势估计,generalized advantage estimation))该模型同样需要训练。
  • Reward Model :正如上述章节[2.4 奖励模型]介绍,对Policy Model的输出整体进行打分,评估模型对于当前输出的 即时收益 。该模型训练过程不进行更新。
  • Reference Model :与 Policy Model是一样的模型,但在训练过程中不进行更新。其作用主要是与Policy Model计算 KL散度 (可以理解为两者的预测token概率分布差距)来作为约束,防止Policy Model在更新过程中出现过大偏差,即每一次参数更新不要与Reference Model相差过于大。

2.5.1 DPO(Direct Preference Optimization)

DPO是一种成本比较低的强化学习方法, 它不需要显式的Reward Model,只需要Policy Model和Reference Model

  • • 训练数据是与上述奖励模型一样的 偏好对数据
  • • Policy Model的目标是 尽量拉开chosen(preferred)样本与rejected(dispreferred)样本的token概率差距
  • • 但是,同时Policy Model的概率差距与 Reference Model 的概率差距不要太过于大,避免训练不稳定

具体的DPO loss公式如下:

DPO Loss
DPO Loss

为什么说是不需要显式的Reward Model,因为Policy Model在DPO中,其实也是充当了Reward Model的角色, 概率差可以认为是对应的应得奖励收益

2.5.2 PPO(Proximal Policy Optimization)

PPO训练流程图
PPO训练流程图

PPO(近端策略优化)比较复杂,尽量减少非必要的公式,用简单的描述来说明整个流程(以一个批次的数据训练为例):

1.在当前状态 下,也即未更新前的Policy Model 和Value Model ,对一个样本的 ,使用Policy Model(Actor Model)进行一次 采样生成 ,也即一次“ 动作 ”;

2.用Reward Model计算 的分数,以及计算Reference Model与Policy Model的KL散度,这两个结合起来作为 即时奖励

3.接着,用Value Model(Critic Model)来 计算每一个token的收益 ,记为

4.然后,如上述,计算本次 采样生成的优势(累积收益) ,即每一个token的奖励计算不仅考虑当前token的分数,还有考虑对后续tokens分数的影响,再结合上第2步的即时奖励,便是本次动作(采样)的优势 A ;

到这里,一次采样就得到本轮ppo训练的参考奖励 。下面会使用这些来进行k次迭代更新,即一次采样能够进行 k次的模型更新 ,每一次模型的更新步骤如下:

  1. 5. Policy Model对q进行一次新的生成 ,然后计算与 相比的 更新比例

  2. 6. 当 时,则表示本次参考的采样 是正收益的(质量比较好),因此尽量去提升 ;反之 时,则尽量去降低

7.为了避免训练不稳定,出现过大偏差,都会对 进行 裁剪 (Clip),上下限都控制在一个合理的范围内(与梯度裁剪类似):

  1. 8. 接着,Value Model也会对新的生成






请到「今天看啥」查看全文