当前位置: 首页 > news >正文

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机制能够在训练和推理过程中保持数值稳定性和计算效率。

http://www.lryc.cn/news/417302.html

相关文章:

  • 安装MongoDB UI客户端工具:mongodb-compass-1.40.2-win32-x64.msi
  • 一行命令搞定内网穿透
  • C语言——扫雷游戏
  • 【LLM】-16-评估LLM-与标准答案的差距
  • WeNet 2.0:更高效的端到端语音识别工具包
  • 阿里大模型调用 = 》通义千问大语言模型
  • idea使用free流程,2024idea免费使用
  • 算法_链表专题---持续更新
  • 在Windows MFC\C++编程中,如何使用OnCopyData函数
  • 【Qt】项目代码
  • MySQL中常用工具
  • 关于儿童编程语言
  • [io]进程间通信 -信号函数 —信号处理过程
  • RoboDK的插件
  • List<HashMap<String, Object>>排序
  • 【大数据】探索大数据基础知识:定义、特征与生态系统
  • 营销材料翻译质量对销售渠道的影响
  • centos7.9安装k8s 1.3
  • 【第七节】python多线程及网络编程
  • Linux Shell编程--变量
  • 软文写作必须掌握的技巧有哪些?
  • 探索灵办AI:智能办公的好帮手
  • gin-vue-admin框架遇到AxiosError:Network Error怎么解决?
  • 作业zzz
  • python 空list如何表示
  • C++ const、constexpr与consteval作用与区别
  • solidity 数学和密码学函数
  • opencv-图像透视变换
  • C++ 域
  • 安装Supervisor队列进程、管理 Laravel 队列进程