缩放点积注意力(scaled dot-product attention)
/ skayld DOT-prod-uct uh-TEN-shun /
缩放点积注意力,是多数 Transformer 用来把查询、键、值变成输出的确切配方。它有四步,每一步都有它的道理。第一,用点积给每个查询对每个键打分——一个度量两向量有多对齐的数。第二,把这些分数除以键维度的平方根;这就是「缩放」那一步。第三,过一道 softmax,使分数变成相加为一的正权重。第四,对值取加权和。
为何要除?因为两个长向量的点积,仅仅因为相加的项多,就倾向于变得很大。若原始分数太大,softmax 会把几乎全部权重压到单独一项上,把其余统统压平为零——而在这种极端处,用于学习的梯度会缩向乌有,于是训练停滞。除以维度的平方根,能把分数维持在合理大小,使 softmax 保持「柔软」,模型得以继续学习。这是一处小小的数值修正,实践上的分量却大得不成比例。
整件事不过是一行线性代数:softmax(QKᵀ ÷ √d) 乘以 V。这种紧凑正是要点——它便宜、完全并行、可微分,因而能利落地嵌进偏爱矩阵乘法的硬件。诚实的告诫,与困扰所有注意力的那条相同:QKᵀ 这一步要为每一对位置都建一个分数,所以内存与计算随序列长度的平方增长——这正是 flash attention 等技巧被发明出来要推开的那堵墙。
当键的维度为 64 时,分数在过 softmax 前要除以 √64 = 8。略去这一步,在又长又高维的向量上,softmax 可能塌缩成近乎独热,扼杀掉学习信号——这正是那个缩放因子默默防住的毛病。
除以 √d 这一项,让 softmax 不至于饱和,也让梯度保持活着。
名字里的「缩放」不是装饰。若不除以维度的平方根,过大的点积会让 softmax 饱和、梯度消失——训练就是收敛不好。这是「一处微小的归一化救活整套方法」的教科书案例。