快訊
2026-08-30
AI 教學

Attention Mechanism(注意力機制)是什麼?AI 怎麼決定該「注意」哪些字才看得懂上下文

約 14 分鐘閱讀
廣告

⚡ 站長快讀:核心重點

  • 文章屬性:科技冷知識 / 規格解析
  • 核心結論:注意力機制聽起來很像人在「集中精神」,但拆到底層,它做的是替每個字算一組權重、再對所有字的向量做加權平均——一次矩陣運算,不是一次思考。看懂這件事,你就會知道為什麼長對話會愈跑愈慢愈貴,也會知道 Flash Attention 跟 GQA 各自省的其實是不同的東西。
  • 適用對象:每天在用 ChatGPT、Gemini、Claude,想知道「AI 到底怎麼看懂上下文」的人

📌 快速答案

一句話答案:Attention Mechanism 注意力機制是讓模型替句子裡每個字算出「該參考其他哪些字、各佔多少比重」,再把這些字的向量加權平均起來的機制,取代了逐字循環讀完整句的老作法。


🔍 故事的起點

先講一個時間點,因為中文圈很多文章都寫錯:注意力機制不是 2017 年發明的。2014 年 9 月 1 日,Dzmitry Bahdanau、Kyunghyun Cho 與 Yoshua Bengio 把〈Neural Machine Translation by Jointly Learning to Align and Translate〉丟上 arXiv(編號 1409.0473,預印本,後獲 ICLR 2015 口頭報告收錄)。那篇的問題意識很單純:當時的 encoder-decoder 翻譯模型,是把整個來源句壓成一個固定長度的向量,再讓 decoder 從這個向量生出譯文。作者在摘要裡直說,他們推測這個固定長度向量就是效能的瓶頸,所以改讓模型自動「軟性搜尋」來源句中與當前要翻的字相關的片段,而不必先把句子硬切成段。

那個「軟性搜尋」,就是後來大家叫的 attention。

三年後的 2017 年 6 月 12 日,Google 團隊八個人——Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N. Gomez、Łukasz Kaiser、Illia Polosukhin——丟出 arXiv:1706.03762,標題就是那句名言〈Attention Is All You Need〉。這篇的貢獻不是發明注意力,而是把循環與卷積整個拿掉、只留注意力(摘要原句是「dispensing with recurrence and convolutions entirely」)。結果:WMT 2014 英德翻譯拿到 28.4 BLEU,英法單模型 41.8 BLEU(這個數字取自 arXiv 修訂版的摘要與 Table 2;NeurIPS 2017 論文集版該欄為 41.0,而 arXiv 修訂版自身的 §6.1 內文也仍寫 41.0——只有摘要與 Table 2 更新為 41.8,引用時要標清楚是哪一處),而後者只用 8 顆 GPU 訓練 3.5 天

這篇文章要給你三個中文圈很少講清楚的角度,而且每一句我都會把出處標出來。第一,注意力的本體是查表加權平均,不是模型在「判斷誰重要」——包含那個看起來很玄的除以根號,論文在正文與腳註裡都交代了理由(原文用的是「我們推測」),目的是避免 softmax 落入梯度極小的區域。第二,自注意力真正的勝負手不是「比較快」,而是任兩個字之間的路徑長度從 O(n) 變成 O(1),這才是它能記住遠處資訊的原因。第三,那個 O(n²) 是你今天每天在付的帳單——長 context 為什麼特別貴、Flash Attention 與 GQA 各自砍在哪一刀,得先看懂這個式子才講得下去。


🧪 原理拆解

先看它要解的原題:「bank」到底是銀行還是河岸

結論先講:注意力要解的是同一個字在不同上下文裡意思不同,而模型必須有辦法「一步就看到」決定意思的那個關鍵字。

Google Research 官方部落格在 2017 年 8 月 31 日由論文作者之一 Jakob Uszkoreit 撰文,舉的例子非常好懂:句子是「I arrived at the bank after crossing the…」,bank 到底是銀行還是河岸,取決於句子最後是 road 還是 river。官方文中指出,RNN 是逐字循序處理的,所以要判斷 bank 指的是河岸,它得一步一步讀完 bank 與 river 之間的每一個字;而先前研究顯示,一個決策需要的步數愈多,循環網路就愈難學會怎麼做這個決策。

廣告

Transformer 的作法是:直接對句中所有字建立關係,不管彼此距離多遠。官方文中寫得很直接——模型可以學會立刻去 attend「river」這個字,一步就做出判斷;而且他們在英法翻譯模型裡確實觀察到這個行為。

