写在前面

AI无疑是最近几年最火的东西了,其能力与发展速度都让人惊叹,从17年的Transformer到如今的各种大模型,我们的世界在短时间内发生了翻天覆地的变化。模型的相关技术和知识也在高速更新和发展,其架构从原始transformer,到如今的现代化变体,其应用从prompt工程到RAG再到Agent乃至如今的Harness工程,即使专门记录也要花很多篇幅和时间,所以我打算用十几篇博客快速概述一些过去的技术以及一些底层技术,然后会开始介绍自己的近期学习情况(也就是当前的模型技术内容)。这篇博客就是这个系列的首篇博客,概述原始transformer的一些情况。

过去两年,大语言模型(Large Language Model, LLM)的迭代速度令人瞠目。从最初的 GPT 到如今的 LLaMA、Qwen、DeepSeek 等明星模型,它们看似形态各异,但掀开外壳,内部的骨架其实是同一套逻辑。

然而,真正阻碍初学者入门的,往往不是技术本身有多难懂,而是那堵由生僻词和英文缩写砌成的“名词高墙”——Token、Embedding、RoPE、MHA、GQA、FFN、Pre-Norm…… 每个词单独拎出来都让人一头雾水。

我们的目标很简单:把大模型的“五脏六腑”拆开来看清楚。从数据如何输入,到模型内部如何“思考”,再到最终如何输出,我会沿着一条清晰的数据流,把每一个核心组件讲明白。

准备好了吗?我们从最基础的“数据怎么进入模型”开始。

一、整体概览:一张图看懂 LLM 的“骨架”

在深入细节之前,先给大家一个全局视角。

几乎所有现代大语言模型,底层都基于同一个架构——Transformer。但请注意,今天的 LLM 已经不再是 2017 年论文《Attention is All You Need》里那个原汁原味的 Transformer 了。

研究者们在实践中发现,对其中某些模块进行替换和优化,可以带来显著的性能提升。于是,一套“现代 LLM 默认配置”逐渐成形:

组件经典 Transformer现代 LLM(以 LLaMA 为代表)
注意力机制MHA(Multi-Head Attention)GQA(Grouped Query Attention)
位置编码绝对位置编码 / Learned PERoPE(旋转位置编码)
前馈网络激活ReLU / GELUSwiGLU
归一化LayerNorm + Post-NormRMSNorm + Pre-Norm

这就是目前 LLaMA、Qwen、Mistral、DeepSeek 等主流模型共同遵循的“标配”。

把这些组件串起来,一条完整的数据处理链路是这样的:

原始文本 → Tokenizer(分词) → Embedding(向量化) → + 位置编码(RoPE)
       ↓
   [Transformer Block] × N 层
       ↓
   Pre-Norm → Attention(GQA) → 残差连接
       ↓
   Pre-Norm → FFN(SwiGLU) → 残差连接
       ↓
   最终输出层 → 预测下一个 Token

接下来,我们就沿着这条链路,一个模块一个模块地拆解。

二、Tokenizer:把人类语言翻译成模型能懂的“数字密码”

2.1 Tokenizer 是做什么的?

大模型不认识汉字、字母或标点符号,它只“吃”数字。Tokenizer 的工作,就是把一段人类写的文本,切分成一个个小碎片,然后映射成模型词表中的数字 ID。

比如,输入一句话:“我爱大语言模型”,Tokenizer 可能会把它切成:

["我", "爱", "大", "语言", "模型"] → [231, 452, 789, 1023, 88]

这些数字序列,就是模型真正接收的“原料”。而每一个被切出来的碎片,就叫做一个 Token(词元)

2.2 主流分词算法有哪些?

