本文全面介绍大型语言模型(LLMs)的构建流程,涵盖从架构选择到训练优化的关键步骤。文章首先探讨 LLMs 的模型架构,然后详细阐述数据准备过程,包括数据的收集、清洗和去重,接着是关于如何进行有效标记化的讨论。在模型构建方面,博客详细解释了采用自监督学习方法的预训练过程,以及对模型进行指令微调和对齐的重要性。
训练流程示意:

1. 主流的 LLM 架构
常见架构类型:最广泛使用的 LLM 架构包括仅编码器、仅解码器和编码器 - 解码器。
基础架构:大多数 LLM 架构都基于 Transformer 作为构建模块。
Transformer
开创性工作:Vaswani 等人提出 Transformer 框架,具有里程碑的意义,最初设计用于使用 GPU 进行有效的并行计算。
核心机制:Transformer 的核心是(自)注意力机制,相比递归和卷积机制,它能够更有效地利用 GPU 捕捉长期上下文信息。
Transformer 语言模型架构:最初为机器翻译提出的 Transformer 语言模型架构,包括一个编码器和一个解码器。编码器由 N=6 个相同的 Transformer 层堆叠组成。每层有两个子层:第一个是多头自注意力层,另一个是简单的逐位置全连接前馈网络。解码器由 6 个相同的层堆叠组成。除了编码器层中的两个子层外,解码器还有第三个子层,它对编码器堆栈的输出执行多头注意力。注意力函数可以描述为将查询和一组键值对映射到一个输出,其中查询、键、值和输出都是向量。输出计算为值的加权和,其中每个值的权重由查询与相应键的兼容性函数计算得出。与执行一个具有 dmodel 维键、值和查询的单一注意力函数不同,发现将查询、键和值 h 通过不同的学习线性投影分别映射到 dk、dk 和 dv 维是有益的。位置编码被加入以融合有关序列中标记的相对或绝对位置的信息。
仅编码器架构
注意力层特点:在这个家族的模型中,每个阶段的注意力层都能访问初始句子中的所有词语。
预训练方法:这些模型的预训练通常包括以某种方式破坏给定句子(例如,通过掩盖句子中随机的单词),然后让模型找出或重构初始句子。
适用任务:编码器模型非常适合需要理解整个序列的任务,如句子分类、命名实体识别和抽取式问答。
代表模型:一个突出的仅编码器模型是 BERT(Bidirectional Encoder Representations from Transformers)。
仅解码器架构
注意力层特点:对于这些模型,每个阶段的注意力层只能访问句子中该词之前的词语。这些模型有时也被称为自回归模型。
预训练方法:这些模型的预训练通常被构建为预测序列中的下一个词(或标记)。
适用任务:仅解码器模型最适合涉及文本生成的任务。GPT 模型是这一类别的突出例子。
编码器 - 解码器架构
架构特点:这些模型使用编码器和解码器,有时被称为序列到序列模型。在每个阶段,编码器的注意力层可以访问初始句子中的所有词语,而解码器的注意力层只访问输入中给定词之前的词语。
预训练目标:这些模型通常使用编码器或解码器模型的目标进行预训练,但通常涉及更复杂的内容。例如,一些模型通过用单个掩码特殊词替换文本中的随机文本跨度(可能包含几个词)进行预训练,目标是预测这个掩码词替换的文本。
适用任务:编码器 - 解码器模型最适合涉及基于给定输入生成新句子的任务,如摘要、翻译或生成式问答。
2. 数据清理
数据清理的重要性:数据质量对于基于其训练的语言模型的性能至关重要。数据清理技术,如过滤和去重,已被证明对模型性能有很大影响。
实例研究:作为一个例子,在 Falcon40B 中,Penedo 等人展示了经过适当过滤和去重的网络数据单独可以构建强大的模型,甚至在性能上显著超过在 The Pile 上训练的最先进模型。尽管进行了广泛过滤,他们仍然从 CommonCrawl 获取了五万亿个标记。他们还发布了来自 REFINEDWEB 数据集的 6000 亿标记的提取物,以及在此基础上训练的 1.3/7.5B 参数语言模型。
数据精炼过程示意:

