关于注意力机制的理解
注意力机制的经典公式详解
注意力机制的经典公式如下:
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(dkQKT)V
这是一种点积注意力(Scaled Dot-Product Attention),广泛用于 Transformer 及其变种(如 BERT、GPT)。
1. 公式的含义
在该公式中:
- Q Q Q(Query,查询):表示当前要寻找相关信息的向量。
- K K K(Key,键):表示可供查询的参考向量集合。
- V V V(Value,值):表示与键对应的实际信息,用于加权求和得到最终的输出。
- d k d_k dk:键向量的维度(通常是模型的隐藏层维度)。
- Q K T QK^T QKT:计算查询向量与键向量的相关性,得到一个注意力权重的分数矩阵。
- Softmax:归一化相关性得分,使其成为概率分布。
- 乘以 V V V:加权求和,得到最终的注意力输出。
2. 计算步骤
假设有以下数据:
- 句子长度(Token 数量): n n n
- 词向量维度: d k d_k dk
那么 Q , K , V Q, K, V Q,K,V 的形状如下:
- Q ∈ R n × d k Q \in \mathbb{R}^{n \times d_k} Q∈Rn×dk
- K ∈ R n × d k K \in \mathbb{R}^{n \times d_k} K∈Rn×dk
- V ∈ R n × d v V \in \mathbb{R}^{n \times d_v} V∈Rn×dv
(1) 计算相似度: Q K T QK^T QKT
S = Q K T S = QK^T S=QKT
S S S 是一个 n × n n \times n n×n 形状的矩阵,其中:
- 第 i , j i, j i,j 位置的值表示 第 i i i 个查询向量(query)与第 j j j 个键向量(key)的相似度。
- 计算方式是点积(Dot-Product),即: S i j = Q i ⋅ K j S_{ij} = Q_i \cdot K_j Sij=Qi⋅Kj
(2) 进行缩放
Q K T d k \frac{QK^T}{\sqrt{d_k}} dkQKT
缩放的作用:
- 当 d k d_k dk 很大时,点积的数值可能很大,导致 Softmax 计算的梯度过大,使模型训练不稳定。
- 通过除以 d k \sqrt{d_k} dk,可以让计算保持较为平稳,防止梯度消失或梯度爆炸。
(3) 归一化:Softmax
A = softmax ( Q K T d k ) A = \text{softmax} \left(\frac{QK^T}{\sqrt{d_k}}\right) A=softmax(dkQKT)
Softmax 归一化:
-
让所有注意力权重的总和为 1,形成一个概率分布:
A i j = exp ( S i j ) ∑ k exp ( S i k ) A_{ij} = \frac{\exp(S_{ij})}{\sum_{k} \exp(S_{ik})} Aij=∑kexp(Sik)exp(Sij) -
这样模型可以学习到应该关注哪些部分,忽略哪些部分。
(4) 加权求和
Output = A V \text{Output} = A V Output=AV
- A A A 是注意力权重矩阵( n × n n \times n n×n)。
- V V V 是值矩阵( n × d v n \times d_v n×dv)。
- 最终的输出仍然是一个矩阵 n × d v n \times d_v n×dv。
3. 计算复杂度
对于输入序列长度为 n n n,每个词的维度为 d k d_k dk:
- 计算 Q K T QK^T QKT 需要 O ( n 2 d k ) O(n^2 d_k) O(n2dk)
- 计算 A V A V AV 需要 O ( n 2 d v ) O(n^2 d_v) O(n2dv)
- 总复杂度: O ( n 2 d k ) O(n^2 d_k) O(n2dk)
- 相比 RNN( O ( n d k 2 ) O(n d_k^2) O(ndk2)),Transformer 具有更好的并行性,但计算量较大。
偷偷举个例子:
假设你在寻找一辆 1500匹马力 的车,手头有三辆车的选择:
- 科尼塞克Gemera:2300匹马力
- 小米苏7 Ultra:1548匹马力
- 比亚迪:200匹马力
在这个例子中,你的需求是 1500匹马力,我们可以将其转化为 查询向量(Q),而每辆车的马力值就是 键向量(K) 和 值向量(V)。
1. 查询向量 Q Q Q(你的需求):
你需要的是一辆 1500匹马力 的车,所以查询向量 Q Q Q 是 1500。
Q = 1500 Q = 1500 Q=1500
2. 键向量 K K K(每辆车的马力):
你有三辆车,每辆车的马力如下:
- 科尼塞克Gemera:2300匹马力( K 1 = 2300 K_1 = 2300 K1=2300)
- 小米苏7 Ultra:1548匹马力( K 2 = 1548 K_2 = 1548 K2=1548)
- 比亚迪:200匹马力( K 3 = 200 K_3 = 200 K3=200)
K = [ 2300 , 1548 , 200 ] K = [2300, 1548, 200] K=[2300,1548,200]
3. 值向量 V V V(每辆车的马力):
值向量其实就是你关心的 每辆车的马力值:
- 科尼塞克Gemera:2300匹马力( V 1 = 2300 V_1 = 2300 V1=2300)
- 小米苏7 Ultra:1548匹马力( V 2 = 1548 V_2 = 1548 V2=1548)
- 比亚迪:200匹马力( V 3 = 200 V_3 = 200 V3=200)
4. 计算相关性 Q K T QK^T QKT(查询与每辆车的马力差距):
接下来,我们计算你的需求( Q = 1500 Q = 1500 Q=1500)与每辆车的马力( K K K)之间的差距。这里的相关性实际上是你与每辆车马力的 差值,差值越小表示越接近。
- 科尼塞克Gemera: ∣ Q − K 1 ∣ = ∣ 1500 − 2300 ∣ = 800 |Q - K_1| = |1500 - 2300| = 800 ∣Q−K1∣=∣1500−2300∣=800
- 小米苏7 Ultra: ∣ Q − K 2 ∣ = ∣ 1500 − 1548 ∣ = 48 |Q - K_2| = |1500 - 1548| = 48 ∣Q−K2∣=∣1500−1548∣=48
- 比亚迪: ∣ Q − K 3 ∣ = ∣ 1500 − 200 ∣ = 1300 |Q - K_3| = |1500 - 200| = 1300 ∣Q−K3∣=∣1500−200∣=1300
相关性矩阵为:
Q K T = [ 800 , 48 , 1300 ] QK^T = [800, 48, 1300] QKT=[800,48,1300]
5. 应用 Softmax:
通过 Softmax 将这些差距转化为权重。Softmax 会将这些差值转换为概率,使得差值小的(即越接近1500匹马力的车)获得更高的权重。
Softmax ( [ 800 , 48 , 1300 ] ) = [ 0.01 , 0.89 , 0.1 ] \text{Softmax}([800, 48, 1300]) = [0.01, 0.89, 0.1] Softmax([800,48,1300])=[0.01,0.89,0.1]
这意味着:
- 科尼塞克Gemera的选择概率是 0.01
- 小米苏7 Ultra的选择概率是 0.89
- 比亚迪的选择概率是 0.1
6. 加权求和(最终选择):
最后,我们将这些概率应用到每辆车的马力值( V V V)上,进行加权求和,得到最终选择的马力值。
Output = 0.01 × 2300 + 0.89 × 1548 + 0.1 × 200 \text{Output} = 0.01 \times 2300 + 0.89 \times 1548 + 0.1 \times 200 Output=0.01×2300+0.89×1548+0.1×200
计算得到:
Output = 23 + 1378 + 20 = 1421 \text{Output} = 23 + 1378 + 20 = 1421 Output=23+1378+20=1421
结果:
最终的输出是 1421匹马力,这意味着在考虑了每辆车的马力和你需求的接近程度后,你选择了 小米苏7 Ultra,因为它的马力与 1500 匹最为接近(sinko才开电车,男人开V8!!)。
总结:
- Q Q Q 是你需要的马力(1500匹马力)。
- K K K 是每辆车的马力(2300匹、1548匹和200匹)。
- V V V 是你关心的马力值(对应的值向量就是车的马力)。
- Q K T QK^T QKT 计算查询与每辆车的差距。
- 通过 Softmax 将这些差距转化为选择概率。
- 最后通过 加权求和,得到最终选择的马力(1421匹),并选择了 小米苏7 Ultra。
4. 变种
(1) 多头注意力(Multi-Head Attention, MHA)
为了增强模型学习不同角度的信息,多头注意力将注意力分成多个子空间,并行计算:
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O MultiHead(Q,K,V)=Concat(head1,…,headh)WO
这样可以让模型从不同角度学习数据特征,提高表达能力。
(2) 自注意力(Self-Attention)
当 Q , K , V Q, K, V Q,K,V 都来自同一组输入时(如 Transformer 的编码器),我们称之为自注意力。
(3) 交叉注意力(Cross-Attention)
在 Transformer 解码器中, Q Q Q 来自目标句子, K , V K, V K,V 来自源句子,这种机制用于序列到序列任务(如翻译)。
5. 总结
-
核心思想: 计算查询( Q Q Q)与键( K K K)的相关性,生成注意力权重,然后用这些权重对值( V V V)加权求和。
-
关键公式:
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(dkQKT)V
-
改进版本: 多头注意力(MHA)、自注意力(Self-Attention)、交叉注意力(Cross-Attention)。
-
Transformer 使用此机制来替代 RNN,提高并行计算能力。