概述
注意力机制,是深度学习中的一项关键技术,它让模型能够像人一样,在处理大量信息时,自动聚焦在最重要的部分。
1. 注意力机制是什么?它从何而来?
动机与直觉
当我们看一张照片时,视线会不自觉地落在人脸、文字标题等关键区域,而不是把每个像素平等对待。
这种高效分配有限处理资源的能力,就是注意力。
深度学习中的注意力机制正是借鉴了这一思想,核心目标是:从海量信息中,为当前任务筛选出更关键的部分,并赋予其更高权重。
本质定义
注意力机制,可以理解为"根据查询(Query),从一组键值对(Key-Value)中,有侧重地抽取信息"的过程。
最终输出是"值(Value)"的加权和,而权重由"查询(Query)"与"键(Key)"的匹配程度决定。
下面这组概念会贯穿全文:
- Query(Q):当前要查询的目标,比如正在翻译的词。
- Key(K):各个候选信息的关键特征,用来与 Q 匹配。
- Value(V):候选信息本身的值,被加权求和的对象。
2. 基础注意力机制:加性注意力与缩放点积注意力
这是两种最经典的 Q-K 匹配方式。
加性注意力
将 Q 和 K 分别通过可训练矩阵进行线性变换,然后相加,再经 tanh 等激活函数和非线性变换后得到分数。
公式(示意):
score ( Q , K ) = w T tanh ( W q Q + W k K ) \text{score}(Q, K) = w^T \tanh(W_q Q + W_k K) score(Q,K)=wTtanh(WqQ+WkK)
其中 W q , W k W_q, W_k Wq,Wk 是可学习参数。这种方式允许 Q 和 K 维度不同。
缩放点积注意力
直接对 Q 和 K 做点积,计算相似度。由于点积值可能很大,为防止 softmax 后梯度消失,引入缩放因子 d k \sqrt{d_k} dk 。
公式:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V Attention(Q,K,V)=softmax(dk QKT)V
这里要求 Q 和 K 的维度( d k d_k dk)相同。它是后续自注意力的基础。
一个小例子 (为后续串联铺垫):
假设我们要将中文"我"翻译成英文,目标词是"me"。
Q 是"我"的表示向量,K 是各个英文单词的关键特征,V 是英文单词本身的特征向量。
通过计算"我"(Q) 与 "me"、"I"、"you"等(K) 的点积相似度,再 softmax 得到权重。
最后,用这些权重对 V 加权求和,得到的信息会告诉模型:"我"和"me"最相关。
3. 自注意力机制(Self-Attention)------ 让序列内部互相关注
核心思想
自注意力让序列中的每个元素,都与序列内所有其他元素建立关联,从而捕获长距离依赖。每个位置的 Q、K、V 都来自输入自身,这就是"自"的含义。
详细数据推导:以序列 "你好机车" 为例
假设输入序列为三个词:"你" "好" "机车",词向量维度 d m o d e l = 4 d_{model}=4 dmodel=4。
经过 Embedding 后,得到输入矩阵(行向量表示每个词):
X = 1 0 1 0 0 2 0 2 1 1 1 1 X = \begin{bmatrix} 1 & 0 & 1 & 0 \\ % 你 0 & 2 & 0 & 2 \\ % 好 1 & 1 & 1 & 1 % 机车 \end{bmatrix} X= 101021101021
为便于手工计算,我们设所有可训练权重矩阵为简单单位阵或特定值。
这里取 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV 均为 4 × 3 4 \times 3 4×3 的矩阵(降维到 d k = d v = 3 d_k=d_v=3 dk=dv=3),并手动设定便于观察的值。
令:
W Q = 1 0 0 0 1 0 0 0 1 1 0 0 , W K = 0 1 0 0 0 1 1 0 0 0 1 0 , W V = 1 0 1 0 1 0 0 0 1 1 1 0 W^Q = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{bmatrix},\quad W^K = \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix},\quad W^V = \begin{bmatrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 1 & 0 \end{bmatrix} WQ= 100101000010 ,WK= 001010010100 ,WV= 100101011010
1) 计算 Q, K, V
Q = X W Q Q = X W^Q Q=XWQ, K = X W K K = X W^K K=XWK, V = X W V V = X W^V V=XWV
-
第一行 "你" ( X 1 = 1 , 0 , 1 , 0 X_1 = 1,0,1,0 X1=1,0,1,0):
Q 1 = 1 , 0 , 1 , 0 W Q = 1 + 0 + 0 + 0 , 0 + 0 + 0 + 0 , 0 + 0 + 1 + 0 = 1 , 0 , 1 Q_1 = 1,0,1,0 W^Q = 1+0+0+0,\\ 0+0+0+0,\\ 0+0+1+0 = 1, 0, 1 Q1=1,0,1,0WQ=1+0+0+0, 0+0+0+0, 0+0+1+0=1,0,1
K 1 = 1 , 0 , 1 , 0 W K = 0 + 0 + 1 + 0 , 1 + 0 + 0 + 0 , 0 + 0 + 0 + 0 = 1 , 1 , 0 K_1 = 1,0,1,0 W^K = 0+0+1+0,\\ 1+0+0+0,\\ 0+0+0+0 = 1, 1, 0 K1=1,0,1,0WK=0+0+1+0, 1+0+0+0, 0+0+0+0=1,1,0
V 1 = 1 , 0 , 1 , 0 W V = 1 + 0 + 0 + 0 , 0 + 0 + 0 + 0 , 1 + 0 + 1 + 0 = 1 , 0 , 2 V_1 = 1,0,1,0 W^V = 1+0+0+0,\\ 0+0+0+0,\\ 1+0+1+0 = 1, 0, 2 V1=1,0,1,0WV=1+0+0+0, 0+0+0+0, 1+0+1+0=1,0,2
-
第二行 "好" ( X 2 = 0 , 2 , 0 , 2 X_2 = 0,2,0,2 X2=0,2,0,2):
Q 2 = 0 , 2 , 0 , 2 W Q = 0 + 0 + 0 + 2 , 0 + 2 + 0 + 0 , 0 + 0 + 0 + 0 = 2 , 2 , 0 Q_2 = 0,2,0,2 W^Q = 0+0+0+2,\\ 0+2+0+0,\\ 0+0+0+0 = 2, 2, 0 Q2=0,2,0,2WQ=0+0+0+2, 0+2+0+0, 0+0+0+0=2,2,0
K 2 = 0 , 2 , 0 , 2 W K = 0 + 0 + 0 + 0 , 0 + 0 + 0 + 2 , 0 + 2 + 0 + 0 = 0 , 2 , 2 K_2 = 0,2,0,2 W^K = 0+0+0+0,\\ 0+0+0+2,\\ 0+2+0+0 = 0, 2, 2 K2=0,2,0,2WK=0+0+0+0, 0+0+0+2, 0+2+0+0=0,2,2
V 2 = 0 , 2 , 0 , 2 W V = 0 + 0 + 0 + 2 , 0 + 2 + 0 + 2 , 0 + 0 + 0 + 0 = 2 , 4 , 0 V_2 = 0,2,0,2 W^V = 0+0+0+2,\\ 0+2+0+2,\\ 0+0+0+0 = 2, 4, 0 V2=0,2,0,2WV=0+0+0+2, 0+2+0+2, 0+0+0+0=2,4,0
-
第三行 "机车" ( X 3 = 1 , 1 , 1 , 1 X_3 = 1,1,1,1 X3=1,1,1,1):
Q 3 = 1 , 1 , 1 , 1 W Q = 1 + 0 + 0 + 1 , 0 + 1 + 0 + 0 , 0 + 0 + 1 + 0 = 2 , 1 , 1 Q_3 = 1,1,1,1 W^Q = 1+0+0+1,\\ 0+1+0+0,\\ 0+0+1+0 = 2, 1, 1 Q3=1,1,1,1WQ=1+0+0+1, 0+1+0+0, 0+0+1+0=2,1,1
K 3 = 1 , 1 , 1 , 1 W K = 0 + 0 + 1 + 0 , 1 + 0 + 0 + 1 , 0 + 1 + 0 + 0 = 1 , 2 , 1 K_3 = 1,1,1,1 W^K = 0+0+1+0,\\ 1+0+0+1,\\ 0+1+0+0 = 1, 2, 1 K3=1,1,1,1WK=0+0+1+0, 1+0+0+1, 0+1+0+0=1,2,1
V 3 = 1 , 1 , 1 , 1 W V = 1 + 0 + 0 + 1 , 0 + 1 + 0 + 1 , 1 + 0 + 1 + 0 = 2 , 2 , 2 V_3 = 1,1,1,1 W^V = 1+0+0+1,\\ 0+1+0+1,\\ 1+0+1+0 = 2, 2, 2 V3=1,1,1,1WV=1+0+0+1, 0+1+0+1, 1+0+1+0=2,2,2
2) 计算注意力分数
用缩放点积: score ( i , j ) = Q i ⋅ K j T d k \text{score}(i,j) = \frac{Q_i \cdot K_j^T}{\sqrt{d_k}} score(i,j)=dk Qi⋅KjT,这里 d k = 3 d_k = 3 dk=3, 3 ≈ 1.732 \sqrt{3} \approx 1.732 3 ≈1.732。
先算 Q 1 Q_1 Q1 对所有 K 的点积:
- Q 1 ⋅ K 1 T = 1 × 1 + 0 × 1 + 1 × 0 = 1 Q_1 \cdot K_1^T = 1\times1 + 0\times1 + 1\times0 = 1 Q1⋅K1T=1×1+0×1+1×0=1
- Q 1 ⋅ K 2 T = 1 × 0 + 0 × 2 + 1 × 2 = 2 Q_1 \cdot K_2^T = 1\times0 + 0\times2 + 1\times2 = 2 Q1⋅K2T=1×0+0×2+1×2=2
- Q 1 ⋅ K 3 T = 1 × 1 + 0 × 2 + 1 × 1 = 2 Q_1 \cdot K_3^T = 1\times1 + 0\times2 + 1\times1 = 2 Q1⋅K3T=1×1+0×2+1×1=2
将每个点积除以 1.732 即得到缩放后的分数:
- 1 / 1.732 ≈ 0.577 1 / 1.732 ≈ 0.577 1/1.732≈0.577
- 2 / 1.732 ≈ 1.155 2 / 1.732 ≈ 1.155 2/1.732≈1.155
- 2 / 1.732 ≈ 1.155 2 / 1.732 ≈ 1.155 2/1.732≈1.155
缩放后得分向量为 0.577 , 1.155 , 1.155 0.577, 1.155, 1.155 0.577,1.155,1.155。
Softmax 计算(保留三位小数):
softmax ( 0.577 , 1.155 , 1.155 ) = e 0.577 e 0.577 + 2 e 1.155 , e 1.155 e 0.577 + 2 e 1.155 , e 1.155 e 0.577 + 2 e 1.155 \text{softmax}(0.577, 1.155, 1.155) = \left \\frac{e\^{0.577}}{e\^{0.577}+2e\^{1.155}},\\ \\frac{e\^{1.155}}{e\^{0.577}+2e\^{1.155}},\\ \\frac{e\^{1.155}}{e\^{0.577}+2e\^{1.155}} \\right softmax(0.577,1.155,1.155)=e0.577+2e1.155e0.577, e0.577+2e1.155e1.155, e0.577+2e1.155e1.155
e 0.577 ≈ 1.781 , e 1.155 ≈ 3.174 e^{0.577} \approx 1.781,\ e^{1.155} \approx 3.174 e0.577≈1.781, e1.155≈3.174,分母 = 1.781 + 2 × 3.174 = 8.129 = 1.781 + 2\times3.174 = 8.129 =1.781+2×3.174=8.129。
然后每个权重 = 对应指数 / 分母:
- 1.781 / 8.129 ≈ 0.219 1.781 / 8.129 ≈ 0.219 1.781/8.129≈0.219
- 3.174 / 8.129 ≈ 0.391 3.174 / 8.129 ≈ 0.391 3.174/8.129≈0.391
- 3.174 / 8.129 ≈ 0.391 3.174 / 8.129 ≈ 0.391 3.174/8.129≈0.391
得到权重: 0.219 , 0.391 , 0.391 0.219, 0.391, 0.391 0.219,0.391,0.391。
3) 加权求和输出
对于第一个位置的输出 Z 1 Z_1 Z1 :
Z 1 = 0.219 × V 1 + 0.391 × V 2 + 0.391 × V 3 Z_1 = 0.219 \times V_1 + 0.391 \times V_2 + 0.391 \times V_3 Z1=0.219×V1+0.391×V2+0.391×V3
V 1 = 1 , 0 , 2 , V 2 = 2 , 4 , 0 , V 3 = 2 , 2 , 2 V_1=1,0,2,\ V_2=2,4,0,\ V_3=2,2,2 V1=1,0,2, V2=2,4,0, V3=2,2,2:
- 第一维: 0.219 × 1 + 0.391 × 2 + 0.391 × 2 = 0.219 + 0.782 + 0.782 = 1.783 0.219\times1 + 0.391\times2 + 0.391\times2 = 0.219 + 0.782 + 0.782 = 1.783 0.219×1+0.391×2+0.391×2=0.219+0.782+0.782=1.783
- 第二维: 0.219 × 0 + 0.391 × 4 + 0.391 × 2 = 0 + 1.564 + 0.782 = 2.346 0.219\times0 + 0.391\times4 + 0.391\times2 = 0 + 1.564 + 0.782 = 2.346 0.219×0+0.391×4+0.391×2=0+1.564+0.782=2.346
- 第三维: 0.219 × 2 + 0.391 × 0 + 0.391 × 2 = 0.438 + 0 + 0.782 = 1.220 0.219\times2 + 0.391\times0 + 0.391\times2 = 0.438 + 0 + 0.782 = 1.220 0.219×2+0.391×0+0.391×2=0.438+0+0.782=1.220
所以 Z 1 ≈ 1.783 , 2.346 , 1.220 Z_1 \approx 1.783, 2.346, 1.220 Z1≈1.783,2.346,1.220。同理可算出 Z 2 , Z 3 Z_2, Z_3 Z2,Z3。
补全 Z 2 Z_{2} Z2 和 Z 3 Z_{3} Z3 的计算:
延续相同的输入和 Q , K , V Q, K, V Q,K,V 值
计算 Z 2 Z_{2} Z2(对应"好")
Q 2 = 2 , 2 , 0 Q_2 = 2, 2, 0 Q2=2,2,0
与各 Key 的点积(未缩放):
- Q 2 ⋅ K 1 T = 2 × 1 + 2 × 1 + 0 × 0 = 4 Q_2 \cdot K_1^T = 2×1+2×1+0×0=4 Q2⋅K1T=2×1+2×1+0×0=4
- Q 2 ⋅ K 2 T = 2 × 0 + 2 × 2 + 0 × 2 = 4 Q_2 \cdot K_2^T = 2×0+2×2+0×2=4 Q2⋅K2T=2×0+2×2+0×2=4
- Q 2 ⋅ K 3 T = 2 × 1 + 2 × 2 + 0 × 1 = 6 Q_2 \cdot K_3^T = 2×1+2×2+0×1=6 Q2⋅K3T=2×1+2×2+0×1=6
缩放(除以 3 ≈ 1.732 \sqrt{3} \approx 1.732 3 ≈1.732):
- 4 / 1.732 ≈ 2.309 4 / 1.732 ≈ 2.309 4/1.732≈2.309
- 4 / 1.732 ≈ 2.309 4 / 1.732 ≈ 2.309 4/1.732≈2.309
- 6 / 1.732 ≈ 3.464 6 / 1.732 ≈ 3.464 6/1.732≈3.464
Softmax 权重
- e 2.309 ≈ 10.06 e^{2.309} \approx 10.06 e2.309≈10.06
- e 3.464 ≈ 31.90 e^{3.464} \approx 31.90 e3.464≈31.90
- 分母 ≈ 10.06 + 10.06 + 31.90 = 52.02 \approx 10.06 + 10.06 + 31.90 = 52.02 ≈10.06+10.06+31.90=52.02
- 权重: 10.06 / 52.02 ≈ 0.193 , 0.193 , 31.90 / 52.02 ≈ 0.613 10.06/52.02 \\approx 0.193, 0.193, 31.90/52.02 \\approx 0.613 10.06/52.02≈0.193,0.193,31.90/52.02≈0.613
加权求和 Z 2 = 0.193 V 1 + 0.193 V 2 + 0.613 V 3 Z_2 = 0.193V_1 + 0.193V_2 + 0.613V_3 Z2=0.193V1+0.193V2+0.613V3
V 1 = 1 , 0 , 2 , V 2 = 2 , 4 , 0 , V 3 = 2 , 2 , 2 V1 = 1,0,2 ,V2 = 2,4,0 ,V3 = 2,2,2 V1=1,0,2,V2=2,4,0,V3=2,2,2
- 第一维: 0.193 × 1 + 0.193 × 2 + 0.613 × 2 = 0.193 + 0.386 + 1.226 = 1.8050.193 × 1 + 0.193 × 2 + 0.613 × 2 = 0.193 + 0.386 + 1.226 = 1.805 0.193×1+0.193×2+0.613×2=0.193+0.386+1.226=1.8050.193×1+0.193×2+0.613×2=0.193+0.386+1.226=1.805 0.193×1+0.193×2+0.613×2=0.193+0.386+1.226=1.8050.193×1+0.193×2+0.613×2=0.193+0.386+1.226=1.805
- 第二维: 0.193 × 0 + 0.193 × 4 + 0.613 × 2 = 0 + 0.772 + 1.226 = 1.9980.193 × 0 + 0.193 × 4 + 0.613 × 2 = 0 + 0.772 + 1.226 = 1.998 0.193×0+0.193×4+0.613×2=0+0.772+1.226=1.9980.193×0+0.193×4+0.613×2=0+0.772+1.226=1.998 0.193×0+0.193×4+0.613×2=0+0.772+1.226=1.9980.193×0+0.193×4+0.613×2=0+0.772+1.226=1.998
- 第三维: 0.193 × 2 + 0.193 × 0 + 0.613 × 2 = 0.386 + 0 + 1.226 = 1.6120.193 × 2 + 0.193 × 0 + 0.613 × 2 = 0.386 + 0 + 1.226 = 1.612 0.193×2+0.193×0+0.613×2=0.386+0+1.226=1.6120.193×2+0.193×0+0.613×2=0.386+0+1.226=1.612 0.193×2+0.193×0+0.613×2=0.386+0+1.226=1.6120.193×2+0.193×0+0.613×2=0.386+0+1.226=1.612
得到 Z 2 ≈ 1.805 , 1.998 , 1.612 Z_2 \approx 1.805,1.998,1.612 Z2≈1.805,1.998,1.612
计算 Z 3 Z_{3} Z3(对应"机车")
Q 3 = 2 , 1 , 1 Q_3 = 2, 1, 1 Q3=2,1,1
与各 Key 的点积(未缩放)
- Q 3 ⋅ K 1 T = 2 × 1 + 1 × 1 + 1 × 0 = 3 Q_3 \cdot K_1^T = 2 \times 1 + 1 \times 1 + 1 \times 0 = 3 Q3⋅K1T=2×1+1×1+1×0=3
- Q 3 ⋅ K 2 T = 2 × 0 + 1 × 2 + 1 × 2 = 4 Q_3 \cdot K_2^T = 2 \times 0 + 1 \times 2 + 1 \times 2 = 4 Q3⋅K2T=2×0+1×2+1×2=4
- Q 3 ⋅ K 3 T = 2 × 1 + 1 × 2 + 1 × 1 = 5 Q_3 \cdot K_3^T = 2 \times 1 + 1 \times 2 + 1 \times 1 = 5 Q3⋅K3T=2×1+1×2+1×1=5
缩放:
- 3 / 1.732 ≈ 1.732 3 / 1.732 ≈ 1.732 3/1.732≈1.732
- 4 / 1.732 ≈ 2.309 4 / 1.732 ≈ 2.309 4/1.732≈2.309
- 5 / 1.732 ≈ 2.887 5 / 1.732 ≈ 2.887 5/1.732≈2.887
Softmax 权重:
- e 1.732 ≈ 5.65 e^{1.732} \approx 5.65 e1.732≈5.65
- e 2.309 ≈ 10.06 e^{2.309} \approx 10.06 e2.309≈10.06
- e 2.887 ≈ 17.93 e^{2.887} \approx 17.93 e2.887≈17.93
- 分母 ≈ 5.65 + 10.06 + 17.93 = 33.64 \approx 5.65 + 10.06 + 17.93 = 33.64 ≈5.65+10.06+17.93=33.64
- 权重: 5.65 / 33.64 ≈ 0.168 , 10.06 / 33.64 ≈ 0.299 , 17.93 / 33.64 ≈ 0.533 5.65/33.64 \\approx 0.168, 10.06/33.64 \\approx 0.299, 17.93/33.64 \\approx 0.533 5.65/33.64≈0.168,10.06/33.64≈0.299,17.93/33.64≈0.533
加权求和: Z 3 = 0.168 V 1 + 0.299 V 2 + 0.533 V 3 Z_3 = 0.168V_1 + 0.299V_2 + 0.533V_3 Z3=0.168V1+0.299V2+0.533V3
- 第一维: 0.168 × 1 + 0.299 × 2 + 0.533 × 2 = 0.168 + 0.598 + 1.066 = 1.8320.168 × 1 + 0.299 × 2 + 0.533 × 2 = 0.168 + 0.598 + 1.066 = 1.832 0.168×1+0.299×2+0.533×2=0.168+0.598+1.066=1.8320.168×1+0.299×2+0.533×2=0.168+0.598+1.066=1.832 0.168×1+0.299×2+0.533×2=0.168+0.598+1.066=1.8320.168×1+0.299×2+0.533×2=0.168+0.598+1.066=1.832
- 第二维: 0.168 × 0 + 0.299 × 4 + 0.533 × 2 = 0 + 1.196 + 1.066 = 2.2620.168 × 0 + 0.299 × 4 + 0.533 × 2 = 0 + 1.196 + 1.066 = 2.262 0.168×0+0.299×4+0.533×2=0+1.196+1.066=2.2620.168×0+0.299×4+0.533×2=0+1.196+1.066=2.262 0.168×0+0.299×4+0.533×2=0+1.196+1.066=2.2620.168×0+0.299×4+0.533×2=0+1.196+1.066=2.262
- 第三维: 0.168 × 2 + 0.299 × 0 + 0.533 × 2 = 0.336 + 0 + 1.066 = 1.4020.168 × 2 + 0.299 × 0 + 0.533 × 2 = 0.336 + 0 + 1.066 = 1.402 0.168×2+0.299×0+0.533×2=0.336+0+1.066=1.4020.168×2+0.299×0+0.533×2=0.336+0+1.066=1.402 0.168×2+0.299×0+0.533×2=0.336+0+1.066=1.4020.168×2+0.299×0+0.533×2=0.336+0+1.066=1.402
得到 Z 2 ≈ 1.832 , 2.262 , 1.402 Z_2 \approx 1.832,2.262,1.402 Z2≈1.832,2.262,1.402
小结:
可以看到,"你" 的输出融合了全序列信息,且与"好""机车"的权重较高,体现了长距离依赖。
解读:
"你"的输出融合了全序列信息。 计算"你"的最终表示 Z 1 Z_{1} Z1 时,并不只用"你"自己的信息,而是把整个序列里"你""好""机车"三者的信息都考虑了进去。
通过 Z 1 Z_{1} Z1 的计算公式是加权求和: Z 1 = w 11 V 1 + w 12 V 2 + w 13 V 3 Z_1 = w_{11}V_1 + w_{12}V_2 + w_{13}V_3 Z1=w11V1+w12V2+w13V3
- 权重 w 11 , w 12 , w 13 w_{11},w_{12},w_{13} w11,w12,w13 是注意力权重, V 1 , V 2 , V 3 V_{1},V_{2},V_{3} V1,V2,V3分别是"你""好""机车"的值向量
- 因此 Z 1 Z_{1} Z1 里同时包含了这三个词的特征,这就是"融合了全序列信息"。
"与'好''机车'的权重较高"。在计算 Z 1 Z_{1} Z1 时,分配给"好"和"机车"的注意力权重比分配给"你"自己的还要高。
从前面算出的注意力权重是:
- "你" → "你":0.219
- "你" → "好":0.391
- "你" → "机车":0.391
可见,后两者的权重明显高于 0.219,所以"你"更多地关注了"好"和"机车"
所以为什么这体现了"长距离依赖"?
在序列"你 好 机车"中,"你"和"机车"之间隔着一个词,属于较长距离。
传统 RNN 等模型可能因为距离远而难以直接建立联系,但自注意力机制可以直接计算它们之间的点积并给予高权重。
说明它能自动跨越距离,捕捉到语义上相关的元素,这就是"长距离依赖"。
从 Q 1 Q_{1} Q1 ("你"的查询)与各个 K 的点积时:
- Q 1 ⋅ K 1 = 1 Q_1 \cdot K_1 = 1 Q1⋅K1=1 (自身)
- Q 1 ⋅ K 2 = 2 Q_1 \cdot K_2 = 2 Q1⋅K2=2 (好)
- Q 1 ⋅ K 3 = 2 Q_1 \cdot K_3 = 2 Q1⋅K3=2 (机车)
点积大小反映了原始的"匹配程度"。
可以看到, Q 1 Q_{1} Q1 与远处的"机车"点积和"好"一样高,并没有因为距离而衰减。
经过 softmax 归一化后,这种相关性直接反映为注意力权重的高低,从而让"机车"的信息在 Z 1 Z_{1} Z1 中占据重要地位。
这就是"长距离依赖"的数值证据。
4. 多头自注意力机制 ------ 从单视角到多视角
单头注意力只能学习一种关联模式,多头则并行运行多个独立的注意力"头",让模型关注不同子空间的信息。
延续上例,设头数 h = 2 h=2 h=2
我们需要为每个头准备单独的 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV。
简单起见,将原先的 W ∗ W^* W∗ 拆分为两部分:前两列给 head 1,后一列给 head 2(或者降维后再拆)。
这里我们重新定义每个头的维度 d k = d v = 2 d_k = d_v = 2 dk=dv=2,权重随机设定。
Head 1 权重矩阵(4×2):
W Q 1 = 1 0 0 1 0 0 1 0 W^{Q1} = \begin{bmatrix}1&0\\0&1\\0&0\\1&0\end{bmatrix} WQ1= 10010100 ,
W K 1 = 0 1 1 0 0 1 0 0 W^{K1} = \begin{bmatrix}0&1\\1&0\\0&1\\0&0\end{bmatrix} WK1= 01001010 ,
W V 1 = 1 0 0 1 1 0 0 1 W^{V1} = \begin{bmatrix}1&0\\0&1\\1&0\\0&1\end{bmatrix} WV1= 10100101
Head 2 权重矩阵(4×2):
W Q 2 = 0 0 1 0 0 1 0 1 W^{Q2} = \begin{bmatrix}0&0\\1&0\\0&1\\0&1\end{bmatrix} WQ2= 01000011 ,
W K 2 = 1 0 0 0 0 1 1 0 W^{K2} = \begin{bmatrix}1&0\\0&0\\0&1\\1&0\end{bmatrix} WK2= 10010010 ,
W V 2 = 0 1 1 1 0 0 1 0 W^{V2} = \begin{bmatrix}0&1\\1&1\\0&0\\1&0\end{bmatrix} WV2= 01011100
计算每个头的 Q, K, V(仅以"你"为例,其他词类似)
对 X 1 = 1 , 0 , 1 , 0 X_1=1,0,1,0 X1=1,0,1,0:
- Head1:
Q 1 1 = 1 , 0 Q_1^1 = 1,0 Q11=1,0,
K 1 1 = 1 , 0 , 1 , 0 W K 1 = 0 , 2 K_1^1 = 1,0,1,0 W^{K1} = 0, 2 K11=1,0,1,0WK1=0,2 (计算: 1 × 0 + 0 × 1 + 1 × 0 + 0 × 0 = 0 1\times0+0\times1+1\times0+0\times0 = 0 1×0+0×1+1×0+0×0=0, 1 × 1 + 0 × 0 + 1 × 1 + 0 × 0 = 2 1\times1+0\times0+1\times1+0\times0 = 2 1×1+0×0+1×1+0×0=2)
V 1 1 = 1 , 0 , 1 , 0 , W V 1 = 2 , 0 V_1^1 = 1,0,1,0 ,W^{V1} = 2, 0 V11=1,0,1,0,WV1=2,0 - Head2:
Q 1 2 = 1 , 0 , 1 , 0 , W Q 2 = 0 , 1 Q_1^2 = 1,0,1,0 ,W^{Q2} = 0, 1 Q12=1,0,1,0,WQ2=0,1 (第一维: 1 × 0 + 0 × 1 + 1 × 0 + 0 × 0 = 0 1\times0+0\times1+1\times0+0\times0=0 1×0+0×1+1×0+0×0=0,第二维: 1 × 0 + 0 × 0 + 1 × 1 + 0 × 1 = 1 1\times0+0\times0+1\times1+0\times1=1 1×0+0×0+1×1+0×1=1)
K 1 2 = 1 , 0 , 1 , 0 , W K 2 = 1 , 1 K_1^2 = 1,0,1,0 ,W^{K2} = 1, 1 K12=1,0,1,0,WK2=1,1 (第一维: 1 × 1 + 0 × 0 + 1 × 0 + 0 × 1 = 1 1\times1+0\times0+1\times0+0\times1=1 1×1+0×0+1×0+0×1=1,第二维: 1 × 0 + 0 × 0 + 1 × 1 + 0 × 0 = 1 1\times0+0\times0+1\times1+0\times0=1 1×0+0×0+1×1+0×0=1)
V 1 2 = 1 , 0 , 1 , 0 , W V 2 = 0 , 1 V_1^2 = 1,0,1,0 ,W^{V2} = 0, 1 V12=1,0,1,0,WV2=0,1 (第一维: 1 × 0 + 0 × 1 + 1 × 0 + 0 × 1 = 0 1\times0+0\times1+1\times0+0\times1=0 1×0+0×1+1×0+0×1=0,第二维: 1 × 1 + 0 × 1 + 1 × 0 + 0 × 0 = 1 1\times1+0\times1+1\times0+0\times0=1 1×1+0×1+1×0+0×0=1)
接着在每个头内,独立地进行缩放点积注意力计算(过程同第三节),得到每个头输出的 Z i 1 , Z i 2 Z_i^1, Z_i^2 Zi1,Zi2(维度均为2)。
最后,将两个头的输出拼接起来,再乘以输出权重矩阵 W O W^O WO(这里可设为2×4→4)得到最终的多头输出。
例如,拼接后 Z 1 = Z 1 1 , Z 1 2 Z_1 = Z_1\^1, Z_1\^2 Z1=Z11,Z12 维度为4,再与 W O W^O WO 相乘还原到模型维度。这样,序列的每个位置都包含了来自不同表示子空间的信息。
5. 通道注意力机制(SENet) ------ 告诉模型"哪个通道更重要"
在卷积神经网络中,不同的卷积核提取不同特征(纹理、颜色等),但并非所有通道都对当前任务同等有用。通道注意力就是给每个通道分配权重。
SENet 步骤(假设输入特征图维度 C × H × W C \times H \times W C×H×W)
- Squeeze(压缩) :对每个通道做全局平均池化,得到一个 C C C 维向量。例如,某通道的 2 × 2 2\times2 2×2 特征图为 1 3 2 4 \begin{bmatrix}1&3\\2&4\end{bmatrix} 1234,池化后为 ( 1 + 3 + 2 + 4 ) / 4 = 2.5 (1+3+2+4)/4 = 2.5 (1+3+2+4)/4=2.5。
- Excitation(激励):将这个向量送入一个小型全连接网络(降维再升维),经 Sigmoid 激活后得到每个通道的权重(0~1之间)。
- Scale(缩放):将原始特征图每个通道乘以对应权重,强化重要通道,抑制次要通道。
数值示例 :
假设经过卷积后的特征图 U U U 有 3 个通道,每个通道空间尺寸 2 × 2 2\times2 2×2。
C 1 : 1 1 1 1 , C 2 : 2 2 2 2 , C 3 : 3 3 3 3 C1: \begin{bmatrix}1&1\\1&1\end{bmatrix}, C2: \begin{bmatrix}2&2\\2&2\end{bmatrix}, C3: \begin{bmatrix}3&3\\3&3\end{bmatrix} C1:1111,C2:2222,C3:3333
Squeeze 得向量 1 , 2 , 3 1, 2, 3 1,2,3。经过一个简单的 Excitation 网络(设权重 W 1 W_1 W1 将3维映射到2维,ReLU,再映射回3维,Sigmoid),可能得到权重 0.2 , 0.5 , 0.9 0.2, 0.5, 0.9 0.2,0.5,0.9。
最后,逐通道相乘:C1 所有值变为 1 × 0.2 = 0.2 1\times0.2=0.2 1×0.2=0.2,C2 变为 2 × 0.5 = 1.0 2\times0.5=1.0 2×0.5=1.0,C3 变为 3 × 0.9 = 2.7 3\times0.9=2.7 3×0.9=2.7。模型将更关注第三个通道的特征。
6. 空间注意力机制(CBAM 中的空间注意力) ------ 告诉模型"哪里更重要"
空间注意力关注的是图像中的位置,通过压缩通道维度来得到二维的空间重要性图。CBAM 中的空间注意力模块接在通道注意力之后。
计算步骤:
- 对输入特征图( C × H × W C \times H \times W C×H×W),在通道维度上分别做全局最大池化和全局平均池化,得到两个 1 × H × W 1\times H\times W 1×H×W 的矩阵。
- 将这两个矩阵拼接起来,形成一个 2 × H × W 2\times H\times W 2×H×W 的"特征图"。
- 通过一个卷积层(如7×7卷积)和 Sigmoid 激活,生成一张空间权重图( 1 × H × W 1\times H\times W 1×H×W)。
- 将这张权重图乘回原始特征图的每一个位置(广播相乘)。
数值示例 :
假设某个 2 × 2 2\times2 2×2 空间位置,通过所有通道的像素值(3个通道)为:
位置(0,0): 1, 5, 3 → 平均池化=3,最大池化=5
位置(0,1): 2, 4, 2 → 平均=2.67,最大=4
位置(1,0): 0, 6, 1 → 平均=2.33,最大=6
位置(1,1): 3, 3, 4 → 平均=3.33,最大=4
拼接后得到两个"通道"的2×2矩阵:平均池化矩阵 3 2.67 2.33 3.33 \begin{bmatrix}3 & 2.67\\ 2.33 & 3.33\end{bmatrix} 32.332.673.33,最大池化矩阵 5 4 6 4 \begin{bmatrix}5&4\\6&4\end{bmatrix} 5644。
经过卷积和 Sigmoid 后,可能得到空间权重 0.9 0.3 0.8 0.5 \begin{bmatrix}0.9 & 0.3\\ 0.8 & 0.5\end{bmatrix} 0.90.80.30.5。
将这个权重乘到原特征图每个通道的相应空间位置,让模型更关注(0,0)和(1,0)等高权重区域。
7. 完整串联:从自然语言处理到计算机视觉
我们用一个虚构的跨模态任务将上述机制串联起来:输入一张图片,模型需生成其文字描述。
- 视觉编码器:用 CNN 提取图像特征图,依次通过通道注意力(SENet)和空间注意力(CBAM)增强特征,让模型聚焦在显著物体区域。
- 特征向量化:将增强后的特征图展平或通过某个区域特征提取,得到一组向量序列,作为"图像部分的词元"。
- 序列融合:将图像词元与文本前缀(如"START")一同输入 Transformer 解码器。解码器中,自注意力让文本上下文交互,交叉注意力(Q 来自文本,K,V 来自图像)则将视觉信息注入文本生成。
- 生成下一个词:每一层都使用多头自注意力或交叉注意力,最终输出词的概率分布。
在这个过程中,通道注意力筛选了有用的特征通道,空间注意力锁定了关键图像位置,而自注意力/多头注意力保证了文本序列的连贯性和对视觉信息的动态选取。
总结
自注意力让序列元素两两交互,多头则提供多子空间表征。
通道注意力(SENet)告诉模型"哪个通道值得关注",空间注意力(CBAM)指出"通道内的哪个位置更重要"。
这些机制可以灵活组合,如 Transformer + CBAM 的视觉模型,或文本任务中加入通道/空间维度重标定。