神经网络 · 第 06 条 · 结构
注意力机制与 Transformer
注意力机制只做了一件事:让序列里的每个位置都能直接看到其他所有位置。就这一句话,解释了它为什么这么强。
先看它解决了什么问题
在注意力出现之前,处理序列主要靠循环网络(RNN)——一个词一个词地读,把信息压缩在一个「记忆状态」里往后传。
这有两个硬伤:一是长距离信息会被稀释(读到第 100 个词时,第 1 个词的信息已经很模糊);二是无法并行(必须读完前一个才能读下一个,训练极慢)。
注意力同时解决了这两个问题:任意两个位置之间的距离都是「一步」,而且所有位置可以并行计算。
QKV 是什么
注意力用一个查询的比喻来解释:
| 记号 | 含义 | 类比 |
|---|---|---|
| Q(Query) | 当前位置在找什么 | 我拿着一个检索词 |
| K(Key) | 每个位置能提供什么 | 每份文档的标签 |
| V(Value) | 每个位置的实际内容 | 文档的正文 |
计算过程是:用 Q 和所有 K 做匹配,得到一组权重;再用这组权重对所有的 V 加权求和。权重高的位置,信息被更多地取用。
注意力本质上是一个「软检索」。它不像数据库那样精确匹配某一条记录,而是按相关度把所有信息按比例混合起来。这也是它比硬性规则更灵活的原因。
为什么需要位置编码
注意力有一个副作用:它本身对顺序毫无概念。把所有输入打乱,只要「谁和谁配对」,结果是一样的。但语言里顺序至关重要(「猫追狗」和「狗追猫」完全不同)。
所以必须额外把位置信息注入进去,这就是位置编码的作用。它是一个必需补丁——不是锦上添花。
代价是什么
注意力的计算量随序列长度的平方增长。序列长度翻一倍,计算量翻四倍。
这是长上下文的核心瓶颈,也是近年大量研究的焦点:稀疏注意力、滑动窗口、线性注意力等各种变体,本质上都在想办法在不损失太多效果的前提下,把这个平方复杂度降下来。
为什么它成了主流
因为它匹配的假设是「序列中任意两个位置都可能相关」,这个假设比循环网络的「信息按顺序传递」更弱、更通用。假设越弱,适用的范围越广。
加上它可以高度并行,正好适配 GPU 的并行能力——算法结构和大规模算力同时站在了它这一边。这是它取代 RNN 的根本原因。
要点回顾
- 注意力让任意两个位置的距离都是「一步」,同时解决了长距离依赖和并行化两个问题。
- QKV 是一次软检索:Q 是查询,K 是标签,V 是内容,按相关度加权取用。
- 它本身没有顺序概念,必须靠位置编码补上。
- 代价是计算量随序列长度平方增长——这是长上下文的核心瓶颈。
- 它成为主流,是因为假设更弱(任意位置都可能相关)且天然适配 GPU 并行。