selfAttention 中的dk到底是什么

在Self-Attention机制中,为什么需要对 Q K T QK^T QKT 的结果进行缩放,除以 d k \sqrt{d_k} dk 。以下是详细解释:

缩放的原因

除以 d k \sqrt{d_k} dk 的原因有两个:

  1. 防止输入过大:如果不缩放, Q K T QK^T QKT的值可能会非常大,这会导致Softmax的值非常小,接近于0,从而造成梯度消失问题。
  2. 归一化:缩放使得 Q ⋅ K Q\cdot K QK 的结果满足均值为0,方差为1的分布,类似于归一化的效果。

数学推导

假设 Q Q Q K K K中的元素是从均值为0,方差为1的独立同分布随机变量。设 X = q i X = q_i X=qi Y = k i Y = k_i Y=ki,则:

  1. E ( X ) = E ( Y ) = 0 E(X) = E(Y) = 0 E(X)=E(Y)=0
  2. D ( X Y ) = E ( X 2 ) E ( Y 2 ) − [ E ( X ) E ( Y ) ] 2 = 1 ⋅ 1 − 0 = 1 D(XY) = E(X^2)E(Y^2) - [E(X)E(Y)]^2 = 1 \cdot 1 - 0 = 1 D(XY)=E(X2)E(Y2)[E(X)E(Y)]2=110=1

因此, D ( ∑ i = 1 d k q i k i ) = d k D\left(\sum_{i=1}^{d_k} q_i k_i\right) = d_k D(i=1dkqiki)=dk

Q K T QK^T QKT 的缩放:
D ( Q K T d k ) = 1 d k D ( ∑ i = 1 d k q i k i ) = 1 d k ⋅ d k = 1 D\left(\frac{QK^T}{\sqrt{d_k}}\right) = \frac{1}{d_k} D\left(\sum_{i=1}^{d_k} q_i k_i\right) = \frac{1}{d_k} \cdot d_k = 1 D(dk QKT)=dk1D(i=1dkqiki)=dk1dk=1

好的,让我们通过一个具体的例子来说明 (d_k) 的作用以及为什么要除以 (\sqrt{d_k})。

假设我们有一个查询向量 q \mathbf{q} q 和一个键向量 k \mathbf{k} k,它们的维度 d k = 4 d_k = 4 dk=4。这些向量的元素是均值为0、方差为1的独立同分布随机变量。我们具体来看下这两个向量的点积结果以及缩放后的结果。

假设:
q = [ 1.2 , − 0.5 , 0.3 , 0.8 ] \mathbf{q} = [1.2, -0.5, 0.3, 0.8] q=[1.2,0.5,0.3,0.8]
k = [ 0.6 , − 0.1 , − 1.5 , 0.7 ] \mathbf{k} = [0.6, -0.1, -1.5, 0.7] k=[0.6,0.1,1.5,0.7]

计算点积:
q ⋅ k = 1.2 × 0.6 + ( − 0.5 ) × ( − 0.1 ) + 0.3 × ( − 1.5 ) + 0.8 × 0.7 \mathbf{q} \cdot \mathbf{k} = 1.2 \times 0.6 + (-0.5) \times (-0.1) + 0.3 \times (-1.5) + 0.8 \times 0.7 qk=1.2×0.6+(0.5)×(0.1)+0.3×(1.5)+0.8×0.7
= 0.72 + 0.05 − 0.45 + 0.56 = 0.72 + 0.05 - 0.45 + 0.56 =0.72+0.050.45+0.56
= 0.88 = 0.88 =0.88

不进行缩放时,这个点积结果直接用于Softmax计算。但是,当 (d_k) 很大时,这个值可能会非常大,导致Softmax输出非常尖锐。为了避免这种情况,我们将点积结果除以 (\sqrt{d_k}) 来进行缩放。

在本例中, d k = 4 d_k = 4 dk=4,因此 d k = 2 \sqrt{d_k} = 2 dk =2

缩放后的点积结果:
q ⋅ k d k = 0.88 2 = 0.44 \frac{\mathbf{q} \cdot \mathbf{k}}{\sqrt{d_k}} = \frac{0.88}{2} = 0.44 dk qk=20.88=0.44

现在我们来比较一下经过Softmax之前的值和经过缩放后的值在Softmax函数中的效果:

假设有另外两个查询向量和键向量的点积结果分别为2.0和0.5,计算Softmax之前和之后的值。

不缩放时的点积结果
未缩放的点积值 = [ 0.88 , 2.0 , 0.5 ] \text{未缩放的点积值} = [0.88, 2.0, 0.5] 未缩放的点积值=[0.88,2.0,0.5]
Softmax计算:
Softmax ( 0.88 , 2.0 , 0.5 ) = [ e 0.88 e 0.88 + e 2.0 + e 0.5 , e 2.0 e 0.88 + e 2.0 + e 0.5 , e 0.5 e 0.88 + e 2.0 + e 0.5 ] \text{Softmax}(0.88, 2.0, 0.5) = \left[ \frac{e^{0.88}}{e^{0.88} + e^{2.0} + e^{0.5}}, \frac{e^{2.0}}{e^{0.88} + e^{2.0} + e^{0.5}}, \frac{e^{0.5}}{e^{0.88} + e^{2.0} + e^{0.5}} \right] Softmax(0.88,2.0,0.5)=[e0.88+e2.0+e0.5e0.88,e0.88+e2.0+e0.5e2.0,e0.88+e2.0+e0.5e0.5]
≈ [ 0.184 , 0.643 , 0.173 ] \approx [0.184, 0.643, 0.173] [0.184,0.643,0.173]

