JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

疊加與稀疏自編碼器

你打開一顆神經元,原以為會看到一個乾淨的概念,結果卻發現七種東西攪在一起。這篇導引解釋為什麼會這樣——也就是疊加假說——以及研究者如今用來把這團亂麻重新拆解成可命名特徵的稀疏自編碼器。

意思有七種的那顆神經元

在上一篇導引裡,你學會了把網路讀成特徵電路,並懷抱一個誘人的夢想:也許有一天,我們能像工程師拆開一台收音機那樣拆開一個模型——追蹤線路、為零件命名、看清它如何運作。然而當你真的往一個真實模型裡頭看時,這個夢想在你拿起的第一個零件上就絆倒了。你挑出一顆神經元,原以為它代表一件乾淨的東西,結果它卻為一堆荒謬的雜燴而亮起:貓的照片、詞元「December」、一串串 DNA、以及一段 Python 錯誤訊息的語法。它沒有壞掉;這才是常態。大型模型裡大多數的單一神經元都長這樣,而這一個觀察,正是這整篇導引存在的目的——去解開它。

這種雜亂有個名字:一顆會對好幾種不相干事物都有反應的神經元,叫做多義神經元,而這種性質就叫多義性。你為什麼該在意?因為機制可解釋性的整個承諾——以及本階段第一篇導引裡那個追求它的安全理由——就是要能指著模型的某個部位,說清楚它在做什麼。如果我們想稽核一個大型語言模型、看它有沒有一個隱藏的欺騙特徵,或想確認一次拒答是真有其事、還是脆弱的表面把戲,我們就需要能夠命名的零件。一個同時意指七種東西的零件,是我們無法誠實命名的零件;而一個幾乎全由這種零件構成的模型,乍看之下,像是理解之路的死胡同。

想法比線路還多

在任何術語之前,先說直覺。一個神經網路的某一層,擁有的神經元數目是固定且有限的——比方說幾千顆。但一個真正理解語言與世界的模型,需要追蹤的不同概念,數量要龐大得多得多:每一位名人、每一種程式語言、每一種情緒、每一個成語、化學物質與語氣。值得表徵的東西,就是遠遠多過能用來表徵它們的神經元。於是網路面臨一個無法用最簡單方式(一個概念配一顆神經元)解決的儲存問題。它擁有的想法,比它擁有的線路還多。

想像一間小套房,卻不知怎地得裝下一整棟大房子的家當。你沒辦法給每樣東西都配一個架子——架子不夠。但只要你善用一個關於「自己實際上怎麼使用這些東西」的事實,你就能撐下去:你幾乎從來不需要同時用到全部。大多數時候,真正派上用場的只有寥寥幾樣。於是你堆疊、重疊,收進去的東西遠多過架子的數量,而在任何一天,你只取出你需要的那幾樣。讓這一切成立的關鍵事實,就是稀疏性:在一個模型所能表徵的全部概念中,任何單一輸入裡真正活躍的,只佔極小一部分。「December」這個詞,和一段 DNA,很少會在同一個句子裡同時要緊。

於是網路做了一筆交易。因為概念是稀疏的,它便負擔得起把許多概念疊放在同一個小空間裡,並接受偶爾會有兩者相撞、彼此稍微干擾——以一點點、可以容忍的雜訊,換取表徵遠比原本多得多的能力。這筆交易,正是接下來一切的核心。上一節你遇見的多義神經元並不是個臭蟲;它是一個「選擇了塞進比神經元數目更多概念」的網路所留下的、看得見的指紋。現在,我們把這件事講精確。

特徵是方向,而它們是刻意重疊的

這個精確的想法,建立在上一篇導引的一個概念之上,現在把它講利落:線性表徵假說。它主張,一個特徵並不是由單一神經元來表徵,而是由某一層激活的高維空間中的一個「方向」來表徵——很像一個概念可以是嵌入空間裡的一個方向。一個特徵在某個輸入中「存在」的程度,取決於該層的激活沿著它那個方向指過去多少。這個重新框定令人豁然開朗:方向不必非得對齊神經元的座標軸。一個特徵可以斜斜地同時橫跨許多顆神經元,而這正是為什麼「一次只讀一顆神經元」告訴我們的東西如此之少。

