跳到主要内容大模型架构要点总结:LLM 基础与核心组件解析 | 极客日志PythonAI算法
大模型架构要点总结:LLM 基础与核心组件解析
总结了大型语言模型(LLM)的核心架构与关键技术点。内容涵盖 LLM 定义、自回归与自编码模型分类、预训练微调及 RLHF 对齐流程。详细解析了 Transformer 架构演进、Tokenization 分词策略(BPE 等)、Embedding 与位置编码(RoPE)、以及 Decoder 内部组件如 Self-Attention、LayerNorm 和 FFN 的实现细节。此外,还探讨了长度外推、FlashAttention 优化及 KV Cache 等推理加速技术,为理解大模型底层原理提供系统性指导。
静心1 浏览 简介
大型语言模型(Large Language Model, LLM)是人工智能领域的重要突破,其核心基于 Transformer 架构。本文旨在系统梳理 LLM 的基础概念、分类、训练流程及核心组件细节,帮助读者建立完整的知识体系。
1. 什么是 LLM
LLM 本质上是基于 Transformer 架构的深度学习模型。通常认为参数量超过 10B(十亿)的模型为大语言模型。由于参数量巨大,需要的训练数据量也极多,因此目前大部分的使用方式为:大公司整理大量常用数据集,训练一个各方面性能还不错的通用大模型,小公司在此通用模型上搜集小规模行业数据进行微调,最终得到行业专有模型/领域模型。当然,如果通用模型能直接拥有各行业知识是最好的,但以目前的数据量和算力等还未达到效果。
2. LLM 的分类
一般分为三种:自回归模型、自编码模型和序列到序列模型。
2.1 自回归模型 (Autoregressive Model)
自回归模型采用经典的语言模型任务进行预训练,即给出上文,预测下文,对应原始 Transformer 模型的解码器部分,其中最经典的模型是 GPT。由于自编码器只能看到上文而无法看到下文的特点,模型一般会用于文本生成的任务。
2.2 自编码模型 (AutoEncoder Model)
自编码模型则采用句子重建的任务进行预训练,即预先通过某种方式破坏句子,可能是掩码,可能是打乱顺序,希望模型将被破坏的部分还原,对应原始 Transformer 模型的编码器部分,其中最经典的模型是 BERT。与自回归模型不同,模型既可以看到上文信息,也可以看到下文信息,由于这样的特点,自编码模型往往用于自然语言理解的任务,如文本分类、阅读理解等。(此外,这里需要注意,自编码模型和自回归模型的唯一区分其实是在于预训练时的任务,而不是模型结构。)
2.3 序列到序列模型 (Sequence to Sequence Model)
序列到序列模型则是同时使用了原始的编码器与解码器,最经典的模型便是 T5。与经典的序列到序列模型类似,这种模型最自然的应用便是文本摘要、机器翻译等任务,事实上基本所有的 NLP 任务都可以通过序列到序列解决。
目前现有的 LLM 基本上全是 Autoregressive model。
3. LLM 的几个阶段
3.1 预训练 -> Base model
预训练是整个流程中最重要的部分,也是消耗成本最多的环节。在这个阶段大模型的主体(基干)已经确定,堆砌大量的数据进行训练,模型找出其中的共性,将其压缩为一个模型。
目前主流的认知已经是:模型的参数量太小会制约性能,但也并不是越大越好。增加数据量并保持一个中~大参数规模目前看是一个平衡效果和使用成本的较优的方案。
3.2 微调 -> SFT model
大型语言模型中的几乎所有知识都是在预训练中学习的,只需要有限的指令学习数据就可以教会模型产生高质量的输出。
Base 模型并不是一个一般场景/特定场景下好用的模型,Base 模型中学习了很多我们所不需要甚至不想要的信息。
所以我们需要一种方式来对其进行调整,只输出我们想要的内容,以及更好的适应特定场景中我们的问题。
使用相对少量的(1w-10w 水平的问答对)、高质量的数据来继续训练 LLM。由于微调阶段使用的数据量相对于预训练阶段和模型整体参数量来说都较小,所以必须保持一个较高的质量。其中混有的少比例脏数据可能会把模型带偏。
3.3 模型对齐 -> RLHF model
让标注员产生一个答案成本很高,但让他在不同答案之间选择哪个更好是成本明显降低的。这就产生了另一类标注方式,对于不同的回答对直接标记好坏倾向。这种标注方式能够帮助模型学习高层语义上的倾向。
对齐技术可以让 AI 系统在成功优化训练目标的同时,能够符合预期目的,且遵守人类提供的道德和安全标准。对齐技术通常指的是通过引入人工生成的预期效果样例以及使用强化学习(比如 RLHF)来实现模型和预测的对齐。
RLHF (Reinforcement Learning from Human Feedback) 人类反馈强化学习
- 收集人类生成的对于预期行为的描述并且训练一个全监督微调模型 (SFT: supervised finetuned model)
- 使用对不同的输出的评分,训练一个奖励模型 (RM: reward model)
- 使用 RM 作为评分函数来微调 SFT,从而最大化回答的评分(具体细节用 PPO 算法实现)
RLHF 环节在整个 LLM 的过程中也是很难的,很不稳定。
RL 问题的求解过程的难度本就是(相对于 DL 等)更大的。reward 的具体数值设计也很玄学,不同回答之间'好'的差异的程度应该是有大有小的,过于简单的处理会导致 reward model 扭曲。这个问题的 reward 非常稀疏,且是只在最后给出的这种最困难的类型。实际应用中,RL 问题面对的 token 序列都太长,长一点的回答会超过 1000token,这对 RL 求解的过程挑战较大。
4. 模型细节
4.1 Transformer 架构
由于 transformer 架构包含 encoder、decoder 两部分。
但在实际使用时,可以针对使用场景进行不同结构的尝试。
如下图所示,有些 LLM 保持了原始的 transformer 架构,而有些 LLM 只使用了 Encoder,有些只使用了 Decoder。具体模型架构发展图如下。
在理论上 Encoder 是双向注意力机制,会存在低秩问题。所有 Decoder-only 是目前的主流形式。参考苏神的回答 为什么现在的 LLM 都是 Decoder only 的架构?
Encoder 架构在预测 mask 处文字的应用方面更有优势,Decoder 架构在预测下一个单词应用方面更有优势。
在 DecoderBlock 中,mask-attention 是为了解决训练时 answer 内容中前面的 token 不能观察到后面 token 的信息而引入的,在推理时所有输入均可以互相看到,并不需要 mask-attention。又考虑到训练和推理时模型架构一致会使得效果更好,因此在后面的 LLM 中,Decoder-block 只包含 self-attention。
4.2 Datasets
数据的质量决定了模型的上限。清洗后的数据需要去除噪声、重复内容以及有害信息。
4.3 Tokenization
整理的各类文本 (各种语言) 首先需要根据段落和语句等裁剪成短文本段落。
然后将短文本段落分解成词序列,此过程为 tokenization,转换的每个单元称为 token。
最后将 token 转换成计算机更容易处理的数字信息(通过 vocab 进行转换)。
如何将文字分词并转换成数字也有一些细节可以深究。比如输入为 live in New York,分词结果可以是
–> live in / New York --> live / in / New York --> live / in / New / York --> l / i / v / e / i / n / N / e / w / Y / o / r / k
–> 乒乓球 \ 拍卖 \ 完了 --> 乒乓 \ 球拍 \ 卖 \ 完了
其中主要包含按词组进行分词、按单词进行分词、按照字母进行分词等几种。不同的分词方式可能会产生不同的含义。
英文:一个单词会包含多种形式:does,done,doing,did。中文:一个汉字可能会包含多种意思。
4.3.1 分词方式
-
基于词典的分词方式
优点:速度快、成本低 缺点:适应性不强,不同领域效果差异大 基本思想是基于词典匹配,将待分词的中文文本根据一定规则切分和调整,然后跟词典中的词语进行匹配,匹配成功则按照词典的词分词,匹配失败通过调整或者重新选择,如此反复循环即可。代表方法有基于正向最大匹配和基于逆向最大匹配及双向匹配法。
-
基于统计的分词方式
优点:适应性较强 缺点:成本较高,速度较慢 这类目前常用的是算法是 HMM、CRF、SVM、深度学习等算法,比如 stanford、Hanlp 分词工具是基于 CRF 算法。以 CRF 为例,基本思路是对汉字进行标注训练,不仅考虑了词语出现的频率,还考虑上下文,具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果。
-
基于深度学习的分词方式
优点:准确率高、适应性强 缺点:成本高,速度慢 例如有人员尝试使用双向 LSTM+CRF 实现分词器,其本质上是序列标注,所以有通用性,命名实体识别等都可以使用该模型,据报道其分词器字符准确率可高达 97.5%。常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。
4.3.2 词典分词方法的颗粒度
按切分的粒度通常分成三大类,一是按词粒度来分,二是按字符粒度来分,三是按 subword(子词粒度来分,最常用)
-
词粒度
词粒度的切分能够非常好地保留完整语义信息,但是如果出现拼写错误、英文中的缩写、不同表示形态等情况,鲁棒性一般。另一方面,词切分会产生非常巨大的词表,而且这都不能确保不会出现 out of vocabulary 问题。
在词粒度分词法中,do、did、done、does 和 dies(拼写错误) 都是作为不同的词,因此最终统计的词表量会非常大。
-
字粒度
字粒度最早应该是 2015 年 Karpathy 提出,英文就是以字母为单位(对于大小写不敏感的任务,甚至可以先转小写再切分)。汉语就是以汉字为单位。
在字粒度中,英文 i want to play football.被分成 i w a n t t o p l a y f o o t b a l l。拆成字母序列后,缺乏断点,难以理解原始语句的含义。且输入长度大幅增加,计算量灾难性增长。
-
Subword 粒度
Subword 粒度是针对字粒度和词粒度的折中方式。针对常用词组,采用词粒度形式,对于罕见单词,采用字粒度形式,在一定程度上减少了词表的数量,又均衡了输入 token 的长度
比如 friendly and lovely.
词粒度:friendly / and / lovely,加上常见的 friend 和 love,词典中会得到 5 个词。Subword 粒度:friend / ly / and / love / ly,词表中只包含 4 个词。
常用分词算法:
Byte Pair Encoding(BPE)、WordPiece、Unigram Language Model(ULM)。
4.3.3 Token 数量的重要性
通常认为模型参数量越大,性能越强。但实际上并非如此,考虑到大模型存在参数冗余,token 数量比参数数量更重要。
如图所示,LLaMA 的 65B 效果可以比肩 GPT-3 的 175B 效果。
下图是一些常用架构的训练数据量。
4.4 Embedding
正如每个颜色(红、黑、绿…)都可以映射到 RGB 三维空间 (255,0,0 0,0,0 0,255,0) 进行表示,每个文本序列转化得到的 token_ids 也可以映射到一组高维空间进行表示。当映射到高维表示后,可以通过计算高维向量之间的距离来表示两个单词含义的相近程度。
embedding 过程也是查表过程,因为它们之间也是一个一一映射的关系。每个 token 都有一个对应的高维表示,这种映射关系在模型训练的过程中一直在更新。
最终会将输入 n 个 token_id,转换为 [n, hidden_size] 的向量矩阵。
简单来说,embedding 可以使用 one-hot 编码 (0,0,0…1…,0,0) 进行区分即可。但是 one-hot 编码不利于计算 token 间的相似度,且 embedding 的长度实质上代表特征的维度数目(如果是 ont-hot 编码,则特征维度的数目需要和字典中的 token 数量相同),实际上训练后得到的结果为(0.5123, 0.12312,…,0.2315,09783)。
4.5 位置编码
经过 embedding 转换之后,已经可以进行 decoder 处理了。但是此时的输入由于是整体输入,没有额外增加位置信息。同一个 token 在不同位置处查表得到的 embedding 相同,经过 attention 计算后的数据也相同,只是位置不一样。但通常认为某个 token 在一句话的不同位置应该表示出不同的含义,因此需要一个额外的操作引入位置信息,使其结果有所区别。
详细内容参考:
让研究人员绞尽脑汁的 Transformer 位置编码 - 科学空间|Scientific Spaces
羡鱼智能:【OpenLLM 009】大模型基础组件之位置编码 - 万字长文全面解读 LLM 中的位置编码与长度外推性(上)
羡鱼智能:【OpenLLM 010】大模型基础组件之位置编码 - 万字长文全面解读 LLM 中的位置编码与长度外推性(中)
但之前看有论文提到,在某些任务上 (非 GPT 任务),不加位置编码也能取得非常好的效果。具体任务具体验证吧
4.5.1 长度外推
大模型在训练时,通常会将段落分割成长度较小的语句,比如 LLaMA1 的最大 token 长度是 2K,LLaMA2 的最大 token 长度是 4K。当输入长度不足时,会以空字符进行 padding。
padding_side="left"和 padding_side="right"均可以,结果没有区别,但代码实现上会有一点区别 DuTim:大部分的大模型 (LLM) 采用左填充 (left-padding) 的原因
但在实际使用时,比如用于聊天机器人时,会希望将整个聊天历史输入进去一起推理,得到更好的回复效果。此时就需要处理超过 2048 个 token 的输入,虽然 transformer 本身可以输入任意长度的输入,但是由于训练时并没有处理过长度超出 2048 的样例,因此处理效果会大打折扣。此时就需要进行长度外推或者对输入 Prompt 进行压缩,使得推理长度超出训练最大长度时,仍能保持推理结果质量。
为什么训练时不采用更大的长度?因为输入 token 越长,占用显存越大,计算量也更大。经测试,每增加 1 个 token,显存占用增加 1M 左右。
考虑到一个较长的 prompt 中,必定会存在一些冗余信息,因此可以对 prompt 进行压缩,但 prompt 压缩如果处理的不够好,很有可能会改变原始输入的含义。
长度外推是比较常用的方式,其中最常用的方法为基于 RoPE 改进的方法:
Transformer 升级之路:7、长度外推性与局部注意力 - 科学空间|Scientific Spaces
Transformer 升级之路:8、长度外推性与位置鲁棒性 - 科学空间|Scientific Spaces
Transformer 升级之路:9、一种全局长度外推的新思路 - 科学空间|Scientific Spaces
Transformer 升级之路:10、RoPE 是一种β进制编码 - 科学空间|Scientific Spaces
4.6 Decoder 处理
经过位置编码后的数据会经过 N 次 DecoderBlock 处理。最终得到输出状态 hidden_status。
DecoderBlock 结构如下图所示
其中包含一个 self-attention、Add(残差)、Norm 和 FFN 模块。
4.6.1 Self-Attention
self-attention 模块是 transformer 的核心,主要包含 Wq、Wk 和 Wv 三个矩阵。计算公式为
分析计算数据的 size 可知,计算复杂度为 O(n^2)。
从苏神的博客可知 线性 Attention 的探索:Attention 必须有个 Softmax 吗?- 科学空间|Scientific Spaces
去掉 softmax 后,复杂度可以得到大幅优化。
还有一些方法关注于减少 transformer 计算量。考虑到 attention 计算时,每个 token 信息会关注到其他所有位置的 token 信息,然而大部分其他的 token 都是与之无关的,因此可以稀疏 attention 计算减少计算量。
王辉:线性 self-attention 的漫漫探索路(1)—稀疏 Attention
GitHub - openai/sparse_attention: Examples of using sparse attention, as in 'Generating Long Sequences with Sparse Transformers'
也有一些方法关注如何减少 transformer 的内存占用。比如 MQA 和 GQA,其中 LLaMa2 就使用了 GQA 的方法减少 attention 内存,由于减少了内存加载的数量,因此也提高了计算速度。
4.6.1.1 Flash-Attention -> Page Attention
对于以 transformer 为基础的架构,IO 瓶颈限制的重要性大于计算瓶颈限制。
因此出现了 flashAttention–pageattention 等技术。通过对矩阵分块处理减少 IO 次数,提高计算速度。
参考文章:呵呵哒:LLM 推理框架 2:vLLM 源码学习
大 batch size(模型训练时)加速效果非常明显
4.6.2 LayerNorm
LLM 中由于输入的 token 长度不同,不便于使用 BatchNorm,通常使用 LayerNorm。
LLaMA 中采用了 RMSNorm,计算量更小,推理速度快。
考虑到 LayerNorm 放置的位置不同,可以分为 PreLayerNorm 和 PostLayerNorm。
4.6.3 FFN 模块
5. 总结与展望
大模型架构的发展日新月异,从最初的 Transformer 到如今的 Decoder-only 主导,再到 RoPE、FlashAttention 等优化技术的引入,每一步都在提升模型的性能与效率。未来,随着硬件算力的提升和数据质量的优化,LLM 将在更多垂直领域发挥关键作用。开发者应重点关注模型的可扩展性、推理效率以及安全性对齐,以适应不断变化的技术环境。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online