一、引言:注意力到底在做什么?
Transformer 的核心是自注意力机制 ,它的本质可以用一句话概括:
在生成当前 token 时,对序列里每一个词计算"相关程度",按重要性加权融合信息,从而决定模型该"关注"什么、输出什么。
整个过程可以理解为:
- 对每个词生成三个向量:查询 Q(我要找什么)、键 K(我是什么)、值 V(我包含什么信息)
- 用 Q 和所有 K 做匹配,得到注意力分数------分数越高,越需要关注
- 对分数做缩放与归一化,得到注意力权重
- 使用权重对 V 加权求和,得到融合后的语义向量
- 用这个语义向量预测下一个 token
这就是注意力"决定该关注什么"的完整逻辑。
二、缩放点积注意力:公式与完整数学推导
2.1 核心公式
Attention ( Q , K , V ) = s o f t m a x ( Q K ⊤ d k ) V \text{Attention}(Q,K,V) = \mathrm{softmax}\left( \frac{Q K^\top}{\sqrt{d_k}} \right) V Attention(Q,K,V)=softmax(dk QK⊤)V
2.2 符号说明
- Q ∈ R L × d k Q \in \mathbb{R}^{L \times d_k} Q∈RL×dk:查询矩阵, L L L 为序列长度
- K ∈ R L × d k K \in \mathbb{R}^{L \times d_k} K∈RL×dk:键矩阵
- V ∈ R L × d v V \in \mathbb{R}^{L \times d_v} V∈RL×dv:值矩阵
- d k d_k dk:Q、K 向量的维度
- d k \sqrt{d_k} dk :缩放因子,保证训练稳定
- 输出 O ∈ R L × d v O \in \mathbb{R}^{L \times d_v} O∈RL×dv:融合全局信息的语义向量
2.3 分步数学推导
步骤1:计算相似度分数
S = Q K ⊤ S = Q K^\top S=QK⊤
S i j S_{ij} Sij 表示第 i i i 个位置对第 j j j 个词的原始相关性打分 ,由向量点积实现:
S i j = q i ⋅ k j = ∑ t = 1 d k q i , t k j , t S_{ij}=q_i \cdot k_j = \sum_{t=1}^{d_k} q_{i,t} k_{j,t} Sij=qi⋅kj=t=1∑dkqi,tkj,t
点积越大,语义越相关,模型越应该关注这个词。
步骤2:缩放
S ~ = S d k \tilde{S} = \frac{S}{\sqrt{d_k}} S~=dk S
目的:稳定点积数值,避免 Softmax 饱和、梯度消失。
步骤3:Softmax 归一化
α i j = exp ( S ~ i j ) ∑ l = 1 L exp ( S ~ i l ) \alpha_{ij} = \frac{\exp(\tilde{S}{ij})}{\sum{l=1}^{L} \exp(\tilde{S}_{il})} αij=∑l=1Lexp(S~il)exp(S~ij)
将分数转为 0~1 之间的权重,且每行和为 1,α i j \alpha_{ij} αij 就是第 i i i 位对第 j j j位的注意力权重。
步骤4:加权求和得到输出
o i = ∑ j = 1 L α i j v j o_i = \sum_{j=1}^{L} \alpha_{ij} v_j oi=j=1∑Lαijvj
输出向量 o i o_i oi 是所有词信息按权重融合的结果,直接用于后续预测下一个 token。
三、缩放因子 d k \sqrt{d_k} dk 的作用
3.1 数学根源
假设 Q、K 中元素独立同分布,均值 0、方差 1,则点积的方差为:
V a r ( q ⋅ k ) = d k \mathrm{Var}(q\cdot k) = d_k Var(q⋅k)=dk
维度 d k d_k dk 越大,点积数值越大,Softmax 越容易进入饱和区,导致梯度几乎为 0,模型无法学习。
3.2 实例对比( d k = 64 , d k = 8 d_k=64,\sqrt{d_k}=8 dk=64,dk =8)
设原始注意力分数:(S = [6, 0, 0])
情况A:不使用缩放因子
S ~ = [ 6 , 0 , 0 ] \tilde{S} = [6,0,0] S~=[6,0,0]
exp ( 6 ) ≈ 403.4 , exp ( 0 ) = 1 , exp ( 0 ) = 1 \exp(6)\approx403.4,\quad \exp(0)=1,\quad \exp(0)=1 exp(6)≈403.4,exp(0)=1,exp(0)=1
α ≈ [ 403.4 405.4 , 1 405.4 , 1 405.4 ] ≈ [ 0.995 , 0.0025 , 0.0025 ] \alpha \approx \left[\frac{403.4}{405.4},\frac{1}{405.4},\frac{1}{405.4}\right] \approx [0.995, 0.0025, 0.0025] α≈[405.4403.4,405.41,405.41]≈[0.995,0.0025,0.0025]
- 权重极度极端,几乎只关注第一个词
- 梯度极小,接近消失
- 模型无法更新,训练崩溃
情况B:使用缩放因子
S ~ = [ 6 , 0 , 0 ] 8 = [ 0.75 , 0 , 0 ] \tilde{S} = \frac{[6,0,0]}{8} = [0.75, 0, 0] S~=8[6,0,0]=[0.75,0,0]
exp ( 0.75 ) ≈ 2.117 , exp ( 0 ) = 1 , exp ( 0 ) = 1 \exp(0.75)\approx2.117,\quad \exp(0)=1,\quad \exp(0)=1 exp(0.75)≈2.117,exp(0)=1,exp(0)=1
α ≈ [ 2.117 4.117 , 1 4.117 , 1 4.117 ] ≈ [ 0.514 , 0.243 , 0.243 ] \alpha \approx \left[\frac{2.117}{4.117},\frac{1}{4.117},\frac{1}{4.117}\right] \approx [0.514, 0.243, 0.243] α≈[4.1172.117,4.1171,4.1171]≈[0.514,0.243,0.243]
- 权重分布合理,保留全局信息
- 梯度正常,模型可稳定学习
3.3 对比总结
| 项目 | 无缩放 | 有缩放 |
|---|---|---|
| 数值范围 | 大,易饱和 | 稳定在合理区间 |
| 权重分布 | 极端 One-hot | 平滑合理 |
| 梯度 | 接近 0,无法训练 | 正常流动 |
| 效果 | 模型不收敛 | 稳定学习 |
四、完整手动实例:注意力如何打分、决定输出
我们以翻译任务:
我, 爱, 你\] → \[I, love, you\] \\text{\[我, 爱, 你\]} \\rightarrow \\text{\[I, love, you\]} \[我, 爱, 你\]→\[I, love, you
为例,完整演示从打分到输出 token 的全过程。
4.1 设定
- 序列长度 L = 3 L=3 L=3
- 模型维度 d k = d v = 2 d_k=d_v=2 dk=dv=2, d k ≈ 1.4142 \sqrt{d_k}\approx1.4142 dk ≈1.4142
- 输入向量(已加词嵌入+位置编码):
X = [ 0.5 1.1 1.0 1.1 1.2 − 0.2 ] X= \begin{bmatrix} 0.5 & 1.1 \\ 1.0 & 1.1 \\ 1.2 & -0.2 \end{bmatrix} X= 0.51.01.21.11.1−0.2 - 简化: W Q = W K = W V = I W_Q=W_K=W_V=I WQ=WK=WV=I,即 Q = K = V = X Q=K=V=X Q=K=V=X
4.2 计算注意力分数(以第 0 位"我"为例)
查询向量: q 0 = [ 0.5 , 1.1 ] q_0 = [0.5, 1.1] q0=[0.5,1.1]
对"我"打分
s 00 = 0.5 × 0.5 + 1.1 × 1.1 = 0.25 + 1.21 = 1.46 s_{00}=0.5\times0.5 + 1.1\times1.1 = 0.25 + 1.21 = 1.46 s00=0.5×0.5+1.1×1.1=0.25+1.21=1.46
对"爱"打分
s 01 = 0.5 × 1.0 + 1.1 × 1.1 = 0.5 + 1.21 = 1.71 s_{01}=0.5\times1.0 + 1.1\times1.1 = 0.5 + 1.21 = 1.71 s01=0.5×1.0+1.1×1.1=0.5+1.21=1.71
对"你"打分
s 02 = 0.5 × 1.2 + 1.1 × ( − 0.2 ) = 0.6 − 0.22 = 0.38 s_{02}=0.5\times1.2 + 1.1\times(-0.2) = 0.6 - 0.22 = 0.38 s02=0.5×1.2+1.1×(−0.2)=0.6−0.22=0.38
原始分数:
s 0 = [ 1.46 , 1.71 , 0.38 ] s_0 = [1.46,\ 1.71,\ 0.38] s0=[1.46, 1.71, 0.38]
含义:"我"最关注"爱",其次是自己,最不关注"你"。
4.3 缩放
s ~ 0 = [ 1.46 , 1.71 , 0.38 ] 1.4142 ≈ [ 1.03 , 1.21 , 0.27 ] \tilde{s}_0 = \frac{[1.46,\ 1.71,\ 0.38]}{1.4142} \approx [1.03,\ 1.21,\ 0.27] s~0=1.4142[1.46, 1.71, 0.38]≈[1.03, 1.21, 0.27]
4.4 Softmax 得到注意力权重
exp ( 1.03 ) ≈ 2.80 , exp ( 1.21 ) ≈ 3.35 , exp ( 0.27 ) ≈ 1.31 \exp(1.03)\approx2.80,\quad \exp(1.21)\approx3.35,\quad \exp(0.27)\approx1.31 exp(1.03)≈2.80,exp(1.21)≈3.35,exp(0.27)≈1.31
S u m = 2.80 + 3.35 + 1.31 = 7.46 \mathrm{Sum}=2.80+3.35+1.31=7.46 Sum=2.80+3.35+1.31=7.46
α 0 ≈ [ 0.38 , 0.45 , 0.17 ] \alpha_0 \approx [0.38,\ 0.45,\ 0.17] α0≈[0.38, 0.45, 0.17]
4.5 加权求和得到输出向量
o 0 = 0.38 v 0 + 0.45 v 1 + 0.17 v 2 o_0 = 0.38v_0 + 0.45v_1 + 0.17v_2 o0=0.38v0+0.45v1+0.17v2
代入:
- v 0 = [ 0.5 , 1.1 ] v_0=[0.5,1.1] v0=[0.5,1.1]
- v 1 = [ 1.0 , 1.1 ] v_1=[1.0,1.1] v1=[1.0,1.1]
- v 2 = [ 1.2 , − 0.2 ] v_2=[1.2,-0.2] v2=[1.2,−0.2]
计算:
o 0 ( 1 ) = 0.38 × 0.5 + 0.45 × 1.0 + 0.17 × 1.2 = 0.19 + 0.45 + 0.204 = 0.844 o_0^{(1)} = 0.38\times0.5 + 0.45\times1.0 + 0.17\times1.2 = 0.19+0.45+0.204=0.844 o0(1)=0.38×0.5+0.45×1.0+0.17×1.2=0.19+0.45+0.204=0.844
o 0 ( 2 ) = 0.38 × 1.1 + 0.45 × 1.1 + 0.17 × ( − 0.2 ) = 0.418 + 0.495 − 0.034 = 0.879 o_0^{(2)} = 0.38\times1.1 + 0.45\times1.1 + 0.17\times(-0.2) = 0.418+0.495-0.034=0.879 o0(2)=0.38×1.1+0.45×1.1+0.17×(−0.2)=0.418+0.495−0.034=0.879
o 0 ≈ [ 0.84 , 0.88 ] o_0 \approx [0.84,\ 0.88] o0≈[0.84, 0.88]
4.6 如何决定下一个 token?
- 输出向量 o 0 o_0 o0 融合了全局语义,且明显偏向"爱"的特征
- 经过线性层映射到词表空间,与词嵌入计算相似度(推理过程见深度学习的数学原理(二十三))
- Softmax 输出概率:
- I:~25%
- love:~55%
- you:~20%
- 模型选择概率最大的 love 作为下一个输出 token
仍然值得反复强调的是,本例只是训练中的某一轮,目的在于展示过程,因此其结果一定具有代表性。
五、总结:注意力如何决定该关注什么
- 打分机制:通过 Q 与 K 的点积,量化每个词与当前位置的相关性,分数即"关注程度"
- 权重分配:Softmax 将分数转为权重,决定每个词的信息占比
- 信息融合:按权重对 V 加权,得到聚焦关键信息的语义向量
- 输出决策:语义向量映射为词表概率,直接决定下一个 token
- 缩放稳定:(\sqrt{d_k}) 保证数值稳定,避免梯度消失,让注意力真正可学习
简单来说:
注意力分数决定"该看谁",权重决定"看多少",加权结果决定"输出什么"。