循環一致性激活先知:將神經網絡激活轉化為自然語言
我訓練了一個模型,利用循環一致性作為訓練信號將大語言模型的激活向量翻譯成自然語言。雖然輸出結果看似合理,但資訊損失嚴重,且通常是對激活向量周圍上下文的猜測,而非對激活本身的高質量描述。
TL;DR: 我訓練了一個模型將大型語言模型(LLM)的激發值(activations)翻譯成自然語言,並使用循環一致性(cycle consistency)作為訓練訊號(激發值 → 描述 → 重建激發值)。輸出結果通常看似合理,但資訊損失嚴重,且通常是對激發值周圍上下文的猜測,而非對激發值本身的良好描述。這是一份包含初步結果的中期報告。
概覽
我認為 Activation Oracles (Karvonen et al., 2025) 是一個非常令人興奮的研究方向。人類並非演化來閱讀混亂的激發向量,而機器學習模型卻非常擅長處理這類事情。
Activation Oracle 的訓練目標是回答有關 LLM 激發值的特定問題(例如「這段文本的情感是正面還是負面?」或「前 3 個標記是什麼?」)。我想嘗試一些不同的方法:訓練一個模型將激發值翻譯成自然語言。
這裡要解決的主要問題是缺乏訓練數據。目前沒有將激發值與其描述配對的標記數據集。那麼我們該如何繞過這個問題呢?
一個想法是使用循環一致性:如果你將語言 A 翻譯成語言 B,再翻譯回 A,你應該會回到大約起始的位置。
我訓練了一個解碼器(decoder),它接收激發值並生成文本;以及一個編碼器(encoder),它接收文本並重建原始激發值。原始激發值與重建激發值之間的餘弦距離(cosine distance)是這兩個模型的訓練訊號。
以下是本文的其餘內容:
-
設置:我在 Qwen3-8B 的中間層激發值上訓練了一個 AO 風格的解碼器和一個獨立的編碼器。我首先在 LatentQA 和標記預測上進行監督式預熱,隨後進入使用 GRPO 的循環一致性階段。
-
輸出範例:我展示了解碼器通常能掌握大體主題和局部上下文,但輸出看起來不像對模型思考內容的良好描述。
-
此方法的局限性:循環一致性並不會強迫解碼器產生忠實的解釋,只會產生有助於編碼器重建向量的文本。此外,解碼器可以進行自己的推理,且文本瓶頸會導致嚴重的資訊損失。
-
評估:我將此方法與分類任務的線性探針(linear probes)進行比較。探針的表現總是更好,因為文本表示的資訊損失非常大。
-
後續步驟:改進設置的想法。
設置
我從 Qwen3-8B 的中間層提取單個激發向量,並訓練一個模型將其映射到自然語言。解碼器遵循 Karvonen 等人的 Activation Oracle 架構:對基礎模型進行 LoRA 微調,在第 1 層注入激發值並生成文本描述。
^([1])
編碼器是一個獨立的 LoRA 微調模型,將文本映射回激發空間。給定一段文本描述,它會從相同的中間層提取隱藏狀態,並將其池化為單個向量;然後將此重建向量與原始激發值進行比較。訓練分為兩個階段:
第一階段:監督式預熱。 解碼器首先在約 5 萬個範例上進行訓練,使用簡化版的 Activation Oracles 監督方式:混合了 LatentQA 數據(行為問答)和標記預測(給定 FineWeb 激發值,預測周圍標記)。
第二階段:透過 GRPO 實現循環一致性。 從第一階段的檢查點開始,我運行了 4000 步的 GRPO(群體相對策略優化)。對於每個激發值,解碼器採樣 K=4 個候選描述。每個描述根據編碼器重建原始激發值的效果(餘弦相似度)進行評分。這些分數經過群體歸一化,轉化為策略梯度更新的優勢值(advantages)。我對基礎模型應用了 KL 懲罰,以保持輸出連貫。
^([2])
輸出範例
對於文本中的每個標記(token),我提取其中間層激發值並讓解碼器對其進行描述。我上傳了各種文本的輸出範例,你可以點擊任何標記並查看解碼器的描述。去看看吧!
一個數學應用題範例。 以下是一些描述:
-
.:解碼器說「他」而不是「她」,並猜測是 5、6 或 10 個蘋果。 -
She:說是 Sarah 而不是 Alice,並給她彈珠而不是蘋果。 -
3:知道我們正在從集合中減去蘋果。 -
.:知道我們原本有一些數量,減去了一個數字,然後加上了一個數字。 -
1:正確得出了最終答案的第一位數字。
句子邊界。 大多數時候,解碼器似乎只捕捉到了緊接在前的上下文。然而,在句號處,它通常會產生更像是前一句話總結的內容。參見上述範例中的第二個句號。如果你認為模型在句子邊界存儲總結性上下文,這正是你所預期的。
一個常見的模式是解碼器保留了正在發生的事情的結構,但替換了不同的實體。 上述的 She 標記是一個很好的例子:實際文本是關於 Alice 給 Bob 蘋果,但解碼器描述的是 Sarah 送出彈珠。它掌握了「女性角色將計數對象交給某人」,但沒有掌握具體的角色或對象。
可解釋性方法多種多樣,從嚴謹但狹窄的(如探針)到直接閱讀思維鏈(CoT)。此方法介於兩者之間(可能更接近 CoT 端)。
此方法的局限性
循環一致性並不意味著良好的描述。 解碼器不需要描述激發值包含什麼,它只需要產生能「提示」編碼器進入與原始激發值相似內部狀態的文本。在極端情況下,你可以想像解碼器完全複製原始提示詞,這會讓編碼器的工作變得異常簡單。這種壓力特別強大,因為編碼器本身就是原始模型的微調版。這裡得到獎勵的不是「說出激發值的含義」,而是「說出一些讓模型進入相似狀態的話」。當你閱讀解碼器的輸出時,你會發現描述指向了正確的主題和上下文,並試圖猜測激發值之前的標記。描述確實包含有關激發值的資訊,但該資訊也存在於原始提示詞中!
解碼器有自己的思考。 如果解碼器從激發值中獲取了足夠的上下文來猜測輸入文本是什麼,它可以進行前向推理並報告激發值中根本不存在的結論。你無法分辨解碼器是從激發值中讀取了某些內容,還是它自己推算出來的。(標準的 AO 也存在這個問題。)
假設我們想檢查數學計算過程中的某個激發值,並想知道模型到目前為止計算了什麼。它正在追蹤哪些中間結果?如果解碼器能「讀取」前面的標記,它可能會在寫描述的同時自己解決這個數學問題。因此,我們無法得知原始激發值是否真的包含該解法。
資訊損失的瓶頸。 我們正在將一個高維連續向量壓縮成 128 個文本標記。重建的餘弦相似度約為 0.8,因此丟失了大量資訊。如果你預先知道想問激發值什麼問題,訓練一個探針會比閱讀文本描述更好。
評估
檢索
作為一項基本檢查:描述是否足夠具體,以識別它們來自哪個激發值?對於 1000 個激發值池中的每一個,我生成了一個描述,將其編碼回去,並檢查最近的匹配是否為原始值。Top-1 準確率為 95.7%,Top-5 為 99.1%。請注意,這主要證實了循環機制正在運作,而非描述本身是優質的。
分類
對於六個二元分類任務,我將原始激發值上的線性探針與解碼器進行了比較:由一個 LLM 閱讀解碼器的描述並回答相同的「是/否」問題。
^([3])
Last tok 使用最後一個標記處的激發值;mean 則對所有標記位置取平均。
| 數據集 | 探針 (last tok) | 解碼器 (last tok) | 探針 (mean) | 解碼器 (mean) |
|---|---|---|---|---|
| SST-2 (情感) | 88.5% | 72.5% | 87.0% | 79.5% |
| Bias in Bios (性別) | 81.0% | 61.3% | 96.2% | 70.8% |
| AG News (體育/非體育) | 94.2% | 91.5% | 98.8% | 97.8% |
| Tense (過去式/非過去式) | 97.5% | 94.5% | 98.5% | 91.2% |
| Singular/Plural (單複數) | 96.2% | 88.5% | 96.7% | 63.4% |
| Language ID (語言識別) | 99.5% | 50.7% | 99.2% | 54.8% |
| Language ID (多語言檢查點) | 99.5% | 78.5% | 99.2% | 85.5% |
解碼器完全無法進行語言識別(50.7-54.8%,接近隨機)。我懷疑這是因為解碼器僅在英語數據上訓練,因此我訓練了一個在訓練語料中包含多語言文本的獨立檢查點(「多語言檢查點」行),這將準確率提高到 78.5-85.5%。這是一個不錯的進步,但也表明我們沒有自動獲得從英語到多語言的泛化能力。
算術
受 Current Activation Oracles Are Hard to Use 中數字預測評估的啟發,此評估將「4 * 7 = 」之類的表達式輸入原始模型,並提取末尾空格處的激發值。
解碼器表現 (每層級 n=50):
| 難度 | 完全匹配 | 描述中首位數字正確 |
|---|---|---|
| 簡單 (1 位數答案) | 46% | 52% |
| 中等 (2 位數答案) | 0% | 52% |
| 較難 (3 位數答案) | 0% | 24% |
無論實際答案為何,解碼器大多隻會說出 5、10、12、15 之類的數字。
這有多少是解碼器的錯,而多少是原始激發值本身不包含答案?這些激發值來自第 18 層(網絡中間),因此模型當時可能尚未計算出答案。我通過在相同位置訓練線性探針來檢查這一點,該探針在中等難度問題的答案首位數字上達到了 100% 準確率。因此,資訊是存在的,但解碼器未能提取它。
我接下來想嘗試的
核心問題在於循環一致性獎勵解碼器去猜測上下文,而非產生良好的描述。我目前還沒有完美的解決方案,但這裡有一些我想嘗試的事情。
不同的編碼器。 目前的編碼器是同一個模型的微調版,觀察同一層的激發值,這使得解碼器特別容易通過猜測原始文本來獲得高分。我想嘗試將其替換為一個獨立的激發值生成模型(例如類似 Ameisen et al., 2025 的模型),這可能會降低猜測上下文的有效性。但不清楚這是否真的有幫助,或者如何以不重現相同問題的方式使其具備文本條件。
在循環一致性期間持續進行 AO 訓練。 我想嘗試在循環訓練的同時運行 AO 風格的監督。我猜測任務的選擇非常重要:如果解碼器一開始就產生描述,編碼器就會學習從描述中重建,循環一致性就會強化這一點。如果它一開始就猜測原始文本,那麼被強化的就會是猜測。
如果你有任何能推動產生更好描述(而不僅僅是更好重建)的訓練訊號想法,我很樂意聽聽。
附錄:其他訓練想法
逐標記信用分配(Per-token credit assignment)。 GRPO 將編碼器視為整個描述的黑盒評分函數,但編碼器是可微的,且包含關於描述中每個標記如何影響重建的訊號。逐標記獎勵或基於梯度的信用分配可能有助於解碼器更有效地學習。
後向循環 (文本 → 編碼 → 解碼 ≈ 文本):將文本通過編碼器獲得激發向量,將其注入解碼器,並訓練解碼器重建原始文本。這是完全可微的,且不需要生成過程。問題在於目前沒有類似激發值描述的文本,而使用解碼器自己的輸出作為訓練數據會導致循環論證。
軟前向循環 (激發值 → 解碼 → 編碼 ≈ 激發值,但可微):我嘗試使用直通式 Gumbel-Softmax 作為解碼器的替代梯度,以便編碼器的重建損失可以直接訓練解碼器。我目前還沒能讓這個方法奏效。
-
注入遵循 AO:激發值 $v$ 透過 $h' = h + v \cdot w$ 被添加到第 1 層的隱藏狀態 $h$ 中。編碼器的池化頭是一個學習到的線性層,它對每個標記進行評分並取隱藏狀態的加權平均。兩個適配器均為 LoRA rank 64, alpha 128。↩︎
-
Batch size 32,學習率 1e-5,配合線性預熱和衰減,溫度 1.0。KL 散度僅在生成的文本上針對原始模型(無 LoRA)計算(不包含 oracle 提示詞或激發值注入)。↩︎
-
LLM 裁判是 GPT-5。它接收解碼器的描述以及逐標記的編碼器注意力權重(顯示編碼器認為哪些位置資訊最豐富),以及一個「是/否」問題,如「這段文本是否表達了正面情感?」或「這段文本是否關於體育?」。SST-2、Bias in Bios、AG News 和 Language ID (WiLI-2018) 來自 HuggingFace。Tense 和 Singular/Plural 取自 Activation Oracles 倉庫。↩︎