Transformer架构:从零开始的完整指南
🔔 本专栏《AI核心原理30讲》:专注AI核心原理,回归技术本质。每篇追求一个目标------让复杂的东西变简单。
一、从"记性不好"说起
要理解Transformer,最简单的切入点是它的"前任"------RNN(循环神经网络)。
想象一下,你读一本侦探小说。读到第50页的时候,RNN要做的事情是:合上书,试图靠脑子里的几句话概括前49页的所有情节。它只能用最后那几个"隐藏状态"来代表整本书的信息。
这就是RNN的根本缺陷:信息是一步一步传递的,就像用竹签串糖葫芦,串到后面的时候,最前面那颗山楂的味道早就淡得差不多了。
当序列变长(比如翻译一篇5000词的论文),RNN就会出现长期依赖问题------早期的重要信息在层层传递中已经被稀释得面目全非。
二、Attention机制:让每个词都"看到"全文
2015年,Bahdanau等人提出了Attention机制。这个想法朴素却致命地有效:
翻译的时候,不要只盯着上一个词,而是去看整个句子。
具体怎么做?拿英译中举例:
输入: "The animal didn't cross the street because it was too tired"
输出: "这种动物没有穿过街道,因为它太累了"
这句话里,"it"到底指什么? 是"street"还是"animal"?
人类读到这个句子会自然地回看,找到"animal",因为"动物"才可能"太累"。Attention机制就是在做这件事------它让模型在翻译"it"的时候,加权地看向"animal"和"street",最终给"animal"更高的权重。
Attention的核心公式:
Attention(Q, K, V) = softmax(QK^T / √d_k) × V
别被公式吓到。拆开来看:
- Q(Query):我当前要翻译的词,"it"在问"谁是it?"
- K(Key):所有词都在喊"我是谁谁谁",每个词都有一个Key
- V(Value):词的实际内容
Q和K做点积,得到相似度分数;除以√d_k是为了防止点积过大导致梯度消失;softmax归一化后得到权重;最后用权重对V做加权求和。
翻译成大白话就是:用我(Q)的问题,去和所有人(K)的回答做匹配,找到最相关的几个,然后取他们的值(V)。
三、Self-Attention:自己看自己
真正的革命来自Self-Attention。这个概念出现在2017年的经典论文《Attention is All You Need》中。
它和普通Attention的区别在于:
- 普通Attention:源序列和目标序列之间的交互(翻译场景)
- Self-Attention:序列内部自己玩,自己看自己
还是翻译"The animal didn't cross the street"这句话。当处理到"didn't"这个词的时候,Self-Attention让它能够同时"看到":
- "The animal"(主语是谁)
- "cross the street"(在做什么)
- "tired"(为什么没做)
这就是Transformer的核心能力------并行看到全序列,不像RNN必须一个个词顺序处理。
四、Multi-Head Attention:多角度理解
一个Attention头只能学到一种"看问题的方式"。Multi-Head就是同时用多个脑袋从不同角度分析。
论文中用了8个head。每个head有自己独立的W_Q、W_K、W_V权重矩阵。你可以理解为:
- Head 1:关注语法结构------主谓宾在哪里
- Head 2:关注指代关系------谁指向谁
- Head 3:关注语义相似------哪些词意思相近
- Head 4:关注位置关系------谁在谁旁边
- ......
最后把8个head的输出拼接起来,再做一个线性变换。
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) × W_O
这样做的好处是什么?模型可以从多个子空间同时学习不同类型的依赖关系。 研究表明,不同的head确实会学到不同的模式------有的专门处理语法,有的处理语义,有的处理位置。
五、Positional Encoding:给模型一双"耳朵"
Attention机制本质上是无序的------它对输入序列的顺序是"盲"的。
"The cat sat on the mat" 和 "The mat sat on the cat",用Attention来处理,产生的表示可能几乎一样。
但语言是有顺序的。"我打你"和"你打我"意思完全相反。
所以需要Positional Encoding,给每个位置一个独特的"门牌号"。
论文用的公式是:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
用正弦余弦交替的原因:每个位置的编码是唯一的,且可以用线性变换相互转换------这让模型能够学习到相对位置关系(比如"i在j的左边3步")。
后来也有很多变体,比如BERT用的学习式位置编码,RoPE用的旋转编码等,但核心思想都是把位置信息注入到表示中。
六、编码器与解码器
完整的Transformer是编码器-解码器架构:
输入 → [编码器] → 上下文向量 → [解码器] → 输出
编码器(Encoder):
- 6层相同结构堆叠
- 每层:Self-Attention + Feed Forward
- 每个子层周围有残差连接,然后做LayerNorm
解码器(Decoder):
- 也是6层
- 每层:Masked Self-Attention + Encoder-Decoder Attention + Feed Forward
- "Masked"的意思是:预测第N个词的时候,只能看到第1到第N-1个词,不能偷看后面的内容------这叫因果掩码(Causal Mask)
- Encoder-Decoder Attention层:Q来自解码器,K和V来自编码器输出------这是翻译过程中"对照原文"的关键步骤
七、Feed Forward Network:非线性变换
每个编码器/解码器层里,除了Attention,还有一个全连接前馈网络:
FFN(x) = max(0, xW_1 + b_1)W_2 + b_2
这是一个两层MLP,第一层展开维度是2048(4倍隐藏层大小),用ReLU激活;第二层映射回原始维度。
Attention负责**"看全局",FFN负责"消化和提炼"**。两者的分工很清晰。
八、LayerNorm与残差连接
每个子层都有残差连接:
output = LayerNorm(x + Sublayer(x))
残差连接让梯度可以直接流过,缓解深层网络的梯度消失问题。LayerNorm则是对每个样本做均值方差归一化,让训练更稳定。
九、数字能说明一些问题
Transformer的关键参数(以base版本为例):
| 组件 | 数值 |
|---|---|
| 模型维度 d_model | 512 |
| Attention头数 h | 8 |
| 每个头的维度 d_k | 64 |
| FFN隐藏维度 | 2048 |
| 编码器/解码器层数 | 6 |
| 注意力参数量 | ~4 × d_model² = ~1M |
原始Transformer在WMT 2014英德翻译任务上达到了28.4 BLEU(当时SOTA),训练成本在当时约为25,000美元/次。
十、为什么Transformer这么重要
回顾一下它的核心贡献:
- 并行化:摆脱了RNN的顺序依赖,训练速度大幅提升
- 全局视野:任意两个位置之间可以直接交互,路径长度O(1)
- 可扩展性:堆更多的层、更大的维度、更宽的head,都能work
- 通用性:从NLP出发,现在已经扩展到CV、语音、代码、多模态......
BERT用编码器做预训练,GPT用解码器做自回归生成。ViT把图像切成patch当作token。Whisper用Transformer做语音识别。AlphaFold2用Transformer预测蛋白质结构。
Transformer这篇论文,引用量已经超过10万次。《Attention is All You Need》几乎以一己之力重塑了整个深度学习领域。
如果你想进一步深入,可以关注这几个方向:
- Flash Attention:IO-aware的高效注意力实现,让长上下文成为可能
- RoPE / ALiBi:位置编码的改进,解决外推问题
- Grouped Query Attention:Llama、Mistral等模型采用的注意力变体
- Sparse Attention:降低二次复杂度的一些尝试
本文参考资料:《Attention is All You Need》(Vaswani et al., 2017)及后续相关研究。
📢 关注作者,第一时间获取更新。本专栏持续更新中,下一篇:《RNN与LSTM:记忆的救赎》。
有任何疑问欢迎留言讨论。