Lecture 9:注意力机制
408 学习笔记:Lecture 9:注意力机制。保留原有知识内容、公式与图示;有对应原件时提供查看和下载入口。
本页目录
描述:本节从查询、键和值的注意力池化出发,推导非参数注意力、可加性注意力和缩放点积注意力;随后整理自注意力、多头注意力、正弦位置编码以及 Transformer 编码器、解码器、因果掩码、层归一化和交叉注意力的信息流。
9.1 注意力机制的直觉
9.1.1 随意线索与不随意线索
课件借用心理学中的两类线索解释注意力:
- 随意线索:由当前目标主动决定关注方向,例如“我现在想找什么”。
- 不随意线索:由环境中显眼、突出的信息自然吸引注意。
卷积、池化和普通全连接层主要按固定参数和输入内容处理信息,没有为每个目标显式提供“我想找什么”的查询。
注意力机制则显式加入查询,使模型能根据当前目的偏向性地选择输入。
9.1.2 Query、Key、Value
每个候选输入可表示为键值对:
$$ (\boldsymbol k_i,\boldsymbol v_i). $$
另给定查询:
$$ \boldsymbol q. $$
三者含义为:
- Query(查询):当前想寻找的信息,表示关注目标。
- Key(键):候选信息的匹配索引,用来与 Query 计算相关性。
- Value(值):候选位置实际携带、最终要被聚合的内容。
注意力层先比较 Query 与各 Key,再用所得权重加权聚合对应 Value。
9.2 注意力分数、权重与输出
设有 $m$ 个键值对:
$$ (\boldsymbol k_1,\boldsymbol v_1), \ldots, (\boldsymbol k_m,\boldsymbol v_m). $$
9.2.1 注意力分数
用评分函数衡量 Query 与第 $i$ 个 Key 的相关性:
$$ s_i=a(\boldsymbol q,\boldsymbol k_i). $$
Softmax 默认把更大的分数解释为更相关。点积、余弦相似度或可学习网络可直接产生相似度分数;若原始量是距离 $d(\boldsymbol q,\boldsymbol k_i)$,应先转成随距离减小而增大的分数,例如 $s_i=-d(\boldsymbol q,\boldsymbol k_i)$ 或高斯核的负平方距离,不能把正距离直接送入 Softmax。
9.2.2 注意力权重
对所有分数做 Softmax:
$$ \alpha_i =\frac{\exp(s_i)} {\sum_{j=1}^{m}\exp(s_j)}. $$
因此:
$$ \alpha_i>0, \qquad \sum_{i=1}^{m}\alpha_i=1. $$
9.2.3 加权聚合
注意力输出为:
$$ \boldsymbol o =\sum_{i=1}^{m}\alpha_i\boldsymbol v_i. $$
核心关系可以记为:
Query 与 Key → 注意力分数
注意力分数 → Softmax → 注意力权重
注意力权重 × Value → 加权求和 → 输出
WARNING · 易错点 分数 $s_i$ 可以为任意实数;经过 Softmax 后的 $\alpha_i$ 才位于 $(0,1)$ 且总和为 1。
9.3 非参数注意力池化
9.3.1 定义
非参数注意力池化不学习评分函数参数,而是使用预先规定的相似度或核函数动态分配权重。
给定样本:
$$ {(x_i,y_i)}_{i=1}^{n}, $$
对查询 $x$ 的预测为:
$$ f(x)=\sum_{i=1}^{n}\alpha(x,x_i)y_i. $$
其中 $x_i$ 相当于 Key,$y_i$ 相当于 Value,$x$ 是 Query。
9.3.2 高斯核形式
课件给出的 Nadaraya-Watson 型注意力为:
$$ f(x)
\sum_{i=1}^{n} \operatorname{softmax}_i!\left( -\frac{1}{2}(x-x_i)^2 \right)y_i. $$
也就是:
$$ \alpha(x,x_i)
\frac{ \exp!\left[-\frac12(x-x_i)^2\right] }{ \sum_{j=1}^{n} \exp!\left[-\frac12(x-x_j)^2\right] }. $$
查询越接近某个 $x_i$,对应 $y_i$ 的权重通常越大。
9.3.3 一般相似函数
若输入是向量,可使用:
- 点积 $\boldsymbol q^{\mathrm T}\boldsymbol k$。
- 余弦相似度。
- 负欧氏距离。
- 高斯核或其他核函数。
非参数表示评分规则本身没有可学习参数,并不表示模型的其他部分一定没有参数。
9.4 可加性注意力
9.4.1 适用场景
当 Query 和 Key 的维数不同,或希望通过可学习非线性变换计算相关性时,可使用可加性注意力(Additive Attention)。
它常见于经典 RNN Seq2Seq 注意力模型。原始 Transformer 的核心注意力则采用缩放点积,而不是可加性注意力。
9.4.2 公式
设:
$$ W_k\in\mathbb R^{h\times d_k}, \qquad W_q\in\mathbb R^{h\times d_q}, \qquad \boldsymbol v\in\mathbb R^h. $$
单个 Query-Key 对的分数为:
$$ a(\boldsymbol k,\boldsymbol q)
\boldsymbol v^{\mathrm T} \tanh!\left( W_k\boldsymbol k+W_q\boldsymbol q \right). $$
对第 $i$ 个查询与第 $j$ 个键:
$$ e_{ij}
\boldsymbol v^{\mathrm T} \tanh!\left( W_q\boldsymbol q_i+W_k\boldsymbol k_j \right). $$
这等价于把变换后的 Query 和 Key 广播相加,经过隐藏维度为 $h$ 的 $\tanh$ 非线性,再映射为一个标量。
三个可学习部分的作用:
| 参数 | 作用 |
|---|---|
| $W_q$ | 把 Query 映射到共同隐藏空间 |
| $W_k$ | 把 Key 映射到共同隐藏空间 |
| $\boldsymbol v$ | 把隐藏表示映射为标量分数 |
9.5 缩放点积注意力
9.5.1 单个 Query-Key 对
若 Query 与 Key 维度均为 $d_k$:
$$ a(\boldsymbol q,\boldsymbol k_i)
\frac{\boldsymbol q^{\mathrm T}\boldsymbol k_i} {\sqrt{d_k}}. $$
除以 $\sqrt{d_k}$ 是为了防止维度较大时点积方差随 $d_k$ 增长,使 Softmax 过早饱和、梯度过小。
9.5.2 向量化公式
设:
$$ Q\in\mathbb R^{n\times d_k}, \qquad K\in\mathbb R^{m\times d_k}, \qquad V\in\mathbb R^{m\times d_v}. $$
注意力分数矩阵:
$$ S=\frac{QK^{\mathrm T}}{\sqrt{d_k}} \in\mathbb R^{n\times m}. $$
沿每个 Query 对应的 Key 维做 Softmax:
$$ A=\operatorname{softmax}(S) \in\mathbb R^{n\times m}. $$
最终输出:
$$ \operatorname{Attention}(Q,K,V) =AV
\operatorname{softmax}!\left( \frac{QK^{\mathrm T}}{\sqrt{d_k}} \right)V \in\mathbb R^{n\times d_v}. $$
9.6 掩码与可加性注意力代码
变长序列批处理会补 padding。无效 Key 不应参与 Softmax,因此要把对应分数置为极小值。
下面把课件的 AdditiveAttention 代码补全为可解析版本:
import torch
from torch import nn
def sequence_mask(x, valid_lens, value=0.0):
"""屏蔽每行中超过有效长度的位置。"""
max_len = x.size(1)
mask = (
torch.arange(max_len, device=x.device)[None, :]
< valid_lens[:, None]
)
x = x.clone()
x[~mask] = value
return x
def masked_softmax(x, valid_lens):
"""在最后一维做带有效长度掩码的 Softmax。"""
if valid_lens is None:
return nn.functional.softmax(x, dim=-1)
shape = x.shape
if valid_lens.dim() == 1:
valid_lens = valid_lens.repeat_interleave(shape[1])
else:
valid_lens = valid_lens.reshape(-1)
flat = x.reshape(-1, shape[-1])
mask = (
torch.arange(shape[-1], device=x.device)[None, :]
< valid_lens[:, None]
)
masked = flat.masked_fill(~mask, -1e6)
weights = nn.functional.softmax(masked, dim=-1) * mask
normalizer = weights.sum(dim=-1, keepdim=True)
weights = torch.where(
normalizer > 0,
weights / normalizer.clamp_min(torch.finfo(weights.dtype).tiny),
torch.zeros_like(weights),
)
return weights.reshape(shape)
class AdditiveAttention(nn.Module):
"""可加性注意力。"""
def __init__(
self,
key_size,
query_size,
num_hiddens,
dropout,
):
super().__init__()
self.w_k = nn.Linear(key_size, num_hiddens, bias=False)
self.w_q = nn.Linear(query_size, num_hiddens, bias=False)
self.w_v = nn.Linear(num_hiddens, 1, bias=False)
self.dropout = nn.Dropout(dropout)
self.attention_weights = None
def forward(self, queries, keys, values, valid_lens):
"""
queries: [batch, num_queries, query_size]
keys: [batch, num_keys, key_size]
values: [batch, num_keys, value_size]
"""
queries = self.w_q(queries)
keys = self.w_k(keys)
# [batch, num_queries, num_keys, num_hiddens]
features = queries.unsqueeze(2) + keys.unsqueeze(1)
features = torch.tanh(features)
# [batch, num_queries, num_keys]
scores = self.w_v(features).squeeze(-1)
self.attention_weights = masked_softmax(scores, valid_lens)
# [batch, num_queries, value_size]
return torch.bmm(
self.dropout(self.attention_weights), values
)
代码与公式的对应关系:
w_q对应 $W_q$。w_k对应 $W_k$。w_v对应 $\boldsymbol v^{\mathrm T}$。queries.unsqueeze(2) + keys.unsqueeze(1)通过广播得到所有 Query-Key 组合。masked_softmax保证 padding 不获得注意力权重;当某行valid_len=0时显式返回全零,而不是对一整行-1e6做 Softmax 后得到均匀分布。
9.7 CNN、RNN 与自注意力
设序列长度为 $n$、表示维数为 $d$、卷积核宽度为 $k$。课件的理想化比较为:
| 架构 | 计算复杂度 | 同层可并行位置数 | 最长信息路径 |
|---|---|---|---|
| CNN | $O(knd^2)$ | $O(n)$ | $O(n/k)$ |
| RNN | $O(nd^2)$ | $O(1)$ | $O(n)$ |
| 自注意力 | $O(n^2d)$ | $O(n)$ | $O(1)$ |
9.7.1 含义
- CNN:局部连接,可并行;要跨越远距离通常需堆叠多层、扩大核或使用膨胀卷积。
- RNN:每一步依赖前一步,时间维串行;两端信息交互路径长。
- 自注意力:任意两个位置可在一层直接交互,并能并行计算各 Query;但完整注意力矩阵有 $n^2$ 个元素。
NOTE 表中复杂度依赖具体实现、通道宽度和 CNN 感受野增长方式。“同层可并行位置数”若改写成“最少串行步骤”,CNN 与自注意力为 $O(1)$,RNN 为 $O(n)$。
9.7.2 长序列的取舍
自注意力的最长路径短,适合建立远距离关系;但标准全注意力的时间和显存通常随 $n^2$ 增长。
因此“能直接看远处”和“适合任意超长序列”不是同义词。很长序列常需要局部注意力、稀疏注意力、线性注意力或分块策略。
9.8 自注意力
9.8.1 定义
自注意力(Self-Attention)在同一序列内部建立元素之间的联系。输入序列为:
$$ X\in\mathbb R^{n\times d_{\mathrm{model}}}. $$
通过三组可学习投影:
$$ Q=XW_Q, \qquad K=XW_K, \qquad V=XW_V. $$
因为 Query、Key、Value 都来自同一个 $X$,所以称为自注意力。
输出为:
$$ Z
\operatorname{softmax}!\left( \frac{QK^{\mathrm T}}{\sqrt{d_k}} \right)V. $$
9.8.2 三个特点
- 长程依赖:任意两个位置可直接计算相关性。
- 动态权重:根据内容为不同位置分配不同权重,而不是固定卷积核连接。
- 并行计算:没有 RNN 那样的逐时间步状态依赖。
9.8.3 课件二维数值图
课件用二维 Query 与 Key 说明缩放点积。取:
$$ \boldsymbol q_1=(1,2), \qquad \boldsymbol q_2=(1,1), $$
$$ \boldsymbol k_1=(1,0), \qquad \boldsymbol k_2=(0,1), \qquad d_k=2. $$
对 $\boldsymbol q_1$:
$$ \left( \frac{\boldsymbol q_1^{\mathrm T}\boldsymbol k_1}{\sqrt2}, \frac{\boldsymbol q_1^{\mathrm T}\boldsymbol k_2}{\sqrt2} \right)
(0.71,1.41). $$
Softmax 后约为:
$$ (0.33,0.67). $$
对 $\boldsymbol q_2$:
$$ \left( \frac{1}{\sqrt2}, \frac{1}{\sqrt2} \right) =(0.71,0.71), $$
Softmax 后为:
$$ (0.50,0.50). $$
因此两位置聚合结果为:
$$ \boldsymbol b_1 =0.33\boldsymbol v_1+0.67\boldsymbol v_2, $$
$$ \boldsymbol b_2 =0.50\boldsymbol v_1+0.50\boldsymbol v_2. $$
9.9 Q、K、V 的含义
| 向量 | 角色 | 搜索类比 | NLP 中的含义 |
|---|---|---|---|
| Query | 主动寻找信息的主体 | 搜索词 | 当前词/当前位置想寻找什么 |
| Key | 被匹配的信息索引 | 网页关键词标签 | 各位置用于匹配的特征 |
| Value | 实际携带的信息 | 网页正文 | 各位置要被聚合的语义内容 |
可以把三个投影矩阵理解为:
- $W_Q$:学习“如何提出问题”。
- $W_K$:学习“如何组织可检索索引”。
- $W_V$:学习“匹配后要传递什么内容”。
点积 $QK^{\mathrm T}$ 只决定匹配强度;真正被加权汇总的是 $V$。
9.10 多头自注意力
9.10.1 动机
单个注意力头只有一套投影,可能只擅长一种关系。多头注意力让不同子空间分别学习:
- 短距离与长距离关系。
- 语法依赖与语义相似。
- 不同位置或不同特征维度的交互。
9.10.2 每个头
对第 $r$ 个头:
$$ \operatorname{head}_r
\operatorname{Attention}!\left( QW_r^Q, KW_r^K, VW_r^V \right). $$
课件的两头图把每个输入投影/划分为两部分,分别送入 head1 和 head2 独立计算。
9.10.3 拼接与输出投影
$$ \operatorname{MultiHead}(Q,K,V)
\operatorname{Concat} (\operatorname{head}_1,\ldots,\operatorname{head}_h) W^O. $$
完整步骤:
- 各头用自己的 $W_r^Q,W_r^K,W_r^V$ 投影输入。
- 各头独立计算注意力和输出。
- 对同一 token 的各头输出沿特征维拼接。
- 用 $W^O$ 融合所有头。
课件图中的 $b_{1,1},b_{1,2}$ 是第一个 token 在不同头中的输出分块;拼接后再经 $W^O$,才得到最终表示。
WARNING 多头不是把同一份单头结果复制多次。各头有独立投影参数,能学习不同关系;拼接后还需要输出投影。
9.11 自注意力为什么需要位置编码
9.11.1 无位置时的性质
自注意力仅根据内容计算两两关系,本身没有 CNN 的局部位置结构,也没有 RNN 的递推顺序。
若 $P$ 是位置置换矩阵,则无位置自注意力满足:
$$ \operatorname{SA}(PX)=P\operatorname{SA}(X). $$
这叫排列等变(permutation equivariant):输入位置被置换,输出位置以同样方式置换。
若随后对所有位置做对称池化,整体表示才可能是排列不变的。
WARNING · 课件表述纠错 课件直接写“自注意力本身是排列不变的”不够准确。保留逐位置输出的自注意力是排列等变;集合池化后的结果才可排列不变。
9.11.2 注入位置信息
设输入嵌入为:
$$ X\in\mathbb R^{n\times d}, $$
位置编码矩阵为:
$$ P\in\mathbb R^{n\times d}. $$
送入第一层的表示为:
$$ X'=X+P. $$
位置编码不改变注意力公式,而是先把顺序信息写入输入表示。
9.12 正弦/余弦位置编码
9.12.1 公式
经典 Transformer 的固定位置编码为:
$$ P_{\mathrm{pos},2i}
\sin!\left( \frac{\mathrm{pos}} {10000^{2i/d}} \right), $$
$$ P_{\mathrm{pos},2i+1}
\cos!\left( \frac{\mathrm{pos}} {10000^{2i/d}} \right). $$
不同维度使用不同频率,因此课件曲线图中各列具有不同周期。
9.12.2 为什么用 Sin/Cos
由加法公式:
$$ \sin(a+b)=\sin a\cos b+\cos a\sin b, $$
$$ \cos(a+b)=\cos a\cos b-\sin a\sin b. $$
对某一频率 $\omega$:
$$ \begin{bmatrix} \sin\omega(\mathrm{pos}+k)\ \cos\omega(\mathrm{pos}+k) \end{bmatrix}
\begin{bmatrix} \cos\omega k & \sin\omega k\ -\sin\omega k & \cos\omega k \end{bmatrix} \begin{bmatrix} \sin\omega\mathrm{pos}\ \cos\omega\mathrm{pos} \end{bmatrix}. $$
因此固定偏移 $k$ 对应一个只依赖 $k$ 的线性变换,有利于模型学习相对位置关系。
9.12.3 长度外推的准确说法
正弦/余弦位置编码由公式生成,可以为训练长度之外的位置计算数值,不受固定嵌入表大小限制。
但“编码可计算”不等于“模型一定能可靠理解超长序列”。注意力模式、训练分布和数值频率都可能限制外推性能。
NOTE 相比固定大小的 learned positional embedding,正弦编码具备生成任意位置表示的结构优势;实际长上下文泛化仍需单独验证。
9.13 Transformer 总体架构
Transformer 基于编码器-解码器处理序列对,但不使用 RNN 递推,核心序列交互由多头注意力完成。
9.13.1 编码器块
经典编码器每层包含:
- 多头自注意力。
- 残差连接与层归一化。
- 逐位置前馈网络(Feed-Forward Network,FFN)。
- 残差连接与层归一化。
输入
↓
多头自注意力
↓ + 残差
LayerNorm
↓
前馈网络
↓ + 残差
LayerNorm
9.13.2 解码器块
经典解码器每层包含:
- 带因果掩码的多头自注意力。
- 残差连接与层归一化。
- 编码器-解码器交叉注意力。
- 残差连接与层归一化。
- 逐位置前馈网络。
- 残差连接与层归一化。
最后用线性层与 Softmax 生成输出 token 概率。
NOTE 课件图采用原始 Transformer 的 Post-LN 画法,即子层后做 Add & Norm。现代模型也常采用 Pre-LN,先归一化再进入子层。
9.14 因果掩码注意力
自回归解码时,第 $i$ 个位置不能读取未来位置 $j>i$,否则训练时会泄漏答案。
构造掩码:
$$ M_{ij}
\begin{cases} 0,&j\le i,\ -\infty,&j>i. \end{cases} $$
带掩码注意力为:
$$ A
\operatorname{softmax}!\left( \frac{QK^{\mathrm T}}{\sqrt{d_k}}+M \right). $$
Softmax 后,被掩码的未来位置权重为 0。
课件所说“计算 $x_i$ 输出时,假装当前序列长度为 $i$”就是这一因果约束的直观解释。
padding mask 与 causal mask 作用不同:
- padding mask:忽略补齐位置。
- causal mask:阻止访问未来位置。
9.15 层归一化
9.15.1 LayerNorm
对单个 token 表示:
$$ \boldsymbol x\in\mathbb R^d, $$
在特征维上计算:
$$ \mu=\frac1d\sum_{j=1}^{d}x_j, $$
$$ \sigma^2 =\frac1d\sum_{j=1}^{d}(x_j-\mu)^2. $$
层归一化为:
$$ \operatorname{LN}(\boldsymbol x)
\boldsymbol\gamma\odot \frac{\boldsymbol x-\mu} {\sqrt{\sigma^2+\epsilon}} +\boldsymbol\beta. $$
它对每个样本、每个 token 独立沿隐藏维归一化,不依赖其他样本或序列长度。
9.15.2 与 BatchNorm 的区别
对形状 $[B,L,D]$ 的序列张量:
- BatchNorm 通常按特征通道统计跨 batch、位置的均值方差,受批大小、padding 和长度分布影响。
- LayerNorm 对每个 $[D]$ token 向量独立归一化,训练与推理行为一致,更适合变长序列。
WARNING · 课件表述纠错 “Transformer 中不能使用 BatchNorm”过于绝对。标准 Transformer 选择 LayerNorm,且它通常更合适;但研究和变体中可以设计使用 BatchNorm 或其他归一化的方法。应记为“标准结构使用 LayerNorm”,不是数学上的禁止。
9.16 编码器到解码器的信息传递
设编码器输出:
$$ Y=(\boldsymbol y_1,\ldots,\boldsymbol y_n). $$
在解码器交叉注意力中:
- Query 来自解码器当前目标序列表示。
- Key 来自编码器输出 $Y$。
- Value 也来自编码器输出 $Y$。
因此:
$$ Q=H_{\mathrm{dec}}W_Q, \qquad K=YW_K, \qquad V=YW_V. $$
交叉注意力输出:
$$ \operatorname{CrossAttention}
\operatorname{softmax}!\left( \frac{QK^{\mathrm T}}{\sqrt{d_k}} \right)V. $$
这让每个目标位置按需读取全部源序列表示,而不是把整个源序列压成单一固定向量。
课件图中编码器和解码器都堆叠 $N$ 层,并保持 $d_{\mathrm{model}}$ 不变,便于残差连接;这是经典 Transformer 的对称设计,并非所有变体必须使用相同层数。
9.17 易错点
- Query 决定想找什么,Key 决定如何匹配,Value 才是被汇总的信息。
- 注意力分数不是注意力权重;只有 Softmax 后的权重才非负且和为 1。
- 非参数注意力没有可学习评分参数,但仍可嵌入有参数模型。
- 可加性注意力用 MLP 式打分;原始 Transformer 使用缩放点积注意力。
- 缩放因子是 $\sqrt{d_k}$,不是 $d_k$ 或 Value 维度。
- Softmax 沿 Key 维执行,因此每个 Query 对所有可见 Key 的权重和为 1。
- 标准自注意力能直接建立远距离关系,但完整注意力的时间和显存为二次规模。
- 无位置编码的逐位置自注意力是排列等变,不应简单说成排列不变。
- 多头注意力具有独立的 Q/K/V 投影,各头拼接后还需 $W^O$ 融合。
- 位置编码加在输入嵌入上,不是给注意力权重矩阵简单加位置编号。
- 正弦位置编码可计算训练长度外的位置,但不保证模型一定成功外推。
- causal mask 防未来泄漏,padding mask 忽略补齐,两者用途不同。
- 标准 Transformer 使用 LayerNorm;“绝对不能使用 BatchNorm”是过强表述。
- 编码器-解码器交叉注意力的 Query 来自解码器,Key/Value 来自编码器。
- 残差连接要求相加张量形状兼容,因此经典块保持统一的 $d_{\mathrm{model}}$。
相关知识
- 科目导航:复试常考科目导航
- 阅读顺序:上一篇:循环神经网络与 LSTM · 下一篇:数据库绪论
- 关联专题:RNN、LSTM 与编码器-解码器
9.18 本节复盘
- 注意力用 Query 与 Key 计算分数,Softmax 得到权重,再对 Value 加权求和。
- 非参数注意力可用固定距离核;可加性注意力用可学习 MLP 式评分;缩放点积注意力使用 $QK^T/\sqrt{d_k}$。
- 向量化注意力输出是 $\operatorname{softmax}(QK^T/\sqrt{d_k})V$,掩码可排除 padding 或未来位置。
- 自注意力的 Q、K、V 都来自同一序列,支持全局交互和并行计算,但标准实现具有 $O(n^2d)$ 复杂度。
- 课件二维例子中,$q_1$ 对两个 Key 的权重约为 $(0.33,0.67)$,$q_2$ 为 $(0.50,0.50)$。
- 多头注意力在多个子空间独立计算关系,拼接各头后用 $W^O$ 融合。
- 无位置自注意力不记录顺序;正弦/余弦位置编码通过 $X+P$ 注入绝对位置并提供相对偏移结构。
- Transformer 编码器由自注意力、前馈网络、残差和归一化组成;解码器还含因果掩码和交叉注意力。
- LayerNorm 对每个 token 的隐藏维归一化,通常比依赖批统计的 BatchNorm 更适合变长序列。
- 交叉注意力用解码器状态作 Query、编码器输出作 Key/Value,实现源序列到目标序列的信息传递。