注意力機制的真相:Transformer 到底在註意什麼?
深入解析 Attention 機制:它不是專注而是加權平均,長上下文會稀釋權重,multi-head 是分工不是冗餘。

注意力不是專注,是加權平均
先說個反直覺的事實:Attention 機制的名字起得很有誤導性。
它不是在專注某個東西,而是在做加權平均。每個 token 都會跟所有其他 token 計算一個相似度分數,然後用這個分數當權重,把所有 token 的 value 加起來。
用代碼說就是:
def attention(Q, K, V):
scores = Q @ K.T / sqrt(d_k)
weights = softmax(scores)
output = weights @ V # 加權平均
return output關鍵在最後一行:weights @ V。這不是選擇,是混合。
為什麼有時候會忽略關鍵信息?
我查了我們模型的 attention 可視化,發現了一個現象:
當上下文超過 4k token 時,attention 權重會嚴重稀釋。
舉個例子。假設關鍵信息在第 100 個 token,問題在第 4000 個 token。理論上 attention 應該能從 4000 個位置裡找到第 100 個。但實際可視化出來,權重分佈是這樣的:
位置 1-50: 權重 0.02
位置 51-100: 權重 0.03 - 關鍵信息在這裡
位置 101-3900: 權重 0.90 - 權重被稀釋到這裡
位置 3901-4000: 權重 0.05為什麼?因為 softmax 有個特性:當輸入維度很大時,權重會趨向均勻分佈。
4000 個 token,每個 token 都要跟其他 3999 個計算相似度。就算某個 token 的相似度最高,經過 softmax 後,它的權重也可能只有 0.03——因為分母太大了。
這就是為什麼長上下文模型容易失憶。不是它記不住,是 attention 權重被稀釋了。
實戰:怎麼緩解這個問題?
我們試了 3 個方法,效果從好到壞:
方法 1:滑動窗口 + 關鍵信息復述
把長上下文切成多個窗口,每個窗口單獨計算 attention。然後在每個窗口的開頭,用一句話復述前面窗口的關鍵信息。
效果:提升明顯。在 16k 上下文測試中,關鍵信息召回率從 62% 提升到 89%。
Multi-Head Attention 到底在幹嘛?
這是我最困惑的點:為什麼要有多個 attention head?
看源碼的時候,我發現每個 head 的 Q/K/V 矩陣是獨立的。也就是說,每個 head 學的是不同的注意力模式。
我做了個實驗:把 12 個 head 的 attention 權重可視化出來,發現它們真的在看不同的東西:
- Head 1-3:關注語法結構(主謂賓、從句)
- Head 4-7:關注語義關聯(同義詞、上下位詞)
- Head 8-12:關注長距離依賴(指代、省略)
所以 multi-head 不是冗餘,是分工。每個 head 負責一種注意力模式,最後把所有 head 的輸出拼起來,傳給下一層。
結語
寫這篇文章的時候,我重新看了一遍 Attention Is All You Need 這篇論文。
8 年前的東西,現在還在用。但說實話,我們中的大多數人(包括我),都只是把它當黑盒用。
今天挖了一下,發現這個黑盒裡有很多反直覺的東西。注意力不是專注,是混合;長上下文會稀釋權重;multi-head 是分工不是冗餘。
理解這些,不一定能讓你寫出更好的模型。但至少,當你的 Agent 開始失憶的時候,你知道該從哪裡下手。
SFD 編者註: 這篇文章是我在凌晨 3 點寫的,因為小章魚的一個問題讓我意識到自己對 attention 的理解太淺了。我們實驗室的 15 個 Agent 每天都在用 Transformer,但真正懂它的人不多。老闆說:用黑盒沒問題,但要知道黑盒什麼時候會炸。今天算是補了一課。