2.1 数据过滤
数据过滤的目的是提高训练数据的质量和训练数据的有效性。常见的数据过滤技术包括:
去除噪声:指消除可能影响模型良好泛化能力的无关或噪声数据。例如,可以考虑从训练数据中删除错误信息,以降低模型生成错误回应的可能性。质量过滤的两种主流方法包括:基于分类器的和基于启发式的框架。
处理离群值:识别并处理数据中的离群值或异常,以防止它们对模型产生不成比例的影响。
处理数据不平衡:平衡数据集中类别或类别的分布,避免偏见,确保公平代表性。这对于负责任的模型训练和评估特别有用。
文本预处理:通过去除停用词、标点符号或可能不会显著贡献于模型学习的其他元素,来清洁和标准化文本数据。
处理模糊性:解决或排除可能在训练过程中混淆模型的模糊或矛盾数据。这可以帮助模型提供更确定和可靠的答案。
2.2 数据去重
去重的意义:去重指的是移除数据集中的重复实例或重复出现的相同数据的过程。重复的数据点可能会在模型训练过程中引入偏见,并减少多样性,因为模型可能多次从相同的示例中学习,可能导致对那些特定实例的过拟合。
改善泛化能力:去重改善了模型对新的、未见过的数据的泛化能力。
大数据集中的重要性:在处理大型数据集时,去重尤其重要,因为重复数据可能无意中放大了某些模式或特征的重要性。这在 NLP 任务中尤其相关,因为多样化和具有代表性的训练数据对于构建健壮的语言模型至关重要。
具体方法:具体的去重方法可能根据数据的性质和特定语言模型的训练需求而有所不同。它可能涉及比较整个数据点或特定特征来识别和消除重复数据。在文档层面,现有工作主要依赖于文档之间高级特征(例如 n-gram 重叠)的重叠比率来检测重复样本。
3. 分词
基本概念:分词是将文本序列转换成称为标记的更小部分的过程。尽管最简单的分词工具仅基于空格将文本切分成标记,但大多数分词工具依赖于词典。
词典外问题(OOV):在这种情况下,词典外(out-of-vocabulary,OOV)问题是一个挑战,因为分词器只能识别其词典中的词汇。
增加词典覆盖率:为了增加词典的覆盖率,用于 LLMs 的流行分词器基于子词,这些子词可以组合形成大量词汇,包括训练数据中未出现的词汇或不同语言的词汇。
流行分词器简介:以下将描述三种流行的分词器。
3.1 BytePairEncoding(字节对编码)
算法起源:BytePairEncoding 最初是一种数据压缩算法,使用字节级别的频繁模式来压缩数据。
算法特点:该算法主要尝试保持频繁出现的单词的原始形式,并分解不常见的单词。这种简单的范式使得词汇表不会很大,同时也足以代表常见单词。如果训练数据中的后缀或前缀也常见,则频繁单词的形态变化也可以很好地表示。
3.2 WordPieceEncoding(词片编码)
应用模型:这种算法主要用于众所周知的模型,如 BERT 和 Electra。
训练过程:在训练开始时,算法取训练数据中的所有字母表,确保没有任何内容会被标记为 UNK(未知)。
算法特点:当模型给出一个无法由标记器标记的输入时,会出现这种情况。这种情况多发生在某些字符无法被标记时。与 BytePairEncoding 类似,它尝试根据频率最大化将所有标记放入词汇表的可能性。
3.3 SentencePieceEncoding(句子片编码)
与前两者对比:尽管前两种标记器强大且与空白标记相比有许多优势,它们仍然假设单词总是由空格分隔。这个假设并非总是成立,在某些语言中,单词可能会被不需要的空格或甚至是捏造的单词等噪声元素破坏。
解决问题:SentencePieceEncoding 试图解决这个问题。
4. 位置嵌入
4.1 绝对位置嵌入(Absolute Positional Embeddings, APE)
原理与应用:APE 用于原始 Transformer 模型,以保留序列顺序信息。因此,单词的位置信息被添加到编码器和解码器堆栈底部的输入嵌入中。
位置编码的选择:位置编码有多种选择,可以是学习的或固定的。在标准 Transformer 中,使用正弦和余弦函数来实现这一目的。
主要缺点:使用 APE 的主要缺点是限制了特定数量的标记。此外,APE 无法考虑标记之间的相对距离。
4.2 相对位置嵌入(Relative Positional Embeddings, RPE)
方法和实现:RPE 通过扩展自注意力来考虑输入元素之间的成对链接。RPE 在两个层面上被添加到模型中:首先作为键的额外组成部分,然后作为值矩阵的子组成部分。
输入视角:这种方法将输入视为一个带标签和有向边的完全连接图。在线性序列的情况下,边可以捕获输入元素之间相对位置差异的信息。
剪辑距离:剪辑距离 k 指定了相对位置的最大限制。这允许模型对训练数据中未包含的序列长度进行合理预测。
4.3 旋转位置嵌入(Rotary Position Embeddings, RoPE)
解决问题:RoPE 解决了现有方法的问题。学习的绝对位置编码在句子短时可能缺乏泛化性和意义。此外,当前方法如 T5 的位置嵌入在构建位置之间的完整注意力矩阵方面面临挑战。
实现方法:RoPE 使用旋转矩阵来编码单词的绝对位置,并在自注意力中同时包含显式的相对位置细节。
特点:RoPE 带来了一些有用的特性,如灵活应对句子长度、随着相对距离的增加降低词汇依赖性,以及通过相对位置编码改善线性自注意力的能力。GPT-NeoX-20B、PaLM、CODEGEN 和 LLaMA 等模型在其架构中利用了 RoPE。
4.4 相对位置偏置(Relative Positional Bias)
背景与概念:这种类型的位置嵌入旨在在推理过程中为比训练中遇到的序列更长的序列提供外推。
实现方法:Press 等人提出了带线性偏置的注意力(ALiBi)。他们不是简单地将位置嵌入添加到词嵌入中,而是为查询键对的注意力分数引入偏置,根据它们的距离施加比例惩罚。BLOOM 模型中利用了 ALiBi。
5. 模型预训练
预训练是大型语言模型训练流程的第一步,帮助 LLMs 获得基本的语言理解能力,适用于广泛的语言相关任务。在预训练期间,LLM 通常在大量(通常是未标记的)文本上以自监督的方式进行训练。预训练的方法有多种,包括下一句预测,最常见的两种包括下一个标记预测(自回归语言建模)和遮蔽语言建模。
5.1 自回归语言建模
定义与方法:在这种框架下,给定 n 个标记的序列,模型试图以自回归方式预测下一个标记(有时是下一序列的标记)。
损失函数:这种情况下常用的损失函数是预测标记的对数似然:

- 适用性:由于框架的自回归特性,仅解码器模型更适合学习完成这些任务。
5.2 遮蔽语言建模
定义与方法:在这种方法中,序列中的一些词被遮蔽,模型训练预测基于周围上下文的遮蔽词。有时也被称为去噪自编码。
训练目标:如果将序列 x 中被遮蔽/损坏的样本表示为,该方法的训练目标可以表示为:

5.3 专家混合(Mixture of Experts, MoE)
最近趋势:MoE 近来在 LLM 领域也变得非常流行,它允许模型以较少的计算进行预训练,意味着可以在相同的计算预算下显著扩大模型或数据集的规模。
主要元素:
稀疏 MoE 层:代替密集前馈网络(FFN)层使用,拥有一定数量的'专家'(例如 8 个),每个专家都是一个神经网络。实践中,专家通常是 FFN,但也可以是更复杂的网络。
门控网络或路由器:决定哪些标记发送给哪个专家。一个标记可以发送给多个专家。路由标记至专家的决策至关重要,路由器由学习的参数组成,并与网络的其余部分同时进行预训练。
图示说明:下图展示了 MoE 中使用的 Switch Transformer 编码器块。

图:Switch Transformer 编码器块示意图。它们用稀疏 Switch FFN 层(浅蓝色)替换了 Transformer 中的密集前馈网络(FFN)层。
6. 微调和指令微调
微调和指令微调是大型语言模型训练流程中的重要步骤,这些技术展示了微调和指令微调在提高 LLMs 性能、提升模型适应特定任务和遵循指令的能力方面的关键作用。
6.1 微调
概念与应用:早期语言模型如 BERT 使用自监督学习,但无法执行特定任务。为使基础模型实用,需要使用带标签的数据针对特定任务进行微调(监督式微调,SFT)。例如,在 BERT 原论文中,模型被微调以适应 11 种不同任务。
微调的影响:尽管最新的 LLMs 不再需要微调即可使用,但它们仍可从特定任务或数据的微调中受益。如 GPT-3.5 Turbo 在特定任务数据微调后,性能可超过 GPT-4。
6.2 指令微调
目的与方法:为使 LLMs 的响应符合通过提示给出的指令期望,进行指令微调非常重要。这被称为指令微调。例如,Natural Instructions 数据集包含任务定义、正/负示例或需避免事项等组件。
效果与比较:通常,经过指令微调的模型性能优于它们基于的原始基础模型。例如,InstructGPT 在大多数基准测试上优于 GPT-3。
6.3 Self-Instruct 方法
- 框架与实现:Wang 等人提出的 Self-Instruct 方法,通过引导自身生成来提高预训练语言模型的指令遵循能力。其流程包括从语言模型生成指令、输入和输出样本,然后过滤掉无效或相似的样本,用于微调原始模型。
7. 对齐
7.1 对齐
AI 对齐是指引导 AI 系统朝向人类的目标、偏好和原则的过程。预训练的 LLMs,虽然针对词预测,但经常会展现出非预期行为,如生成有毒、有害、误导性和带有偏见的内容。
7.2 指令微调
指令微调是使 LLMs 更接近对齐的一步。然而,在许多情况下,还需要进一步的步骤来改善模型的对齐,避免非预期行为。最新研究表明,除 SFT 外的进一步对齐主要改善至少 7B 参数的模型。对于较小的模型,SFT 已足够。以下是最流行的对齐方法:
7.3 RLHF 和 RLAIF
RLHF:基于人类反馈的强化学习(RLHF)使用奖励模型从人类反馈中学习对齐。经调整后的奖励模型能够根据人类给出的对齐偏好评分不同输出,并将反馈用于进一步调整 LLM。
RLAIF:基于 AI 反馈的强化学习(RLAIF)将预训练且良好对齐的模型直接连接到 LLM,帮助它从更大和更对齐的模型中学习。
7.4 DPO
- 方法与效果:Rafailov 等人提出的 DPO 方法针对 RLHF 的复杂性和不稳定性提出了新的解决方案。他们使用奖励函数和最优策略之间的映射,表明可以通过单阶段的策略训练精确优化受限奖励最大化问题,本质上在人类偏好数据上解决分类问题。DPO 方法稳定、高效、计算轻量,无需拟合奖励模型、在微调期间采样或进行大量超参数调整。DPO 微调在控制生成情感和提高摘要响应质量方面超过了 RLHF。

图:DPO 优化人类偏好,避免强化学习。现有方法首先对人类反馈数据集中的提示和对响应对的人类偏好进行奖励模型拟合,然后使用 RL 找到最大化学习奖励的策略。相比之下,DPO 直接针对最佳满足偏好的策略进行优化,具有简单的分类目标,无需显式奖励函数或 RL。
7.5 KTO
- 方法与优势:Ethayarajh 等人提出的 Kahneman-Tversky 优化(KTO)方法,不需要成对偏好数据,只需(x,y)和知识判断 y 是可取还是不可取。KTO 对齐的模型在 1B 到 30B 的规模上表现良好,尽管没有使用成对偏好。KTO 更适用于现实世界,因为所需数据类型更加丰富。例如,每家零售公司都有大量客户互动数据以及这些互动是成功(例如,购买)还是失败(例如,未购买)。但他们几乎没有反事实数据(即,如何将不成功的客户互动转变为成功的)。

图:LLM 对齐涉及监督微调,然后优化以人为中心的损失(HALO)。然而,现有方法需要的成对偏好数据难以获取。相比之下,KTO 使用一种更加丰富的数据类型,使其在现实世界中更易于使用。
8. 解码策略
解码是指使用预训练的 LLMs 进行文本生成的过程。在处理输入提示后,标记器将文本中的每个标记转换为相应的标记 ID。语言模型随后使用这些 ID 预测下一个最可能的标记或标记序列。最后,模型产生逻辑值,通过 softmax 函数转换为概率。已经开发了多种解码策略,包括 Greedy Search、Beam Search 以及 Top-K 和 Top-P (Nucleus sampling) 等采样技术。
8.1 Greedy Search
方法:Greedy Search 在每一步选择最可能的标记作为序列中的下一个标记,舍弃所有其他选择。
特点与局限:这是一种简单的方法,但可能会丢失时间上的连贯性和一致性。Greedy Search 只考虑每一步最可能的标记,忽视了对整体序列的影响。虽然快速,但它可能错过更好的序列,这些序列可能会出现在稍不那么可能的后续标记中。
8.2 Beam Search
方法:与只考虑下一个最可能标记的 Greedy Search 不同,Beam Search 在每一步考虑了 N 个最可能的标记,其中 N 是束的数量。
特点:例如,对于束大小为 2 且最大长度为 5 的情况,Beam Search 需要跟踪 2^5 个可能的序列。因此,它比 Greedy Search 更耗费计算资源。
8.3 Top-K 采样
方法:Top-K 采样使用语言模型生成的概率分布,从 k 个最可能的选项中随机选择一个标记。
实现与随机性:假设有 6 个标记(A, B, C, D, E, F),k=2,且 P(A)=30%,P(B)=20%,P(C) 等于 P(D)、P(E) 和 P(F) 的 12.5%。在 Top-K 采样中,C、D、E、F 被忽略,模型输出 A 的概率为 60%,B 的概率为 40%。这种方法在选择过程中引入了随机性,同时优先考虑最可能的标记。温度参数 T 影响 softmax 函数生成的概率,使得最可能的标记更具影响力。低温度设置显著改变概率分布,高温度优先考虑概率较高的标记。
8.4 Top-P 采样
方法与特点:Top-P 采样(也称为 Nucleus 采样)采用与 Top-K 不同的方法。它选择一个截断值 p,使得选定标记的概率之和超过 p,形成一个'核心',从中随机选择下一个标记。这种方法在 Top-K 标记不具有大概率质量的情况下可能更好。
变化性与多样性:与 Top-K 不同,Nucleus 采样中包含的标记数量不固定,这种变化性通常导致更多样化和创造性的输出,使 Nucleus 采样在文本生成任务中受欢迎。
9. 费效比优化训练/推理/适应/压缩
在这部分中,我们回顾了一些用于更经济、更高效计算地训练和使用 LLMs 的流行方法。
9.1 优化训练
为了更经济、更高效地训练 LLMs,已经开发了许多框架。这些优化训练框架有助于更经济高效地训练和使用 LLMs,降低成本的同时保持或提升性能。这里我们介绍一些主要的框架。
ZeRO
概述:Rajbhandari 等人开发了 Zero Redundancy Optimizer(ZeRO),旨在优化内存,显著提高 LLMs 的训练速度,同时增加可以高效训练的模型大小。
优势:ZeRO 消除了数据和模型并行训练中的内存冗余,同时保持了低通信量和高计算粒度。它允许按比例扩大模型大小以适应设备数量,保持高效率。
RWKV
概述:Peng 等人提出了 Receptance Weighted Key Value(RWKV),结合了 Transformers 的高效并行训练和 RNNs 的高效推理。
技术细节:RWKV 利用线性注意力机制,可以作为 Transformer 或 RNN 进行构建,在训练期间实现并行计算,在推理期间保持恒定的计算和内存复杂度。
架构及时间复杂度比较:

