🎯 什麼情境該想到我

當你「發現模型對某個特定事實答錯(或會吐出某段不該說的資訊),想精準地只改這一點,又不想付重新訓練或微調的代價」的時候。

⚙️ 怎麼用(步驟 / 公式)

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:先定位再做秩一更新

  1. 定位(因果追蹤):對「斑馬的膚色是」這類輸入,先在主體(斑馬)的嵌入加雜訊讓模型答不出來,再逐層、逐位置把某一個隱藏狀態還原成乾淨值,看答案機率回升多少。結果是:中間層的 FFN 在處理主體最後一個 token(「馬」)時效應最大。再把後續的 FFN 凍結成干擾狀態,效應就消失,證實關鍵在 FFN。
  2. 找鍵 k*:主體最後一個 token 進入被編輯 FFN 下投影矩陣前的向量;在主體前接多個隨機前綴,取平均,讓它不依賴特定句子。
  3. 找值 v*:梯度下降找一個輸出向量,讓模型答出新答案;同時加一項 KL,讓「斑馬是……」這類泛泛的 prompt 輸出分佈不變(守住局部性)。
  4. 插入:解帶約束的最小平方,得到閉式解
    Ŵ = 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 的協方差寫「去中心化」,原論文用的是未中心化的二階矩。實作時以原論文為準。

🔗 相關工具