为什么self-attention除以根号dk而不是其他值

最近在看transformers源码的过程中一直有个疑问,为什么self-attention在Q向量与K向量转置相乘后要除以根号dk而不是dk或是其他值,借此机会做个记录。

为什么要除以一个数?

self-attention在计算注意力分数的时候,用query向量与key向量转置相乘,再除以根号d_k,经过softmax之后得到注意力权重,源码实现如下:

python 复制代码
scores = torch.matmul(query, key.transpose(-2, -1)) \ math.sqrt(d_k)
p_attn = F.softmax(scores, dim = -1)

那为什么要除以一个数呢?这与softmax的求导有关,下面给出softmax计算公式:

另softmax的表达式为x,则softmax求导结果为x*(1-x),若某项zi偏大或偏小,则softmax计算结果趋向于1或0,而其导数则会趋向于0,造成梯度消失,不利于训练的稳定,所以在计算完注意力分数后要除以一个数,以稳定其梯度。

为什么要除以根号dk呢?

在明白为什么要除以一个数之后,那么问题来了,为什么除以的是根号dk呢,而不是dk、dk的平方或者其他数值呢?

首先假设q向量与k向量是均值为0、方差为1的随机向量,则q向量与k向量相乘之后,方差随维度线性增长,相乘后方差为dk,标准差为根号dk。

根据方差的性质:

因此可以做出以下推导,在q向量与k向量乘积后除以根号dk,可以将原来的方差缩放为1,将输出控制在合理的范围内,为后续的Softmax计算提供了稳定的输入。

相关推荐
Ekehlaft1 分钟前
这款国产 AI,让 Python 小白也能玩转编程
开发语言·人工智能·python·ai·aipy
哈__2 分钟前
CANN多模型并发部署方案
人工智能·pytorch
深鱼~2 分钟前
Attention机制加速实战:基于ops-transformer的性能优化
深度学习·性能优化·transformer·cann
予枫的编程笔记4 分钟前
【Linux入门篇】Linux运维必学:Vim核心操作详解,告别编辑器依赖
linux·人工智能·linux运维·vim操作教程·程序员工具·编辑器技巧·新手学vim
慢半拍iii5 分钟前
对比分析:ops-nn与传统深度学习框架算子的差异
人工智能·深度学习·ai·cann
心疼你的一切7 分钟前
解构CANN仓库:AIGC API从底层逻辑到实战落地,解锁国产化AI生成算力
数据仓库·人工智能·深度学习·aigc·cann
啊阿狸不会拉杆15 分钟前
《机器学习导论》第 5 章-多元方法
人工智能·python·算法·机器学习·numpy·matplotlib·多元方法
薯一个蜂蜜牛奶味的愿15 分钟前
模块化显示神经网络结构的可视化工具--BlockShow
人工智能·深度学习·神经网络
心疼你的一切18 分钟前
基于CANN仓库算力手把手实现Stable Diffusion图像生成(附完整代码+流程图)
数据仓库·深度学习·stable diffusion·aigc·流程图·cann
班德先生19 分钟前
深耕多赛道品牌全案策划,为科技与时尚注入商业表达力
大数据·人工智能·科技