LLM Attention 不是模型腦內的螢光筆,而是一套決定「目前這個 token,要從前文哪些位置搬多少資訊」的計算權重。本文先用一句話拆開 Query、Key、Value,再帶你用公開的互動視覺化跑四組可重複的小實驗;最後再加上 token 替換對照,避免把一張漂亮熱圖誤認成完整因果解釋。
先說結論:LLM Attention 是資訊路由,不是讀心術
Attention = 用 Query 對 Key 算「搬多少」,再把 Value 按比例混合。
熱圖是這段資訊路由的觀察窗,不是模型完整的思考紀錄。
如果你只記得一件事,就記住上面這句。Attention 可以幫我們提出假設,例如「模型在輸出人名時,可能正在利用前面哪個名字」;但最後答案還會經過多個 head、輸出投影、殘差連接、MLP、後續 layer 與語言模型輸出層。單看某一格顏色,不能證明它就是答案的原因。
- 你會學到:Q、K、V、causal mask、head 與 layer 各自在做什麼。
- 你會動手做:代名詞、精確複製、詞序交換、長距離依賴四組控制實驗。
- 你會避開:把高 attention 當成高因果影響力,以及把 KV Cache 說成「消滅所有 N²」。
Q、K、V 到底是什麼?先用圖書館比喻
想像每個 token 都走進一座圖書館,同時變成三個學出來的向量版本:
- Query(Q):我現在想找哪種線索?
- Key(K):我身上有哪些可被比對的索引?
- Value(V):如果被找到,真正要搬走的內容是什麼?
單一 head 的核心可寫成 A = softmax(QKᵀ / √dₖ + M),再用 Y = AV 混合內容。Q 與 K 的點積先決定相容分數,除以 √dₖ 把分數尺度拉回合理範圍,softmax 再把同一列轉成比例。原始 Transformer 論文就是用這個 scaled dot-product attention 形式。
這個圖書館比喻只是一支扶手:Q 並不是真的自然語言問題,K 也不是人工標籤,三者都是訓練出來的數值向量。想先補齊 token、embedding、layer 等底層概念,可以先讀 LLM 運作原理白話篇,再回來看公式。
Causal mask:為什麼生成下一個字時看不到未來?
自回歸模型在預測位置 i 時,只能用位置 i 與更早的 token。實作上會在 softmax 前,把不合法的未來位置加上 −∞;softmax 後,那些位置的權重就是 0。這不是把分數乘上一張 0/1 圖,因為「乘 0」仍可能在 softmax 後得到非零機率。
Head 與 layer:同一句話,為什麼會有很多張圖?
每個 attention head 有各自學到的 Q、K、V 投影,像同時派出不同鏡頭蒐集線索;多個 head 的結果合併後,再送進同一層的後續運算。下一個 layer 收到更新過的 hidden states,又會重新計算一次。因此,「第幾層、第幾個 head、哪個輸出位置」缺一不可。不同 head 可能呈現位置、分隔符號、語法或指涉模式,但不能替每個 head 硬貼一個永遠不變的職稱。
先認識這次用的 LLM Attention Visualizer
本文使用 Isham Faizal 的 LLM Attention Visualizer。它提供八組可立即觀看的預先生成範例,也能讓 Qwen3-0.6B ONNX 模型在瀏覽器內生成新答案。公開程式碼顯示,自訂 prompt 第一次載入的 instrumented weights 為 617,690,408 bytes,約 618 MB;生成在 browser worker 中進行,prompt 不必傳到作者的推論伺服器。