目前大模型中常用的分词算法主要有三种:

  • BPE(Byte Pair Encoding) :通过统计语料库中高频出现的字符对,不断合并,逐步构建词汇表。优点是能有效处理未登录词(OOV),词汇量可控。缺点是对中文这类无空格语言的支持较弱。
  • WordPiece:Google 为 BERT 开发的算法,原理与 BPE 类似,但合并策略基于最大似然估计。它在子词前添加 ## 标记,更适合英文处理。
  • SentencePiece:一种语言无关的分词器,将文本视为 Unicode 字符序列,不依赖空格分词。对中文、日文等无空格语言特别友好,而且支持可逆转换。LLaMA、Mistral、Gemma 等主流模型都采用了 SentencePiece。

2.3 为什么分词这么重要?

分词器的设计直接影响模型的性能和效率。一个不好的分词器可能导致:

  • OOV(未登录词)问题:遇到词表中没有的词,只能映射到 [UNK],信息直接丢失。
  • 中文分词灾难:把“大语言模型”切成“大”、“语”、“言”、“模”、“型”,语义完全破碎。
  • 词汇表爆炸:词汇表太大,模型参数量急剧膨胀,训练和推理成本激增。

因此,选择一个合适的分词器,是构建高质量 LLM 的第一步。

三、Embedding:让词语在数学空间里“安家”

3.1 从 Token ID 到向量

经过 Tokenizer,我们得到了一串数字 ID,但这些 ID 本身没有语义信息。ID 231 和 ID 452 之间,有什么内在联系吗?模型无从知晓。

Embedding(词嵌入) 的作用,就是把每一个 Token ID,映射到一个高维空间中的向量(通常是几百到几千维的浮点数数组)。

举个例子,假设 Embedding 维度是 4096(LLaMA-7B 的配置),那么 Token ID 231 会被转换成一个包含 4096 个数字的向量:

Token ID: 231 → Embedding: [0.023, -0.451, 0.789, ..., 0.112](4096 维)

3.2 为什么 Embedding 这么神奇?

Embedding 的美妙之处在于:在这个高维数学空间里,语义相近的词,它们的向量在几何空间中也靠得很近

比如,“国王”和“王后”的向量距离会很近,“苹果”和“水果”的向量距离也很近。而“苹果”和“汽车”的向量则相距甚远。

这种性质不是人工定义的,而是通过在海量语料上进行训练,让模型自己“学会”的。Embedding 本质上是一种分布式的语义表示,它把离散的符号(词语)映射到了连续的向量空间,使得后续的神经网络能够进行高效的数学运算。

3.3 一个小问题:位置信息去哪了?

仔细想想,Embedding 只包含了词语的语义信息,但完全没有告诉模型这些词语在句子中的位置关系。

“我爱你”和“你爱我”,由完全相同的三个词组成,但意思截然不同。如果模型不知道词语的顺序,它就无法理解这种差异。

这就是位置编码(Positional Encoding) 要解决的问题——我们接下来重点讲。

四、RoPE:让模型知道“谁在前,谁在后”

4.1 为什么需要位置编码?

Transformer 的核心机制是 Attention(后面会详细讲),而 Attention 本身对输入序列的顺序是不敏感的。如果你把一句话的词序打乱,然后丢给一个没有位置信息的 Transformer,它看到的 Embedding 集合是一样的,自然无法区分顺序。

因此,必须在 Embedding 的基础上,注入位置信息,告诉模型每个 Token 在句子中的位置。

4.2 从绝对位置编码到 RoPE

早期的 Transformer 使用的是绝对位置编码——给每个位置分配一个固定的向量,直接加到 Embedding 上。比如位置 0 加向量 A,位置 1 加向量 B……这种方法的缺陷是:模型很难泛化到训练时没见过的长序列长度。

后来,研究者发现,相对位置信息 更重要——模型应该关心“词 A 和词 B 之间相隔多少距离”,而不是“词 A 在绝对的第几个位置”。

于是,RoPE(Rotary Position Embedding,旋转位置编码) 应运而生。

4.3 RoPE 的核心思想:用旋转来编码相对位置