缩放后的点积结果
缩放的点积值 = [ 0.44 , 1.0 , 0.25 ] \text{缩放的点积值} = [0.44, 1.0, 0.25] 缩放的点积值=[0.44,1.0,0.25]
Softmax计算:
Softmax ( 0.44 , 1.0 , 0.25 ) = [ e 0.44 e 0.44 + e 1.0 + e 0.25 , e 1.0 e 0.44 + e 1.0 + e 0.25 , e 0.25 e 0.44 + e 1.0 + e 0.25 ] \text{Softmax}(0.44, 1.0, 0.25) = \left[ \frac{e^{0.44}}{e^{0.44} + e^{1.0} + e^{0.25}}, \frac{e^{1.0}}{e^{0.44} + e^{1.0} + e^{0.25}}, \frac{e^{0.25}}{e^{0.44} + e^{1.0} + e^{0.25}} \right] Softmax(0.44,1.0,0.25)=[e0.44+e1.0+e0.25e0.44,e0.44+e1.0+e0.25e1.0,e0.44+e1.0+e0.25e0.25]
≈ [ 0.272 , 0.459 , 0.269 ] \approx [0.272, 0.459, 0.269] [0.272,0.459,0.269]

可以看到,经过缩放后,Softmax的输出分布更加平滑,不再像未缩放前那样有较大的差异,这有助于梯度的稳定性和模型的训练效果。

通过这个例子,我们可以清楚地看到为什么在自注意力机制中对点积结果进行缩放是必要的,这样可以防止数值过大导致的问题,并且让Softmax的输出更为合理。

结论

通过上述推导,我们可以看到:

  • 对 (QK^T) 进行缩放,使其满足均值为0,方差为1的分布。
  • 这样处理后的值更加稳定,输入到Softmax函数后可以避免梯度消失问题。

综合解释

  • 为什么要缩放:缩放可以防止输入到Softmax的值过大,导致梯度消失,同时使得分布更稳定。
  • 缩放因子 d k \sqrt{d_k} dk :因为键向量 K K K 的维度为 d k d_k dk,在计算点积时需要对结果进行缩放,使其方差为1,保持稳定性。

通过对这些细节的处理,Self-Attention机制能够在训练和推理过程中保持数值稳定性和计算效率。

### 自注意力机制在计算机视觉中的概念 自注意力机制是一种允许模型不同位置相互关联的方法,在处理序列数据方面表现出色。对于图像这种二维结构的数据,自注意力能够捕捉像素间的全局依赖关系[^1]。 ### 计算机视觉中自注意力机制的应用场景 在计算机视觉领域,自注意力被广泛应用于多种任务: - **目标检测**:通过增强特征图上的重要区域来提高检测精度。 - **语义分割**:帮助更好地理解上下文信息,从而更精确地区分物体边界。 - **姿态估计**:利用长距离依赖建模人体关节之间的联系。 - **风格迁移**:促进源域和目标域之间更加自然的内容交换[^2]。 ### 自注意力机制的具体实现方式 #### 单头自注意力(Single-head Self-Attention) 单头自注意力计算过程如下所示: 给定输入矩阵 \(X\) ,其中每一列代表一个词向量,则可以定义查询\(Q\)、键\(K\) 和值 \(V\): \[ Q=W_Q X \] \[ K=W_K X \] \[ V=W_V X \] 这里 \(W_Q, W_K,\text{and } W_V\) 是可学习参数矩阵。接着计算注意力权重并得到输出 \(O\): \[ O=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_k}}\right)V \] 上述公式实现了标准的缩放点乘法注意力建模方案。 ```python import torch.nn as nn import math class SingleHeadSelfAttention(nn.Module): def __init__(self, d_model, dk=None): super(SingleHeadSelfAttention, self).__init__() if not dk: dk = d_model self.dk = dk self.query_transform = nn.Linear(d_model, dk) self.key_transform = nn.Linear(d_model, dk) self.value_transform = nn.Linear(d_model, dk) def forward(self, x): queries = self.query_transform(x) # (batch_size, seq_len, dk) keys = self.key_transform(x).transpose(-2,-1) # (batch_size, dk, seq_len) values = self.value_transform(x) # (batch_size, seq_len, dk) scores = torch.matmul(queries, keys) / math.sqrt(self.dk) # Scale dot-product attention score calculation. attn_weights = F.softmax(scores,dim=-1) # Softmax normalization over last dimension. output = torch.matmul(attn_weights,values) # Weighted sum of value vectors based on computed weights. return output # Output tensor with shape (batch_size,seq_length,d_k). ``` 为了进一步提升性能,通常会采用多头自注意力机制(Multi-Head Self-Attention),它可以在不同的子空间内独立执行多次自注意力操作后再拼接起来作为最终输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ai君臣

学会的就要教给人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值