如果喜欢我的文章,可以关注 ➕ 点赞,与我一同成长
微信:hancao97,一起学习交流,成为更优秀的攻城狮~
开篇
大家好,我是寒草🌿,浮云一别后,宛若流水十年间,而整个社会也已沧海桑田,这次(创作方面)新的开始我也希望为大家提供一些不同往日的内容。
从头开始的第一篇文章,我将以「模型的训练过程」为开篇:毕竟 AI 在我神隐的这段时间疯狂发展,而以此问题开始便很自然。
所以我将尽力以通俗的文字 + 个人的浅薄认知为大家带来一场"不虚此行"的分享。也希望针对存有疑问或内容不实之处,大家可以与我互动交流,寒草定不胜荣幸。
LLM 训练的关键词
当我们开始了解模型是如何训练的,总会听到以下关键词:
- Pretarin 预训练
- SFT(Supervised Fine-Tuning) 监督微调
- Reward model 奖励模型
- PPO(Proximal Policy Optimization) 近端策略优化
以上是 GPT 相关的, 而 LLaMA 模型相关的则包含更多步骤:
- Pretarin 预训练
- Reward model 奖励模型
- Rejection Sampling 拒绝采样
- SFT(Supervised Fine-Tuning) 监督微调
- DPO(Direct Preference Optimization) 直接偏好优化
虽然我们可能暂时不清楚以上的词汇是干嘛的,但暂且以上述关键字为提纲,开启本次旅程。
GPT
Pretrain
预训练是 LLM 训练的第一阶段,其核心目标是让模型学习语言模式,语法,语义关系以及世界知识。
就像我们人类从呱呱坠地起,也要逐渐开始接纳学习这个世界,掌握这个世界的语言。
这个过程将使用非常大量的训练数据集,并耗费相当长的时间:
- 数据量是万亿(trillion)级的 token
- 数据主要来自开放互联网、书籍、代码库等,经过严格的清理和筛选,以确保质量
而 Llama 3 模型在预训练阶段使用了大约 15 万亿个 tokens 的数据集。虽然训练数据集规模在过去经历了快速增长,但未来这种增长可能受到数据资源有限性和边际效益递减的影响。因此,业界未来可能会更加关注数据质量而非数据体量。
于是我们会不由得想到这样一个问题:这么多的数据量要用来干什么呢?
当我们先看下面这个例子,当我们输入一串文字时,我们总会有他的一些候选词):
但是:
- 为什么"破"之后"心"的概率更高呢?
- 为什么"破心"之后"中"的概率更高呢?
- ...
这便依托于我们上面提到的基于大量数据的训练了,比如我们的训练数据中有这样的句子:
"阳明先生有句著名而有深意的话:破山中贼易,破心中贼难。意思是..."
首先,我们希望模型可以利用到这些数据,于是会定义一个概念,叫做:"段落联合概率",含义为模型生成整个段落的概率。
假设给定一个段落由词序列 w1,w2,...,wn 组成,模型计算该段落的联合概率为:
javascript
P(w1,w2,...,wn)=P(w1)×P(w2∣w1)×P(w3∣w1,w2)×...×P(wn∣w1,w2,...,wn−1)
上面的公式的白话解读为:
javascript
生成一句话的概率 = 生成这句话的前(length - 1)个字的概率 * 生成这句话最后一个字的概率
像不像大学/高中学概率论里面各种:红球,白球,蓝球丢在一个盒子里,我们依次按顺序取出红蓝白球的概率。
所以:
javascript
P(破心中贼难) = P(破) * P(心|破) * P(中|破心) * P(贼|破心中) * P(难|破心中贼)
而那些段落就是基于上面所提到的巨大数据集进行切分而来的,而切分规则可能包含:
- 基于 token 数切分
- 基于标点符号切分
- 基于内容感知切分
假设以 2000 token为一组进行切分,那么以上述 Llama3 的 15T token 的数据量,且一个汉字占有 2 token 做计算,将有 37.5 亿个段落。而这些段落将作为 Pretrain 阶段的养料,供养 LLM 完成第一阶段的成长。整个预训练的过程,也就是学会如何使用"段落"的过程。
这种方法使模型能够捕捉语言的统计特性和上下文关系,从而生成连贯且符合语法的段落。
可以简单看看这个图,为了让数亿个段落联合概率都达到满意的结果,这个训练过程将经历千万次的迭代:
而整个迭代过程将消耗多少算力呢:
- Llama2 65B 参数,1.4万亿量级数据集,用了 2048 个 A100 GPU,训练了 21 天
- Llama3 405B 参数,15万亿量级数据集,用了 16384 个 H100 GPU,训练了 54 天
那这个 Pretrain 阶段结束后,我们将得到一个具备如下特征的模型:
- ✅ 非常熟悉人类语言的模型
- ✅ 阅读了大量的人类文献
- ✅ 猜测下一个字的能力与人类近似
- ❌ 但是,和真正做任务仍有距离
他成为了一个接话茬大王
那么如何让 LLM 可以更加智慧呢,那就要继续阅读下文的 SFT 环节。
SFT
SFT 全称为 Supervised Fine-Tuning (有监督的微调),在这个过程中会使用大量的标注数据。
标注数据(Annotated Data)是指在原始数据的基础上,附加了(人工/自动生成的)标签或注释信息。这些标签通常用于指示数据的某些特征或类别,以便模型在训练过程中学习到输入数据与这些特征或类别之间的关联。
举一些通俗的案例:
- "《剑来》真是一个热血又充满内涵的好作品" 是一个「正面」的评价
- "动画片都是给小孩看的" 是一个「负面」的评价
- "逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。"是「苏轼」的作品
- "我喜欢吃锅包肉" 和 "锅包肉很好吃" 是「相似」的含义
使用标注数据进行训练,这个过程叫做监督训练(Supervised),反之,使用无标注信息的数据进行训练,就是无监督学习(Unsupervised)。同时,这个标注,我们也可以理解其为「作业的参考答案」
同时也会有「自监督/自回归」(Self-supervised) 和「半监督」(Semi-supervised)两个概念:
- 「自监督」:无需人工标注数据,通过从数据本身中构造"伪标签"来进行训练。上面的 Pretrain 阶段中输入和输出不断变化,而其上次的输出组合前面的信息后又能作为下次训练的输入,所以该阶段也是自监督训练。
- 「半监督」:标注数据和未标注数据共同作用下进行训练。Pretrain + SFT 两个阶段组合起来就可以称作半监督。
SFT 阶段使用的数据量可能只有几十万条,大约是 Pretrain 阶段数据量的 1/10000 - 1/5000 💡
下图是 Instruct GPT 论文中的截取,可以以此案例对 SFT 进行阐释:
- "Explain the moon landing to a 6 year old" 是问题的案例(模型的 prompt)
- 专业人员对上述问题进行回答,诸如:"Some people went to the moon"
- 上述的回答将作为标注(正确答案),用于对模型进行微调(fine-tuning)
InstructGPT 是 OpenAI 在 GPT-3 基础上提出的一种可遵循指令 (Instruction-Following)的大型语言模型,主要目的是让模型的输出更贴近人类意图 。它通过在预训练模型的基础上,结合人工标注 和强化学习等方法进行微调,使模型在回答问题时更加准确、有用并符合伦理规范。
基于标注数据进行训练后,大模型不仅学会了接话茬,也同时学会了做一些任务,但是和优秀的完成任务仍有距离,那么接下来的成长就要交给 Reward Model 了。
Reward Model
Reward Model(奖励模型)是一个单独的模型,用于对生成的文本进行评估,以指导强化学习阶段,使模型的输出更符合人类期望。 在强化学习(RLHF, Reinforcement Learning from Human Feedback)中扮演重要角色。
评估是一件很困难的事情,因为人类是复杂多变的,我们很难标准的定义好坏。
在训练 Reword Model 的过程中:
- 首先需要准备一系列(几万乃至几十万条)的 prompt,并让前面的 SFT 模型给每一个 prompt 生成多个回答。
- 随后进行训练数据的收集:让人类标注员对不同的文本进行排名,比如"回答 A > 回答 B > 回答 C" 【大家对 2 美元时薪的肯尼亚标注工有没有印象~】
- 消费上面的(排序)输出,用于训练 Reword Model
具体过程亦如下图:
我们现在分析这之中的 D > C > A = B,这之中其实有六条数据:
- D > C
- D > A
- D > B
- C > A
- C > B
- A = B
而 Llama 模型中又引入了新的模式 The Llama 3 Herd of Models:
翻译一下:
我们在每轮标注后部署多个模型,并为每个用户提示采样来自两个不同模型的两个响应。这些模型可以使用不同的数据混合和对齐策略进行训练(例如,提高代码能力),以增加数据多样性。
我们要求标注员根据他们对所选响应相较于被拒绝响应的偏好程度,将其分为四个等级: 显著更好(significantly better)、更好(better)、稍好(slightly better)或略好(marginally better) 。
此外,我们在偏好排名之后引入编辑步骤,以鼓励标注员进一步改进优选响应。标注员可以直接编辑所选的响应,或提示模型根据反馈优化其自身的响应。因此,我们的一部分偏好数据包含三个层次的排名: 已编辑(edited)> 选中(chosen)> 被拒绝(rejected) 。
其中的差异包含:
- 数据的来源更加多元
- 通过引入【偏好程度】的概念使得对响应的比较更加复杂
- 允许通过二次编辑得到更加优秀的答案,并以此分级:已编辑,选中的,被拒绝的
而上述【偏好数据】便应用于 Llama 的 reward model 的训练。
总结一下 📖,当前步骤的目标是通过大量 LLM 的 prompt-response pair 结合人工标注数据,训练出一个 Reward Model 奖励模型, 该模型可以对 LLM 的 prompt-response pair 进行打分,后续用于 LLM 的进一步强化。
PPO
在 PPO 之前,先介绍一个概念,叫做 Decision Making 决策制定,指在多个可选方案中选择最佳行动的过程,受到以下五个主要因素的影响(from chatgpt):
- Alternatives(备选方案) :
- 任何决策通常都涉及多个可选方案,决策者需要在不同选项之间权衡,选择最合适的方案。
- Uncertainty(不确定性) :
- 许多决策是在信息不完全或未来不确定的情况下做出的,决策者需要在有限的信息下评估风险并进行判断。
- High-risk consequences(高风险后果) :
- 某些决策可能带来重大后果,尤其是涉及财务、健康或安全的问题,因此高风险决策需要更加谨慎。
- Interpersonal issues(人际问题) :
- 许多决策不仅涉及个人,还会影响团队或组织,因此需要考虑人际关系、沟通和协调因素。
- Complexity(复杂性) :
- 有些决策涉及多层次、多变量的问题,需要更深入的分析和评估,例如商业战略决策或人工智能系统的优化。
而 PPO 近端策略优化是一种是强化学习算法,常用于优化大型语言模型(LLM)的决策(decision making)能力,通过调整模型的策略,使其逐步靠近最优策略,同时通过 策略裁剪(clipping) 等机制避免策略更新过大导致的不稳定性,确保优化稳定高效。其应用请见下图:
图片描述了 PPO(Proximal Policy Optimization, 近端策略优化) 在大模型训练中的应用。这个流程主要用用于优化语言模型的输出,使其更加符合人类偏好, 有以下步骤:
- 采样一个新提示(prompt)
- 例如"Write a story about frogs"(写一个关于青蛙的故事)。
- 这个 prompt 来自于一个 预先构建的数据集
- 策略(Policy)生成输出
- 使用当前的语言模型(policy),基于输入 prompt 生成一个文本输出,例如 "Once upon a time..." 。
- 这个策略的参数是通过 PPO 进行优化 的,这是个循环多次迭代的过程。
- 奖励模型(Reward Model, RM)为输出进行打分:rk
- 当然 Reward Model 也会有一天不再胜任,也需要进行不断升级
- 使用 PPO 进行语言模型(policy)更新
- 计算得到的奖励(分数) rk 会反馈给 **PPO **,用于优化策略,使未来的生成结果获得更高的奖励。
注: 在 强化学习训练阶段 时,模型的输出是基于策略 π(a∣s) 进行决策,所以在上文中将其称为 policy
至此,已经简要讲述了 GPT 训练的关键四个步骤,接下来继续看看 Llama 是怎么追赶的。
LLaMA
下图来自The Llama 3 Herd of Models:
图中的的灰色节点代表数据,蓝色节点代表模型
这张图描述了 Llama3 的 后训练(Post-Training)流程 ,在预训练(Pretraining)完成后,如何通过 监督微调(SFT) 、奖励模型(Reward Model, RM)训练 以及 直接偏好优化(DPO) 来优化 Llama 3,使其更符合人类偏好。
Llama 3 训练流程
第一步:数据收集与生成
- Collected Prompts(收集提示词)
- 首先,研究人员收集了一个高质量的 prompt(提示词) 数据集,这些 prompts 覆盖了广泛的任务,如对话、代码生成、数学推理等。
- K Generations per Prompt(每个 prompt 生成 K 个回答)
- Llama 3 会针对每个 prompt 生成 K 个不同的回答,这些回答会用于后续的质量筛选。
第二步:奖励模型训练(Reward Model Training)
- Pairwise Annotated and Specialized Per-Capability Binary Preference Data(成对标注的能力偏好数据)
- "Pairwise Annotated" 成对标注,指的是对比两个回答,选择更好的一个
- "Per-Capability" 代表针对不同能力(如数学、编程、常识推理等)分别构造数据集,以训练出更加细粒度的能力控制。
- "Preference Data" 偏好数据,这个在上文(Reward Model章节)中有过提及
- Reward Model(奖励模型)
- 通过上文的【偏好数据】训练出了 奖励模型(RM) ,用于评估生成的回答质量,并为 Llama 3 生成的文本打分,决定哪些回答更符合人类偏好。
- Rejection Sampling(拒绝采样)
- 通过 Reward Model 打分 ,从 K 个生成的回答中筛选出最优的部分,用于后续的 SFT 训练。这可以让模型避免学习质量较低的样本。
第三步:监督微调(Supervised Fine-Tuning, SFT)
- SFT Data(监督微调数据)
- 经过奖励模型筛选出的高质量回答,将被用于 监督微调(Supervised Fine-Tuning, SFT) 。
- 此外,还会加入 专门针对不同能力(Per-Capability)的 SFT 数据,确保模型在各个维度上都有较强的表现。
- SFT Model(监督微调模型)
- 以高质量的 SFT 数据训练 Llama 3,使其具备更好的理解能力、生成能力和可控性。
- 这个 SFT 训练的模型会作为下一步 DPO 训练的基础。
第四步:直接偏好优化(Direct Preference Optimization, DPO)
- DPO Training(DPO 训练)
- 监督微调虽然能提升模型质量,但仍然存在一些输出偏差,因此需要进一步优化。于是设计并采用了 Direct Preference Optimization(直接偏好优化, DPO) 方法:
- DPO 是 GPT 结合 RM + PPO 进行强化学习的替代方案,通过使用损失函数 直接在语言模型的概率分布上进行优化,使得偏好更高的回答比偏好低的回答更可能被生成,从而避免了 RLHF 中策略梯度等复杂优化过程。
DPO 的思路可以简要的理解为:通过 Reward Model 和 Rejection Sampling(拒绝采样)我们可以获得到更好的回答 y+ 和 较差的回答 y− ,而我们期望通过优化模型参数,使 LLM 更倾向于生成优选答案。
- Final DPO Model(最终 DPO 模型)
- 经过 DPO 训练后,我们得到 最终优化过的 Llama 3 模型 ,该模型不仅能保持 SFT 训练的基础能力,还能更符合人类偏好,我们并以此作为 Best models from previous rounds(上一轮的最佳模型) 进入下一次的循环,直至我们对模型的输出结果满意。
结束语
至此本篇文章的内容已经告一段落了,虽然大致阐述了大致流程,但是还是并未深入细节,需要后续进行分享。
以及如有存在错误想要指正或有想要共同探讨的话题也请与我沟通交流, 不胜感激。
无人扶我青云志,我自踏雪至山巅。
若是命中无此运,亦可孤身登昆仑。
红尘赠我三尺剑,酒看瘦马一世街。
世人朝路乃绝涧,独见众生止步前。
海到尽头天作岸,山登绝顶我为峰。
如若东山能再起,大鹏展翅九万里。
一入红尘梦易真,一朝悟透心境名。
一朝悟道见真我,昔日枷锁皆云烟。
天门将至百运开,拂尘轻笑问仙来。
好久不写文章,有些许手生了,再会~
------HANCAO PRESENT------