Transformers 中的核心機制,讓模型能夠權衡輸入中哪些部分彼此之間最相關。與較早期的模型從左到右閱讀文字不同,注意力機制讓每個詞彙可以同時「檢視」其他所有詞彙,以理解上下文。
注意力機制正是現代大型語言模型(LLM)之所以能理解「bank」在「river bank」與「bank account」中意義不同的原因。這也是為什麼更長的上下文視窗成本更高—注意力機制的計算量會隨著序列長度呈二次方增長。
注意力機制的核心在於計算加權總和。對於序列中的每個 token,這個機制會問:「目前來說,其他每個 token 對我有多重要?」它透過三個學習得到的投影 — 查詢(query)、鍵(key)與值(value)(也就是每篇論文都會看到的 Q、K、V)來完成這個任務。一個 token 的查詢會與所有 token 的鍵進行點積,產生一組分數,這些分數會經過 softmax 轉換為權重,而這些權重會用來混合值,產生一個具上下文感知的表示。整個運算過程是可微分的,因此模型可以在訓練過程中學習哪些關係是重要的。多頭注意力會平行運行多個這樣的機制,使用不同的投影,讓模型能同時關注不同類型的關係 — 一個頭可能追蹤語法,而另一個頭則追蹤代詞指代。
自注意力的實際突破在於平行運算。像 LSTM 這樣的遞歸網絡必須逐個處理 token,這意味著訓練過程本質上是序列的且緩慢的。注意力機制則能一次性處理整個序列,將訓練轉換為 GPU 非常擅長處理的大規模矩陣乘法。這就是為什麼 Transformer 能夠擴展到數十億參數和數兆訓練 token — 硬體早已為這種工作負載設計好。今天你所使用的每個主要 LLM,從 GPT-4 到 Claude、Llama 3 到 Mistral,都歸功於這種平行運算的優勢。
房間裡的象是二次方擴展。標準的注意力機制會為每對 token 計算一個分數,因此當上下文視窗加倍時,計算與記憶體需求會增加四倍。一個 4K 上下文視窗的模型在每一層每一頭會使用 1600 萬個注意力分數;若增加到 128K,則會達到 160 億個。這就是為什麼擴展上下文視窗成為如此巨大的工程挑戰。Flash Attention(由 Tri Dao 發明)從記憶體方面解決了這個問題,透過重新設計計算方式,避免在 GPU HBM 中生成完整的注意力矩陣,使得長上下文變得實際可行,而無需改變數學原理。Llama 2 和更新模型使用的分組查詢注意力(GQA)則透過讓查詢頭共享鍵值頭,來減少生成過程中累積的 KV 緩衝區。
交叉注意力是一個值得單獨理解的變體。在編碼器-解碼器模型和條件生成(如文字到圖片)中,查詢來自一個序列,而鍵與值則來自另一個序列。這就是 Stable Diffusion 如何根據你的文字提示進行條件生成 — 圖像側的查詢會關注文字編碼器的輸出。這也是原始 Transformer 處理翻譯的方式:解碼器會關注編碼器的輸出,以決定下一步要生成什麼。
一個常見的誤解是認為注意力機制等同於「理解」。事實並非如此。注意力機制是一種路由機制 — 它決定資訊流向哪裡,但實際的處理是在每個注意力模塊後面的前饋層中進行的。Anthropic 的「Transformer Circuits」研究顯示,注意力頭會發展出專業化的角色(如歸納頭、前一個詞頭),但這些都是學習到的模式,而不是預設的邏輯。另一個實務上的陷阱是:注意力機制本身並不知道 token 的順序。若沒有位置編碼(正弦、學習得到的,或像 RoPE 的旋轉編碼),它會將序列視為一組 token 的集合。正確的位置編碼對於長上下文表現至關重要,這就是為什麼 ALiBi 和 RoPE 等方法持續演進。