Attention 其實是一個核平滑器

第一次看到「attention 是核方法」這個說法時,我以為那只是類比。自己推過一次才發現不是——而這件事直接決定了我們該在哪裡砍計算量。

更新於 2026年10月22日3 分鐘
transformer數學推論
Attention 與核函數對應關係的示意圖

一句話讓我想了很久

「Attention 就是一個核平滑器。」

第一次看到這句話的時候我以為是某種比喻,畢竟「核方法」聽起來像是 SVM 那個年代的事,跟 Transformer 沒什麼關係。後來自己把公式展開一次,才發現它不是在打比方。

把公式拆開

給定查詢矩陣 Q∈Rn×dQ \in \mathbb{R}^{n \times d}、鍵矩陣 K∈Rm×dK \in \mathbb{R}^{m \times d} 與值矩陣 V∈Rm×dvV \in \mathbb{R}^{m \times d_v},scaled dot-product attention 是

Attn⁡(Q,K,V)=softmax⁡ ⁣(QK⊤d)V.\operatorname{Attn}(Q, K, V) = \operatorname{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d}}\right) V .

看整體沒感覺,把它逐項展開。第 ii 個輸出向量是

oi=∑j=1mexp⁡ ⁣(qi⊤kjd)vj∑j=1mexp⁡ ⁣(qi⊤kjd).o_i = \frac{\sum_{j=1}^{m} \exp\!\left(\frac{q_i^{\top} k_j}{\sqrt{d}}\right) v_j}{\sum_{j=1}^{m} \exp\!\left(\frac{q_i^{\top} k_j}{\sqrt{d}}\right)} .

左邊的分子是一堆 vjv_j 的加權和,權重是 qiq_i 與 kjk_j 的相似度;左邊的分母只是把權重歸一化,讓它們加起來等於 1。

如果把 κ(q,k)=exp⁡ ⁣(q⊤k/d)\kappa(q, k) = \exp\!\left(q^{\top}k / \sqrt{d}\right) 當成一個核函數,上面這一坨就是

oi=∑jκ(qi,kj) vj∑jκ(qi,kj),o_i = \frac{\sum_j \kappa(q_i, k_j)\, v_j}{\sum_j \kappa(q_i, k_j)} ,

——非參數回歸裡的 Nadaraya–Watson 估計。一模一樣。

差別只在於:這裡的「樣本」是模型自己學出來的,不是給定的資料集。

知道這件事有什麼用

不是為了數學上的優雅。是因為它會告訴你哪裡可以砍。

如果 κ\kappa 可以寫成有限維特徵映射的內積,也就是 κ(q,k)≈ϕ(q)⊤ϕ(k)\kappa(q,k) \approx \phi(q)^{\top}\phi(k),那麼

oi≈ϕ(qi)⊤∑jϕ(kj)vj⊤ϕ(qi)⊤∑jϕ(kj).o_i \approx \frac{\phi(q_i)^{\top} \sum_j \phi(k_j) v_j^{\top}}{\phi(q_i)^{\top} \sum_j \phi(k_j)} .

右邊的兩個累加量可以事先算好,每個查詢只要查表。複雜度從 O(nm)O(nm) 掉到 O(n+m)O(n + m):

標準 attention:O(nmd)線性 attention:O ⁣(nd2+md2)\begin{aligned} \text{標準 attention} &: \quad O(n m d) \\ \text{線性 attention} &: \quad O\!\left(n d^2 + m d^2\right) \end{aligned}

這就是 linear attention 那一整家族在做的事。

代價在分母

這裡有個很容易被忽略的地方:誤差最大的地方不是分子,是分母。

分子是「加權和」,近似得差一點,輸出只是稍微偏掉;分母是「歸一化常數」,它一錯,整個輸出會跟著縮放。序列越長,ϕ(qi)⊤∑jϕ(kj)\phi(q_i)^{\top}\sum_j \phi(k_j) 和真正的 ∑jκ(qi,kj)\sum_j \kappa(q_i,k_j) 差得越多,輸出就越不可信。

所以我們在評估這類方法時,看的第一個數字不是整體 perplexity,而是分母的相對誤差。

實務上的三個檢查點

檢查為什麼
分母的相對誤差比分子更致命,因為它會整體縮放輸出
特徵維度 dϕd_\phi太少則近似粗糙,太多則省不下計算
序列長度分佈短序列幾乎沒有收益,長序列才值得換
# 概念示意:先把 K、V 的累加量算好
kv = einsum("m d, m e -> d e", phi(K), V)   # O(m d^2)
z  = phi(K).sum(dim=0)                       # O(m d)
out = einsum("n d, d e -> n e", phi(Q), kv) / einsum("n d, d -> n", phi(Q), z)

給下一個要調這個模型的人

如果你正在為長序列煩惱,我會建議先把 attention 當成核平滑器看一遍,再決定要不要換模型。

因為換成 linear attention 不是「更快的 attention」,而是用特徵映射換掉精確的歸一化——你付出的是準確度,不是免費的午餐。

知道自己在付什麼,比知道自己在用什麼重要。