为什么 Transformer 值得单独讲一篇
上一篇我们讲了 Attention(注意力机制)——它解决了 RNN 处理长文本时的两大难题:信息瓶颈和无法并行。但 Attention 始终是 RNN 的"外挂",主体还是 RNN。
2017 年 Google 的一篇神文 Attention Is All You Need,把这件事推到了极致:干脆把 RNN 全部干掉,整个模型就用 Attention 搭建。这个架构就是 Transformer。
类比:上一篇说 Attention 像是给 RNN 加了一副"可以回头看"的眼镜,但 RNN 还是那个只能一步一步走的蜗牛。Transformer 直接把蜗牛壳扔了——让 Attention 当骨架,重新搭了一个四条腿可以并行走路的结构。
Transformer 是怎么诞生的?
原论文标题本身就是一个回答:"Attention Is All You Need"——只要 Attention 就够了。你不再需要 RNN、LSTM、CNN 这些复杂的序列建模结构,只用 Attention 就能达到甚至超过它们的效果。
Transformer 诞生的标志性事件是:
| 时间 | 事件 |
|---|---|
| 2017 年 6 月 | Google 发表 Attention Is All You Need |
| 2017 年底 | 在 WMT 2014 英德、英法机器翻译任务上拿下 SOTA |
| 2018 年 | BERT、GPT 等基于 Transformer 的预训练模型井喷 |
| 2022 年底 | ChatGPT 发布,Transformer 成为大模型时代的基石 |
理解 Transformer 的结构,是理解今天所有大模型(GPT-4、文心一言、Gemini、Llama 等)的底层基础。
一、Transformer 整体长什么样?
我们先抛掉所有细节,从最高视角看一眼整个模型。Transformer 本质上还是个 seq2seq 结构——左边编码,右边解码——只是编码器和解码器从 RNN 换成了基于 Attention 的模块:
把它"看成一个黑盒",输入是法语文本序列,输出是英语文本序列:
拆开黑盒,就是经典的 encoder-decoder 结构:
把 encoder 内部和 decoder 内部再展开,就是 6 层 encoder + 6 层 decoder(原论文用的层数,这个 6 不是固定的,可以调):
类比:Transformer 的多层结构像一个工厂流水线。每个车间(层)负责把原料(词向量)加工得更精细。原料进入第 1 车间,被打磨一次,送入第 2 车间,再打磨一次……经过 6 个车间后,出来的东西已经是高品质的成品。不同车间可以做不同的事——前几个车间专门抓语法结构,中间几个抓语义关系,最后几个抓语用信息。
PM 视角:为什么 Transformer 不像 RNN 那样"深度大"(比如 100 层)?因为每层内部已经做了很多事(多头 Attention、FFNN 等),层数不需要太深。这告诉我们一个产品启示——不要追求"模型越大越好",而是要找到效果和成本的最优平衡点。 GPT-3 有 96 层、1750 亿参数,所以单次推理贵得离谱;很多业务场景下 6~12 层的小 Transformer 就够用了。
二、单层 Encoder 的构成
每一层 Encoder 由两个子层组成:
- Self-Attention 层(自注意力层)
- 前馈神经网络(FFNN, Feed-Forward Neural Network)
工作流程:
- 输入:每个词的 embedding 向量 $x_1, x_2, ..., x_n$(维度 $d$)
- Self-Attention 层处理后:$h_1, h_2, ..., h_n$(每个 $h_i$ 都融合了上下文信息)
- FFNN 再处理一遍:得到新的 $x_1, x_2, ..., x_n$
- 这些 $x_i$ 继续传给下一层 encoder,重复上述过程
类比:Self-Attention 像是"小组讨论"环节——让每个词先听听其他词怎么说,融合大家的意见;FFNN 像是"个人消化"环节——融合完意见后,每个词再独立思考整理。这种"先讨论后消化"的两步走,是 Transformer 每层的标准动作。
三、单层 Decoder 的构成
Decoder 比 Encoder 多一个子层:Encoder-Decoder Attention 层(也叫 cross-attention)。这一层让 Decoder 在生成每个词时,能"回头看" Encoder 的输出:
三个子层分别是:
- Masked Self-Attention:自己看自己(带掩码,看不到未来的词)
- Encoder-Decoder Attention:Q 来自 Decoder,K/V 来自 Encoder
- FFNN:常规前馈网络
类比:Decoder 像一个翻译官在交传——他边听边译,但他只能翻译"已经听到的部分"(Masked Self-Attention 保证看不到未来),并且每翻译一句都要回头核对原文(Encoder-Decoder Attention)。
四、输入处理:词向量 + 位置向量
Transformer 处理输入的第一步,是把每个词变成向量。这有两步:
4.1 词向量(Word Embedding)
用 embedding 算法把每个词变成一个向量(比如 4 维示意,真实场景是 256 或 512 维):
4.2 位置向量(Positional Encoding)
但是!Transformer 没有 RNN/LSTM 那种天然的"顺序感"。RNN 是逐字读的,所以它知道"第 1 个词在前面,第 2 个词在后面"。Transformer 是一次性把整句话喂进去——它需要一种额外的方式告诉模型"这个词在哪个位置"。
这就是位置向量的作用——给每个词向量"加上"一个代表位置的向量:
类比:Transformer 像一个把整本书"摊开在桌上"一次性扫描的人。这种读法的好处是能并行,坏处是分不清词的前后——"苹果手机"和"手机苹果"如果只看摊开的两个词,对机器来说是一样的。位置向量就是给每个词贴一个"门牌号"——1 号、2 号、3 号——让模型知道谁在前、谁在后。
PM 视角:为什么位置信息这么重要?想象一下,如果不告诉模型"苹果"和"手机"哪个在前哪个在后,模型可能会以为"苹果手机"和"手机苹果"是同一个东西。位置编码是 Transformer 区别于词袋模型(Bag-of-Words)的关键。 作为 PM,你以后看到"RoPE"、"ALiBi"这些词,都是位置编码的不同实现方案——不用懂原理,但要明白它们都在解决同一个问题。
具体的位置向量怎么算?原论文给的公式是:
$$ PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}}) $$
$$ PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}}) $$
其中:
- $pos$ 是词的位置(0、1、2、...)
- $d_{model}$ 是位置向量的维度
- $i$ 是维度下标($i \in [0, d_{model})$)
为什么用 sin 和 cos?是因为这两个函数有周期性——这意味着位置编码可以泛化到训练时没见过的句子长度。
五、Self-Attention:Transformer 的灵魂
这一节是整篇文章的核心。Self-Attention 的"自"意思是:句子里的每个词,都要把注意力分给同一句话里的所有其他词,包括自己。
5.1 为什么需要 Self-Attention?
看这个经典例子:
"The animal didn't cross the street because it was too tired."
句子里的 it 指的是谁?人一看就知道是 animal,但对模型来说这是个难题——可能是 animal,也可能是 street。
Self-Attention 机制让模型自动学会把 it 和 animal 关联起来:
类比:Self-Attention 像一个学生在做阅读理解。每读完一个词,他都会回头看一下整段话,确认这个词到底在指什么。"it" 单独看是模糊的,但回头看了"animal"和"tired"之后,就清楚了。
PM 视角:这是 AI 产品中"指代消解"问题的核心技术。比如你的客服系统收到用户问题:"这个东西能退款吗?"——这里的"这个东西"指的是哪件商品?Self-Attention 让模型能"读懂"这种模糊指代。
5.2 Self-Attention 的 6 步计算过程
我们以 "Thinking Machines" 两个词为例,演示 Self-Attention 的 6 步计算:
第 1 步:每个词向量 $X_i$ 乘以 3 个不同的权重矩阵,得到 3 个向量:$Q_i$(Query,查询)、$K_i$(Key,键)、$V_i$(Value,值):
类比:你去图书馆找一本书,Q 是你想找的书名(比如"机器学习"),K 是书架上每本书的标签,V 是书的内容。Q 和 K 越相关(点积越大),你越会"关注"对应的 V。
第 2 步:计算 Attention Score。比如算 Thinking 的注意力分数,就是把 Thinking 的 $q_1$ 跟所有词的 $k_i$ 做点积:
第 3 步:把分数除以 $\sqrt{d_k}$($d_k$ 是 Key 向量的维度)。除以这个数是为了让训练时梯度更稳定。
第 4 步:softmax 归一化,把分数变成概率(加起来等于 1):
第 5 步:每个 $V_i$ 乘以自己的分数。
第 6 步:把加权后的 $V_i$ 加起来,得到当前位置的输出 $z_1$:
PM 视角:如果你跟算法工程师开会,他们说"我们在算 QK^T",说的就是这个过程。Self-Attention 的本质就是:计算"我对其他词的关注度",然后按关注度加权汇总信息。
5.3 矩阵形式:实际代码怎么算
上面是按"词"一步步算的,实际代码里我们用矩阵一次性算完所有词。
输入矩阵 $X$(每一行是一个词的 embedding):
$$ X = [X_1; X_2; ...; X_n] $$
三个权重矩阵 $W^Q, W^K, W^V$ 是模型要学习的参数。算出 Q、K、V 矩阵:
$$ Q = X W^Q, \quad K = X W^K, \quad V = X W^V $$
最后用一行公式算出 Self-Attention 输出:
$$ Z = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
PM 视角:你不需要会写这段代码,但要明白 "矩阵运算让 Self-Attention 天然适合 GPU 并行"。这是 Transformer 训练速度远超 RNN 的根本原因——产品启示是:当你评估一个 NLP 模型的训练成本时,Transformer 架构往往是性价比最高的选择。
六、多头注意力(Multi-Head Attention):让模型"多角度看问题"
单个 Self-Attention 头有个局限:它只能从"一个角度"看句子。比如翻译 "it" 时,可能重点看了 "animal",但忽略了 "tired"。
多头注意力的解决方案是:同时用多组 $W^Q, W^K, W^V$(每组叫一个 head),每个 head 学到不同的关注模式。
原论文用了 8 个 head。每个 head 独立计算,得到 8 个输出矩阵:
但下游的 FFNN 只需要一个矩阵,所以把 8 个 head 的结果拼起来,再乘一个权重矩阵 $W^O$ 做一次线性变换:
完整流程放在一起:
回到 "it" 的例子,不同的 head 关注不同的词:
图中:
- 一个橙色 head 把注意力放在 "the animal"
- 一个绿色 head 把注意力放在 "tired"
类比:多头注意力就像一个专家团队会诊一个病人。内科医生看的是生理指标,外科医生看的是解剖结构,影像科医生看的是片子——同一份病历,每个人从自己的专业视角提取不同特征,最后汇总成综合诊断。Transformer 的多个 attention head 就是在做这件事:每个 head 学不同的关注模式,最后拼起来。
PM 视角:多头机制的本质是"让 AI 像专家团队一样协作"——每个 head 是一个"专才",有的关注主语,有的关注动词,有的关注情感。当 AI 产品需要处理复杂场景时(比如法律合同的多重条款审查、医疗报告的多维度提取),多头机制天然适合。你以后听到"模型有 32 个 attention head",就知道这意味着模型能同时从 32 个角度分析问题。
七、残差连接 & Layer Normalization
到目前为止,我们算了 Self-Attention 的输出。但单层 Encoder 还有两个关键操作:残差连接 + 层标准化。
Encoder 的每个子层(Self-Attention 和 FFNN)都用了残差连接和 LayerNorm:
把 Self-Attention 内部的 LayerNorm 细节也画出来:
把两层 Transformer 的所有内部细节都画出来,是这个样子:
类比:残差连接就像高速公路的"应急车道"——主路上堵车(梯度消失)走不动时,信息可以从应急车道绕过去。这让几十层、上百层的网络还能稳定训练。
PM 视角:残差连接解决了深度网络的"梯度消失"问题——简单说就是让模型能训得动几十层、上百层。这是深度学习能 scale up 的关键技术。你不用懂数学,但要明白一个产品结论:基于 Transformer 的大模型可以做到 100+ 层深,本质上是因为残差连接 + LayerNorm 解决了深度训练难题。
八、Decoder 是怎么工作的?
Encoder 部分讲完了,现在看 Encoder 和 Decoder 如何配合:
Decoder 的每个时间步:
- 接收上一个时间步生成的词作为输入
- 通过 Self-Attention 看到之前生成的所有词
- 通过 Encoder-Decoder Attention 看到 Encoder 的全部输出
- 经过 FFNN 输出当前时间步的词
- 重复,直到生成结束符
整体动态过程:
Decoder 里的 Self-Attention 和 Encoder 里的有两点关键区别:
| 区别点 | Encoder Self-Attention | Decoder Masked Self-Attention |
|---|---|---|
| 看到未来词吗 | 可以(看到整句话) | 不可以(只能看到当前位置及之前) |
| 实现方式 | 普通 Attention | 在 Softmax 之前把未来位置设为 $-\infty$ |
为什么 Decoder 要"看不到未来"?因为训练时如果模型提前看到了答案,那就没意义了——它必须学会一步一步、自左向右地生成。这就像考试时不能偷看答案——必须现场推演。
九、线性层 + Softmax:从向量到单词
Decoder 最后一个时间步的输出是一个浮点数向量,怎么变成具体的单词?
通过一个线性层(全连接层)+ Softmax:
假设词表大小是 10000("the"、"a"、"translation"、... 等 10000 个英文单词):
- 线性层把 Decoder 输出映射成一个 10000 维的 logits 向量
- 每个维度对应一个单词的分数
- Softmax 把分数转换为概率(加起来等于 1)
- 取概率最大的那个单词作为这一步的输出
PM 视角:这就是为什么 AI 有时会"胡说八道"——它本质上是从概率分布里挑一个词。如果某个上下文让模型把高概率放在了一个奇怪的词上,输出就会很奇怪。这告诉我们:AI 输出永远不应该被原样呈现给用户,必须做后处理(事实校验、敏感词过滤、置信度提示)。
十、损失函数:模型是怎么"学习"的
训练时,模型每个时间步都会输出一个概率分布。我们希望它输出的分布和正确答案尽可能接近。
下图展示了训练初期——模型输出的概率分布几乎是随机的(每个词的概率差不多):
通过反向传播 + 梯度下降,模型逐渐学会把高概率放在正确答案上:
训练充分后,模型在每个时间步都能给出接近真实的概率分布:
损失函数可以用欧氏距离、交叉熵(cross-entropy)、KL 散度等。这部分是算法工程师关心的,作为 PM 你只需知道:有大量标注数据 + 合适的损失函数 = 模型能学会任务。 数据是产品的护城河,不是算法。
十一、推理策略:Greedy Decoding vs Beam Search
模型每个时间步从概率分布里挑词的方式,叫解码策略:
- Greedy Decoding(贪心解码):每步都挑概率最大的词。简单、快,但可能不是全局最优。
- Beam Search(集束搜索):每步保留 top-k 个候选(比如 k=5),下一步基于这 5 个候选分别展开,最后选整体概率最高的序列。效果更好,但计算量成倍增加。
类比:贪心解码像下象棋每步都走"看起来最好"的那一步,但可能错过几步之后的精妙组合。Beam Search 像保留前 5 个候选局面往下推演,能找到更好的全局解,但代价是慢。
PM 视角:当你的 AI 产品响应太慢时,先问问算法工程师:"解码用的什么策略?能不能 beam size 砍半?"——这是产品性能优化的常见入口。
十二、关键 takeaway:作为 PM 你需要记住什么?
如果你只能从这篇文章里带走三句话,我希望是这三句:
1. Transformer = 注意力机制 + FFNN + 残差连接 + 位置编码的组合拳。
它抛弃了 RNN,全用 Attention,并行计算能力拉满,成为现代大模型的基石架构。
2. Self-Attention 让模型在处理每个词时都能"看全"整句话。
这是 Transformer 强大表达能力的根本来源。
3. BERT = Transformer Encoder + 预训练 + 微调,奠定了 NLP "通用底座"的范式。
这让所有 NLP 团队第一次拥有"拿来即用"的基座模型,业务落地周期从月级降到天级。
由此延伸的产品决策启示:
| 业务场景 | Transformer/BERT 的启示 |
|---|---|
| 长文档处理 | 模型天然支持长上下文,但要小心显存——512 token 和 4096 token 成本差 8 倍 |
| 多语言翻译 | 同一个 Transformer 可以训出几十种语言的对齐能力——多语言 SaaS 产品可复用一套模型 |
| 实时对话 | Decoder 必须串行生成(一个字一个字吐),延迟是产品体验的关键约束 |
| 内容审核 | BERT 适合做"理解"类任务(分类、情感、命名实体识别),可直接用预训练模型微调 |
| 客服 FAQ | BERT 的句子相似度能力可以让用户问"怎么退款"自动匹配知识库答案 |
| 中文 NLP 产品 | 中文 BERT(RoBERTa-wwm-ext、ERNIE 等)已经成熟,效果比英文版本只差一点点 |
参考资料
补充阅读:
- Vaswani et al., 2017, Attention Is All You Need
- Devlin et al., 2018, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
- Jay Alammar: The Illustrated Transformer
- Jay Alammar: The Illustrated BERT
📖 延伸阅读:BERT 的完整内容已拆为独立文章,详见 AI产品经理入门指南(四)--BERT、GPT 与 T5。
































Comments | NOTHING