Transformer 架构基本原理:Encoder、Decoder 和 Attention 到底在做什么?
一、一句话讲清 Transformer Transformer 是一种处理序列数据的神经网络架构。它最关键的设计是 Self-Attention:让一句话里的每个 token 都能直接和其他 token 建立联系,再按重要程度聚合信息。 这
一、一句话讲清 Transformer
Transformer 是一种处理序列数据的神经网络架构。它最关键的设计是 Self-Attention:让一句话里的每个 token 都能直接和其他 token 建立联系,再按重要程度聚合信息。
这和 RNN 的思路完全不同。RNN 是按顺序从左到右处理,前面的信息要一层层传到后面;Transformer 则是让所有位置在同一层里并行计算,任意两个位置都能直接关联。
二、Transformer 之前,RNN 卡在哪里?
RNN 的最大问题不是“不会处理文本”,而是不适合大规模并行训练。它必须先算第 1 个词,再算第 2 个词,后面的步骤依赖前面的结果。序列越长,这种顺序依赖越明显,GPU 的并行能力也越难发挥。
另一个问题是长距离信息衰减。比如一句话开头的主语,要影响几百个 token 后的动词,RNN 需要经过很多步传递,信息和梯度都会慢慢变弱。Transformer 通过注意力机制让任意两个位置直接连接,把“远距离通信”变成了一步到位。
三、Self-Attention:让每个 token 都会“找重点”
Self-Attention 可以理解为一次“内部检索”。当前 token 拿着自己的 Query 去和所有 token 的 Key 做匹配,匹配分越高,说明越值得关注;然后模型按权重汇总对应的 Value,得到当前 token 的新表示。
这里最容易混淆的是 Q、K、V 从哪里来。它们不是人工写死的,而是从同一个输入 X 经过三个不同的线性投影矩阵算出来的。
# X: [batch_size, seq_len, d_model] |
四、注意力公式其实就四步
注意力公式看起来像数学题,拆开就是四步:先用 Q 和 K 做点积得到相关度分数;再除以 sqrt(d_k) 稳定数值;然后用 softmax 转成权重;最后用这些权重对 V 做加权求和。
import torch |
为什么要除以 sqrt(d_k)?因为 Q 和 K 的维度越大,点积的数值越容易变得很大。数值太大以后,softmax 会变得很尖,几乎只保留最大的一项,其他位置权重接近 0,梯度也容易变小。除以 sqrt(d_k) 后,分数回到更合理的范围,训练更稳定。
五、Multi-Head Attention:不要只从一个角度看关系
单个注意力头只能学习一种关联方式。但语言里的关系很多:主谓关系、宾语关系、位置关系、指代关系、语义相似关系。Multi-Head Attention 的做法是把 Q、K、V 投影到多个子空间,让多个头分别学习不同类型的关系,最后再拼接融合。
这就像多个专家同时看同一句话:有人关注语法,有人关注指代,有人关注上下文主题。最后把这些观点合起来,模型得到的表示就更丰富。
六、一个 Transformer Block 里有哪些部件?
Transformer Block 通常由两大核心模块组成:Multi-Head Self-Attention 和 Feed-Forward Network。Attention 负责从上下文里找信息,FFN 负责对每个位置做非线性加工。
Add & Norm 也很关键。Add 是残差连接,能把输入原样带到后面,避免深层网络把原始信息冲掉;Norm 是归一化,让不同层的数值范围更稳定,训练更容易收敛。
def transformer_block(x, self_attention, ffn, norm1, norm2, mask=None): |
七、Encoder 和 Decoder 到底差在哪?
Encoder 的注意力是双向的。一个 token 可以看到前面的词,也可以看到后面的词,所以它更适合“理解类任务”,比如文本分类、命名实体识别、语义匹配、抽取式问答。
Decoder 的注意力带有因果遮蔽。生成第 N 个 token 时,只能看到前面已经生成的 token,不能提前偷看后面的答案。所以它天然适合“生成类任务”,比如对话、写作、代码生成。
# causal mask:下三角为 1,上三角为 0 |
八、三种架构:Encoder-only、Decoder-only、Encoder-Decoder
Encoder-only 代表是 BERT,一般用来理解文本。Decoder-only 代表是 GPT、LLaMA、Qwen,一般用来生成文本。Encoder-Decoder 代表是 T5、BART,一般用来做输入到输出的转换,比如翻译、摘要、改写。
不是说哪一种永远最好,而是看任务要什么。如果任务重点是“看懂输入”,Encoder 更合适;如果重点是“继续生成”,Decoder 更合适;如果输入和输出结构明显不同,Encoder-Decoder 更自然。
九、为什么现在通用大模型多选 Decoder-only?
现在很多通用大模型选择 Decoder-only,不是因为 Encoder 没价值,而是因为 Decoder-only 的训练目标非常统一:根据前文预测下一个 token。
这个目标足够简单,也足够强大。写文章是续写,聊天是续写,写代码是续写,翻译也可以包装成“根据指令继续生成目标语言文本”。更重要的是,互联网上大量文本天然适合做下一 token 预测,不需要每条数据都人工标注。
所以在大规模预训练时代,Decoder-only 更容易把数据规模、模型规模和任务统一性结合起来。它不是唯一架构,但确实是通用生成式大模型最顺手的选择。
十、面试时怎么总结?
讲 Transformer,不要只背“Encoder、Decoder、Attention”。更好的讲法是先说 RNN 的两个问题:顺序计算慢、长距离关系难学;再说 Self-Attention 怎么让每个 token 直接看到其他 token;接着讲 Q/K/V、sqrt(d_k)、多头注意力和 FFN;最后再解释 Encoder-only、Decoder-only、Encoder-Decoder 的场景差异。
如果能把“为什么现代大模型多选 Decoder-only”讲清楚,文章就会从概念介绍升级成架构理解。重点不是把所有公式堆出来,而是让读者明白:Transformer 的设计,是为了让模型更快、更稳、更容易吃下海量文本。
要点速读
一、一句话讲清 Transformer Transformer 是一种处理序列数据的神经网络架构。它最关键的设计是 Se
- 一、一句话讲清 Transformer Transformer 是一种处理序列数据的神经网络架构
- 它最关键的设计是 Se
- 更多细节仍在持续更新中