RoPE 的核心想法非常优雅:通过对 Query 和 Key 向量施加一个与位置相关的旋转操作,使得两个 Token 的点积结果天然包含它们的相对位置信息

具体来说,RoPE 将每个 Token 的向量看作复数,然后根据它在序列中的位置,将其旋转一定的角度。位置越靠后,旋转的角度越大。

这样做的神奇之处在于:两个 Token 的 Query 和 Key 做内积时,结果只依赖于它们之间的相对位置差(m – n),而不是各自的绝对位置。

用公式来表达,假设 Token m 的 Query 向量为 (q_m),Token n 的 Key 向量为 (k_n),经过 RoPE 旋转后:

[
q_m \cdot k_n = f(x_m, x_n, m – n)
]

其中 (x_m)、(x_n) 是各自的词嵌入向量,(m – n) 就是相对位置差。

4.4 为什么 RoPE 成为“标配”?

RoPE 有几个显著优势:

  1. 天然编码相对位置:不需要额外学习位置参数,相对位置信息直接内嵌在向量运算中。
  2. 长度外推能力好:理论上可以处理比训练时更长的序列。
  3. 计算高效:实现简单,对 Attention 计算的改动很小。

正因如此,LLaMA、Gemini、DeepSeek、Qwen 等几乎所有主流 LLM 都采用了 RoPE 作为位置编码方案。

五、Attention 全家桶:MHA → MQA → GQA

终于来到了 LLM 最核心的模块——Attention(注意力机制) 。这是 Transformer 的灵魂所在。

5.1 Attention 在做什么?

Attention 的核心思想可以用一句话概括:在处理当前词时,让模型能够“注意”到上下文中所有相关的词,并给它们分配不同的重要性权重

举个例子,句子“苹果很好吃”中,处理“很”这个字时,模型应该更多地关注“苹果”和“好吃”,而较少关注句号。这种“选择性关注”就是 Attention 的魔力。

5.2 Self-Attention 的计算流程

标准的 Self-Attention 计算分为以下几步:

第一步,对于每个输入 Token,通过三个不同的权重矩阵 (W_Q)、(W_K)、(W_V) 投影,得到三个向量:

  • Query(查询向量) :代表“我在找什么”。
  • Key(键向量) :代表“我是什么”。
  • Value(值向量) :代表“我的内容是什么”。

第二步,计算 Query 和所有 Key 的相似度(点积),得到注意力分数矩阵,然后通过 Softmax 归一化为权重:

[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
]

其中 (d_k) 是向量的维度,除以 (\sqrt{d_k}) 是为了防止点积值过大导致 Softmax 梯度消失。

第三步,用这些权重对 Value 进行加权求和,得到最终的输出。

5.3 MHA:多头注意力——多角度“观察”

如果只有一个注意力头,模型可能只能捕捉到一种语义关系(比如只关注语法,忽略了语义)。为了解决这个问题,Transformer 提出了MHA(Multi-Head Attention,多头注意力)

MHA 的做法是:把 Query、Key、Value 拆分成多个“头”,每个头独立计算 Attention,最后把所有头的输出拼接起来:

[
\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \text{head}_2, …, \text{head}_h)W^O
]

每个头可以关注不同的语言特征——有的头关注句法,有的头关注指代,有的头关注情感。多个头合在一起,模型就有了更丰富的表达能力。

5.4 推理瓶颈:KV Cache 带来的显存压力

这里有一个工程上的关键问题。

在自回归生成(逐词生成)过程中,模型每次生成一个新词,都需要计算它与之前所有词的 Attention。如果每次从头算一遍,计算量会以平方级增长。

于是,工程师们发明了 KV Cache 技术:把已经算过的 Key 和 Value 向量缓存起来,生成下一个词时直接复用,避免重复计算。

但问题来了:MHA 中每个头都有自己独立的 K 和 V。序列越长、头数越多,KV Cache 占用的显存就越大。这成了大模型推理效率的瓶颈。

5.5 MQA:让所有头共享同一份 K 和 V

