真实面经题目 · 原创解析
Self attention的公式是什么,为什么要除以sqrt(dk)?
Self-attention 的常见公式是 Attention(Q,K,V)=softmax(QK^T/sqrt(dk))V。除以 sqrt(dk) 是为了控制点积分数的方差,避免维度较大时 logits 过大导致 softmax 饱和、梯度变小、训练不稳定。
真实面经题目 · 原创解析
Self-attention 的常见公式是 Attention(Q,K,V)=softmax(QK^T/sqrt(dk))V。除以 sqrt(dk) 是为了控制点积分数的方差,避免维度较大时 logits 过大导致 softmax 饱和、梯度变小、训练不稳定。
Self-attention 中,输入经过线性变换得到 Q、K、V,注意力输出一般写作 softmax(QK^T / sqrt(dk))V,其中 dk 是 key/query 的维度。QK^T 表示每个 query 和各个 key 的相似度,softmax 把相似度转成权重,再对 V 做加权求和。除以 sqrt(dk) 的原因是点积由 dk 个分量相加,如果分量近似独立且方差相近,点积方差会随 dk 增大而增大。logits 过大时 softmax 会变得很尖锐,进入饱和区,梯度变小,所以用 sqrt(dk) 缩放来稳定数值和训练。
Self-attention 的核心公式是 Attention(Q,K,V)=softmax(QK^T/sqrt(dk))V。Q 表示查询,K 表示键,V 表示值。因为是 self-attention,Q、K、V 都来自同一个序列的表示,只是通过不同线性投影得到,用来建模序列内部 token 之间的依赖关系。
QK^T 中的每个元素表示一个 query token 与一个 key token 的匹配程度。匹配分数越高,softmax 后的权重通常越大,对应的 value 对当前位置输出贡献越大。这样每个 token 的新表示都可以聚合其他 token 的信息,而不是只依赖局部邻域。
假设 Q 和 K 的各维分量均值为 0、方差为 1,点积会累加 dk 个随机项,其方差大约与 dk 成正比,标准差约为 sqrt(dk)。当 dk 较大时,未缩放的 attention logits 会变得很大,softmax 输出容易极端化,训练信号变差。
softmax 对输入尺度很敏感。如果某些 logits 远大于其他位置,输出会接近 one-hot。此时模型过早把注意力集中到少数位置,其他位置梯度很小,不利于稳定学习。缩放不是改变注意力机制本质,而是让 logits 保持在更合适的数值范围。
多头注意力会把整体 hidden size 切分到多个 head,每个 head 有自己的 dk。每个 head 内仍然使用 sqrt(dk) 进行缩放。这样不同 head 可以在稳定数值尺度下学习不同关系,例如语法依赖、长程引用或局部上下文模式。
缩放点积注意力可以看作对 dot-product attention 的数值校准。没有缩放时,大维度点积的幅度更容易失控;使用加性注意力时,分数由小网络计算,尺度问题表现不同。Transformer 采用缩放点积注意力,兼顾并行效率和训练稳定性。
因为点积方差约随 dk 增大,标准差约随 sqrt(dk) 增大。缩放目标是把标准差拉回稳定范围,因此使用 sqrt(dk) 更符合方差分析。
不一定完全不能训练,但在 dk 较大时更容易出现 logits 过大、softmax 过尖、梯度不稳定等问题。缩放是提高训练稳定性和收敛质量的重要设计。
公式形式基本相同。区别在于 self-attention 的 Q、K、V 来自同一序列,而 cross-attention 通常 Q 来自目标序列,K 和 V 来自另一个序列或编码器输出。
softmax 得到的是当前位置对各个位置的关注权重,乘 V 相当于按这些权重聚合信息,得到融合上下文后的表示。