)
Transformer 使用 scaled dot-product attentionattention_scores QK^T / sqrt(d_k)之所以这样做原因有三。第一层维度越大点积通常越大假设 query 和 key 里的每个元素都是差不多大小的随机数。比如 2 维点积q · k q1*k1 q2*k2只加 2 项。如果是 64 维q · k q1*k1 q2*k2 ... q64*k64要加 64 项。项数越多累加出来的数的波动范围通常越大。所以d_k越大q · k的值更容易变得很大或很小。第二层softmax 遇到大差距会变得很“极端”softmax 会把分数变成概率softmax([1, 2, 3]) ≈ [0.09, 0.24, 0.67]还比较平滑。但如果分数变大softmax([10, 20, 30]) ≈ [0.00, 0.00, 1.00]几乎全部概率都给最大值。这就叫“很尖锐”一个 token 权重接近 1其他 token 权重接近 0。第三层太尖锐会影响训练如果 attention 一开始就非常尖锐模型会过早只看某一个 token。其他 token 的权重接近 0它们对应的梯度也会很弱模型不容易学习“到底该关注谁”。所以 Transformer 里会做缩放attention score q · k / sqrt(d_k)假设d_k 64sqrt(d_k) 8原本点积是32缩放后变成32 / 8 4softmax 就不会那么极端。所以这句话的意思是QK 点积的维度越高分数越容易变大 分数太大会让 softmax 输出过于极端 除以 sqrt(d_k) 是为了把分数拉回稳定范围让训练更平滑。一个小例子importtorchprint(torch.softmax(torch.tensor([1.0,2.0,3.0]),dim0))print(torch.softmax(torch.tensor([10.0,20.0,30.0]),dim0))你会看到第二个几乎变成[0, 0, 1]这就是“softmax 很尖锐”。既然softmax会尖锐为啥非得用它softmax 会尖锐但它也正好提供了 attention 需要的“可微分选择机制”。问题不在 softmax 本身而在输入给 softmax 的分数不能太大所以才要除以sqrt(d_k)。attention 需要把一堆 score 变成一组“权重”score: [2.1, 0.3, -1.2, 4.0] weight: [?, ?, ?, ?]这组权重要满足每个权重 0 所有权重加起来 1 分数越高权重越大 整个过程可以求导方便训练softmax 正好满足这几个条件softmax(x_i) exp(x_i) / sum(exp(x_j))它的好处是1. 输出都是正数 2. 输出总和等于 1 3. 分数大的位置权重更大 4. 可导可以反向传播 5. 会放大相对差异让模型能“重点关注”如果不用 softmax直接除以总和也不太行。比如 score 里有负数[2, -1, 3]直接归一化会得到负权重这在 attention 里不好解释也可能训练不稳定。如果用平均[1/3, 1/3, 1/3]那模型就不能区分重点全都一样看。所以 softmax 的“尖锐”其实不是纯缺点。适度尖锐是好事因为 attention 本来就需要“重点关注”。问题是太尖锐[0.001, 0.002, 0.997]一开始就几乎只看一个 token训练会不稳。所以 Transformer 的做法不是不用 softmax而是控制它的输入尺度softmax(QK^T / sqrt(d_k))你可以这样理解softmax 负责把相关性分数变成注意力分布 除以 sqrt(d_k) 负责让这个分布不要一上来过度极端。就像音量旋钮softmax 是扬声器必须有/sqrt(d_k)是把输入音量调到合适范围。softmax公式softmax 的标准公式是softmax(x_i) exp(x_i) / Σ_j exp(x_j)也就是softmax(x_i) e^(x_i) / (e^(x_1) e^(x_2) ... e^(x_n))如果有一个向量x [x1, x2, x3]那么softmax(x1) e^x1 / (e^x1 e^x2 e^x3) softmax(x2) e^x2 / (e^x1 e^x2 e^x3) softmax(x3) e^x3 / (e^x1 e^x2 e^x3)输出满足每一项 0 所有项加起来 1 原始值越大对应 softmax 后的值越大在 attention 里通常是attention_weights softmax(QK^T / sqrt(d_k))更具体地对第i个 query 和第j个 keyα_ij exp(score_ij) / Σ_j exp(score_ij)其中score_ij (q_i · k_j) / sqrt(d_k)所以完整写成α_ij exp((q_i · k_j) / sqrt(d_k)) / Σ_j exp((q_i · k_j) / sqrt(d_k))