第 4 篇/共 12 篇
AI 記錯一件事,能只改那一條嗎?
不重新訓練,也能直接改模型記住的某一條知識。用 EasyEdit 和 ROME 把梅西改成打籃球,再檢查有沒有改壞別的事。
一句話回答
可以,這個研究方向叫「知識編輯」(Knowledge Editing)。它不重新訓練整個模型,而是找到模型裡跟某條知識有關的參數,只動那一小塊,讓模型對這件事的回答改掉,同時盡量不影響其他知識。不過「只改那一條」是目標,不是保證,改完一定要驗證。
為什麼值得知道
模型的知識停在訓練那一天。公司換了執行長、法規更新了,它還是照舊回答。補救方式有三種:
- 重新訓練或微調:成本高,而且可能讓模型忘掉別的東西。
- 檢索增強(RAG):回答前先查資料庫,模型本身沒變。
- 知識編輯:直接改模型內部,讓它「真的記成新的」。
知識編輯適合「少量、明確、要馬上修正」的事實錯誤。了解它,廠商說「可以直接修正模型」時,你就知道該追問什麼。
白話原理
把模型想成一座圖書館,知識分散在很多書架上。知識編輯是找到「梅西 → 足球」主要放在哪個書架,只改那裡。
本章用的方法是 ROME(Rank-One Model Editing)。它的核心想法:
- 事實型知識常可以拆成「主體+關係+答案」,例如(梅西、從事的運動、足球)。
- 研究發現,這類關聯和模型中間層的前饋網路(MLP)關係很大。
- ROME 對那一層的權重做一次很小的「秩一」更新,可以想成只加上一個非常精準的修正量,讓「梅西」連到「籃球」。
改完之後要檢查四件事,這也是 EasyEdit 評估模組的四個指標:
| 指標 | 白話說法 | 例子 |
|---|---|---|
| 可靠性(Reliability) | 原本那句問法有沒有改成功 | 問「梅西打什麼運動」→ 籃球 |
| 通用性(Generalization) | 換個說法問還是新答案嗎 | 「梅西是哪種運動的選手」→ 籃球 |
| 局部性(Locality) | 無關的知識有沒有被誤傷 | 「Larry Bird 是職業……」還是籃球 |
| 可移植性(Portability) | 跟這條知識相關的推論有沒有跟著更新 | 由新事實延伸出的問題 |
好的編輯要四項兼顧,只看可靠性容易誤以為成功。
教程裡實際做了什麼
這章使用浙江大學團隊開源的 EasyEdit 工具包。它把編輯流程整理成幾個模組:Editor(要編輯的模型與知識、超參數)、Method(ROME、MEND 等編輯方法)、Evaluate(上面四個指標)、Trainer(需要先訓練的方法才用)。
示範任務是把 GPT-2 XL 記得的「梅西踢足球」改成「梅西打籃球」。步驟如下:
- 下載 EasyEdit 並安裝套件(原文建議 Python 3.9.7 的 conda 環境)。
- 選擇編輯方法 ROME,設定模型路徑與要用哪張 GPU,其他參數用原本的設定即可。
- 準備編輯資料:提問句、原答案(football)、新答案(basketball)、主體(Lionel Messi)。
- 讀入 ROME 的超參數檔,建立 Editor。
- 呼叫
edit方法執行編輯,取得評估結果與編輯後的模型。
核心呼叫只有幾行(摘自原教程第 3 章,有刪節):
hparams = ROMEHyperParams.from_hparams('./hparams/ROME/gpt2-xl.yaml')
editor = BaseEditor.from_hparams(hparams)
metrics, edited_model, _ = editor.edit(
prompts=prompts, ground_truth=ground_truth,
target_new=target_new, subject=subject)
驗證方式有兩種:在 edit 裡傳入 locality_inputs 等評估資料讓工具算分數;或把同一批句子丟給編輯前後的模型,直接比較生成結果。
原文提醒:第一次編輯某個模型會下載維基百科語料、計算各層統計值,所以比較久,之後會重複使用。
進階部分是批次編輯(Batch edit):把多條知識排成列表一次傳入,原文指出這時 MEMIT 是比較合適的方法。另外介紹兩個常用測試集 CounterFact 和 ZsRE,每筆資料除了要改的事實,還附有換句話說的問法與「鄰居」問題,正好對應通用性與局部性。
硬體方面,原文只寫要指定 GPU,沒有寫需要多少顯存。
動手試試
最省事的入口是原文附的 Colab 筆記本(ROME 與批次編輯各一份),在瀏覽器就能跑。建議這樣玩:
- 照原樣把梅西改成籃球,看可靠性分數。
- 寫兩三句換說法的問題,檢查通用性。
- 準備幾題無關的常識題,比較編輯前後,感受局部性。
- 一次改兩條知識,看會不會互相干擾。
GPT-2 XL 是很早期的模型,本來就常答錯,重點是看「編輯前後的差異」。免費版 Colab 的 GPU 和時間有限,跑不動時可能要換付費方案,原文沒有這部分的建議。
常見誤解
- 「改一條就只會影響那一條」:參數是很多知識共用的,改動可能波及相近的事實,所以才需要局部性指標。
- 「知識編輯可以取代重新訓練」:它適合少量、明確的事實。大量或大範圍的更新,目前還是要靠訓練或檢索。
- 「編輯成功=模型真的理解新事實」:可靠性高不代表推理也跟著更新,可移植性常常是最難的一項。
延伸閱讀
- 原教程第 3 章:https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter3
- EasyEdit 工具包:https://github.com/zjunlp/EasyEdit
- EasyEdit 的 ZsRE 範例程式:https://github.com/zjunlp/EasyEdit/blob/main/examples/run_zsre_llama2.py
本文整理自上海交通大學《動手學大模型》第 3 章,原教程:https://github.com/Lordog/dive-into-llms/tree/main/documents/chapter3。內容由 MK 以自己的話解說,如有錯誤歡迎留言指正。
追蹤 MK,掌握最新 AI 工具應用
每週分享 GitHub 飆星實測、AI 工具教學與提示詞,短影片版都在社群。