這個工具顯示的並不是原始 attention weight 本身。依其固定版本的程式碼與說明,它先把 attention weight 乘上對應 Value 向量的長度,再用 root-sum-square 聚合 heads、把 28 個 layers 相加。這比只看 weight 多納入 Value magnitude,但仍省略向量方向、attention output projection、殘差、MLP 與後續路徑,所以最安全的名稱是「未投影的 attention-transfer magnitude」。
還有三個讀圖限制:目前公開首頁沒有 head 或 layer 切換器;每個輸出 token 的顏色是各自正規化,最強的非 sink 來源固定最深,因此不能拿兩次 run 的亮度當絕對數值比較;第一個 chat token 會被排除於列最大值正規化。需要逐層逐 head 看標準 attention 時,可另用官方開源的 BertViz,但那又是另一種量測,不要把兩張圖的顏色直接相減。
跑實驗前:先固定五個控制變因
打開視覺化的「Generate in your browser」,展開 Advanced options。四組實驗都使用相同設定,降低抽樣隨機性:
System prompt: Respond with only the requested answer.
Temperature: 0.01
Top K: 1
Top P: 1
Seed: 42
Enable thinking: off
- 先確認答案正確;答案錯了,就先把它記為模型失敗,不解讀熱圖。
- 按暫停,再 hover 或點選你要解釋的生成 token。
- 記錄最深的三個來源 token,包含標點與先前已生成的 token。
- A、B 兩版只改指定變因,其他設定、assistant prefix 與 max tokens 全部不動。
- 比較來源排名與位置,不要比較兩張圖誰「整體比較亮」。
這套方法和 AI Evals 的核心相同:先定義可觀察結果與控制組,再看證據。固定 seed 讓同一組取樣條件可重複,但不會把單一小模型的結果升級成所有 LLM 的普遍定律。
實驗一:代名詞有沒有對到正確的人?
目的:只交換人物與代名詞,觀察答案和強來源是否一起換位。Assistant prefix 設為 Answer:,Max new tokens 設為 8。
A: Sentence: Noah told Emma that she won the prize. Who won the prize? Reply with one name only.
B: Sentence: Emma told Noah that he won the prize. Who won the prize? Reply with one name only.
預期答案從 Emma 換成 Noah。點選生成的人名,檢查對應名字與 she/he 是否進入前三個強來源。即使代名詞顏色不深,也不能反推模型「完全沒用到它」;訊息可能已在較早 layer 被搬進其他位置,而目前工具又把所有 layer 聚合了。
實驗二:精確複製時,模型是在看原文還是自己剛寫的字?
目的:把存取碼只改一位數,觀察每個生成 subtoken 對原始碼與先前生成內容的依賴。Assistant prefix 設為 Code:,Max new tokens 設為 20。
A: The access code is RAVEN-4817-QX. Copy only the access code.
B: The access code is RAVEN-4818-QX. Copy only the access code.
特別檢查生成的 7/8,以及模型可能切出的 RAV、EN、- 等 subtokens。若前幾個字已複製成功,後面的生成 token 可能更偏向模型剛寫出的前綴,而不是每一步都回頭找原文。這正好連到 LLM 下一個 Token 預測器:模型每次只產生下一個 token,之後再把它加入上下文。
實驗三:字都一樣,只換詞序會怎樣?
目的:固定詞彙、交換主客體位置,避免只因某個單字出現就誤判。Assistant prefix 設為 Chaser:,Max new tokens 設為 8。
A: Sentence: The dog chased the cat. Who was the chaser? Reply with one noun only.
B: Sentence: The cat chased the dog. Who was the chaser? Reply with one noun only.
A 應回答 dog,B 應回答 cat。因為兩版都有 dog、cat、chased,真正改變的是語法角色與位置。若答案有跟著換,再看強來源是否從前一個名詞位置一起換過去;若只盯著「dog 這格很深」,就會錯過控制組提供的關鍵資訊。
實驗四:長距離依賴能否越過干擾詞?
目的:測試主詞與動詞隔得較遠時,較近但數量相反的名詞會不會成為干擾。Assistant prefix 設為 Answer:,Max new tokens 設為 8。
A: Complete with one word: The key to the cabinets beside the doors ___ on the table.
B: Complete with one word: The keys to the cabinet beside the door ___ on the table.
A 的目標是 is,B 的目標是 are。點選答案 token,記錄遠端 head noun(key/keys)與近端 distractors(cabinets、doors/cabinet、door)的排名。這個實驗測的是一個特定句法依賴,不代表模型能穩定處理任意長文件;若要評估更長 context,應把距離逐段增加並重複多個句型。
高 Attention 等於高影響力嗎?加一個近似 ablation
四組熱圖只能告訴你「哪裡值得懷疑」。下一步是做輸入介入:挑一個高亮來源,再挑一個詞性與位置相近、但亮度較低的來源,分別建立控制版 prompt。以複製實驗為例,把 4817 改成 9317,觀察目標數字是否跟著變;再改一個低亮度、對任務不關鍵的等長 token 作對照。
- 鎖定同一個生成目標 token,抄下原版的前三名來源。
- 優先做等角色替換,不要直接刪字,避免位置與 tokenization 全部位移。
- 所有抽樣設定不變,記錄答案是「不變、局部改變、完全錯誤」哪一種。
- 至少換三組內容重跑;只成功一次,最多算案例,不算規律。
即使高亮 token 被替換後答案改了,能證明的也只是「這次輸入改動對輸出有因果效果」,還不能鎖定是原本那條 attention edge 造成的;替換可能同時改變 tokenization、所有 layer 的 hidden states 與後續運算。真正針對內部機制的 intervention 還包括 head ablation、activation patching 等,但它們已超出這個瀏覽器工具的範圍。
2019 年的 Attention is not Explanation 發現,在其研究的文字分類模型裡,attention weight 常與梯度重要性不一致,也能找到不同權重卻維持預測的例子;同年的 Attention is not not Explanation 則指出,結論取決於你怎麼定義「解釋」、比較基準是否合理。兩篇主要研究較早期的 RNN attention,最穩妥的結論不是「attention 一定可信」或「attention 完全沒用」,而是:把它當診斷線索,再用介入實驗補因果證據。
Context 變長為什麼會出現 N²?
在標準 dense、full-sequence self-attention 裡,長度為 N 的序列會形成 N×N 的 query–key 配對。因果遮罩只留下下三角,合法格數約為 N(N+1)/2,漸近仍是 N²。原始 Transformer 論文把這段每層計算寫成 O(N²d);完整 block 另有投影與 MLP,所以不能把「context 加倍」簡化成整個模型耗時必定精準四倍。
還要先說清楚你談的是 FLOPs、顯存,還是實際延遲。FlashAttention 用 tiling 減少高頻寬記憶體讀寫,不必把完整 N×N attention matrix 長期 materialize;它計算的是 exact dense attention,配對 FLOPs 仍是平方。滑動窗口、稀疏 attention 等方法則改變連線圖,不能與 full dense attention 混成一句「attention 永遠 N²」。
KV Cache 解決什麼?它沒有解決什麼?
Hugging Face 的 KV Cache 說明把生成拆成兩段:prefill 先替 prompt 每一層算出 K/V;decode 時,每個新 token 只需算自己的 Q/K/V,舊 token 的 K/V 可直接重用。換句話說:
- 它省掉的:每一步都替整段舊前文重算 K/V。
- 它沒省掉的:新 Q 仍要和目前所有 cached K 比對;context 長度為 t 時,單步 attention 仍約隨 t 線性增加。
- 它付出的:每一層都要把舊 K/V 留在記憶體;標準 full cache 通常會隨 context 變長。
- 首次 prefill:標準 dense causal attention 仍保留平方配對。
因此,「KV Cache 把推論從 N² 變 O(1)」不正確;比較安全的說法是:它讓單一新 token不用重算舊 K/V,但仍要讀取舊 cache。想把這段放回推論系統、批次與顯存管理一起看,可接著讀 LLM 推論引擎教學;想看 cache 空間不足時的淘汰問題,則可參考 Random Attention 與 KV Cache 評測。
看 Attention 熱圖最常犯的 5 個錯
- 把最深色當答案原因:它最多是路由係數或工具定義的聚合 magnitude。
- 跨 run 比亮度:本工具逐列正規化,每列都會有一個最深來源。
- 忽略生成前綴:模型剛生成的 token 也是下一步的 context,常會變成強來源。
- 把單一 head 擬人化:某次看似「指涉 head」,不代表所有句子與模型都固定如此。
- 只做一版 prompt:沒有最小改動的 A/B 控制,就很難區分詞義、位置、格式與偶然相關。
LLM Attention 常見問題 FAQ
1. Attention weight 到底代表什麼?
它代表某個 query 位置在該 layer、該 head 裡,對各 key 位置分配的 softmax 係數;係數接著用來混合 Value。它不是整個模型對字詞的最終重要性分數。
2. 每列 attention weight 都會加總為 1 嗎?
標準 softmax attention 在遮罩後,同一 query 的有效 key 權重會加總為 1。本文工具顯示的是再乘 Value norm、聚合 head/layer 並逐列視覺正規化後的顏色,不能把畫面透明度當作原始 softmax 機率。
3. 顏色最深的 token 就最重要嗎?
不能直接這樣判定。Value 的方向與大小、輸出投影、殘差、MLP 和後續 layer 都可能放大、轉向或抵銷訊息;高亮只值得成為下一個 ablation 假設。
4. 為什麼第一個 token 常吸到很多 attention?
有些 head 會把未使用或基準性的權重放到序列開頭,常被稱為 attention sink。這是觀察到的模式,不代表第一個 token 具有對等的語意影響;本工具也把第一個 chat token 排除於列最大值正規化。
5. 這個視覺化能切換 head 與 layer 嗎?
目前公開首頁顯示的是聚合結果,沒有 head/layer 選擇器。若要逐 head、逐 layer 觀察,可改用 BertViz 或直接從模型取得 attentions,但不同工具定義不同,圖不能直接互相比色。
6. Attention 的記憶體與計算一定都是 N² 嗎?
不是。標準 full dense self-attention 的配對 FLOPs 是平方;FlashAttention 可避免保存完整矩陣並降低額外記憶體,cached 單 token decode 是 1×t,滑動窗口與稀疏方法還會改變連線數。談 N² 時要先標出階段與指標。
7. KV Cache 會儲存 attention matrix 嗎?
一般生成用 cache 主要儲存每一層過去 token 的 K 與 V,不是把整張 attention matrix 永久保存。新 token 的 Q 會對 cached K 計分,再用權重混合 cached V。
8. Attention map 能看見模型的思考過程嗎?
不能把它當完整思考紀錄。它只揭露某段運算的路由量測,沒有涵蓋所有內部狀態與因果路徑;最好的用法是提出可反駁的假設,再配合輸入介入或內部 activation 實驗驗證。
給新手的 7 個重點
- Q 找線索、K 提供索引、V 才是被搬運的內容。
- Causal mask 在 softmax 前封住未來位置,不會讓 full prefill 變成線性。
- 每個 head 與 layer 都是局部鏡頭,不存在唯一一張「模型腦內地圖」。
- 本文工具把 attention×Value norm 聚合,仍不是最後 logit 的因果貢獻。
- 比較 A/B prompt 時固定 seed、抽樣設定、格式與輸出長度。
- 高亮來源先當假設,再用匹配的高亮/低亮替換做近似 ablation。
- KV Cache 省舊 K/V 重算,用更多記憶體換 decode 效率;新 Q 仍要看舊 K。
接著閱讀
左右滑動查看更多推薦
結論:先用熱圖找線索,再用實驗挑戰它
理解 LLM Attention 的關鍵,不是背完一張 QKV 架構圖,而是建立一個可操作的判讀順序:先確認量測定義,再固定控制變因,看 A/B 是否一起改變,最後用替換或更精細的內部介入測因果。現在就先打開視覺化,從「精確複製」那組開始;它最容易看出原文 token 與已生成前綴如何競爭。
如果你想把這套觀察方法延伸到 prompt、RAG、Agent 與評測工作流,可到 AlphaLab AI 課程總覽,依自己的程度接著練習。






