为什么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计算提供了稳定的输入。

相关推荐
Larcher1 小时前
从零搭建 MCP 服务——让 AI 拥有无限扩展能力
人工智能·程序员
zzzzzz3102 小时前
你的 AI 写的 React 烂透了?这个 8000+ Star 的开源工具能揪出 90% 的「Agent 屎山」
人工智能
小星AI2 小时前
MCP协议超详细教程,从入门到实战
人工智能
小星AI2 小时前
Kimi Code CLI 超详细教程,附源码
人工智能·agent
牧艺2 小时前
Cursor Rules / Skills 分层设计:让 Agent 像「团队新同事」
前端·人工智能·cursor
shepherd1112 小时前
一文带你掌握 LLM、Token、Context、Prompt、RAG、MCP、Skill、Agent 等 AI 核心概念
人工智能·后端·ai编程
小林ixn3 小时前
MCP 保姆级入门指南:AI 的“万能充电口”到底怎么玩?
人工智能
转转技术团队4 小时前
没有测试的核心代码,怎么交给 AI 重构
人工智能
爱读源码的大都督5 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端