上一篇我們用 Logit Lens 觀察模型在不同 layer 中對答案的傾向,這仍然主要停留在 observation / localization,今天我們將第一次真正把手伸進模型內部,嘗試透過替換對應位置的 activation 看看模型是否真的能被影響對應的行為,探索模型後面的 computation 是否真的有依賴這些資訊。這就是 Activation Patching 的核心想法。
Activation Patching 通常從兩次 forward pass 開始。假設我們有:
Clean:
The capital of Japan is → Tokyo
Corrupted:
The capital of Taiwan is → Taipei
這裡的 corrupted 不一定代表模型「答錯」,而是我們刻意改變輸入,讓模型產生和 clean run 不同的行為。接著我們把兩次 forward pass 的 activation 都記錄下來。現在假設我們懷疑第 8 層、Japan 這個 token 位置的 Residual Stream,包含了讓模型最後回答 Tokyo 的重要資訊。那我們就做第三次 forward pass。輸入仍然是 corrupted prompt:
The capital of Taiwan is
但當模型跑到第 8 層時,我們偷偷把那個位置的 activation,換成 clean run 裡對應位置的 activation。然後繼續讓模型往下算。

如果 patch 之後,模型在 patched run (輸入是問台灣的首都時)變得更支持 Tokyo,那就得到了一條比單純 correlation 更進一步的證據:我們對這個內部狀態做 intervention,確實改變了模型的行為。Activation Patching 因此成為 Mechanistic Interpretability 裡非常常見的 causal localization 方法。[1]
想像我們發現某個 neuron 在所有關於 Taipei 的句子中都特別活躍。但它可能只是:
如果我們真的把它換掉,模型的行為也跟著發生預測中的變化,證據的性質就不一樣了。
我們不再只是說:「這個 activation 和 Taipei 有相關性」而開始可以說:「在這個 intervention 下,改變這個 activation 會改變模型對 Taipei 的輸出,和 Taipei 這個輸出有因果性。」(仍然很謹慎)。Activation Patching 提供的是因果證據,但它還不等於我們已經知道完整的 mechanism。
首先跑 clean input,把 activation 存下來:
clean_logits, clean_cache = model.run_with_cache(clean_tokens)
接著重新跑 corrupted input,但在指定的位置插入一個 hook:
patched_logits = model.run_with_hooks(
corrupted_tokens,
fwd_hooks=[
(
hook_name,
lambda act, hook:
patch_activation(act, clean_cache[hook_name], position)
)
]
)
patch_activation() 做的事情非常單純:把 corrupted run 某個位置的 activation,換成 clean run 對應位置的 activation。
接著比較:Clean output、Corrupted output、Patched output,看看 patch 之後,模型有沒有往 clean behavior 恢復。
真正有趣的地方,是我們不需要只猜一個位置。假設模型有 12 layers,prompt 有 10 個 tokens,我們可以:
每次都測量 patch 之後,clean behavior 被恢復多少?最後就能畫出:

如果某些區域特別亮,就代表把這些位置的 clean activation 放回去,對恢復 clean behavior 特別有效。我們就從一個巨大的 Transformer 中,逐漸縮小到少數值得繼續調查的位置。這就是 Activation Patching 作為 causal localization 工具最直覺的用途。
假設:
Clean run → Tokyo score = 10
Corrupted run → Tokyo score = 2
Patched run → Tokyo score = 8
我們可以定義一個簡單的 normalized restoration:

其中 (M) 可以是 target token logit、logit difference,或其他和任務相關的 metric。
在這個例子裡:
不過,metric 怎麼選其實會明顯影響 patching 的結論。Zhang 與 Nanda 系統性比較不同 patching 設定後發現,corruption method、metric 和其他實驗細節都可能導致非常不同的 localization results。[1] 所以一張漂亮的 heatmap,本身也不是終點。
剛才我們做的是把 clean activation 放進 corrupted run。也就是:「如果我把這項資訊救回來,行為能不能恢復?」但也可以反過來把 corrupted activation 放進 clean run,然後問:「如果我破壞這裡,原本的行為會不會消失?」
前者有時被稱為 denoising,後者則可以理解成 noising。直覺上:
但實際 interpretability 中,「necessary」和「sufficient」都要非常小心使用,因為模型可能存在 redundancy、backup mechanisms 或 self-repair。[2]
如果你去讀早期相關論文,還會看到另一個名字:Causal Tracing。Meng 等人在研究 GPT 如何儲存 factual associations 時,先對模型輸入加入 noise 破壞 factual recall,再逐步把不同位置的 clean activation 恢復回去,看哪些位置能把正確答案救回來。[3] 這和我們剛剛做的事情非常接近。
現在的文獻裡,Activation Patching 常被當成更廣義的名稱,單純指從一次 model run 取出 activation,再 patch 到另一次 model run 中;Causal Tracing 則可以視為其中一種具體的 corruption / restoration 設計。[1]
假設最後我們得到一張非常漂亮的 heatmap,告訴我們 layer 7–9、某幾個 token positions 特別重要、具有一定程度的 causal influence。但資訊到底透過哪條 computation path 流到輸出?
例如 Layer 8 的 Residual Stream 很重要,可能是因為:
所以你去調整他確實會影響到對應的輸出,但我們卻不知道具體是為什麼,我們下一步會把問題再縮小一點:我們能不能不只找「哪個位置重要」,而是追蹤資訊究竟沿著哪些元件流動?
下一篇,我們會從單點 intervention 往前一步,開始看 Path Patching、Attribution Patching,以及它們如何幫助我們逐漸找到一條真正的 computation path。
[1] Zhang, F., & Nanda, N., “Towards Best Practices of Activation Patching in Language Models: Metrics and Methods”, International Conference on Learning Representations (ICLR), 2024. https://proceedings.iclr.cc/paper_files/paper/2024/hash/06a52a54c8ee03cd86771136bc91eb1f-Abstract-Conference.html
[2] Heimersheim, S., & Nanda, N., “How to use and interpret activation patching”, 2024. https://arxiv.org/abs/2404.15255
[3] Meng, K., Bau, D., Andonian, A., & Belinkov, Y., “Locating and Editing Factual Associations in GPT”, Advances in Neural Information Processing Systems (NeurIPS), 2022. https://proceedings.neurips.cc/paper_files/paper/2022/hash/6f1d43d5a82a37e89b0665b33bf3a182-Abstract-Conference.html