Bootstrap

注意力机制

关于注意力机制的理解

注意力机制的经典公式详解

注意力机制的经典公式如下:

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

这是一种点积注意力(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} QRn×dk
  • K ∈ R n × d k K \in \mathbb{R}^{n \times d_k} KRn×dk
  • V ∈ R n × d v V \in \mathbb{R}^{n \times d_v} VRn×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=QiKj

(2) 进行缩放

Q K T d k \frac{QK^T}{\sqrt{d_k}} dk QKT

缩放的作用:

  • 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(dk QKT)

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 QK1=∣15002300∣=800
  • 小米苏7 Ultra: ∣ Q − K 2 ∣ = ∣ 1500 − 1548 ∣ = 48 |Q - K_2| = |1500 - 1548| = 48 QK2=∣15001548∣=48
  • 比亚迪: ∣ Q − K 3 ∣ = ∣ 1500 − 200 ∣ = 1300 |Q - K_3| = |1500 - 200| = 1300 QK3=∣1500200∣=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!!)。


总结:

  1. Q Q Q 是你需要的马力(1500匹马力)。
  2. K K K 是每辆车的马力(2300匹、1548匹和200匹)。
  3. V V V 是你关心的马力值(对应的值向量就是车的马力)。
  4. Q K T QK^T QKT 计算查询与每辆车的差距。
  5. 通过 Softmax 将这些差距转化为选择概率。
  6. 最后通过 加权求和,得到最终选择的马力(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(dk QKT)V

  • 改进版本: 多头注意力(MHA)、自注意力(Self-Attention)、交叉注意力(Cross-Attention)。

  • Transformer 使用此机制来替代 RNN,提高并行计算能力。

;