一句话回答:Transformer 是一种让模型在处理一句话、一个段落或一张被切分后的图片时,能同时查看所有相关部分,并据此更新每个部分含义的神经网络架构。
它不是一个"会思考的单一零件",而是一套可反复堆叠的处理流程。每一层都重复两件事:
- 看看其他位置,收集和自己有关的信息;
- 加工收集到的信息,使自己的表示更有意义。
这套方法最早由 2017 年论文《Attention Is All You Need》提出,用于机器翻译。现在,文本生成、问答、检索、图片识别等很多模型都建立在它或它的变体之上。
1. 从一个真实问题开始:词的意思要看上下文
看这句话:
小猫追着球跑,它很开心。
人很容易知道"它"大概率指"小猫"。但计算机看到的最初只是一些符号:小猫、追、球、它......它需要一种机制来判断:处理"它"时,应该重点参考句中的哪个词?
Transformer 的答案是:让"它"向整句话提问,并根据相关程度从每个词取回信息。
它不会只按从左到右的顺序,把前面的内容压缩进一个固定状态;而是可以直接建立"它"和"小猫"之间的联系。这个能力叫作 Self-Attention(自注意力)。
可以把它想成阅读时做的事:
text
读到"它"
↓
回看整句话
↓
发现"小猫"最相关,"球"次之,其他词较弱
↓
带着这个上下文,更新"它"的含义
这里的"注意"不是人类主观意识,而是模型计算出的一组权重。
2. Transformer 到底接收什么,又输出什么?
模型不能直接计算汉字或单词,所以会先把输入切成 token(词元)。词元可以是一个词、一个字,或一个常见的字符片段。
例如:
text
输入文本:我喜欢苹果
词元: [我] [喜欢] [苹果]
每个词元随后会被转换成一串数字,称为 embedding(嵌入向量)。向量不是人为写好的词典释义,而是在训练中逐渐学到的数值表示。
text
词元 向量(示意,真实模型通常有数百或数千维)
[我] → [ 0.2, -0.5, 0.8, ...]
[喜欢] → [-0.1, 0.3, 0.6, ...]
[苹果] → [ 0.7, 0.1, -0.2, ...]
这些向量进入多层 Transformer 后,会变成"结合上下文后的向量"。也就是说,句中"苹果"的向量不只表示"苹果"这个词,还会带有"被我喜欢"这一语境的信息。
整体流程可以记成:
3. 核心内容:自注意力如何"看上下文"?
对序列中的每个位置,Transformer 会从它的当前向量中生成三份不同用途的信息:
| 名称 | 英文 | 作用 | 直觉类比 |
|---|---|---|---|
| 查询向量 | Query,记作 Q | 当前词想寻找什么信息 | "我现在要找谁?" |
| 键向量 | Key,记作 K | 当前词有哪些特征,可供别人匹配 | "我能否回答你的问题?" |
| 值向量 | Value,记作 V | 当前词能真正提供的内容 | "如果你关注我,带走哪些信息?" |
仍以"小猫 追着球跑,它很开心"为例。当模型处理"它"时:
- 用"它"的 Q 与每个词的 K 计算匹配分数;
- 分数越高,说明该词越值得参考;
- 将所有分数转成总和为 1 的权重;
- 用这些权重,对所有词的 V 做加权平均;
- 得到"它"在当前上下文中的新向量。
一个纯示意的计算结果可能是:
text
"它"对各词的关注权重:
小猫 0.70 ██████████████
球 0.20 ████
跑 0.07 █
其他 0.03
因此,新"它"的向量主要带入"小猫"的信息。这些权重不是规则工程师预先规定的,而是模型通过大量训练样本学到的。
3.1 公式是上面过程的压缩写法
如果你刚入门,不需要背公式;只要理解它表达了"匹配 → 得到权重 → 汇总信息"。
Attention(Q,K,V)=softmax(dk QKT+M)V
对应关系是:
| 公式部分 | 人话解释 |
|---|---|
| QKT | "我和谁相关?"的分数表 |
| dk | 缩小分数,避免数值过大导致训练不稳定 |
| M | 规定哪些位置不允许看 |
softmax |
把分数转成注意力权重 |
| 乘 V | 按权重取回各位置携带的信息 |
这里的 dk 是键向量的维度。Softmax 是一种把任意分数转换为非负权重、且一行权重总和为 1 的函数。
还要注意两个细节:
- 模型不是先在字典里标记"小猫是名词、跑是动词"再计算;这些语法和语义规律也是从数据与任务目标中统计学习的。
- 深层 Transformer 的输入不是原始词向量。前一层已经让"小猫"吸收了"追着球跑"的上下文,所以后面的层匹配到的可能是"正在追球的小猫"这个上下文化表示,而非孤立的"小猫"二字。
所以,Self-Attention 真正解决的核心问题是:它提供了一种可微分的、可由训练自动调节的"从所有位置按需取信息"机制。它不手写语言规则,而是让"该看谁、看多少"成为能被训练的参数结果。
4. 为什么要有位置信息?
仅用自注意力时,模型能看到有哪些词,却天然不知道它们的先后顺序。
text
我 喜欢 你
你 喜欢 我
两句话的词集合相同,但意思不同。为此,Transformer 会为第 1、2、3......个位置准备位置向量,并直接加到词元嵌入向量上:
text
"我"的输入向量 = "我"的词义向量 + 第 1 个位置的向量
"喜欢"的输入向量 = "喜欢"的词义向量 + 第 2 个位置的向量
这个机制叫作 Positional Encoding(位置编码)。
原始论文使用正弦和余弦函数生成固定位置编码;现代模型也常使用可学习位置向量或旋转位置嵌入。实现不同,但目的始终一致:让模型同时知道"是什么"与"在哪里"。
5. 为什么不只做一次注意力,而要"多头"?
只做一次注意力,好比只用一个视角阅读一句话。多头注意力让模型同时使用多组独立的 Q、K、V:
text
同一句话
├─ 头 1:可能更关注相邻词
├─ 头 2:可能更关注主谓关系
├─ 头 3:可能更关注指代关系
└─ 头 4:可能更关注远距离关联
↓
合并所有视角
这称为 Multi-Head Attention(多头注意力)。
"可能"非常重要:没有人把每个头人工指定成"语法头"或"指代头";模型自行学习分工。有的头会出现容易解释的规律,有的则不一定能用简单语言命名。
多头注意力的价值是:模型不必把所有关系都挤进同一个相似度计算里,而能从多个表示空间同时收集信息。PyTorch 的官方 MultiheadAttention 模块实现的就是这种原始结构。官方文档
6. 为什么生成文字时不能偷看答案?
假设模型要学习补全:
text
今天 天气 很 好
训练时,预测"天气"时绝不能直接看到后面的"很 好",否则模型只是在抄答案。于是,生成类 Transformer 会使用 Causal Mask(因果掩码):
text
当前位置:第 3 个词
可以看: 第 1、2、3 个词
不能看: 第 4 个词及以后
这使模型学习"基于已知内容预测下一个词"。真正生成时,它会这样循环:
text
已有内容 → 预测下一个词 → 把新词加入已有内容 → 再预测
这种逐个生成的方式叫 Autoregressive(自回归)生成。
另有一种掩码叫 Padding Mask(填充掩码),用于忽略为了凑齐批量长度而补上的无意义位置。
7. 一层 Transformer 除了注意力,还做什么?
自注意力负责"和其他位置交流",但每个位置还需要自己加工获得的信息。因此,一个标准层还有三个关键部件。
前馈网络
前馈网络(Feed-Forward Network)会对每个位置的向量分别做非线性变换。
可以把注意力看成"向同学收集资料",把前馈网络看成"自己消化整理资料"。它不会让词与词直接交流;词与词的交流主要发生在注意力层。
残差连接
残差连接会把层的原输入直接加回输出:
text
新结果 = 当前模块处理结果 + 原来的信息
这样做可以避免深层网络轻易丢掉已有信息,也有助于训练。
层归一化
Layer Normalization(层归一化)会调节一个向量内部数值的尺度,让各层的数值更稳定,训练过程更容易收敛。
所以可以把一层 Transformer 记为:
text
先交流:多头自注意力
再整理:前馈网络
中间始终保留原信息:残差连接
并让数值保持稳定:层归一化
8. Encoder 和 Decoder:原始 Transformer 如何翻译?
原始论文的 Transformer 有两部分。
编码器:读懂输入
编码器一次看到完整的源句子,例如:
text
I love apples.
经过多层处理后,每个词都获得融合上下文的表示。
解码器:逐步写出输出
解码器根据编码器提供的输入信息,并结合已经写出的内容,逐步生成:
text
我 → 我 喜欢 → 我 喜欢 苹果 → 我 喜欢 苹果 。
解码器有两种"看":
- 掩码自注意力:看已经生成的目标文本,不能看未来;
- 编码器---解码器注意力:在生成每个词时,回看输入句子的相关部分。
后来,Transformer 演化出不同结构:有的只保留编码器,擅长理解和分类;有的只保留带因果掩码的解码器,擅长续写和对话;也有的保留完整编码器---解码器结构,适合翻译、摘要等"输入到输出"的任务。
9. 模块一句话记住
| 模块 | 用一句话理解 |
|---|---|
| Embedding(嵌入向量) | 把词元变成模型能计算的数字向量。 |
| Position Encoding(位置编码) | 告诉模型每个词元在序列中的位置。 |
| Self-Attention(自注意力) | 决定当前词元该重点参考哪些词元。 |
| Multi-Head Attention(多头注意力) | 从多个独立视角同时建立词元之间的关系。 |
| Mask(掩码) | 规定哪些信息不能看,例如未来答案或填充符。 |
| Feed-Forward Network(前馈网络) | 对每个词元收集到的信息进行独立加工。 |
| Residual Connection(残差连接) | 保留原信息,让深层网络更容易训练。 |
| Layer Normalization(层归一化) | 让各层数值更稳定。 |
| Encoder(编码器) | 读懂和表示输入内容。 |
| Decoder(解码器) | 依据已有内容和输入信息逐步生成输出。 |
10. 最终心智模型
第一次学习 Transformer 时,不要把它理解成一堆公式。先把它想成一个不断开会的小组:
text
每个词元先带着自己的初始信息进入会议
↓
每个词元查看其他词元,并挑选有用信息
↓
每个词元更新自己对当前上下文的理解
↓
重复多层后,得到更抽象、更有上下文的表示
↓
根据任务,输出分类、翻译结果或下一个词
Transformer 的核心不是"记住前文",而是"在每一层动态决定该从哪里取信息"。
参考资料
以下资料均为原始论文或主流框架官方文档: