從「哪個輸入」到「什麼計算」
本階前面幾篇給了你一些工具,它們把模型當成黑箱,從外部追問:它為什麼會做出那個預測?顯著性圖會高亮有影響力的像素;可解釋 AI方法給每個輸入特徵打一個分數。這些確實有用,但它們回答的是一個有限的問題——某次預測裡哪些輸入重要——而不是更深的那個問題:網路究竟在計算什麼?機制可解釋性立下了遠為雄心勃勃的目標。它把一個訓練好的神經網路當作一段沒有原始碼的已編譯程式,試圖把這段程式逆向還原成人類能讀懂的演算法。
這個類比值得認真對待。訓練過程把一段程式寫進了成百上千萬、甚至上億個數字——也就是參數——靠的是梯度下降,而不是人去敲程式碼。我們手上有完整的二進位:每一個權重都明明白白地擺在那裡,完全可觀測。我們缺的是註解、變數名、結構。機制可解釋性就是那個反組譯工程:拿起這些原始數字,把藏在裡面的、有意義的計算單元還原出來。
探針:追問某一層到底已經知道了什麼
最溫和的切入方式是探針。思路是:把網路凍住,讓一些輸入流過它,在你選定的某個隱藏層抓取內部激活值。然後訓練一個極小、極簡單的分類器——也就是探針分類器,通常只是線性的——用這些激活值去預測你關心的某個屬性。如果一個一行的線性探針能直接從第 12 層裡讀出「這個詞是不是動詞?」或「這個棋局是不是贏面?」,那這個屬性顯然就被表示在了那裡,而且是以一種很容易取用的形式。
在不同層上做探針,會勾勒出一幅「發育」的圖景:視覺網路的淺層攜帶邊緣和紋理,深層攜帶物體部件;Transformer的淺層追蹤詞的表層形態,深層追蹤含義與句法。研究者正是這樣找到證據,說明某個嵌入或激活編碼了某種抽象的東西——而這東西並沒有人明確訓練它去儲存。
探針裡還藏著一個微妙的侷限:它告訴你某個屬性可以從某一層裡被解碼出來,卻沒告訴你網路自己有沒有用到它。資訊可能確實存在,卻被下游的計算所忽略。探針回答的是「它在不在那裡?」,回答不了「模型有沒有依賴它?」——而這道縫隙,恰恰是接下來那些更偏因果的方法想要填補的。
特徵與迴路:這門學問的工作詞彙
機制可解釋性建立在兩個核心名詞上。這裡說的特徵,並不是你餵給模型的那個輸入特徵,而是激活空間裡的一個內部方向,它會對某種有意義的東西穩定地作出反應——視覺網路裡的曲線偵測器、語言模型裡「這段文字是法語」的那個方向、一個會因金門大橋而激活的神經元。迴路則是由特徵和權重構成的、彼此相連的一小塊子圖,它們合起來實現某個具體行為,就像用激活和連接搭出來的一段微型演算法。
一個著名的例子是在 Transformer 裡發現的「歸納頭」(induction head):一對注意力組件協同工作,實現了這樣一條規則——「如果模式 AB 之前出現過,而我剛剛又看到了 A,那就預測 B」。這是一個貨真價實的「複製並續寫」演算法,它不是靠讀文件發現的,而是靠追蹤資訊如何流過注意力機制而被找出來的。視覺領域的研究者也同樣追蹤到了一些迴路:它們用更早的「車窗、車輪、鍍鉻」偵測器搭出了一個汽車偵測器。這些都是真實、可複現的發現——是從權重裡還原出來的小演算法。
但這門學問的核心頭疼之處正在於此:多義性(polysemanticity)。大多數神經元並不是乾淨的、單一含義的單元。一個神經元可能同時對貓臉、汽車前臉和某些法律措辭激活。目前主流的解釋是:網路把比神經元數量更多的特徵硬塞了進去——辦法是把它們存成相互重疊的方向,讓特徵共享神經元,於是幾百個維度裡能表示上千個概念。這就是為什麼你沒法一個一個神經元地直接把模型讀出來。
# A neuron's activation is a sum over features it participates in: # neuron_j = w1*feat_A + w2*feat_B + w3*feat_C + ... # Sparse autoencoders try to invert this: # activations -> (encode) -> many sparse feature units # <- (decode) <- reconstruct the activations # Goal: each recovered unit means ONE thing.
最近一條重要的研究路線,用稀疏自編碼器正面進攻多義性問題:訓練一個自編碼器,把某一層的激活重新表達成一組數量大得多、但大部分為零的單元,理想情況下每個單元只表示一件乾淨的事。在大規模應用中,這已經在生產級語言模型裡浮現出了數以百萬計的可解釋特徵,其中有些特徵你可以放大它來引導模型行為。這是目前這門學問把纏成一團的神經元變成可讀詞彙的、最有希望的工具——儘管它遠談不上已經解決。
你如何證明一條迴路是真的
關於一條迴路的說法,在你用因果方式去檢驗它之前,都只是一個假設。最常用的主力技術是「干預」:不要只是觀察網路,而要在它運行到一半時去編輯它,然後看會有什麼變化。這其實是你前面見過的消融實驗在可解釋性裡的表親——只不過是對內部組件做精細的「手術」,而不是對訓練配料動手。
- 提出假設:「這個注意力頭把主語的性別複製到了動詞的位置上。」
- 消融它:把那個組件置零或替換掉,看目標行為會不會因此失效。
- 打補丁:分別用一個「乾淨」輸入和一個「被破壞」輸入各跑一遍,再把其中一次運行的某個激活值嫁接到另一次裡(激活打補丁),從而精確定位到底是哪一部分在傳遞這個效應。
- 確認:事先預測哪些編輯應該、哪些不應該改變結果,然後核對模型的表現是否和你那套迴路說法相符。
正是這種因果上的嚴謹,把機制可解釋性與「隨口編故事」區分開來。它也使機制可解釋性與把注意力權重直接當作解釋截然不同——後者是一條誘人的捷徑,卻常常把人帶偏,因為模型「看哪裡」並不可靠地等同於它「為什麼這樣決定」。同樣的懷疑也適用於顯著性圖:一張漂亮的熱力圖可以很有說服力,卻依然沒能反映真實的計算。
為什麼要費這個勁——以及它和什麼相連
這件事的回報不只是科學上的好奇心。如果你能找到模型所用的那條迴路,你就能給它排錯:發現一個分類器其實是抓住了一個偽相關(哈士奇身後的雪、醫學掃描圖上的浮水印),靠的是捷徑學習,而不是真正的訊號。你可以編輯知識、透過放大或抑制某個特徵來引導行為,還能檢查一個修復究竟是真的去掉了問題,還是只是把它藏了起來。機制層面的洞見也會反哺AI 對齊與AI 安全研究,那裡的夢想是:靠檢視內部,而不只是盯著輸出,來偵測欺騙或不安全的推理。
不過也要看得清醒。今天這門學問能夠完整逆向工程玩具模型和孤立的迴路,也能在真實模型裡浮現出龐大的特徵詞典——但它還沒法遞給你一份關於前沿大語言模型的、完整而忠實的藍圖。這項工作非常耗人力,常常依賴一些尚未被證實的假設(比如「特徵是線性的」這一觀點),而且在一個模型裡得到的發現未必能遷移到另一個模型。「我們找到了一條迴路」是真實的進展;「我們理解了整個模型」則還遠未擺上檯面。