本文主要是以两个目的出发:
-
• 第一个是简单地介绍下LLM训练的一个完整流程,侧重点在于帮助认识这个过程,而不是严谨地对每一个剖析细节,因此基本没有公式推导,但一些必要的符号是避免不了的;
-
• 第二个是尝试使用小模型(0.5B)来复现DeepSeek-R1的思维链模式,仅仅是一个demo级别的实践。
(本人水平有限,如若发现有不对的,欢迎交流探讨)
最简单的语言来描述一个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(后训练)
2.3 指令微调(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)
这一步的目标是
使用上一步的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后训练流程
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
为什么说是不需要显式的Reward Model,因为Policy Model在DPO中,其实也是充当了Reward Model的角色,
概率差可以认为是对应的应得奖励收益
。
2.5.2 PPO(Proximal Policy Optimization)
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次的模型更新
,每一次模型的更新步骤如下:
-
5. Policy Model对q进行一次新的生成
,然后计算与
相比的
更新比例
:
-
-
6. 当
时,则表示本次参考的采样
是正收益的(质量比较好),因此尽量去提升
;反之
时,则尽量去降低
7.为了避免训练不稳定,出现过大偏差,都会对
进行
裁剪
(Clip),上下限都控制在一个合理的范围内(与梯度裁剪类似):
-