为了压缩 KV Cache,研究者提出了 MQA(Multi-Query Attention,多查询注意力)

MQA 的核心思想很简单:让所有注意力头共享同一份 Key 和 Value,只有 Query 保持独立。这样 KV Cache 的大小直接缩小到原来的 1/h(h 是头数)。

代价是:表达能力有所下降。毕竟所有头都在用相同的 K 和 V 来计算 Attention,模型捕捉多样化语义的能力受到了限制。

5.6 GQA:在效率和效果之间找到平衡

GQA(Grouped Query Attention,分组查询注意力) 是 MHA 和 MQA 之间的“折中方案”。

GQA 的做法是:将 Query 头分成若干组(比如 8 个头分成 2 组,每组 4 个头),每组内的 Query 头共享同一份 Key 和 Value

这样既保持了比 MQA 更强的表达能力(多个组可以学习不同的注意力模式),又显著压缩了 KV Cache(相比 MHA 缩小了数倍)。

实际效果非常出色:GQA 在保持接近 MHA 质量的同时,实现了接近 MQA 的推理速度

LLaMA-2/3 系列在 70B 大模型上采用了 GQA,Qwen、Mistral 等模型也纷纷跟进,使其成为现代 LLM 的标配。

💡 进阶延伸:DeepSeek 在 GQA 的基础上更进一步,提出了 MLA(Multi-head Latent Attention,多头潜在注意力) ,通过引入潜在空间投影和动态路由,进一步压缩 KV Cache 并提升推理效率。这个话题我们会在后续系列文章中专门展开。

六、FFN 与 SwiGLU:模型的“知识存储器”

6.1 FFN 的作用

Attention 负责让模型知道“哪些词之间有关系”,但光靠 Attention 是不够的——模型的“知识”和“推理能力”主要存储在 FFN(Feed-Forward Network,前馈网络) 中。

FFN 的结构非常简单,就是一个两层的全连接网络:

[
\text{FFN}(x) = W_2 \cdot \sigma(W_1 \cdot x + b_1) + b_2
]

其中 (\sigma) 是激活函数,(W_1) 将输入维度放大(通常放大 4 倍),(W_2) 再缩回原来的维度。

这个看似简单的结构,实际上承担了模型的大部分参数(约 2/3),可以说是 LLM 的“知识存储器”。

6.2 从 ReLU/GELU 到 SwiGLU

早期 Transformer 的 FFN 使用的是 ReLU 或 GELU 作为激活函数。但近年来,一种叫做 SwiGLU 的激活函数逐渐成为主流。

SwiGLU 的全称是 Swish Gated Linear Unit,它的核心创新是引入了一个门控机制

[
\text{SwiGLU}(x) = (\text{Swish}(x W_1) \odot x V) W_2
]

这里发生了什么?输入 x 被投影成两路:

  • 一路经过 Swish(也叫 SiLU) 激活函数,作为“门控信号”,决定哪些信息可以通过。
  • 另一路直接作为“值信号”,承载实际的内容信息。
  • 两路做逐元素乘法,再投影回原维度。

这种“门控 + 值”的双路设计,让网络能够动态地选择性地传递信息,而不是像传统 FFN 那样把输入一股脑地丢进激活函数。这使得模型有了更强的非线性表达能力和更好的训练稳定性。

6.3 为什么 SwiGLU 更好?

相比 ReLU,Swish 函数在负值区域不是直接置零,而是保留了平滑的非零值。这带来了几个好处:

  1. 梯度流动更顺畅:没有“死神经元”问题,训练更稳定。
  2. 表达能力更强:门控机制让模型能根据输入动态调整信息流。
  3. 收敛更快:在实际训练中,SwiGLU 通常能更快达到更低的 loss。

Meta 的 LLaMA 系列、阿里的 Qwen 系列、Mistral 等主流模型,都已经将 FFN 升级为 SwiGLU。

七、归一化与残差:让深层网络“稳得住”