官方另外舉了一組更刁鑽的例子(該組例句在原文中以圖片呈現,這裡只描述其結構):同一組英文句子,只換掉句尾的形容詞,句中 it 的指涉就從 animal 變成 street。翻成法文時因為這兩個名詞性別不同,譯錯就會露餡。官方表示 Transformer 兩句都翻對了,而視覺化顯示模型確實同時鎖定了 it 可能指涉的兩個名詞,再依上下文分配注意力比重。

Q、K、V:三個角色,其實在做一次查表

結論先講:Query、Key、Value 就是「查詢條件、索引標籤、實際內容」,注意力就是拿查詢條件去比對所有索引標籤,算出一組比重,再按比重把內容混起來。

用圖書館比喻最快:

  • Query(查詢):你手上那張紙條,寫著「我要找跟河流有關的東西」。
  • Key(鍵):每本書書背上的索引標籤,用來被比對。
  • Value(值):書裡真正的內容,是最後要被取用的東西。

Google 官方部落格描述這個流程時是這樣寫的:要算出某個字(例如 bank)的下一層表徵,Transformer 會把它跟句子裡其他每一個字比較,比較的結果就是對每個字的一個 attention score;這些分數決定其他字各要對 bank 的新表徵貢獻多少;接著這些分數會被當成權重,對所有字的表徵做加權平均,再送進全連接網路,產生出反映「這是河岸」的新表徵。

所以拆解成四步:

廣告
  1. 算相似度:Query 與每個 Key 做內積,得到一排原始分數。
  2. 正規化:分數過 softmax,變成加總為 1 的權重。
  3. 加權平均:用這組權重去混合所有 Value。
  4. 送出:結果進入下一層。

這裡值得停一下:整個過程沒有任何一步在「理解」誰重要,它就是內積、softmax、加權平均。所謂「AI 決定該注意哪個字」,實際發生的是「這組被訓練出來的投影矩陣,讓 river 的 Key 跟 bank 的 Query 內積特別大」。順帶一提,能拿來做內積的前提,是文字早就被轉成向量了——那是 Embedding(文字嵌入) 在管的事,注意力是接在它後面的下一棒。

為什麼要除以根號 d_k?這不是玄學

結論先講:除以 √d_k 是為了防止 softmax 被推進梯度極小的區域,論文把理由寫在正文與腳註裡,講得非常清楚。

論文 3.2.1 節指出,他們用的 dot-product attention 跟一般的點積注意力唯一差別,就是多了 1/√d_k 這個縮放因子。為什麼要加?原文說:他們推測當 d_k 很大時,內積的數值量級會變大,把 softmax 函數推到梯度極小的區域。腳註還補了推導:假設 q 與 k 的每個分量是均值 0、變異數 1 的獨立隨機變數,那麼兩者的內積(d_k 項相加)其平均為 0、變異數為 d_k。變異數隨維度線性長大,標準差就是 √d_k——所以除以 √d_k,剛好把量級拉回來。

白話版:softmax 有個特性,輸入之間差距一大,輸出就會逼近 one-hot(某一項接近 1、其餘接近 0)。一旦逼近 one-hot,梯度幾乎歸零,模型就學不動了。所以這個除法不是為了「數字好看」,是為了讓訓練跑得動。

論文也順帶說明了為什麼選點積而不選加法式注意力:兩者理論複雜度相近,但點積在實務上快得多、也更省空間,因為它可以用高度最佳化的矩陣乘法程式碼實作。這句話後來成了整個 GPU 時代的伏筆。

多頭注意力:8 個頭在看不同的東西

結論先講:與其用一個大頭看一種關係,不如切成多個小頭各看一種關係

廣告

論文明載:「In this work we employ h=8 parallel attention layers, or heads.」——這一版用 8 個並行的注意力層(也就是「頭」),而且每個頭的維度是 d_k = d_v = d_model / h = 64。也就是說,總維度沒有變大,是把同一個 512 維切成 8 份、每份 64 維,各自算各自的注意力,最後再拼回來過一次輸出投影。

這樣做的好處,從前面那個 it 的例子就看得出來:一個頭可能負責追代名詞指涉,另一個頭負責追動詞與主詞的搭配。Google 官方部落格在那張注意力視覺化圖的圖說裡就寫明,那是「eight attention heads」其中之一——換句話說,你在網路上看到的那些漂亮注意力熱圖,通常只是八分之一的真相。

