Transformer 架构
30 分钟入门
2017 年 Vaswani 等人发表的《Attention Is All You Need》提出了 Transformer,从此奠定了现代大模型的骨架。本文用最少的数学讲清楚它为什么有效。
核心问题:如何让序列里的元素互相"看到"对方
在 Transformer 之前,序列建模主要靠 RNN/LSTM:信息沿时间步流动,越远越难传递;CNN 则用滑动窗口聚合局部信息。两者都难以高效捕捉长程依赖。
Transformer 给出的回答非常直白:让序列里每一个 token 直接和其他所有 token 计算一次相关度,然后按相关度加权汇聚信息。这就是注意力机制。
自注意力:Q、K、V 三件套
输入序列被映射成三组向量:Query、Key、Value。对每个位置 i:
- 用它的 Query 与所有位置的 Key 做点积,得到一组打分;
- 除以
√d_k做缩放,再 softmax 得到注意力权重; - 用这组权重对所有位置的 Value 做加权求和,作为该位置的新表示。
Attention(Q, K, V) = softmax( Q · Kᵀ / √d_k ) · V
直觉:Query 在问"谁与我相关?",Key 在回答"我代表什么?",Value 才是真正被汇聚的信息。
多头注意力:让模型同时关注多种关系
只算一组 Q/K/V 的话,模型只能学到一种"相关性视角"。多头注意力让模型并行学习若干组投影,比如一组关注语法依赖,另一组关注共指,再一组关注词义相似度,最后把所有头的输出拼接并线性变换。
位置编码:把"顺序"显式喂给模型
注意力本身是置换不变的——把句子打乱不影响 softmax 的结果。但语言显然有顺序,所以必须把"我是第几个 token"以某种形式编码进去。常见做法:
- 正余弦位置编码:固定函数生成,原始论文采用。
- 可学习位置 Embedding:把位置当成另一个词表去学。
- RoPE / ALiBi:把位置信息融入注意力分数,便于外推到更长上下文。
每个 Block 的标准结构
一层 Transformer Block 由两块组成:
x = x + MultiHeadAttention( LayerNorm(x) )
x = x + FeedForward( LayerNorm(x) )
两个关键点:
- 残差连接:让梯度可以直接穿过深层网络,是能堆到几十、几百层的前提。
- FeedForward:通常是两层 MLP,中间维度比 hidden 大几倍,承担"非线性变换"的工作。
Encoder、Decoder 与 Decoder-only
- Encoder-only:BERT 一脉,擅长理解类任务,注意力是双向的。
- Encoder-Decoder:原始 Transformer、T5,常用于翻译、摘要等"输入→输出"明确分开的任务。
- Decoder-only:GPT 一脉,使用因果掩码让每个位置只能看到自己和之前的位置,正是当今 LLM 的主流形态。
为什么它最终赢了
- 并行友好:所有位置可以同时计算,与 GPU 高度契合。
- 长程依赖:任意两个位置之间是 O(1) 的"距离",比 RNN 友好得多。
- 可扩展:层数、宽度、上下文长度都可以加倍,效果随之稳定提升。
- 架构通用:文本、图像、音频、代码都能套用,几乎成了"AI 的标准件"。
下一步
有了 Transformer 这块骨架与一个训练好的 LLM,下一步就是让它用上外部资料,看看 检索增强生成 RAG 是怎么做到的。