🎯 什麼情境該想到我
當你「發現模型對某個特定事實答錯(或會吐出某段不該說的資訊),想精準地只改這一點,又不想付重新訓練或微調的代價」的時候。
⚙️ 怎麼用(步驟 / 公式)
1. 先確認:為什麼不是重訓或微調
書的論點(第 5 章):
- 重新預訓練:清洗資料成本高、知識一直在變、重訓算力巨大,每發現一個錯就重訓是「捨本逐末」。
- 微調:即使用 PEFT 仍有成本;修正一個錯誤能拿到的樣本很少,少量樣本微調容易過擬合和災難性遺忘。
- 模型編輯的目標:精準、高效地修正特定知識點,而且不影響其他無關輸出。
形式化(書的定義 5.1):對知識點 k =(問題 x_k,答案 y_k),編輯後的模型 M* 要滿足
M*(x) = y_k 若 x = x_k 或與 x_k 相關
M*(x) = M(x) 若 x 與 x_k 無關
難點全在「相關/無關」的邊界:知識之間牽一髮動全身。
跟 RAG 怎麼選,書沒有正面比較,以下是我的綜合判斷:知識常常變、量很大 → RAG(換文件就好,見 工具-RAG檢索增強生成);模型本身的錯誤認知、身分錯亂、要抹掉的個資或偏見,而且不想每次都靠外部檢索 → 模型編輯。
2. 用五個面向驗收編輯有沒有成功
用書的斑馬例子(模型錯答「斑馬的皮膚是肉色」,正解是黑色):
| 面向 | 問什麼 | 例題 | 要求 |
|---|---|---|---|
| 準確性 | 原題改對了嗎 | 斑馬的皮膚是什麼顏色? | 答「黑色」 |
| 泛化性 | 換句話問還對嗎 | 剃毛後的斑馬是什麼顏色? | 答「黑色」 |
| 可遷移性 | 間接相關的推論跟著更新了嗎 | 皮膚是黑色的馬是什麼馬?(反向)/斑馬的皮膚和毛色一樣嗎?(推理) | 答案不是「黑色」,而是推論出來的新答案 |
| 局部性 | 無關的知識沒被弄壞吧 | 赤兔馬的皮膚是什麼顏色?/鴕鳥會飛嗎? | 答案跟編輯前一樣 |
| 高效性 | 花多少時間、資源;能不能批量 | — | — |
每一項都是「答對的比例」:例如 Loc = 平均 I(M*(x_i) = M(x_i)),在一組無關題上算編輯前後一致的比例。
- 書的判斷:準確性是前提,沒過就不用看其他項;局部性是模型編輯相較於單純微調的主要改進;多數方法的可遷移性都不好,這是公認難題。所以上線前一定要測「它不知道要連帶更新的推論」。
3. 選方法:二層四類
| 大類 | 子類 | 做法 | 代表 |
|---|---|---|---|
| 外部拓展(不改原參數) | 知識緩存 | 門控判斷輸入跟緩存的知識相不相關,相關就交給推理模組,否則走原模型 | SERAC、Language Patch |
| 附加參數 | 在模型裡加少量新參數,只訓練它 | T-Patcher、GRACE、CALINET | |
| 內部修改(直接改原參數) | 元學習 | 訓練一個「學會怎麼編輯」的超網路,輸出參數更新量 | KE、MEND |
| 定位編輯 | 先找出知識存在哪些參數,再只改那裡 | KN、ROME、MEMIT |
書整理的比較(依 Yao et al. 2023 的實驗):
| 方法 | 準確 | 泛化 | 可遷移 | 局部 | 批量 |
|---|---|---|---|---|---|
| SERAC | 高 | 高 | 低 | 高 | ✓ |
| T-Patcher | 高 | 高 | 高 | 中 | ✗ |
| MEND | 中 | 高 | 中 | 高 | ✓ |
| ROME | 高 | 高 | 高 | 高 | ✗ |
| MEMIT | 高 | 高 | 高 | 高 | ✓ |
選擇原則(依書的判斷整理):
- 一次改一兩條事實,decoder-only 模型 → ROME。
- 要一次改上千條 → MEMIT(ROME 的批量版)。
- 不想動原參數、要能隨時撤銷 → 外部拓展法;代價是知識只是「求助」來的,沒有真正內化,而且緩存越多、存儲與檢索負擔越大。
- 元學習法是從全域更新參數,即使加了局部性損失,也可能讓模型不穩定。
4. 兩個代表方法的機制
T-Patcher:一個錯誤配一個神經元
- 把 FFN 看成鍵值記憶體,在最後一層 FFN 加一個補丁(鍵 k_p、值 v_p、偏置 b_p):
FFN_p(q) = FFN(q) + a_p · v_p,a_p 是補丁對這個輸入的激活值。 - 凍結原參數,只訓練補丁;每個要編輯的 token 加一個補丁。損失有三部分:讓目標輸入激活補丁、讓激活後輸出變成正解、讓無關輸入(從記憶集抽樣)不要激活補丁。
- 書的評價:換模型架構時表現會波動;批量編輯很吃記憶體。
ROME:先定位再做秩一更新
- 定位(因果追蹤):對「斑馬的膚色是」這類輸入,先在主體(斑馬)的嵌入加雜訊讓模型答不出來,再逐層、逐位置把某一個隱藏狀態還原成乾淨值,看答案機率回升多少。結果是:中間層的 FFN 在處理主體最後一個 token(「馬」)時效應最大。再把後續的 FFN 凍結成干擾狀態,效應就消失,證實關鍵在 FFN。
- 找鍵 k*:主體最後一個 token 進入被編輯 FFN 下投影矩陣前的向量;在主體前接多個隨機前綴,取平均,讓它不依賴特定句子。
- 找值 v*:梯度下降找一個輸出向量,讓模型答出新答案;同時加一項 KL,讓「斑馬是……」這類泛泛的 prompt 輸出分佈不變(守住局部性)。
- 插入:解帶約束的最小平方,得到閉式解
驗算:Ŵ = W + Λ (C⁻¹ k*)ᵀ , Λ = (v* − W k*) / ((C⁻¹ k*)ᵀ k*) , C = K KᵀŴ k* = W k* + Λ·(C⁻¹k*)ᵀk* = W k* + (v* − W k*) = v*✔。更新量是「列向量 × 行向量」,所以是秩一矩陣,只改一個方向。C 用維基百科大量文本的鍵向量事先估計。
- 書的評價:準確、泛化、局部都好;但只能處理(主體、關係、客體)這種三元組事實,複雜事實效果不佳,而且不支援批量。
5. 實際能拿來做什麼(書的應用)
- 精準修正:例如模型自我介紹錯成別家模型。書引 2023 年 Gemini Pro 被問「你是誰」答成文心的事件,明說是推測 Google 用了模型編輯。
- 被遺忘權:DEPN 先找出跟某段隱私相關的神經元,再把激活值設成零。
- 去毒、減偏見:找出相關 FFN 參數做編輯(LSDM、DAMA)。
🧪 我實際套用的紀錄
- (尚無)
⚠️ 注意 / 什麼時候不適用
- 可遷移性普遍差:改了「斑馬皮膚是黑色」,模型不一定會推出「黑皮膚的馬是斑馬」。驗收一定要包含反向題與推理題。
- 詞層級的去毒會傷到正常表達:只壓低「炸彈」這類詞,模型反而說不出「不要製造炸彈」這種安全回答。
- ROME/MEMIT 主要針對 decoder-only 設計,書說沒在 encoder-decoder 上比較過。
- 書沒有討論模型編輯被惡意用來植入錯誤知識,也沒討論連續大量編輯的累積退化(推測:連續編輯越多,局部性越可能慢慢流失,要定期回歸測試)。
- 知識量大又常變時,別用編輯硬撐,改走 RAG。
- 書中 ROME 的協方差寫「去中心化」,原論文用的是未中心化的二階矩。實作時以原論文為準。
🔗 相關工具
- 大模型基礎 —— 第 5 章的完整脈絡
- 工具-微調與RAG的取捨 —— 模型編輯是「微調」與「RAG」之外的第三條路
- 災難性遺忘 —— 少量樣本微調為什麼會忘東西;局部性指標就是在量這件事
- 工具-RAG檢索增強生成 —— 知識量大、變動頻繁時的替代方案