要提醒的是,8 這個數字是那篇論文 base 模型的設定,不是什麼宇宙常數;後來各家模型的頭數、維度、頭的分工方式都改過很多輪,下面講 GQA 時會再碰到。

自注意力 vs 循環網路:真正的勝負手是路徑長度

結論先講:自注意力的每層計算量其實比循環網路更吃序列長度,它贏在平行度任兩字之間的最短路徑

論文第 4 節有一張對照表(Table 1),把幾種層的特性列得很清楚。n 是序列長度、d 是表徵維度:

層的種類每層計算複雜度最少序列運算次數任兩位置最長路徑
自注意力 Self-AttentionO(n²·d)O(1)O(1)
循環網路 RecurrentO(n·d²)O(n)O(n)

三到五點重點摘要:

  • 計算量:自注意力對序列長度是平方項,循環網路是線性項——單看這一欄,序列一長是自注意力吃虧
  • 平行度:自注意力的「最少序列運算次數」是 O(1),意思是整層可以一次算完;循環網路是 O(n),必須一格一格推。這正是它能餵飽 GPU/TPU 的原因。
  • 路徑長度:自注意力裡任兩個位置的距離是 O(1),循環網路是 O(n)。這一欄才是「長距離依賴」問題的核心——路徑愈短,訊號與梯度愈不容易在傳遞途中衰減。
  • 所以那句常見的「Transformer 比 RNN 快」講得太粗:它不是每一項都便宜,而是把難平行、路徑長的問題,換成了可平行、路徑短但計算量隨長度平方成長的問題。
自注意力與循環網路的三項特性對照:每層計算複雜度、最少序列運算次數、任兩位置最長路徑

O(n²) 的帳單:為什麼長 context 這麼貴

結論先講:上面那個 n² 就是你今天在付的錢。序列長度變兩倍,注意力這一塊的計算量變四倍;變十倍,變一百倍。

這也是為什麼「把 context window 拉長」從來不是把數字改大就好。從 1,000 個 token 拉到 100 萬個 token,n 差 1,000 倍,n² 這一項差的就是 100 萬倍

不過這裡要誠實補一句,免得變成另一種以訛傳訛:實際跑一次推論的成本,不是只有 attention 這一項在決定。論文那張表的另一欄 O(n·d²) 提醒我們,當序列長度 n 小於表徵維度 d 時,自注意力反而比循環層便宜;而真實系統裡還有前饋層的計算、KV cache 佔用的記憶體、批次大小、以及記憶體頻寬這些變數。所以正確的說法是:n² 是「長文為什麼特別貴」最主要的結構性來源之一,但不是唯一那一項

也因為這個式子擺在那裡,過去幾年業界的最佳化幾乎都繞著它打轉,而且砍的地方各不相同——這點很多人會搞混,值得拆開講。

省法一:Flash Attention 省的是搬運,不是次數

Flash Attention 的作法是分塊計算(tiling)。依 Dao 等人的原始論文(arXiv:2205.14135)摘要,它是一個「IO 感知的精確注意力演算法」,用分塊來減少 GPU 高頻寬記憶體(HBM)與晶片內 SRAM 之間的讀寫次數。請注意「精確(exact)」這個詞——它不是近似,所以結果完全不變。它省的是記憶體搬運與佔用,不是把 O(n²) 變成 O(n)。 這件事本站有專文拆過,包含 llama.cpp 與 Ollama 的實際參數、四代版本差異,以及消費級顯示卡到底吃不吃得到:Flash Attention 是什麼?為什麼能讓大模型跑得更快、更省 VRAM

省法二:GQA 省的是 KV cache 的份數

另一條路是動 Key 與 Value 的頭數。2023 年 5 月 22 日的 arXiv:2305.13245〈GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints〉(Google 團隊,EMNLP 2023 收錄)摘要講得很完整:

  • MQA(multi-query attention)只用單一組 Key-Value 頭,可以大幅加速 decoder 的推論;但摘要同時指出 MQA 可能導致品質下降,而且為了推論更快就另外訓練一個模型,未必划算。
  • GQA(grouped-query attention)是 MQA 的一般化:KV 頭數取一個中間值——比 1 多、比 query 頭數少。
  • 論文還給了一個很實際的配方:摘要提出用原始預訓練算力的 5%,把既有的 multi-head checkpoint「續訓(uptrain)」成 MQA;論文實驗段則顯示 MQA 與 GQA 都能從這 5% 的續訓中獲益。
  • 摘要的結論是:續訓後的 GQA 品質接近多頭注意力、速度接近 MQA