7.1 为什么需要归一化?

LLM 的层数动辄几十上百层(LLaMA-70B 有 80 层)。随着网络变深,一个经典问题出现了:梯度爆炸和梯度消失——前面的层梯度太大导致参数震荡,后面的层梯度太小导致学不动。

归一化(Normalization) 就是用来解决这个问题的。它通过对每一层的输出进行标准化,让数值分布保持稳定,从而让训练能够顺利进行。

7.2 LayerNorm vs RMSNorm

经典的 Transformer 使用的是 LayerNorm(层归一化) ,其公式为:

[
\text{LayerNorm}(x) = \frac{x – \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \beta
]

其中 (\mu) 是均值,(\sigma^2) 是方差,(\gamma) 和 (\beta) 是可学习的缩放和偏移参数。

LayerNorm 效果不错,但计算均值和方差有一定开销。于是,研究者提出了一个简化版——RMSNorm(Root Mean Square Normalization)

[
\text{RMSNorm}(x) = \frac{x}{\text{RMS}(x)} \cdot \gamma
]

RMSNorm 只计算均方根(RMS),去掉了均值的计算。虽然牺牲了“中心化”的能力,但实践表明最终效果和 LayerNorm 差不多,而计算效率更高。

因此,LLaMA、Qwen、DeepSeek 等模型都采用了 RMSNorm 作为归一化方式。

7.3 Pre-Norm vs Post-Norm:谁在前,谁在后?

归一化放在哪里,同样至关重要。有两种选择:

  • Post-Norm:归一化放在子层(Attention 或 FFN)之后。这是 2017 年原版 Transformer 的设计。
  • Pre-Norm:归一化放在子层之前

在实践中,研究者发现 Post-Norm 在深层网络(几十层以上)中容易导致训练不稳定,梯度传播不够平滑。而 Pre-Norm 在残差连接之前做归一化,能够显著改善梯度的传播,让深层网络的训练更加稳定。

因此,现代大模型几乎清一色地采用 Pre-Norm + RMSNorm 的组合

八、总结与展望

8.1 一张全景“标配”清单

回顾全文,现代 LLM 的架构“标配”可以总结为下表:

组件经典方案现代 LLM 标配核心优势
TokenizerBPE/WordPieceSentencePiece(BPE)语言无关,中文友好
位置编码绝对位置编码RoPE相对位置,长序列泛化
注意力MHAGQA平衡效果与效率
FFN 激活ReLU/GELUSwiGLU门控机制,更强表达
归一化LayerNorm + Post-NormRMSNorm + Pre-Norm训练稳定,计算高效

LLaMA、Qwen、Mistral、DeepSeek 等主流模型,在架构上都遵循了这套“黄金配方”。

8.2 数据流全景回顾

让我们再把整条数据流串起来复习一遍:

  1. Tokenizer 将原始文本切成 Token,映射为数字 ID。
  2. Embedding 将每个 Token ID 转换为高维向量。
  3. RoPE 对向量施加旋转操作,注入相对位置信息。
  4. Transformer Block(重复 N 层):
  • Pre-Norm(RMSNorm) 稳定数值分布。
  • GQA(分组查询注意力) 让模型“注意”到上下文中相关的 Token。
  • 残差连接 保留原始信息,防止梯度消失。
  • Pre-Norm(RMSNorm) 再次归一化。
  • FFN(SwiGLU) 对信息进行非线性变换,存储知识。
  • 残差连接 再次保留信息。
  1. 最后通过输出层预测下一个 Token,如此循环直到生成完整回答。

作者

884705373@qq.com

相关文章

QLoRA微调原理详解:与LoRA的性能与内存对比

引言:为什么大模型微调需要QLoRA? 在深...

读出全部

关于Norm的解析

可以说,如果没有残差连接和 Layer No...

读出全部

从 SGD 到 AdamW 的优化器

写在前面 在上一篇文章中,我们讨论了如何用数...

读出全部