現在來看假說本身。在一個 d 維的空間裡,你最多只能塞進 d 個彼此垂直(正交)的方向。如果一個網路只用正交方向,那麼一個 d 顆神經元的層就剛好能存 d 個特徵——也就是那套「一線一概念」的簡單方案。而疊加假說主張:網路做得遠比這好——它靠著使用「只是『近乎』正交」的方向,塞進了比維度數「多得多」的特徵。近乎垂直的方向只會輕微干擾彼此,而且因為特徵是稀疏的,那些罕見的碰撞很少會同時都用力激發,所以干擾小到值得一冒。網路實際上是在「模擬」一個大得多的層,添了一些想像中的額外神經元,並以一點點雜訊作為代價。

這就為我們開篇的謎題收尾了。如果特徵是「不與神經元座標軸對齊」的方向,那麼任何單一神經元都會和一大群特徵方向之間各成某個夾角,於是只要其中任何一個活躍,它就會——部分地——激發。這正是為什麼一顆神經元會同時對貓、December 和 DNA 有反應:它接到的,是好幾個剛好在它座標軸上有分量的不同特徵所溢出的東西。換句話說,多義性並不是另一個獨立的謎;它是表面的症狀,而疊加是底層的成因。成因與症狀,終於接上了。

把它變具體的那個玩具模型

疊加有可能只是一個說得很漂亮的故事,所以「有一個乾淨、受控的示範」這件事很重要。在《Toy Models of Superposition》(Anthropic,2022,Elhage 等人)裡,研究者刻意打造了一個極小的網路,交給它一個答案已知的任務:拿一小撮稀疏且大致獨立的特徵,把它們擠過一個「維度比特徵數還少」的層,再把它們重建出來。根本沒有空間讓每個特徵各佔一條座標軸。網路會怎麼做?當特徵很稠密(通常同時有好幾個活躍)時,它會放棄,只把最重要的那幾個正交地存起來——這是安全、無趣的解。但隨著特徵變得愈來愈稀疏,網路便切換進疊加模式,把多出來的特徵當成非正交的方向硬塞進去,並容忍由此產生的干擾。

可愛之處在於,網路並不是隨便亂塞這些方向。它把它們排成整齊的幾何圖形——對蹠的一對、三角形、五邊形,以及更高維的形狀——讓方向盡量散開,把干擾壓到最低,就像你會把點均勻地排在一個圓周上那樣。從「乾淨地存幾個」切換到「疊放許多個」,是隨著特徵有多稀疏而發生的一個鋒利的相變。這一切都無法證明一個前沿模型做的是一模一樣的事——玩具終究是玩具。但它把疊加從一個揮揮手的說法,變成了一個「你能推導其規則、能預測、還能隨叫隨到地看它發生」的現象。正是這一點,讓這個領域的其他人開始認真看待它。

稀疏自編碼器:把和弦拆回單音

如果疊加是網路把許多稀疏特徵摺進少數擁擠的維度裡,那麼最顯然的一招就是把這個摺疊「反過來跑」:學會把擁擠的激活重新展開成一張寬而稀疏的特徵清單。把一層的激活想成一個音樂和弦——好幾個音同時響起,混成單一波形——而目標是還原出究竟在響的是哪幾個音。這一招在數學上的名字是字典學習:把每個激活向量解釋成「從一本龐大的『字典』(一堆基本方向)裡抽出來的稀疏組合」,而對任何給定的輸入,只有少數幾個字典條目會被打開。

為神經網路做這件事的工具,就是稀疏自編碼器(SAE),它值得一次一個詞地認識。一個 SAE 有兩半。編碼器接收來自模型的一個激活向量,把它投影到一個寬得多的隱藏層——往往比原本寬上八到三十倍,這就是為什麼它被稱為「過完備」。一個非線性函數加上一個懲罰項,逼迫這個寬層大部分都是零,於是對任何輸入,只有少數幾個單元會打開。接著解碼器拿這幾個活躍的單元,把它們的方向重新加總起來,盡可能逼近地重建出原本的激活。訓練同時施壓於兩件事:準確地重建激活,以及讓活躍單元的數目維持得很小。

# a sparse autoencoder over one layer's activations x  (dim d_model)
# dictionary size d_sae  >>  d_model     (overcomplete: many more units)

f      = ReLU(W_enc @ (x - b_dec) + b_enc)   # sparse feature code, size d_sae
x_hat  = W_dec @ f + b_dec                    # reconstruct x from active features

loss   = || x - x_hat ||^2        # (1) reconstruction: explain the activation
       + lambda * || f ||_1       # (2) sparsity: keep very few features on

# the COLUMNS of W_dec are the learned feature directions = the "dictionary"
# the nonzero entries of f say which features are present, and how strongly
# raise lambda  -> sparser, more monosemantic, but worse reconstruction
五行就是整個 SAE:一個說「把激活解釋出來」的重建項,和一個說「幾乎別用任何特徵」的稀疏項彼此拉鋸——而正是這股張力,逼出了乾淨、可分離的概念。
  1. 讓模型跑過一個龐大的語料庫,並在一個選定的位置記錄激活向量——例如某一層的殘差流。
  2. 在這些向量上訓練一個帶有稀疏懲罰的過完備自編碼器,逼它只能用少數幾個活躍單元來解釋每一個向量。
  3. 把每一個解碼器的欄位讀成一個候選特徵,並透過蒐集「最能讓該單元強烈激發的輸入」來為它貼上標籤。
  4. 用「干預」來檢查這個標籤是真有其事、而非一廂情願:把該特徵鉗制成開或關(激活引導或消融),看看輸出是否朝標籤所預測的方向移動。
  5. 反覆迭代——調整字典大小與稀疏程度,留意死亡特徵與特徵分裂,並用留存的行為資料來驗證。

稀疏自編碼器找到了什麼,以及金門大橋版 Claude

這一切在真實模型上真的行得通嗎?第一個有說服力的「行」,來自《Towards Monosemanticity》(Anthropic,2023,Bricken 等人)。他們在一個小型單層 transformer 的激活上訓練了一個 SAE,拉出了數以千計、乾淨得驚人的特徵——單義的,意思是每一個都代表一件可辨識的單一事物。有一個阿拉伯文字的特徵、一個 DNA 序列的特徵、一個 base64 編碼文字的特徵、一個法律語言的特徵。他們也注意到了特徵分裂:把字典放大,一個籠統的特徵(比如「數學」)就會碎裂成許多更細的——「矩陣代數」、「拓樸學」等等——這暗示著並不存在一張唯一而特權的特徵清單,只有一個你所選定的解析度。

接著是規模化。在《Scaling Monosemanticity》(Anthropic,2024,Templeton 等人)中,研究者在已部署的正式產品模型 Claude 3 Sonnet 上訓練 SAE,還原出了數以百萬計的特徵——其中最有名的,是一個橫跨文字與影像、會在金門大橋上激活的特徵。團隊也報告了初步的、與安全相關的特徵:追蹤諂媚、欺騙、危險程式碼與偏見的那些。其他實驗室也循不同路徑抵達了類似的地方——OpenAI 在 GPT-4 等級的模型上訓練了非常大的 top-k SAE,Google DeepMind 則釋出了 Gemma Scope,一套橫跨模型各層的開放 SAE。這個現象不是某一家實驗室的人造產物。

「這些特徵不只是事後貼上去的標籤」這件事,最鮮活的證明來自對它們的干預。Anthropic 把金門大橋特徵鉗制在一個很高的值上,造出了「金門大橋版 Claude」——一個暫時公開的模型版本,它幾乎會把每一段對話都導向那座橋:你向它要一份餅乾食譜,它也會莫名其妙地繞經舊金山的霧與鋼索。這就是激活引導,也正是緊接著下一篇導引的主題:藉由把一個有名字的方向調高或調低,來編輯模型的行為。當你能藉由推動一個特徵、按預測的方式改變行為時,你就有了證據——這個特徵在做真正的因果工作,而不只是與輸出相關而已。

初學者常見的誤解

