注意力机制:从关注到 Transformer
本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 10 章《注意力机制》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。
本章讲什么
注意力机制是现代深度学习最重要的思想之一。它最初用于机器翻译,后来成为 Transformer 的基础——而 Transformer 又是今天几乎所有大语言模型(GPT、BERT 等)的基石。
本章从注意力的直觉讲起,一步步走到完全基于注意力的架构——Transformer。
注意力提示:为什么需要注意力
从注意力经济说起:人的注意力是有限、稀缺、有价值的资源。人的视觉系统每秒接收约 10^8 位信息,大脑无法全部处理,所以只把注意力投向感兴趣的一小部分。
心理学把注意力分成两类:
- 非自主性提示:由物体的突出性自动引起。比如一堆黑白印刷品中突然出现一个红色咖啡杯,杯子不由自主地抓住你的视线。
- 自主性提示:由意识和认知控制。比如"我想读书",所以主动把目光转向书。
把这两种提示翻译成神经网络语言,就得到注意力机制的 QKV 框架:
- 查询(query):自主性提示,代表"我想关注什么"。
- 键(key):与每个值配对的非自主提示,代表"每个候选是什么"。
- 值(value):感官输入或中间特征,是实际要加权的内容。
注意力机制与全连接层、池化层的本质区别,就是引入了自主性提示(查询)——模型可以主动决定关注哪里。
注意力汇聚:注意力怎么工作
用一个 1964 年的经典统计模型——Nadaraya-Watson 核回归,作为注意力机制的最简完整示例。
回归问题:给定 (x, y) 数据对,预测新输入 x 的输出。最笨的办法是平均汇聚——对所有 y 取平均,完全忽略 x 的信息,效果很差。
Nadaraya-Watson 提出按输入位置加权:离查询 x 越近的键,其对应的值权重越大(用高斯核度量距离,再归一化成概率分布)。从注意力框架看:x 是查询,(x_i, y_i) 是键值对,输出就是值的加权平均——这就是注意力汇聚的本质。
"谁离我近,我越听谁的":预测新点时,训练数据里离它越近的点发言权越大。
这个模型可以扩展为带参数版本:在距离计算中乘一个可学习的参数,通过训练自动学习它,让注意力更"尖锐"。
注意力评分函数
高斯核只是注意力评分的一种特例。通用流程是:先用一个函数算出查询与每个键的匹配分数(标量),再经 softmax 变成概率分布(注意力权重),最后对值做加权和。
两个经典评分函数:
- 加性注意力:适用于查询和键长度不同的情况。把查询和键分别线性变换到同一维度后相加,过 tanh 激活,再投影成标量——本质上是一个单隐藏层 MLP。更灵活,但计算较慢。
- 缩放点积注意力:适用于查询和键长度相同的情况。直接算点积,再除以向量长度的平方根。除以平方根是为了抵消维度增大带来的方差膨胀,保证数值稳定。点积可用矩阵乘法高效并行,计算远快于加性注意力。
还有个实用细节:处理变长序列时,用掩蔽 softmax 把填充位置(无意义词元)的注意力权重强制设为 0。
Bahdanau 注意力:注意力进入机器翻译
传统 seq2seq 把整个源句子压缩成一个固定形状的上下文向量 c,解码每一步都用同一个 c。但源句子里并非所有词都对翻译当前词有用。
Bahdanau 注意力(2014 年)让解码器在生成每个目标词元时,动态地从源序列"挑选"相关的部分:上下文变量换成每个解码步各自不同的值,它是编码器所有隐状态的加权和——解码器上一时间步的隐状态作为查询,编码器的所有隐状态同时充当键和值。
这样模型就学会了对齐——翻译某个词时只关注源句中对应的部分(比如英语 go → 法语 va)。可视化注意力权重,可以看到清晰的"对角对齐"模式。这就像人翻译时"边看原文边对应着翻译",而不是把整句死记成一句话再输出。
多头注意力:从多个角度看
单个注意力汇聚只能学到一种"关注方式"。实践中我们希望模型对同一组数据学到不同的行为再组合起来,从而捕获不同范围的依赖(短距离和长距离)。
多头注意力的做法:用 h 组独立学习的线性投影分别变换查询、键、值,得到 h 组不同的"子空间表示",并行送入 h 个注意力汇聚(每个叫一个"头"),把 h 个输出拼接起来,再过一层线性变换得到最终输出。
每个头像一位专家,各自关注材料的不同方面(语法、语义、指代等),最后把各位专家的意见汇总,形成更全面的判断。
自注意力与位置编码
前面都是查询来自一个序列、键值来自另一个序列。自注意力(也叫内部注意力)让同一组词元同时充当查询、键、值——每个词元都关注序列中所有其他词元,输出与输入长度相同的表示。
作者把自注意力与 CNN、RNN 三种序列编码架构从三个维度对比:
| 架构 | 计算复杂度 | 顺序操作 | 最大路径长度 |
|---|---|---|---|
| CNN | O(knd²) | O(1) | O(n/k) |
| RNN | O(nd²) | O(n)(无法并行) | O(n) |
| 自注意力 | O(n²d) | O(1)(可并行) | O(1) |
自注意力兼有并行优势和最短路径(任意两个词元直接相连),但序列很长时二次复杂度是瓶颈。
由于自注意力放弃了顺序操作,需要位置编码注入序列的位置信息。Transformer 用正弦/余弦函数生成固定的位置嵌入,加到输入表示上。这种设计能同时编码绝对位置("第几个位置")和相对位置("相隔多远")。
Transformer:完全基于注意力
Transformer 是本章的集大成者:完全基于注意力,没有任何卷积层或循环层,最初用于机器翻译,现已扩展到语言、视觉、语音、强化学习。
整体是编码器-解码器架构:
- 编码器:由若干相同层堆叠,每层两个子层——多头自注意力 + 基于位置的前馈网络,每个子层都带残差连接和层规范化(Add & Norm)。
- 解码器:每层三个子层——掩蔽多头自注意力(用掩蔽保证自回归属性,预测只依赖已生成的词元)、编码器-解码器注意力(查询来自解码器,键值来自编码器输出)、前馈网络。
几个关键组件:
- 基于位置的前馈网络:对每个位置用同一个两层 MLP 变换,位置无关、逐点共享。
- 层规范化:沿特征维度归一化,适合变长序列,优于批量规范化。
- 残差连接:x + sublayer(x),解决深层网络训练难的问题。
用"接力流水线"来类比:编码器像"阅读理解"(每层读完做笔记再传给下一层),解码器像"边看笔记边写作"(写当前词时既回顾自己已写的内容,又查阅编码器的笔记)。残差连接像"抄近路",保证信息不丢失。
小结
- 注意力机制源于人的注意力:自主提示(查询)和值、键共同构成 QKV 框架。
- 注意力汇聚的本质是对值做加权平均,权重由查询-键关系决定。
- 加性注意力和缩放点积注意力是两种经典评分函数。
- Bahdanau 注意力把注意力引入机器翻译,让模型学会"对齐"。
- 多头注意力从多个子空间并行观察,捕获不同范围的依赖。
- 自注意力让每个词元关注序列中所有词元,配合位置编码使用。
- Transformer 完全基于注意力,是今天大语言模型的基石。
关键术语
| 术语 | 一句话解释 |
|---|---|
| 注意力经济 | 注意力是有限、稀缺、有价值的资源 |
| 查询 / 键 / 值 | 自主提示 / 非自主提示 / 实际加权的内容 |
| 注意力汇聚 | 对值做加权平均,权重由查询-键关系决定 |
| 注意力评分函数 | 把查询和键映射为标量分数的函数 |
| 加性注意力 | 用单隐藏层 MLP 计算评分,可处理不同长度 |
| 缩放点积注意力 | 点积除以长度平方根,计算高效 |
| Bahdanau 注意力 | 首次把注意力引入 seq2seq 机器翻译 |
| 对齐 | 源词与目标词之间的对应关系 |
| 多头注意力 | 多个注意力头并行、拼接后线性变换 |
| 自注意力 | 查询、键、值全部来自同一组输入 |
| 位置编码 | 注入序列位置信息的嵌入 |
| Transformer | 完全基于注意力机制的深度架构 |
| 层规范化 | 沿特征维度归一化,适合变长序列 |