注意力机制到底是什么?一张图讲明白
2026-09-12
注意力机制到底是什么?一张图讲明白
你可能已经在各种AI新闻里看过无数次"注意力机制"这个词了。Transformer、BERT、GPT,这些模型的名字后面,几乎都会跟着一句"基于注意力机制"。但注意力机制到底在干嘛?为什么它能让GPT写文章、让翻译软件翻得越来越准?
我刚开始学的时候也一头雾水,直到有人用了一个特别简单的比喻,我才突然想通了。今天我就把这个比喻分享给你,再配上一张图,争取让你十分钟之内彻底搞懂。
先别管公式,想想你在读这句话
来看这句话:"小明把书放在了桌子上,因为它太重了。"
我问你,"它"指的是什么?
你大概率会说是"书",而不是"桌子"。为什么?因为你的大脑在做一件事:你在判断"它"这个词应该跟前面哪个词关联最紧密。"太重了"这个描述更符合书,而不是桌子。
这就是注意力机制干的事情——在处理某个词的时候,决定该把多少"注意力"分配给句子里的其他词。
图里画的就是这么回事:每个词都会去看一眼句子里的所有其他词,然后给它们打分。分高的,说明关系大,信息就多拿一点过来;分低的,就少拿甚至不拿。
Q、K、V:注意力机制的三个主角
Transformer里,注意力机制有三个核心角色,分别叫Query(查询)、Key(键)、Value(值)。名字听着唬人,其实用图书馆找书来理解特别顺。
想象你走进一个图书馆:
- Query 是你脑子里想找的东西,比如"我想找一本讲宋朝历史的书"
- Key 是每本书书脊上的标签,比如"唐朝历史""宋朝经济""明清小说"
- Value 是书里的实际内容
你拿自己的需求(Query)去跟每一本书的标签(Key)做匹配。匹配度最高的那本,你就抽出来仔细读(Value)。匹配度低的,你翻都不翻。
注意力机制就是在做这个匹配过程,只不过它是对句子里的每个词同时做这件事。每个词都发出一个Query,去跟所有词的Key算相似度,算出来的分数经过Softmax归一化变成权重,最后用这些权重去加权求和所有的Value。
一句话总结:注意力就是加权求和,权重来自Query和Key的相似度。
一张图看懂全过程
如果上面那段文字你还是觉得抽象,我们直接上流程图:
输入句子: [小明] [把] [书] [放在] [桌子] [上] [因为] [它] [太] [重] [了]
以"它"为例:
Query(它)
|
┌───────┼───────┬───────┬───────┐
↓ ↓ ↓ ↓ ↓
Key(小明) Key(书) Key(桌子) Key(因为) ...
| | | | |
相似度 相似度 相似度 相似度
0.05 0.72 0.15 0.08 (Softmax后)
| | | | |
↓ ↓ ↓ ↓ ↓
Value(小明) Value(书) Value(桌子) Value(因为)
| | | | |
└───────┴───加权求和──┴───────┘
|
"它"的新表示
(吸收了72%来自"书"的信息)
你看,经过这一轮计算,"它"这个词的新表示里,有72%的信息来自"书"。模型处理到"它"的时候,就知道这货指的是书,不是桌子。
这就是为什么GPT能理解上下文。它不是死记硬背,而是在每一步动态地决定该关注哪些词。
多头注意力:一个人看不过来,那就多找几个人
单个注意力头只能捕捉一种关系。但语言里的关系太复杂了——有语法关系、有指代关系、有语义关联、还有位置远近的关系。
所以Transformer用了多头注意力(Multi-Head Attention)。原论文用了8个头,每个头有自己独立的Q、K、V权重矩阵。你可以理解成8个不同的人同时读同一句话,每个人关注的点不一样。有人专门盯主谓宾,有人专门盯代词指代,有人专门盯修饰关系。
最后把这8个人的结论拼在一起,再过一个线性层融合。这比单头注意力强得多。后来的GPT-3用了96个头,每个头的维度是128。
为什么注意力机制这么能打
跟RNN对比一下就清楚了。RNN处理序列是一个词一个词按顺序来的,第100个词要等前面99个词都算完。这有两个问题:一是慢,没法并行;二是长距离依赖容易丢失,前面的信息传到后面已经衰减得差不多了。
注意力机制直接让任意两个位置之间建立连接,距离是1步,不是100步。而且所有位置的注意力可以同时计算,GPU并行起来效率极高。这也是为什么Transformer能训到千亿参数,RNN做不到。
| 对比项 | RNN/LSTM | 注意力机制 |
|---|---|---|
| 计算方式 | 顺序计算 | 全部并行 |
| 长距离依赖 | 容易丢失 | 直接连接 |
| 训练速度 | 慢 | 快(可并行) |
| 可扩展性 | 有限 | 极强 |
当然注意力也有代价。它的计算复杂度是O(n²),n是序列长度。序列翻倍,计算量翻四倍。这也是为什么处理超长文本一直是个难题,后来才有了各种稀疏注意力、滑动窗口注意力的改进方案。
自己动手感受一下
如果你想亲手验证,装个transformers库,几行代码就能看到注意力权重:
from transformers import AutoTokenizer, AutoModel
import torch
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModel.from_pretrained("bert-base-chinese", output_attentions=True)
inputs = tokenizer("小明把书放在了桌子上,因为它太重了", return_tensors="pt")
outputs = model(**inputs)
# outputs.attentions 是一个tuple,每层一个tensor
# 形状: (batch, num_heads, seq_len, seq_len)
attn = outputs.attentions[-1][0] # 最后一层
print(attn.shape) # torch.Size([12, 17, 17])
拿到注意力矩阵后,你可以看看"它"对应的那一行,权重最高的位置是不是落在"书"上面。我试过,大部分头确实指向"书",少数头会看"桌子"或者"重"。这也说明不同头学到的模式确实不一样。
搞懂注意力机制之后,再看Transformer的论文,你会发现整个架构其实就是注意力堆出来的:编码器一堆自注意力,解码器一堆自注意力加交叉注意力,再加上前馈网络和残差连接。核心思想就那么一个,剩下的都是工程上的优化和堆叠。
希望这张图和这个图书馆的比喻,能帮你把注意力机制这个东西真正装进脑子里。下次再看到"Attention is All You Need"这个标题,你应该会心一笑了。