RWKV 架构

RWKV 与不同 Transformers 的时间复杂度比较
9.2 低秩适应(LoRA)
概述:低秩适应是一种流行且轻量级的训练技术,显著减少了可训练参数的数量,基于关键洞察:针对特定任务微调的权重与初始预训练权重之间的差异通常表现为'低内在秩'。
实现与优势:使用 LoRA 训练更快、更节省内存,产生更小的模型权重,易于存储和共享。LoRA 基于低秩矩阵可以表示为两个较小矩阵的乘积这一事实,通过专注于更新这两个较小矩阵而非整个原始权重矩阵,显著提高了计算效率。
重参数化示意:

图:LoRA 的重参数化过程。
9.3 知识蒸馏
概述:知识蒸馏是从更大模型中学习的过程,通过将多个模型的知识蒸馏到一个更小的模型中,创建可在边缘设备上使用的更小模型。
蒸馏方法:知识蒸馏通常包括响应蒸馏、特征蒸馏和 API 蒸馏。响应蒸馏专注于教师模型的输出,教导学生模型执行类似的操作;特征蒸馏使用中间层,以便为学生模型创建更好的内部表示;API 蒸馏是使用 API 训练更小的模型,类似于响应蒸馏。
蒸馏框架示意:

图:具有学生和教师的通用知识蒸馏框架。
9.4 量化
量化是减少模型大小和提升运算速度的关键技术。在深度学习的核心,是一系列应用于具有特定精度的模型权重的数学函数。降低权重的精度可以用于减小模型大小,并使其运算更快。例如,与 Int-8 操作相比,Float-32 操作更慢。量化可以在不同阶段应用。
主要量化方法:
分类:模型量化的主要方法可分为训练后量化和量化感知训练。
训练后量化:关注于量化训练好的模型,有两种著名方法:动态和静态。动态训练后量化在运行时计算量化范围,与静态相比较慢。
量化感知训练:在训练过程中加入量化标准,训练和优化一个量化模型。这种方法确保最终模型具有良好性能,且不需要在训练后进行量化。