換句話說,多頭注意力那 8 個頭各自帶一份 Key 與 Value,推論時全都要存進 KV cache;GQA 讓好幾個 query 頭共用一組 KV,快取份數就少了。這一刀砍的是記憶體與頻寬,跟 Flash Attention 砍的不是同一塊。

省法三:乾脆少算一點

還有第三條路線,是讓每次推論只啟動一部分參數,代表作是混合專家(MoE)。要注意的是,MoE 動的部位跟前兩者都不同——以 Mixtral 8x7B 為代表的稀疏 MoE 實作,每一層是由多個前饋區塊(也就是「專家」)組成,推論時只啟動其中一部分參數;它稀疏化的是前饋網路那一段,不是注意力本身。這條路線的取捨(尤其是「參數量看起來小、VRAM 卻還是吃滿」這個反直覺結果)本站也有專文:MoE 混合專家是什麼?稀疏啟動與 VRAM 的取捨

把三條路線並排看,結構就清楚了:Flash Attention 改實作、GQA 改架構、MoE 改的是另一個部位。它們可以疊加,也各有各的代價——這也是為什麼看到某個模型「支援長 context」時,不能只看那個數字,得看它用了哪幾刀。


💡 總結:冷知識延伸

站長我每次看到「注意力機制」這個譯名,都覺得它同時是最好的行銷與最大的誤導。好在它讓人一秒有畫面;誤導在於,它讓太多人以為模型在「決定要專心看哪裡」,於是進一步推論出「它應該知道自己在想什麼」。但把 Q、K、V 攤開來看,那就是內積、softmax、加權平均三個動作,連那個除以 √d_k 都只是為了讓 softmax 不要飽和。整套機制沒有任何一個環節對應到人類意義上的「注意」,它只是恰好在數學上做出了「有選擇性地混合資訊」這件事。

附贈幾個冷知識。第一,〈Attention Is All You Need〉arXiv 上只有 15 頁、5 張圖,而且 2017 年 6 月 12 日投上去之後,一路修訂到 2023 年 8 月 2 日的 v7 還在改——一篇被引到爛的論文,六年後還在動。第二,論文摘要裡最狠的一句其實不是標題,而是那句「dispensing with recurrence and convolutions entirely」:它的賣點不是加了什麼,而是敢拿掉什麼。第三,論文提到英法模型只花了 8 顆 GPU 訓練 3.5 天——用今天的標準看,那是「一台機器一個週末」的規模,而它開啟了後面整個算力軍備競賽。

如果你是為了跑本地模型而來的,理解注意力最實際的用處是:當你在 llama.cpp 或 Ollama 看到一堆跟 attention、KV cache 有關的開關時,你會知道它們各自在動哪一塊,而不是靠玄學一個一個試。


❓ 常見問題

Q:注意力機制是 2017 年才發明的嗎?

不是。2014 年 9 月 Bahdanau、Cho 與 Bengio 的 arXiv:1409.0473 就已經提出讓模型自動軟性搜尋來源句相關片段的作法,用來解決固定長度向量的瓶頸,該論文並獲 ICLR 2015 口頭報告收錄。2017 年〈Attention Is All You Need〉的貢獻,是把循環與卷積完全拿掉、只留注意力,不是發明注意力本身。

Q:Self-Attention 跟一般 Attention 差在哪?

差在 Query 從哪裡來。自注意力的 Query、Key、Value 全部來自同一個序列——句子自己看自己,所以叫「自」。而在翻譯這種 encoder-decoder 結構裡還有另一種用法:Google 官方部落格描述,decoder 一次生一個字,它不只 attend 先前已經生成的字,也 attend encoder 產生的最終表徵——那一種的查詢方與被查詢方就不是同一個序列了。

Q:Attention 跟 Flash Attention 是同一件事嗎?

不是。注意力是機制,Flash Attention 是這個機制的一種高效實作——它靠分塊計算避開把 N×N 矩陣寫進顯示記憶體,而且是精確演算法,結果完全不變。把它想成「同一道菜,換了更好的鍋子」。

Q:為什麼多頭注意力是 8 個頭?

因為那是〈Attention Is All You Need〉base 模型的設定值:h=8、每頭 d_k = d_v = d_model/h = 64。它不是理論上的最佳值,後來各家模型都調整過;GQA 那一路甚至讓多個 query 頭共用一組 Key-Value 頭,以壓低推論時的 KV cache 開銷。


🔗 延伸閱讀


📎 參考資料來源

📖 第一級|廠商官方與原始論文:


廣告