Transformer 是现代大语言模型的核心架构之一。它最早在机器翻译任务中被提出,但后来逐渐成为自然语言处理、代码生成、多模态模型等领域的基础结构。
如果只用一句话概括 Transformer:它通过注意力机制,让序列中的每个 token 都能根据上下文动态地获取信息,并通过堆叠多层结构学习复杂的语义关系。
本文根据我的Transformer 学习笔记整理而成,目标是把核心概念串成一条清晰的学习路径:输入如何表示,注意力如何计算,编码器和解码器如何协作,模型又是如何训练的。
1. Transformer 的整体执行流程
经典 Transformer 由编码器和解码器两部分组成。编码器负责理解输入序列,解码器负责根据已经生成的内容和编码器输出,逐步生成目标序列。
编码器流程
编码器接收原始输入文本后,首先将文本转成 token,再通过词嵌入和位置编码得到模型可以处理的向量表示。
随后,每一层编码器都会依次经过:
多头自注意力机制;
残差连接和层归一化;
前馈神经网络;
再次残差连接和层归一化。
原始 Transformer 论文中,编码器层重复堆叠 6 次。经过多层处理后,每个 token 的表示都融合了整个输入序列中的上下文信息。
解码器流程
解码器用于生成输出序列。它的输入不是完整答案,而是当前已经生成的 token。在训练阶段,解码器输入通常是右移一位后的目标序列;在推理阶段,则是模型一步步生成出来的内容。
每一层解码器大致包含三个子层:
带因果掩码的多头自注意力;
编码器-解码器交叉注意力;
前馈神经网络。
最后,解码器输出会经过线性层映射到词表大小,再通过 Softmax 得到下一个 token 的概率分布。模型选择一个 token 作为输出,并循环执行,直到生成结束符。
2. 词嵌入:把离散 token 变成连续向量
自然语言本身不能直接输入神经网络。模型需要先把文本切分成 token,然后把每个 token 映射成向量。
最朴素的表示方式是独热编码。假设词表大小为 V,那么每个 token 可以表示为长度为 V 的向量,其中只有一个位置为 1,其余位置都是 0。
但独热编码有两个明显问题:
向量非常稀疏;
不包含语义相似性。
例如,“猫”和“狗”在语义上更接近,但它们的独热向量之间并不能体现这种关系。
词嵌入矩阵解决了这个问题。它是一个可训练的参数矩阵,形状通常为:
V × D
其中,V 是词表大小,D 是嵌入维度。原始 Transformer 中 D 为 512。
每个 token ID 都可以从词嵌入矩阵中查出一个长度为 D 的稠密向量。训练过程中,这些向量会不断调整,使语义相近的词在向量空间中更接近。
在原始 Transformer 中,词嵌入还会乘以 (\\sqrt{D}),用于调整词向量的数值尺度,使其更好地与位置编码相加。
3. 位置编码:为模型注入顺序信息
Transformer 的自注意力机制本身并不关心 token 的顺序。如果只输入词向量,模型无法区分“我喜欢你”和“你喜欢我”。
因此,Transformer 需要额外的位置编码来表示每个 token 在序列中的位置。
原始论文使用正弦和余弦函数构造位置编码:
[ PE_{(pos, 2i)} = \\sin\\left(\\frac{pos}{10000^{2i/D}}\\right) ]
[ PE_{(pos, 2i+1)} = \\cos\\left(\\frac{pos}{10000^{2i/D}}\\right) ]
其中,pos 表示 token 的位置,i 表示向量维度索引,D 表示模型维度。
位置编码不会与词向量拼接,而是逐元素相加:
模型输入 = 词向量 + 位置编码
这样,每个 token 的输入表示既包含语义信息,也包含位置信息。
4. 自注意力机制:让每个 token 看向上下文
自注意力机制是 Transformer 的核心。
它的目标是:对序列中的每个 token,计算它应该关注其他 token 的程度,然后根据这些权重汇总上下文信息。
可以把自注意力理解为三个角色:
-
Query:当前 token 想要查找什么信息;
-
Key:每个 token 能提供什么线索;
-
Value:每个 token 真正携带的内容。
对某个 token 来说,它会用自己的 Query 与所有 token 的 Key 计算相似度。相似度越高,说明越应该关注该 token。然后模型使用 Softmax 把相似度转成权重,再用这些权重对 Value 加权求和。
5. 缩放点积注意力的计算过程
在矩阵形式中,输入矩阵 X 的形状为:
L × D
其中,L 是序列长度,D 是模型维度。
输入 X 分别乘以三个可训练矩阵,得到 Q、K、V:
Q = XW_Q
K = XW_K
V = XW_V
然后计算注意力分数:
[ \\text{scores} = \\frac{QK^T}{\\sqrt{d_k}} ]
接着按行执行 Softmax,得到注意力权重矩阵 A:
[ A = \\text{Softmax}\\left(\\frac{QK^T}{\\sqrt{d_k}}\\right) ]
最终输出为:
[ \\text{Attention}(Q,K,V) = A \\cdot V ]
这里除以 (\\sqrt{d_k}) 是为了防止点积结果过大。如果分数过大,Softmax 容易进入饱和区,梯度会变得很小,训练不稳定。
6. 多头注意力:从多个角度理解上下文
单个注意力头只能在一个表示空间中学习 token 之间的关系。多头注意力则把注意力计算并行执行多次,每个头使用不同的 (W_Q)、(W_K)、(W_V)。
原始 Transformer 使用 8 个注意力头。每个头都可以学习不同类型的关系,例如:
-
局部依赖;
-
长距离依赖;
-
语法结构;
-
指代关系;
-
语义关联。
多个头的输出会在特征维度上拼接起来,再经过一个线性变换 (W_O) 进行融合。
多头注意力的价值在于,它让模型可以从多个子空间同时观察同一句话,从而获得更丰富的表达能力。
7. Mask:让注意力只看该看的内容
Transformer 中常见的 Mask 有两类:填充掩码和因果掩码。
填充掩码
在一个 batch 中,不同句子的长度通常不同。为了并行计算,短句需要补齐到相同长度。这些补齐位置没有真实语义,所以模型不应该关注它们。
填充掩码的做法是在计算 (QK^T) 后,把填充位置对应的分数设为 (-\\infty) 或一个极小的负数。经过 Softmax 后,这些位置的注意力权重会接近 0。
填充掩码通常会用于编码器自注意力、解码器自注意力以及交叉注意力。
因果掩码
因果掩码主要用于解码器的自注意力。
解码器在生成第 i 个 token 时,只能看到当前位置及之前的 token,不能看到未来 token。否则,训练时模型就会“偷看答案”,破坏自回归生成的设定。
因此,因果掩码会把所有 (j > i) 的位置设为 (-\\infty)。换句话说,位置 i 只能关注位置 j 满足:
j <= i
这保证了解码器只能基于已知内容预测下一个 token。
8. 残差连接与层归一化:让深层网络更容易训练
Transformer 堆叠了多层注意力和前馈网络。如果没有稳定训练的设计,深层网络很容易出现梯度消失、梯度爆炸或收敛困难。
残差连接的形式是:
[ \\text{Output} = \\text{Input} + \\text{Sublayer}(\\text{Input}) ]
它允许梯度绕过子层直接回传,从而缓解深层网络训练困难的问题。残差连接也让模型更容易学习恒等映射,避免网络越深性能反而退化。
层归一化则会对每个样本在同一层的特征维度进行归一化:
[ \\text{LN}(x) = \\frac{x – \\mu}{\\sigma} \\cdot \\gamma + \\beta ]
其中,(\\gamma) 和 (\\beta) 是可学习参数。
相比批量归一化,层归一化更适合变长序列,因为它不依赖 batch 维度的统计量。
原始 Transformer 采用 Post-LN 结构,也就是:
子层输出 → 残差连接 → 层归一化
而许多现代架构更倾向于使用 Pre-LN:
层归一化 → 子层输出 → 残差连接
9. 前馈神经网络:逐位置的非线性变换
除了注意力层,每个 Transformer 层中还有前馈神经网络。
它的结构很简单:
线性层 → 激活函数 → 线性层
原始 Transformer 使用 ReLU 激活函数,对应公式为:
[ \\text{FFN}(x) = \\max(0, xW_1 + b_1)W_2 + b_2 ]
前馈网络通常会先把维度从 D 扩展到 4D,再压回 D:
D → 4D → D
需要注意的是,FFN 是逐位置独立执行的。也就是说,每个 token 都会经过同一套 FFN 参数,但不同 token 之间不会在 FFN 中直接交互。token 之间的信息交换主要发生在注意力层中。
10. 交叉注意力:连接编码器和解码器
交叉注意力只出现在解码器中,用于让解码器读取编码器输出。
在交叉注意力中:
-
Q 来自解码器当前层的上一子层输出;
-
K 和 V 来自编码器的最终输出。
计算形式为:
[ \\text{CrossAttention}(Q{\\text{dec}}, K{\\text{enc}}, V{\\text{enc}}) = \\text{Softmax}\\left(\\frac{Q{\\text{dec}}K{\\text{enc}}^T}{\\sqrt{d_k}}\\right)V{\\text{enc}} ]
它的作用是让解码器在生成每个 token 时,都能动态关注输入序列中最相关的部分。
在机器翻译任务中,这种机制可以理解为源语言和目标语言之间的对齐。例如,生成某个中文词时,解码器可以重点关注英文原句中对应的词或短语。
11. Transformer 的训练过程
以机器翻译为例,Transformer 的训练可以分为四个步骤。
第一步,源序列进入编码器。输入文本经过词嵌入和位置编码后,送入多层编码器,最终得到上下文表征 (EncOut)。
第二步,目标序列进入解码器。训练时通常使用 Teacher Forcing,也就是把真实目标序列右移一位后作为解码器输入,并在开头加入起始符 <sos>。
例如,目标序列是:
我 爱 学习 <end>
解码器输入可以是:
<sos> 我 爱 学习
模型要预测的标签则是:
我 爱 学习 <end>
第三步,解码器输出经过线性层和 Softmax,得到词表上每个 token 的概率分布。模型用这些概率分布与真实标签计算交叉熵损失,并通常忽略填充位置的 loss。
第四步,通过反向传播计算梯度,并使用优化器更新模型中的所有可训练参数,包括嵌入层、注意力层、前馈网络和输出层。
Teacher Forcing 可以让训练更稳定,因为模型在训练时看到的是正确的历史 token,而不是自己之前可能生成错误的 token。
但即使使用真实标签作为输入,因果掩码仍然是必要的。它保证模型在预测当前位置时不能看到未来标签。
12. 从 Transformer 到大语言模型
大语言模型的核心训练任务通常是自回归预测,也就是根据前面的文本预测下一个 token。
这个任务看起来像“词语接龙”,但当数据规模、参数规模和计算规模足够大时,模型会被迫学习大量压缩后的知识和模式,包括:
-
语法结构;
-
事实知识;
-
常识关联;
-
推理模式;
-
代码结构;
-
数学规律。
因此,虽然训练目标只是预测下一个 token,模型却可能涌现出问答、翻译、代码生成、数学推理等更复杂的能力。
这也是 Transformer 架构影响深远的原因:它不仅提高了序列建模的效率,也为大规模预训练模型提供了可扩展的结构基础。
总结
Transformer 的关键思想可以概括为以下几点:
词嵌入把离散 token 转换成连续语义向量;
位置编码为模型补充顺序信息;
自注意力让每个 token 能动态关注上下文;
多头注意力让模型从多个表示子空间学习关系;
Mask 控制模型能看到哪些位置;
残差连接和层归一化保证深层网络稳定训练;
前馈网络提供逐位置的非线性变换;
交叉注意力连接编码器和解码器;
自回归训练让模型在大规模数据中学习可泛化的模式。
如果把 Transformer 看作一个整体,它并不是某个单一技巧的胜利,而是一组结构设计的组合:注意力机制负责信息交互,位置编码补足顺序,残差与归一化保证可训练性,前馈网络增强表达能力。
理解这些组件如何协作,是继续学习 BERT、GPT、T5、LLaMA 等大模型架构的基础。




