上一篇我們用 Activation Patching 做了第一次真正的 intervention。但就算我們能說這個位置對模型行為有 causal influence,還是有許多沒有回答的問題,例如:為什麼?是因為某個 Attention Head 把關鍵資訊寫進了 Residual Stream?還是某個 MLP 做的轉換?如果我們真正想理解 mechanism,下一步還需要問:「資訊到底沿著哪條路流動?每個節點又具體做了什麼?」
可以先把模型簡化成一張 graph。每一個Attention Head、MLP、Residual component,都可以想成 graph 上的一個 node。而一個元件的輸出會影響下一個元件,這些關係則可以想成 edge。

假設 Activation Patching 告訴我們 Head A 很重要,這仍然沒有告訴我們 Head A 是透過誰影響最終輸出。它可能直接影響 Head B、透過 Residual Stream 影響 MLP C、或同時沿著好幾條路往下游傳遞。因此,如果我們想理解 circuit,只知道重要 components 還不夠。我們還想知道它們怎麼連起來。
這就是 Path Patching 的基本想法。與一般 Activation Patching 不同,我們不是單純問:「如果把 Head A 的 activation 換掉,輸出會不會變?」而是問:「Head A 對 Head B 的影響,是否對最後的行為重要?」也就是只 patch 一條特定的 computational path。
例如,我們懷疑:
Head A → Head B → Output
是模型完成某項任務的重要路徑。我們可以設計 intervention,讓 Head B 在讀取資訊時,只接收到來自 Head A 的 corrupted / clean contribution,而盡量讓其他訊息維持不變。如果最後模型行為明顯改變,就得到更細緻的證據:「不是只有 Head A 很重要,而是 Head A → Head B 這條 interaction 可能具有 causal importance。」Path Patching 因此讓研究者從重要的 nodes 往重要的 edges / paths 前進。這對 circuit discovery 特別重要。[1]
你可能會想:那我把每個 Head 都拿掉,再看看 performance 掉多少,不就好了?這確實是一個方法。但問題是,模型內部不是一群彼此獨立的元件。例如:
Head A → Head C
Head B → Head C
如果 A 和 B 都能把類似資訊送給 C,那拿掉其中一個可能完全沒事。這不代表 A 沒有作用,只代表模型存在 redundancy。反過來,如果一次破壞太多東西,也可能把模型推進一個平常根本不會遇到的 activation regime,讓結果很難解釋。(就像之前比喻的一樣,把模型的大腦攪爛了就很難解讀發生了什麼)
所以 circuit analysis 的問題通常不是「哪個元件拿掉會讓模型壞掉?」而是:「在正常 computation 中,哪些元件之間的 interaction 對這個行為真正重要?」這也是為什麼 path-level intervention 會變得有價值。
這是這個領域會反覆出現的實務問題。如果模型只有 12 layers、12 heads per layer,我們可能還有機會一個一個試。但今天的大型模型可能有數十甚至上百層,以及非常大量的 components 和 possible edges。如果每測試一個位置、每一條 path 都需要重新 forward pass 一次,成本會迅速爆炸。
因此研究者開始發展另一類方法:Attribution Patching。
它的目標不是每一個候選 component 都真的跑一次 intervention,而是利用 gradient 去近似「如果我把這裡從 corrupted activation 換成 clean activation,輸出大概會變多少?」粗略來說,可以把它理解成:

其中:
或者如果現在是 patch node 的話就是(Attribution Patching 可以近似不同粒度的 patching effect,包括 node 與 edge/path;差別取決於我們對哪個內部變數計算 gradient,以及如何定義 intervention):

於是原本可能需要大量 forward passes 的 patching sweep,可以用少量 forward / backward passes 得到近似。速度快很多也是 Attribution Patching 最大的吸引力。
這個想法還可以再往前一步。如果我們不是想知道哪個 activation 重要,而是想直接估計哪些 edges 對模型行為最重要呢?
那就會需要 Edge Attribution Patching(EAP)。EAP 可以替 model graph 中大量 edges 算出 attribution score,再保留最重要的一小部分。最後就得到一張類似:

這讓 circuit discovery 開始可以變得更 automated。[2] 後續也出現像 EAP-IG 等方法,利用 integrated gradients 改善原始 EAP 的 approximation。[3]
但速度變快當然不是沒有代價的。Activation Patching 真正執行了把 activation 換掉,再跑一次模型。Attribution Patching 則是在做一階 linear approximation。這代表如果模型在這個 intervention 附近不是很 linear,近似就可能失準。
Google DeepMind 後來研究 AtP 與 AtP* 時,也發現 attribution-based approximation 可能出現 false negatives,也就是某個 component 實際很重要,gradient approximation 卻沒有把它找出來。[4] 所以比較好的使用方式通常是:
也就是 Attribution 幫我們搜尋,Intervention 幫我們確認。這其實又回到了 Day 5 的核心概念:Evidence 要和 Claim 匹配。
完整的 Demo 一樣在 companion notebook,正文只需要理解兩件事。第一,Activation Patching 是真的 intervention:
patched_logits = run_with_patch(
corrupted_tokens,
source=clean_cache,
layer=layer,
position=position
)
而 attribution 的概念則比較像:
effect = gradient * (
clean_activation - corrupted_activation
)
實際 implementation 會比這複雜,但核心差異就是一個真的改模型重跑;另一個利用 local gradient 預測改了之後大概會怎樣。
到目前為止,我們一路從:
Probe -> Logit Lens -> Activation Patching -> Path Patching
逐漸把問題縮小。
最開始我們只知道「模型裡有這個 information。」現在開始可以問「哪裡有?」「哪些 components 對它重要?」「哪些 interactions 對輸出有 causal influence?」這些線索如果逐漸拼起來,就會形成我們一直提到的一個東西:Circuit。
到目前為止可能你會覺得還是有點抽象,方法的概念是不難,但這樣真的能找到具體的 Circuit 嗎?找到的 Circuit 真的是可以被理解的嗎?下一篇,我們就從 Mechanistic Interpretability 最經典的案例之一——Induction Heads——開始,帶大家看看所謂的「找到 Circuit」是怎樣的過程。
[1] Wang, K. R., Variengien, A., Conmy, A., Shlegeris, B., & Steinhardt, J., “Interpretability in the Wild: a Circuit for Indirect Object Identification in GPT-2 Small”, International Conference on Learning Representations (ICLR), 2023. https://arxiv.org/abs/2211.00593
[2] Syed, A., Rager, C., & Conmy, A., “Attribution Patching Outperforms Automated Circuit Discovery”, 2023. https://arxiv.org/abs/2310.10348
[3] Hanna, M., Pezzelle, S., & Belinkov, Y., “Have Faith in Faithfulness: Going Beyond Circuit Overlap When Finding Model Mechanisms”, 2024. https://arxiv.org/abs/2403.17806
[4] Kramár, J., Lieberum, T., Nanda, N., & Shah, R., “AtP*: An Efficient and Scalable Method for Localizing LLM Behaviour to Components”, 2024. https://deepmind.google/research/publications/68553/