李宏毅 ML 2025 Spring — Lecture 3:剖析大型語言模型內部運作邏輯

AI

📚 課程連結:ML 2025 Spring — 剖析大型語言模型內部運作邏輯
🎥 影片:YouTube
📄 投影片:PDF

前言

這堂課的核心問題是:LLM 內部到底在做什麼?

我們每天都在用 ChatGPT、Claude 這些工具,但它們為什麼有時候會拒絕回答?為什麼會產生幻覺?為什麼有時候能推理、有時候不行?這堂課用三個遞進的層次來拆解 LLM 的黑盒子。

⚠️ 重要前提:這堂課裡沒有任何模型被訓練,所有的分析都是在已經訓練好的模型上進行的「解剖」。


一、一「個」神經元在做什麼

核心方法:觀察 + 干預

要確認一個神經元的功能,不能只看「相關性」,還需要做「因果驗證」:

  1. 觀察:該神經元啟動時,模型會產生特定行為(例如說髒話)→ 只能說有相關性
  2. 干預:移除該神經元後,模型不再產生該行為 → 確認因果關係
  3. 程度驗證:不同啟動程度,對應不同「等級」的行為

有趣的案例

  • 文法神經元:有些神經元專門管單數/複數(論文
  • 川普神經元:在 CLIP 模型中,有神經元同時對川普的照片、文字、漫畫都會啟動(Distill

但事情沒那麼簡單

單一神經元的解釋性很差,因為:

  • 多義性(Polysemanticity):一個神經元可能同時管很多不相關的事
  • 分散式表示:一件事可能由很多神經元共同負責

為什麼會這樣?以 LLaMA 3 8B 為例,一層只有 4,096 個神經元,但就算每個神經元只有開/關兩種狀態,也有 2^4096 種組合 — 遠超過需要表示的概念數量。所以模型選擇用組合來編碼概念,而不是一對一。

💡 實務啟發

這解釋了為什麼 prompt engineering 有時候很玄學 — 你改了一個詞,可能觸發了完全不同的神經元組合,導致模型行為大幅改變。


二、一「層」神經元在做什麼

功能向量(Function Vector)

既然單一神經元不好解釋,那就看整層。老師介紹了一個超直覺的方法:

抽取「拒絕向量」的步驟:

  1. 收集一批「模型拒絕回答」的案例(如「教我做炸藥」→「不」)
  2. 收集一批「模型正常回答」的案例(如「教我機器學習」→「好」)
  3. 取兩組案例在某一層的平均向量差 → 就是「拒絕向量」
1
拒絕向量 = mean(拒絕案例的該層向量) - mean(正常案例的該層向量)

驗證:向量加減法

拿到拒絕向量後,可以做有趣的實驗:

  • 把「拒絕向量」加到正常問題上 → 模型開始拒絕回答正常問題
  • 從拒絕問題中減去「拒絕向量」 → 模型開始回答危險問題(⚠️ 這就是 jailbreak 的原理之一)

這個技術有很多名字:

  • Representation Engineering
  • Activation Engineering / Steering

其他已發現的功能向量

功能向量 效果 論文
Sycophancy Vector 控制模型的「拍馬屁」程度 arXiv
Truthful Vector 讓模型更誠實 arXiv
Function Vector 控制特定任務(如翻譯、情感分析) arXiv

💡 實務啟發

理解功能向量的概念,對 AI 安全和 alignment 很重要。如果你在做 AI 產品,了解「拒絕行為是由向量控制的」,就能理解為什麼 jailbreak 攻擊有時會成功 — 攻擊者本質上是在想辦法「減去」模型的拒絕向量。


三、Sparse Autoencoder(SAE)— 找出所有功能向量

上面是手動找一個功能向量,但能不能自動找出所有功能向量

核心思想

把每一層的向量 h 分解為:

1
h = α₁v₁ + α₂v₂ + ... + αₖvₖ + e(殘差)

其中:

  • vₖ 是功能向量(可解釋的特徵方向)
  • αₖ 是係數(大部分應該是 0 → 稀疏性)
  • e 是重建誤差(越小越好)

訓練目標

1
2
3
L = Σ ||eₙ||² + λ Σ |αₖ|
↑ ↑
重建要好 係數要稀疏

這就是 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
x_new = x + Δx → 輸出從 Taipei 變成 Kaohsiung

這是 Model Editing 的基礎概念(後面第 8 講會深入)

Circuit Discovery

更進一步,可以用 Attribution Patching 等方法,找出模型解決特定任務時,哪些神經元群組(Circuit)在協作。

相關論文:


五、讓模型說出它在想什麼

Logit Lens

最直覺的方法 — 模型有 residual connection,每一層的輸出都可以直接丟進最後的分類器,看看模型「現在覺得答案是什麼」。

1
每一層的 hidden state → 直接套用最後的 unembedding → 得到 token 機率

這就像透過「透鏡」看每一層模型在想什麼。

有趣發現

  • 多語言模型(如 LLaMA)即使輸入中文,中間層的思考是英文的,最後幾層才翻譯成中文

    論文:Do Llamas Work in English?

  • 可以比較相鄰兩層的差異,如果某一層突然改變了答案,代表那一層做了關鍵決策

    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 模型中間層的思考是透明的

延伸閱讀


📝 這是「李宏毅 ML 2025 Spring 學習筆記」系列的第一篇。
系列目錄會隨著學習進度持續更新。

Written by Adora Xu ✨

評論