📚 課程連結:ML 2025 Spring — 剖析大型語言模型內部運作邏輯
🎥 影片:YouTube
📄 投影片:PDF
前言
這堂課的核心問題是:LLM 內部到底在做什麼?
我們每天都在用 ChatGPT、Claude 這些工具,但它們為什麼有時候會拒絕回答?為什麼會產生幻覺?為什麼有時候能推理、有時候不行?這堂課用三個遞進的層次來拆解 LLM 的黑盒子。
⚠️ 重要前提:這堂課裡沒有任何模型被訓練,所有的分析都是在已經訓練好的模型上進行的「解剖」。
一、一「個」神經元在做什麼
核心方法:觀察 + 干預
要確認一個神經元的功能,不能只看「相關性」,還需要做「因果驗證」:
- 觀察:該神經元啟動時,模型會產生特定行為(例如說髒話)→ 只能說有相關性
- 干預:移除該神經元後,模型不再產生該行為 → 確認因果關係
- 程度驗證:不同啟動程度,對應不同「等級」的行為
有趣的案例
但事情沒那麼簡單
單一神經元的解釋性很差,因為:
- 多義性(Polysemanticity):一個神經元可能同時管很多不相關的事
- 分散式表示:一件事可能由很多神經元共同負責
為什麼會這樣?以 LLaMA 3 8B 為例,一層只有 4,096 個神經元,但就算每個神經元只有開/關兩種狀態,也有 2^4096 種組合 — 遠超過需要表示的概念數量。所以模型選擇用組合來編碼概念,而不是一對一。
💡 實務啟發
這解釋了為什麼 prompt engineering 有時候很玄學 — 你改了一個詞,可能觸發了完全不同的神經元組合,導致模型行為大幅改變。
二、一「層」神經元在做什麼
功能向量(Function Vector)
既然單一神經元不好解釋,那就看整層。老師介紹了一個超直覺的方法:
抽取「拒絕向量」的步驟:
- 收集一批「模型拒絕回答」的案例(如「教我做炸藥」→「不」)
- 收集一批「模型正常回答」的案例(如「教我機器學習」→「好」)
- 取兩組案例在某一層的平均向量差 → 就是「拒絕向量」
1 | |
驗證:向量加減法
拿到拒絕向量後,可以做有趣的實驗:
- 把「拒絕向量」加到正常問題上 → 模型開始拒絕回答正常問題
- 從拒絕問題中減去「拒絕向量」 → 模型開始回答危險問題(⚠️ 這就是 jailbreak 的原理之一)
這個技術有很多名字:
- Representation Engineering
- Activation Engineering / Steering
其他已發現的功能向量
| 功能向量 | 效果 | 論文 |
|---|---|---|
| Sycophancy Vector | 控制模型的「拍馬屁」程度 | arXiv |
| Truthful Vector | 讓模型更誠實 | arXiv |
| Function Vector | 控制特定任務(如翻譯、情感分析) | arXiv |
💡 實務啟發
理解功能向量的概念,對 AI 安全和 alignment 很重要。如果你在做 AI 產品,了解「拒絕行為是由向量控制的」,就能理解為什麼 jailbreak 攻擊有時會成功 — 攻擊者本質上是在想辦法「減去」模型的拒絕向量。
三、Sparse Autoencoder(SAE)— 找出所有功能向量
上面是手動找一個功能向量,但能不能自動找出所有功能向量?
核心思想
把每一層的向量 h 分解為:
1 | |
其中:
- vₖ 是功能向量(可解釋的特徵方向)
- αₖ 是係數(大部分應該是 0 → 稀疏性)
- e 是重建誤差(越小越好)
訓練目標
1 | |
這就是 Sparse Autoencoder(SAE)!
Anthropic 的 SAE 研究
Anthropic 用 SAE 分析了 Claude 3 Sonnet,找到了數百萬個功能向量,包括:
- 舊金山金門大橋的功能向量 — 啟動時模型會開始聊金門大橋
- 程式碼 bug 的功能向量
- 鋱(Terbium) 這種稀土元素的專屬功能向量
- 不安全請求 的功能向量
論文:Scaling Monosemanticity
Gemma 2 版本:arXiv
💡 實務啟發
SAE 是目前 Mechanistic Interpretability 最前沿的工具。如果你在做 LLM 評測或 AI 安全相關的工作,這個方法可以幫助理解「為什麼模型做出這個回答」— 不是看 attention map,而是看哪些功能向量被啟動了。
四、一「群」神經元在做什麼 — Circuit
線性模型假說
有趣的發現:模型存儲知識的方式可以用線性函數近似。
例如:
- 輸入「The Taipei 101 is located in ___」→ 模型內部某一層存在一個線性函數
y = Wₗx + bₗ - 同一個線性函數,輸入「The Space Needle」→ 輸出「Seattle」
這代表模型把「事實知識」編碼成了線性變換。
改變知識
既然知識是線性的,那就可以:
- 找到「位置」的線性函數
- 修改輸入向量 x,讓模型認為 Taipei 101 在高雄
1 | |
這是 Model Editing 的基礎概念(後面第 8 講會深入)
Circuit Discovery
更進一步,可以用 Attribution Patching 等方法,找出模型解決特定任務時,哪些神經元群組(Circuit)在協作。
相關論文:
五、讓模型說出它在想什麼
Logit Lens
最直覺的方法 — 模型有 residual connection,每一層的輸出都可以直接丟進最後的分類器,看看模型「現在覺得答案是什麼」。
1 | |
這就像透過「透鏡」看每一層模型在想什麼。
有趣發現
多語言模型(如 LLaMA)即使輸入中文,中間層的思考是英文的,最後幾層才翻譯成中文
可以比較相鄰兩層的差異,如果某一層突然改變了答案,代表那一層做了關鍵決策
DoLA(arXiv):利用這個特性來減少幻覺
Patchscopes
Logit Lens 的限制是只能看到單一 token 的預測。Patchscopes 更進一步 — 把某一層的 hidden state「移植」到另一個 prompt 中,讓模型用自然語言描述那個 hidden state 代表什麼。
例如:
- 模型處理「李宏毅老師是___」時,取出某一層的 hidden state
- 把它插入「X 是什麼?」的 prompt 中
- 模型輸出:「台灣大學教授」
論文:Patchscopes
💡 實務啟發
Logit Lens 和 DoLA 在實際應用中已經被用來減少幻覺。如果你在做 RAG 系統,可以用 DoLA 的概念來偵測模型是否在「瞎掰」— 如果最後幾層的預測突然大幅改變,可能代表模型不太確定答案。
本講核心概念總結
| 分析層級 | 方法 | 發現 |
|---|---|---|
| 一個神經元 | 啟動分析 + 干預實驗 | 單一神經元功能不明確(多義性) |
| 一層神經元 | 功能向量(差值法) | 可以找到拒絕、誠實、諂媚等方向 |
| 一層神經元 | SAE(Sparse Autoencoder) | 自動分解出數百萬個可解釋特徵 |
| 一群神經元 | Circuit Discovery | 知識以線性方式存儲,可以追蹤和修改 |
| 直接問模型 | Logit Lens / Patchscopes | 模型中間層的思考是透明的 |
延伸閱讀
- Anthropic: Scaling Monosemanticity — SAE 分析 Claude 3 Sonnet
- Distill: Multimodal Neurons — CLIP 模型的多模態神經元
- DoLA: Decoding by Contrasting Layers — 利用層間差異減少幻覺
- Representation Engineering — 功能向量的系統化研究
📝 這是「李宏毅 ML 2025 Spring 學習筆記」系列的第一篇。
系列目錄會隨著學習進度持續更新。Written by Adora Xu ✨
評論