序列模型與Transformer

縮放點積注意力(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 飽和、梯度消失——訓練就是收斂不好。這是「一處微小的歸一化救活整套方法」的教科書案例。

又稱
缩放点积注意力縮放點積注意力scaled attention