第一個、也是最大的錯誤,是把一個 SAE 產生的特徵當成模型真正的、天賦的思考原子。它們不是。一個 SAE 的輸出,極度仰賴你做的選擇:字典大小與稀疏懲罰。把字典開得更大,籠統的特徵就分裂成更細的;改變懲罰項,整份清單就跟著挪移。兩個都很合理、在同一個模型上訓練出來的 SAE,可能連「特徵到底是什麼」都各執一詞。所以一個 SAE 給你的,是「一個」在「某個」選定解析度下的有用分解——一種說得通的激活切法——而不是模型「真正」擁有的那一套唯一真概念的讀數。

第二個錯誤,是以為 SAE 解釋了激活裡的一切。它們沒有。總是存在一個重建落差:把一個 SAE 的重建結果接回模型、取代真正的激活,模型的表現就會明顯變差,因為有些資訊在過程中丟失了。研究者有時把這未被解釋的剩餘部分稱為 SAE 的「暗物質」,而它可能佔相當大的比例。一個與此相關的失誤,是把高的重建分數讀成高的「有用性」分數——一個 SAE 可以把激活重建得很好,卻仍然錯過了那些真正驅動你所在意之行為的特徵。

第三個錯誤,是把線性表徵假說當成已成定局的事實囫圇吞下。它是一個極其多產的假設,但不是已被證明的定律。在《Not All Language Model Features Are Linear》(2024,Engels 等人)裡,研究者找到了真正多維、而非單一方向的特徵——例如,一週的星期與一年的月份是被表徵在一個個小圓上的,好讓模型能做類似時鐘的算術,像是「星期六之後三天」。如果有些概念棲身於彎曲或多維的曲面上,那麼一個為了找「直方向」而打造的方法,按其設計,就會錯過或扭曲它們。「特徵是方向」是一個強而有力的初步近似,而不是最終定論。

仍在爭論的,以及接下來往哪走

最尖銳的開放問題講得很直白:對於我們希望可解釋性去做的那些事,SAE 真的有用嗎?在最初那波興奮之後,好幾項 2024 至 2025 年的研究提出反駁,發現 SAE 衍生的特徵,在具體的下游任務上並未穩定地勝過簡單得多的基準線——例如,探測某個特定概念、或引導某個特定行為時,一個普通的線性探針有時做得一樣好、甚至更好。令人憂心的是,「稀疏加重建」這個目標優化的是「把激活解釋出來」,而這跟「把對行為要緊的特徵孤立出來」並不是同一回事。辯護者則回應:SAE 還很年輕,評測方法本身也還不成熟,而它那種無監督、開放式地發現「沒人想到要去找」之特徵的能力,是一個有針對性的探針所無法企及的真實優勢。這是一場正在進行、健康的論戰,而不是已成定論的裁決。

在那之下,還躺著一個更深的不確定:連疊加假說本身,對最大的那些模型而言都還沒被完全釘死,而要分辨一個 SAE 究竟是在「量測」模型本來就有的結構、還是在「強加」一個只是看起來整齊的結構,是真的很難。這是更大的可解釋性鴻溝的其中一個面向——我們能講得頭頭是道的故事,與我們真正想要的嚴謹因果理解,兩者之間的距離。這個領域已經在回應了:較新的方法,例如轉碼器(transcoder)、跨層編碼器(crosscoder)與端到端訓練,調整了目標函數,使其更直接地追蹤模型的計算;而 Anthropic 2025 年的電路追蹤工作,便倚賴跨層轉碼器,把一個個小小的推理步驟首尾相連地描繪出來。誠實的總結是:SAE 是近幾年最令人興奮的可解釋性工具「之一」,「同時」也正受到沉重而應得的檢視——既不是已被解決的問題,也不是死胡同。

接下來往哪走:緊接著的下一篇導引談探針與激活引導,它會接過你如今已懂得如何尋找的特徵,問起該如何測試與運用它們——把一個有名字的方向調高或調低、用線性探針把一個概念讀出來,以及這兩者在安全上的用途與限制。再下一篇談評估詮釋的導引,則提供這整個階段所需要的紀律:如何判斷一個看起來乾淨的特徵,究竟是真正的機制、還是只是一個討喜的故事。請把那個串起本篇與這兩篇的單一想法一路帶著:一個你能命名的特徵,是一個關於模型的假設;而一個假設的價值,只等於它所通過的那些測試。