大模型架构
学习目标
- 理解Transformer架构的核心组件及其扩展方法
- 掌握注意力机制的原理和变体
- 了解GPT系列模型的发展历程和架构特点
- 熟悉LLaMA系列开源模型的设计理念
- 理解大模型训练的关键技术
1.1 Transformer架构基础
1.1.1 从注意力机制说起
在深度学习的早期,循环神经网络(RNN)曾是处理序列数据的主流方法。RNN通过其隐藏状态在序列中传递信息,能够捕捉序列中的时序依赖关系。然而,RNN存在一个根本性的问题:长距离依赖问题。当序列过长时,早期的信息会在传播过程中逐渐被稀释,导致模型难以记住重要的历史细节。
让我们用一个生活中的例子来理解这个问题。假设你在阅读一篇学术论文,需要理解作者在结论部分提出的核心观点。这个观点可能建立在论文开头的研究背景之上,你需要记住"第一章"提到的某个关键技术问题。但在RNN中,经过多层的传递,早期的重要信息可能已经被后续的无关信息所稀释,模型难以建立这种跨越长距离的关联。
为了解决这个问题,研究者们引入了注意力机制(Attention Mechanism)。注意力机制的核心思想是:在处理每个位置的信息时,允许模型"关注"或"查看"序列中的其他位置,从而更好地捕捉长距离依赖关系。
让我们用一个生动的比喻来理解注意力机制。想象你正在观看一场足球比赛。作为观众,你的注意力会自动跟随球的移动——当球传到禁区时,你会更加关注禁区内球员的动向;当球被解围到中场,你的注意力也会随之转移。注意力机制的工作方式与此类似——它让模型能够灵活地权衡序列中不同位置信息的重要性,而不是按固定顺序处理。
自注意力机制(Self-Attention)是注意力机制的一种变体。与普通的注意力机制不同,自注意力机制与输入序列的位置无关,通过计算序列内部各个元素之间的关系来生成输出。自注意力的核心是让序列中的每个位置都能关注到序列中的所有其他位置,从而捕获任意位置的依赖关系。
1.1.2 自注意力机制的数学原理
自注意力机制的计算过程可以通过以下步骤来描述:
第一步:生成查询、键和值向量
对于输入序列中的每个词向量 \(\mathbf{x}_i\),我们使用三个独立的权重矩阵 \(\mathbf{W}_q\)、\(\mathbf{W}_k\)、\(\mathbf{W}_v\) 来生成对应的查询(Query)、键(Key)和值(Value)向量:
这三个向量在注意力机制中扮演不同的角色,理解它们有助于理解整个系统:
- 查询向量(Query):表示当前位置"想要查询什么信息",类似于数据库检索中的搜索关键词
- 键向量(Key):表示每个位置"包含什么信息",类似于数据库中的索引,用于匹配查询
- 值向量(Value):则是实际要传递的信息内容,当查询与键匹配后,通过值向量传递信息
第二步:计算注意力分数
接下来,我们计算查询向量与所有键向量的点积,得到注意力分数:
其中 \(d_k\) 是键向量的维度。引入这个缩放因子 \(\sqrt{d_k}\) 是为了防止点积结果过大,导致softmax函数进入梯度饱和区。点积结果随着维度的增大而增大,如果不进行缩放,softmax函数可能处于非常尖锐的概率分布状态,导致梯度消失,影响模型训练。
第三步:归一化与加权求和
使用softmax函数对注意力分数进行归一化,得到注意力权重:
这些权重表示位置i对位置j的注意力程度,权重之和为1。最后,用注意力权重对值向量进行加权求和,得到最终的输出:
这个过程可以看作是一次"软查找"操作——每个位置都在整个序列中查找相关信息,并根据相关性加权组合。
1.1.3 多头注意力机制
单一的注意力头可能只能捕获一种类型的相关性。例如,一个注意力头可能学会了关注语法依存关系,另一个头可能学会了关注语义相似性,还有一个头可能捕捉指代关系。为了让模型能够同时关注不同类型的信息,Transformer引入了多头注意力机制(Multi-Head Attention)。
多头注意力的思想是:将查询、键、值向量分别投影到多个低维空间,在每个空间中独立地计算注意力,然后合并所有头的输出。
具体来说,如果有 \(h\) 个注意力头,每个头的维度为 \(d_k' = d_k / h\),则:
最终输出为所有注意力头的拼接:
这种设计让模型能够同时学习多种类型的关系,提高了模型的表达能力。
1.1.4 Transformer总体架构
Transformer采用了经典的编码器-解码器(Encoder-Decoder)架构,这种架构在机器翻译等序列到序列任务中表现出色。编码器负责理解输入序列,解码器负责生成输出序列,两者协同工作完成翻译任务。
编码器结构
编码器由 \(N\) 个相同的层堆叠而成,每一层包含两个子层:
-
多头自注意力层:帮助编码器在对每个位置进行编码时,能够关注到上下文的其他位置。这使得编码器在处理每个词时能够"看到"句子中的其他词,更好地理解词语之间的依赖关系。
-
前馈神经网络层:对注意力层的输出进行非线性变换。这个前馈网络通常是两层全连接神经网络,中间有一个非线性激活函数(如ReLU或GELU)。
每个子层都使用了残差连接(Residual Connection)和层归一化(Layer Normalization):
这种设计有两个重要作用:
-
残差连接:允许梯度直接流过,缓解深层网络的训练困难。残差连接的核心思想是让网络学习输入与输出之间的"残差",而不是直接学习完整的映射。当子层的输出与输入相差不大时,梯度可以直接反向传播到输入层。
-
层归一化:通过对每一层的激活值进行归一化,有助于稳定训练过程。层归一化计算同一层中所有神经元激活值的均值和方差,然后进行归一化,使得每层的输入分布保持稳定。
解码器结构
解码器同样由 \(N\) 个相同的层堆叠而成,但每一层包含三个子层:
-
掩码多头自注意力层:确保解码器只能看到当前及之前的位置,保持自回归特性。在生成任务中,解码器只能基于已经生成的内容进行预测,而不能"看到"未来的信息。掩码机制通过将未生成位置的信息遮盖来实现这一点。
-
编码器-解码器注意力层:让解码器的每个位置能够关注到编码器的所有位置。这是解码器理解源语言上下文的关键机制。
-
前馈神经网络层:与编码器相同的全连接层,负责最终的特征变换。
解码器在处理序列时采用自回归的方式——生成每个token时,只能基于已经生成的token进行预测,而不能看到未来的信息。这通过在注意力计算时应用掩码来实现。
1.1.5 位置编码
与RNN不同,Transformer架构本身不包含序列中token位置的信息。这是一个设计上的有意选择——让我们能够使用高效的并行计算,但同时也意味着我们需要显式地将位置信息注入模型。
位置编码(Positional Encoding)通过向输入嵌入添加位置信息来实现这一目标。原始Transformer使用了两种位置编码方式:
方法一:正弦位置编码
对于位置 \(pos\) 和维度 \(i\):
这种设计的优点是:对于任意固定的偏移量 \(k\),\(PE_{pos+k}\) 可以表示为 \(PE_{pos}\) 的线性函数,这使得模型能够轻松地学习关注相对位置。
方法二:可学习的位置编码
另一种方法是将位置编码作为可学习的参数,让模型从数据中自动学习有意义的位置表示。这种方法在某些任务中表现良好,但正弦编码具有更好的外推性。
旋转位置编码(RoPE)
近年来,旋转位置编码成为大语言模型中的主流选择。RoPE通过将位置信息编码为旋转矩阵来实现,其核心思想是:将位置编码融入到查询和键向量的旋转操作中。
具体来说,对于二维情形,RoPE将位置 \(m\) 的查询向量 \(\mathbf{q}\) 旋转角度 \(m\theta\):
其中 \(\mathbf{R}(m\theta)\) 是旋转矩阵。这种编码方式具有更好的外推性,能够处理训练时未见过的更长序列。
1.2 注意力机制的扩展与优化
1.2.1 标准注意力的计算瓶颈
标准自注意力的计算复杂度为 \(O(n^2)\),其中 \(n\) 是序列长度。这意味着当序列长度增加时,计算量会急剧增长。例如,当序列长度从512增加到4096时,计算量会增加64倍。
在大语言模型中,序列长度通常非常大。例如,GPT-4支持长达32,000个token的上下文,而某些模型甚至支持更长的序列。处理如此长的序列是一个巨大的挑战,特别是在显存和计算时间方面。
为了解决这个问题,研究者们提出了多种高效的注意力机制变体,包括多查询注意力、分组查询注意力、稀疏注意力、线性注意力和FlashAttention等。
1.2.2 多查询注意力与分组查询注意力
标准多头注意力中,每个注意力头都有独立的查询、键和值向量。但在某些场景下,我们可能希望共享键向量,以减少计算和内存开销。
多查询注意力(Multi-Query Attention,MQA)采用了这一思路——所有注意力头共享相同的键和值向量,只有查询向量保持独立。这种设计可以显著减少键值对的存储和计算量。
MQA的trade-off是:减少了内存和计算,但可能损失一定的表达能力,因为不同头不能学习独立的键值映射。
分组查询注意力(Grouped Query Attention,GQA)是MQA的推广,它将注意力头分成 \(g\) 个组,同一组内的头共享键和值向量,不同组则有独立的键值向量。
这种设计允许模型在保持一定多样性的同时,减少键值向量的数量,从而降低内存占用和计算成本。LLaMA 2就采用了分组查询注意力来平衡性能和效率。
1.2.3 稀疏注意力机制
稀疏注意力(Sparse Attention)是一种通过只计算部分注意力分数来提高效率的方法。其核心思想是:不是所有位置都需要关注所有其他位置,很多注意力模式是可以预测的。
例如,在语言数据中,一个词更可能与相近的词产生关联,而距离较远的词之间的直接关联相对较少。这种"局部性"特征在自然语言中普遍存在。同样,在图像数据中,相邻像素之间的关联也比远距离像素更强。
基于这种观察,稀疏注意力机制只计算局部窗口内的注意力,或只关注某些预设的"重要"位置。
常见的稀疏注意力模式包括:
-
滑窗注意力(Sliding Window Attention):每个位置只关注其邻近的 \(w\) 个位置。这种模式适合捕捉局部依赖关系,计算复杂度为 \(O(n \cdot w)\)。
-
扩张滑窗注意力(Dilated Sliding Window):在滑窗中引入扩张间隔,增加感受野。例如,扩张率为2的滑窗会跳过一个位置,让感受野更广。
-
全局注意力(Global Attention):某些特殊位置(如[CLS] token或特定标记)可以看到所有其他位置,用于汇总信息。
1.2.4 线性注意力机制
线性注意力(Linear Attention)通过重新排列计算顺序,将注意力计算的复杂度从 \(O(n^2)\) 降低到 \(O(n)\)。
标准注意力的计算过程是:
线性注意力的核心思想是使用核函数近似softmax操作,从而将计算顺序从 \((\mathbf{q} \cdot \mathbf{k}) \mathbf{v}\) 变为 \(\mathbf{q} \cdot (\mathbf{k} \cdot \mathbf{v})\),实现计算复杂度的降低。
具体来说,如果我们使用一个核函数 \(\phi(\cdot)\) 来近似 \(\exp(\mathbf{q} \cdot \mathbf{k})\),那么:
这样可以将计算复杂度降低到 \(O(n)\)。
然而,线性注意力有一个重要的局限性:它无法自然地支持掩码机制,这使得它在生成任务中的表现受到影响,因为生成任务需要防止看到未来信息。
1.2.5 FlashAttention
FlashAttention是一种最近提出的高效注意力计算方法,它利用GPU的层次化内存结构(共享内存、L2缓存、HBM)来加速注意力计算。
传统的注意力实现需要多次访问HBM(High Bandwidth Memory),这会成为性能瓶颈——HBM的带宽虽然高,但延迟也较大,频繁访问会影响性能。
FlashAttention的核心思想是将注意力计算分成多个小块,每次将一小块数据从HBM加载到共享内存,在共享内存中进行计算,然后再写回HBM。
通过这种方式,FlashAttention能够: - 减少HBM访问次数:从 \(O(n^2)\) 次减少到更少的次数 - 避免存储完整的注意力矩阵:节省 \(O(n^2)\) 的显存占用 - 保持数值精度:使用在线softmax等技巧保证计算结果的准确性
FlashAttention已经成为训练大语言模型的标准优化技术之一,被广泛应用于GPT、LLAMA等大模型的训练中。
1.2.6 注意力机制的未来发展
注意力机制的优化仍在持续推进。一些值得关注的研究方向包括:
-
状态空间模型(SSM):如Mamba等新型架构,试图用递归机制替代注意力,实现线性复杂度的序列建模。
-
稀疏注意力学习:让模型自动学习最优的稀疏注意力模式,而非人工设计。
-
多尺度注意力:在不同尺度上应用注意力,捕捉不同范围的依赖关系。
-
硬件感知的注意力:针对特定硬件特性优化的注意力实现。
1.3 GPT系列模型
1.3.1 GPT-1:生成式预训练的开创者
GPT-1(Generative Pre-trained Transformer)是OpenAI在2018年提出的模型,它首次系统性地展示了"预训练+微调"范式的强大威力。
GPT-1的核心思想是:先在大规模无标注文本上进行生成式预训练,学习语言的基本规律,然后在特定任务上进行有监督微调。
这个范式奠定了现代自然语言处理的基础。在此之前,大多数NLP模型需要针对每个任务进行从头训练,而预训练+微调的范式允许模型从大规模无监督数据中学习通用语言表示,然后在特定任务上进行针对性优化。
模型架构基于Transformer的解码器部分: - 12层Transformer解码器 - 768维隐藏层 - 12个注意力头 - 参数量约1.17亿
预训练任务是语言建模(Language Modeling):给定前文预测下一个词。在大规模 BooksCorpus 数据集(包含约7,000本未出版的书籍)上进行训练。
GPT-1在多个NLP任务上取得了当时最好的结果,证明了预训练方法的有效性,开启了预训练大模型的时代。
1.3.2 GPT-2:迈向多任务学习
GPT-2在GPT-1的基础上进行了扩展,展示了"涌现能力"(Emergent Abilities)的初步迹象。
GPT-2的关键特点:
- 规模更大:15亿参数,相比GPT-1增长超过10倍
- 数据更多:训练数据来自Reddit高赞文章,构建了WebText数据集
- 零样本学习:GPT-2展示出了在未见过的任务上进行零样本推理的能力
GPT-2的核心观点是:语言模型可以在无需人类标注的情况下学习执行多种任务,因为语言本身就是多任务的——人们在写作时已经隐含地包含了各种任务(如问答、翻译、摘要等)。
例如,当你读一篇新闻文章时,作者可能隐含地提供了新闻摘要;当你读一个说明书时,里面可能包含了解释性的问答。语言模型通过大规模预训练,能够隐式地学习这些任务。
GPT-2的发布曾引起广泛关注,OpenAI出于安全考虑没有完全开源完整的模型权重,这也引发了对AI安全性的首次大规模讨论。
1.3.3 GPT-3:规模的力量
GPT-3是AI领域的一个里程碑,它证明了"规模假设"(Scaling Hypothesis)——随着模型规模、数据量和计算量的增加,模型能力会持续提升。
GPT-3的关键数据:
| 指标 | 数值 |
|---|---|
| 参数量 | 1750亿 |
| 训练token数 | 约3000亿 |
| 模型尺寸 | 约350GB(FP16) |
| 训练成本 | 估计约460万美元 |
GPT-3展示了令人惊叹的上下文学习能力(In-Context Learning):用户可以通过在提示中提供几个示例,让模型理解任务并执行新的推理,而无需对模型进行任何权重更新。
例如,要让GPT-3进行英语到法语翻译,只需在提示中写:
英语:Hello
法语:Bonjour
英语:Good morning
法语:Bon jour
英语:Thank you
法语:
GPT-3能够理解任务并完成翻译。
GPT-3在众多基准测试中展现出接近甚至超越人类水平的性能,但同时也暴露了一些局限性,如偏见问题和事实性错误。
1.3.4 GPT-4:多模态与强化学习
GPT-4在GPT-3的基础上进行了多项重要升级:
- 多模态能力:GPT-4能够接受图像和文本输入,在视觉理解任务上表现出色
- 更长上下文:支持最高32,000个token的上下文窗口
- 更安全的输出:通过人类反馈强化学习(RLHF)显著减少了有害输出
- 复杂推理能力:在各类专业和学术考试中展现出高级推理能力
GPT-4的架构细节并未完全公开,但可以推测它延续了GPT系列的核心设计,同时引入了更多的工程优化和后训练增强。
GPT-4在多项考试中表现出色,包括: - 美国律师资格考试(LSAT):前10% - 美国医学执照考试(USMLE):约86%的通过率 - GRE语文:前20%
1.3.5 ChatGPT:从语言模型到对话助手
ChatGPT是基于GPT系列模型专门针对对话场景优化的产物。它的出现标志着AI助手进入了一个新时代。
ChatGPT的关键技术包括:
- 指令微调(Instruction Tuning):通过人类编写的指令-响应对数据进行微调,让模型学会理解并遵循指令
- 人类反馈强化学习(RLHF):使用人类反馈来训练奖励模型,再通过强化学习优化策略
- 安全与有用性平衡:在保持模型创造力的同时,减少有害输出
RLHF的过程可以分解为三个阶段:
- 监督学习阶段:使用人类示例数据微调GPT-3.5,学习如何生成合适的回复
- 奖励模型训练:训练一个模型来预测人类偏好,这个模型学习区分"好的"和"不好的"回复
- 强化学习优化:使用PPO(Proximal Policy Optimization)算法优化模型策略,让模型生成更符合人类期望的回复
ChatGPT展示出了连贯对话、代码编写、文学创作等多样化的能力,但它也继承了基础模型的局限性,包括知识截止日期和偶尔产生幻觉的问题。
1.4 LLaMA系列开源模型
1.4.1 LLaMA的诞生与设计理念
LLaMA(Large Language Model Meta AI)是Meta在2023年发布的一系列开源大语言模型,它的出现彻底改变了开源社区的格局。
在LLaMA之前,开源社区虽然有一些小型语言模型,但缺乏能够与GPT系列竞争的大规模模型。LLaMA的发布让开源社区首次拥有了可以媲美闭源模型的基础模型。
LLaMA的核心设计理念是:以更小的规模实现顶级模型相当的性能。
LLaMA提供了多个规模的版本:
| 模型 | 参数量 | 隐藏维度 | 注意力头数 | 层数 |
|---|---|---|---|---|
| LLaMA-7B | 70亿 | 4096 | 32 | 32 |
| LLaMA-13B | 130亿 | 5120 | 40 | 40 |
| LLaMA-33B | 330亿 | 6656 | 52 | 60 |
| LLaMA-65B | 650亿 | 8192 | 64 | 80 |
值得注意的是,LLaMA-13B在多数基准测试中超越了GPT-3(175B参数),这证明了小模型通过更好的训练也能获得出色的性能。
1.4.2 LLaMA的架构特点
LLaMA的架构基于Transformer,但进行了多项重要改进:
1. 预归一化(Pre-normalization)
与标准Transformer不同,LLaMA对每个子层的输入进行归一化,而不是对输出进行归一化。具体使用RMSNorm:
这种归一化方式比层归一化更简单,计算更快,同时在实验中表现良好。
2. 分组查询注意力(GQA)
LLaMA-65B和LLaMA-33B使用分组查询注意力,在保持推理效率的同时不牺牲模型性能。
3. 旋转位置编码(RoPE)
LLaMA使用旋转位置编码取代了绝对位置编码,具有更好的外推性。这对于处理长序列尤为重要。
4. SwiGLU激活函数
LLaMA使用SwiGLU激活函数取代ReLU:
SwiGLU结合了门控机制和Swish激活函数的优点,在多项实验中表现优于标准激活函数。
1.4.3 开源生态的繁荣
LLaMA的开源引发了开源社区的爆炸式发展,产生了众多重要衍生项目:
Alpaca
斯坦福大学发布的轻量级指令微调模型,基于LLaMA-7B,使用52K条人类指令数据进行微调。Alpaca展示了通过低成本微调就能获得出色性能的可能性,训练成本不到600美元。
Vicuna
由伯克利、CMU等机构开发的对话模型,通过在用户共享对话上进行微调,实现了高质量的对话能力。Vicuna-13B在多项评测中表现接近ChatGPT。
LLaMA 2
Meta在2023年发布了LLaMA 2,进一步提升了性能,并开放了更友好的商业许可。LLaMA 2包含专门优化的对话版本Llama Chat和助手版本LLaMA 2-CHAT。
LLaMA 2使用超过100万条人工标注数据进行安全训练,在安全性和有用性方面都有显著提升。
1.4.4 开源模型的意义
开源大语言模型的出现带来了深远的影响:
- 民主化AI:让研究者和小型组织也能接触到顶级AI能力,不再完全依赖商业API
- 加速创新:开源社区的快速迭代加速了新技术的验证和优化
- 透明与安全:开源模型的可审查性有助于识别和解决安全问题
- 降低成本:企业可以基于开源模型进行定制开发,而非完全依赖商业服务
开源模型与闭源模型的竞争正在推动AI领域更快地向前发展,形成了百花齐放的生态。
1.5 大模型训练的关键技术
1.5.1 混合精度训练
混合精度训练是训练大模型的基础技术,它通过使用不同的数值精度来加速训练并减少显存占用。
混合精度训练的核心思想:
- FP16/BF16:用于大部分计算密集操作(前向传播、反向传播)
- FP32:用于累积梯度、权重更新等对精度敏感的操作
- 混合精度前向传播:使用低精度进行计算,同时保存FP32主权重
混合精度的优势:
- 加速计算:Tensor Core在FP16/BF16上的吞吐量是FP32的两倍
- 减少显存:低精度权重、激活值、梯度,显存占用几乎减半
- 通信加速:梯度通信量减半,加快分布式训练中的梯度同步
BF16 vs FP16:
BF16(Brain Float 16)是Google为TPU开发的格式,后来被广泛采用。BF16与FP16的主要区别:
- FP16:1位符号,5位指数,10位尾数
- BF16:1位符号,8位指数,7位尾数
BF16有更多的指数位,与FP32相同的动态范围,因此在训练大模型时更不容易出现数值溢出问题,越来越成为主流选择。
1.5.2 梯度累积
梯度累积是一种允许使用更大有效批大小的技术,在显存受限的情况下尤为重要。
工作原理:
- 将大batch分成多个小batch(micro-batch)
- 分别计算每个micro-batch的梯度并累积
- 当累积到预定数量后,再执行一次参数更新
梯度累积的优势:
- 有效批大小 = micro-batch大小 × 累积步数
- 无需增加物理batch大小即可获得更大有效批大小
- 与流水线并行结合使用时效果尤为明显
1.5.3 激活检查点技术
激活检查点(Activation Checkpointing,也称Gradient Checkpointing)是一种用计算换显存的技术。
工作原理:
- 在前向传播时不保存所有中间激活值
- 在反向传播时重新计算需要的激活值
- 节省显存用于更大的模型或更大的batch
对于Transformer模型,激活检查点可以将显存需求减少到原来的约 \(\sqrt{N}\)(\(N\)为层数)。
激活检查点的trade-off是增加了计算量(前向传播需要重新计算某些激活值),但换取了大比例的显存节省。
1.5.4 学习率调度
大模型训练通常使用复杂的学习率调度策略:
- 预热(Warm-up):初期学习率从小到大逐渐增加,帮助模型稳定
- 余弦退火(Cosine Decay):学习率随训练步数按照余弦曲线下降
- 线性预热+余弦退火:组合策略,先线性预热再余弦退火
预热阶段的作用:
- 避免早期过大梯度导致的不稳定
- 让优化器有机会找到更好的参数空间区域
- 特别对于大批量训练尤为重要
1.5.5 分布式优化器
在大规模分布式训练中,优化器本身也需要特殊处理。
分布式Adam优化器:
标准的Adam优化器需要保存动量和方差。对于70B参数的模型,仅优化器状态就需要约280GB(FP32)。使用ZeRO技术将这些状态分片到不同GPU可以大幅降低显存需求。
AdamW与LAMB:
- AdamW:在Adam基础上加入权重衰减,更好地正则化Transformer模型
- LAMB:Layer-wise Adaptive Moments optimizer,适合大batch训练
1.5.6 检查点与容错
大规模训练需要完善的检查点机制来处理节点故障:
检查点策略:
- 定期保存模型状态(权重、优化器状态等)
- 保存训练进度(元数据)
- 增量检查点优化
容错机制:
- 检测节点故障并自动恢复
- 从最近检查点重启训练
- 弹性训练支持动态调整资源
PyTorch的TorchElastic和DeepSpeed的Zero Redundancy都是为这类场景设计的。
1.6 词嵌入与tokenization
1.6.1 从文本到数字
神经网络无法直接处理文本,需要将文本转换为数字表示。这个过程叫做tokenization(分词)。
Tokenization的基本概念:
- 词表(Vocabulary):将所有可能的token映射到整数ID
- Token:文本的最小单元,可以是词、子词或字符
- ID:Token在词表中的整数索引
常见的tokenization方法:
- 词级别(Word-level):每个词作为一个token
- 字符级别(Char-level):每个字符作为一个token
- 子词级别(Subword-level):如BPE、WordPiece
1.6.2 Byte Pair Encoding (BPE)
BPE是一种常用的子词分词算法,最初用于数据压缩,后来被广泛应用于语言模型。
BPE的工作原理:
- 将文本分割为字符
- 统计相邻字符对的出现频率
- 合并最频繁的字符对
- 重复步骤2-3直到达到预设词表大小
BPE的优势:
- 能够处理未登录词(OOV)
- 平衡词表大小和序列长度
- 便于处理多语言文本
1.6.3 WordPiece与SentencePiece
WordPiece是Google为BERT开发的分词算法,与BPE类似但基于语言学优化。
SentencePiece是一种更通用的分词框架:
- 将文本视为字节序列而非字符
- 端到端学习分词,无需预处理
- 支持多种语言
LLaMA使用SentencePiece进行分词。
1.7 模型评估与基准测试
1.7.1 语言模型的评估指标
评估语言模型需要多维度的指标:
困惑度(Perplexity):
困惑度越低,模型越好。
下游任务评估:
- 问答(SQuAD、HotpotQA)
- 文本分类(GLUE、SuperGLUE)
- 摘要生成(CNN/Daily Mail)
- 机器翻译(WMT)
1.7.2 大模型能力评估
超越困惑度,评估大模型的"涌现能力":
Few-shot评估:
给模型少量示例后测试,无需参数更新。
思维链(Chain-of-Thought)评估:
测试模型的多步推理能力。
复杂推理评估:
如MATH数据集,需要详细的解题步骤。
小结
本节我们系统地学习了大语言模型的核心架构和关键技术。
核心要点:
- Transformer架构通过自注意力机制有效解决了长距离依赖问题,成为现代大语言模型的基础
- 多头注意力机制让模型能够同时捕获多种类型的关系,提升了表达能力
- 位置编码解决了Transformer无法感知序列位置的问题,RoPE等新型编码具有更好的外推性
- GPT系列展示了从GPT-1到GPT-4的演进历程,证明了规模的力量和预训练+微调范式的有效性
- LLaMA系列的开源推动了AI技术的民主化,引发了社区的创新热潮
- 混合精度、梯度累积、激活检查点等技术是训练大模型的关键
思考题:
-
为什么Transformer使用残差连接和层归一化?它们各自的作用是什么?如果没有残差连接,深层网络会面临什么问题?
-
与RNN相比,Transformer在处理序列数据时有哪些优势和劣势?在什么场景下RNN可能仍然是更好的选择?
-
GPT系列模型是如何通过规模扩展提升能力的?规模扩展是否可持续?有什么替代或补充方案?
-
LLaMA采用的分组查询注意力和旋转位置编码相比标准注意力有什么优势?为什么这些设计在大模型中尤为重要?
-
大模型训练中,为什么需要复杂的调度策略(如预热+余弦退火)?如果没有预热阶段可能会出现什么问题?