易於使用的大型語言模型知識編輯框架。
安裝 • 快速入門 • 文件 • 論文 • 簡報 • 基準測試 • 貢獻者 • 投影片 • 影片 • AK 精選
2024年10月23日,EasyEdit整合了從轉向編輯到減輕LLM和MLLM幻覺的受限解碼方法,詳細資訊可在DoLa和DeCo中找到。
2024年9月26日,??我們的論文《WISE: Rethinking the Knowledge Memory for Lifelong Model Editing of Large Language Models》已被NeurIPS 2024接收。
2024年9月20日,??我們的論文:《Knowledge Mechanisms in Large Language Models: A Survey and Perspective》和《Editing Conceptual Knowledge for Large Language Models》已被EMNLP 2024Findings接收。
2024年7月29日,EasyEdit新增了新的模型編輯演算法EMMET,將ROME推廣到大量設定。這本質上允許使用 ROME 損失函數進行批次編輯。
2024-07-23,我們發布了一篇新論文:“大型語言模型中的知識機制:調查與展望”,回顧了知識在大型語言模型中如何獲取、利用和演化。這項調查可能為法學碩士中精確有效地操縱(編輯)知識提供基本機制。
2024年6月4日,?? EasyEdit Paper 已被ACL 2024系統示範軌道接受。
2024-06-03,我們發布了一篇題為“WISE: Rethinking the Knowledge Memory for Lifelong Model Editing of Large Language Models”的論文,並介紹了一種新的編輯任務:連續知識編輯以及相應的終身編輯方法WISE。
2024-04-24,EasyEdit 宣布支援Llama3-8B 的 ROME 方法。建議使用者將其 Transformer 軟體包更新至版本 4.40.0。
2024-03-29,EasyEdit 引入了對 GRACE 的回溯支援。詳細介紹請參考EasyEdit文件。未來的更新將逐漸包括對其他方法的回滾支援。
2024年3月22日,發布了題為「透過知識編輯對大型語言模型進行解毒」的新論文,以及名為 SafeEdit 的新資料集和名為 DINM 的新解毒方法。
2024年3月12日,另一篇題為「Editing Conceptual Knowledge for Large Language Models」的論文發布,介紹了一個名為ConceptEdit的新資料集。
2024-03-01,EasyEdit 新增了對名為FT-M的新方法的支援。該方法涉及使用目標答案的交叉熵損失來訓練特定的 MLP 層並屏蔽原始文字。它的性能優於羅馬的FT-L實施。感謝第 173 期的作者提供的建議。
2024年2月27日,EasyEdit增加了對名為InstructEdit的新方法的支持,技術細節在論文「InstructEdit:基於指令的大型語言模型知識編輯」中提供。
Accelerate
。大型語言模型知識編輯的綜合研究[論文][基準][程式碼]
IJCAI 2024 教學 Google 雲端硬碟
COLING 2024 教學 Google 雲端硬碟
AAAI 2024 教學 Google 雲端硬碟
AACL 2023教學【Google Drive】【百度盤】
有編輯示範。 GIF 檔案是由 Terminalizer 建立的。
我們提供了一個方便的 Jupyter Notebook!它允許您編輯法學碩士對美國總統的了解,從拜登切換到川普,甚至回到拜登。這包括 WISE、AlphaEdit、AdaLoRA 和基於提示的編輯等方法。
部署的模型仍然可能會出現不可預測的錯誤。例如,眾所周知,法學碩士會產生幻覺、延續偏見和事實衰退,因此我們應該能夠調整預訓練模型的特定行為。
知識編輯的目的是調整基礎模型的
在單次編輯後評估模型的表現。模型在單次編輯後重新載入原始權重(例如 LoRA 丟棄適配器權重)。你應該設定sequential_edit=False
這需要順序編輯,並在應用所有知識更新後進行評估:
它進行參數調整sequential_edit=True
:README(了解更多詳細資訊)。
在不影響不相關樣本上的模型行為的情況下,最終目標是建立編輯後的模型
圖片字幕和視覺問答的編輯任務。自述文件
鑑於個人的觀點可以反映其人格特質的各個方面,擬議的任務透過編輯法學碩士對特定主題的觀點來初步嘗試編輯他們的個性。我們利用已建立的「五大」理論作為建構資料集和評估法學碩士個性表達的基礎。自述文件
評估
基於Logits
基於世代的
當評估Acc和TPEI時,您可以從這裡下載經過訓練的分類器。
知識編輯過程通常會影響與編輯範例密切相關的一組廣泛輸入的預測,稱為編輯範圍。
成功的編輯應該在編輯範圍內調整模型的行為,同時保留不相關的輸入:
Reliability
:使用給定編輯描述符進行編輯的成功率Generalization
:編輯範圍內編輯的成功率Locality
:模型的輸出在編輯不相關的輸入後是否發生變化Portability
:推理/應用編輯的成功率(一跳、同義詞、邏輯概括)Efficiency
:時間和記憶體消耗 EasyEdit 是一個用於編輯大型語言模型 (LLM) 的 Python 套件,例如GPT-J
、 Llama
、 GPT-NEO
、 GPT2
、 T5
(支援從1B到65B 的模型),其目標是在特定領域而不會對其他輸入的效能產生負面影響。它被設計為易於使用且易於擴展。
EasyEdit 包含統一的Editor 、 Method和Evaluate框架,分別代表編輯場景、編輯技術和評估方法。
每個知識編輯場景都包含三個元件:
Editor
:例如LM的BaseEditor(事實知識和生成編輯器),MultiModalEditor(多模態知識)。Method
:所使用的具體知識編輯技術(例如ROME 、 MEND 、..)。Evaluate
:評估知識編輯表現的指標。Reliability
, Generalization
, Locality
, Portability
目前支援的知識編輯技術如下:
註1:由於此工具包相容性有限,不支援T-Patcher、KE、CaliNet等部分知識編輯方法。
註2:同樣,由於同樣的原因,MALMEN方法僅部分支持,並將繼續改進。
您可以根據您的特定需求選擇不同的編輯方式。
方法 | T5 | GPT-2 | GPT-J | GPT-NEO | 駱駝 | 百川 | 聊天GLM | 實習生LM | 奎文 | 米斯特拉爾 |
---|---|---|---|---|---|---|---|---|---|---|
金融時報 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
阿達洛拉 | ✅ | ✅ | ||||||||
獅子山 | ✅ | ✅ | ✅ | ✅ | ||||||
IKE | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
修補 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
KN | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
羅馬 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
羅馬 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
梅特 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
埃米特 | ✅ | ✅ | ✅ | |||||||
優雅 | ✅ | ✅ | ✅ | |||||||
梅洛 | ✅ | |||||||||
PMET | ✅ | ✅ | ||||||||
指示編輯 | ✅ | ✅ | ||||||||
DINM | ✅ | ✅ | ✅ | |||||||
明智的 | ✅ | ✅ | ✅ | ✅ | ✅ | |||||
Alpha編輯 | ✅ | ✅ | ✅ |
❗️❗️如果您打算使用Mistral,請手動將
transformers
庫更新至4.34.0版本。您可以使用以下程式碼:pip install transformers==4.34.0
。
工作 | 描述 | 小路 |
---|---|---|
指示編輯 | InstructEdit:大型語言模型的基於指令的知識編輯 | 快速入門 |
DINM | 透過知識編輯消除大型語言模型的毒害 | 快速入門 |
明智的 | WISE:重新思考大型語言模型終身模型編輯的知識記憶 | 快速入門 |
概念編輯 | 編輯大型語言模型的概念知識 | 快速入門 |
MM編輯 | 我們可以編輯多模態大型語言模型嗎? | 快速入門 |
性格編輯 | 編輯大型語言模型的個性 | 快速入門 |
迅速的 | 基於PROMPT的知識編輯方法 | 快速入門 |
基準測試:KnowEdit [抱臉][WiseModel][ModelScope]
❗️❗️需要說明的是, KnowEdit是透過重新組織和擴展現有的資料集(包括WikiBio 、 ZsRE 、 WikiData Counterfact 、 WikiDataRecent 、 Consent 、 Sanitation)建構的,對知識編輯進行綜合評估。特別感謝這些資料集的建構者和維護者。
請注意,Counterfact 和 WikiData Counterfact不是同一個資料集。
任務 | 知識插入 | 知識修改 | 知識擦除 | |||
---|---|---|---|---|---|---|
數據集 | 維基最近 | ZsRE | 維基百科 | 維基數據反事實 | 康文森 | 衛生 |
類型 | 事實 | 問答 | 幻覺 | 反事實 | 情緒 | 不需要的資訊 |
# 火車 | 第570章 | 10,000 | 第592章 | 1,455 | 14,390 | 80 |
# 測試 | 1,266 | 1301 | 1,392 人 | 第885章 | 800 | 80 |
我們提供了詳細的腳本供使用者輕鬆使用KnowEdit,請參考範例。
knowedit
├── WikiBio
│ ├── wikibio-test-all.json
│ └── wikibio-train-all.json
├── ZsRE
│ └── ZsRE-test-all.json
├── wiki_counterfact
│ ├── test_cf.json
│ └── train_cf.json
├── convsent
│ ├── blender_test.json
│ ├── blender_train.json
│ └── blender_val.json
├── convsent
│ ├── trivia_qa_test.json
│ └── trivia_qa_train.json
└── wiki_recent
├── recent_test.json
└── recent_train.json
數據集 | 抱臉 | 智慧模型 | 模型範圍 | 描述 |
---|---|---|---|---|
知道編輯 | [擁抱臉] | [智慧模型] | [模型範圍] | 中文知識編輯資料集 |
CKnowEdit是一個高品質的中文知識編輯資料集,具有強大的中文特色,所有資料都來自中文知識庫。它經過精心設計,旨在更深入地洞察當前法學碩士在理解中文方面固有的細微差別和挑戰,為法學碩士內精煉中文特定知識提供了強大的資源。
CKnowEdit中資料的欄位說明如下:
"prompt" : query inputed to the model ( str )
"target_old" : the incorrect response previously generated by the model ( str )
"target_new" : the accurate answer of the prompt ( str )
"portability_prompt" : new prompts related to the target knowledge ( list or None )
"portability_answer" : accurate answers corresponding to the portability_prompt ( list or None )
"locality_prompt" : new prompts unrelated to the target knowledge ( list or None )
"locality_answer" : accurate answers corresponding to the locality_prompt ( list or None )
"rephrase" : alternative ways to phrase the original prompt ( list )
CknowEdit
├── Chinese Literary Knowledge
│ ├── Ancient Poetry
│ ├── Proverbs
│ └── Idioms
├── Chinese Linguistic Knowledge
│ ├── Phonetic Notation
│ └── Classical Chinese
├── Chinese Geographical Knowledge
└── Ruozhiba
數據集 | Google雲端硬碟 | 百度網盤 | 描述 |
---|---|---|---|
ZsRE加 | [Google雲端硬碟] | [百度網盤] | 使用問題改寫的問答資料集 |
反事實加 | [Google雲端硬碟] | [百度網盤] | 使用實體取代的 Counterfact 資料集 |
我們提供 zsre 和 counterfact 資料集來驗證知識編輯的有效性。您可以在這裡下載它們。 [Google雲端硬碟]、[百度網盤]。
editing-data
├── counterfact
│ ├── counterfact-edit.json
│ ├── counterfact-train.json
│ └── counterfact-val.json
├── locality
│ ├── Commonsense Task
│ │ ├── piqa_valid-labels.lst
│ │ └── piqa_valid.jsonl
│ ├── Distracting Neighbor
│ │ └── counterfact_distracting_neighbor.json
│ └── Other Attribution
│ └── counterfact_other_attribution.json
├── portability
│ ├── Inverse Relation
│ │ └── zsre_inverse_relation.json
│ ├── One Hop
│ │ ├── counterfact_portability_gpt4.json
│ │ └── zsre_mend_eval_portability_gpt4.json
│ └── Subject Replace
│ ├── counterfact_subject_replace.json
│ └── zsre_subject_replace.json
└── zsre
├── zsre_mend_eval.json
├── zsre_mend_train_10000.json
└── zsre_mend_train.json
spouse
等一對一關係的評價數據集 | Google雲端硬碟 | HuggingFace 資料集 | 描述 |
---|---|---|---|
概念編輯 | [Google雲端硬碟] | [HuggingFace 資料集] | 用於編輯概念知識的資料集 |
data
└──concept_data.json
├──final_gpt2_inter.json
├──final_gpt2_intra.json
├──final_gptj_inter.json
├──final_gptj_intra.json
├──final_llama2chat_inter.json
├──final_llama2chat_intra.json
├──final_mistral_inter.json
└──final_mistral_intra.json
概念特定評估指標
Instance Change
:擷取這些實例級變更的複雜性Concept Consistency
:產生的概念定義的語意相似度數據集 | Google雲端硬碟 | 百度網盤 | 描述 |
---|---|---|---|
電子IC | [Google雲端硬碟] | [百度網盤] | 用於編輯影像字幕的資料集 |
電子品質保證 | [Google雲端硬碟] | [百度網盤] | 用於編輯視覺問答的資料集 |
editing-data
├── caption
│ ├── caption_train_edit.json
│ └── caption_eval_edit.json
├── locality
│ ├── NQ dataset
│ │ ├── train.json
│ │ └── validation.json
├── multimodal_locality
│ ├── OK-VQA dataset
│ │ ├── okvqa_loc.json
└── vqa
├── vqa_train.json
└── vqa_eval.json
數據集 | HuggingFace 資料集 | 描述 |
---|---|---|
安全編輯 | [HuggingFace 資料集] | 法學碩士解毒數據集 |
data
└──SafeEdit_train.json
└──SafeEdit_val.json
└──SafeEdit_test.json
排毒具體評估指標
Defense Duccess (DS)
:對抗性輸入(攻擊提示+有害問題)編輯LLM的解毒成功率,用於修改LLM。Defense Generalization (DG)
:編輯後的LLM對域外惡意輸入的解毒成功率。General Performance
:不相關任務表現的副作用。 方法 | 描述 | GPT-2 | 駱駝 |
---|---|---|---|
IKE | 情境學習 (ICL) 編輯 | [Colab-gpt2] | [Colab-llama] |
羅馬 | 定位然後編輯神經元 | [Colab-gpt2] | [Colab-llama] |
梅特 | 定位然後編輯神經元 | [Colab-gpt2] | [Colab-llama] |
注意:EasyEdit 請使用 Python 3.9+要開始使用,只要安裝 conda 並執行:
git clone https://github.com/zjunlp/EasyEdit.git
conda create -n EasyEdit python=3.9.7
...
pip install -r requirements.txt
我們的結果都是基於預設配置
駱駝-2-7B | 聊天glm2 | GPT-J-6B | GPT-XL | |
---|---|---|---|---|
金融時報 | 60GB | 58GB | 55GB | 7GB |
獅子山 | 42GB | 32GB | 31GB | 10GB |
IKE | 52GB | 38GB | 38GB | 10GB |
修補 | 46GB | 37GB | 37GB | 13GB |
KN | 42GB | 39GB | 40GB | 12GB |
羅馬 | 31GB | 29GB | 27GB | 10GB |
梅特 | 33GB | 31GB | 31GB | 11GB |
阿達洛拉 | 29GB | 24GB | 25GB | 8GB |
優雅 | 27GB | 23GB | 6GB | |
明智的 | 34GB | 27GB | 7GB |
編輯大型語言模型 (LLM) 約5 秒
以下範例向您展示如何使用 EasyEdit 進行編輯。更多範例和教程可以在範例中找到
BaseEditor
是語言模態知識編輯的類別。您可以根據您的特定需求選擇合適的編輯方法。
憑藉EasyEdit
的模組化和靈活性,您可以輕鬆地使用它來編輯模型。
步驟1:定義一個PLM作為要編輯的物件。選擇要編輯的 PLM。 EasyEdit
支援在 HuggingFace 上檢索部分模型(到目前為止T5
、 GPTJ
、 GPT-NEO
、 LlaMA
)。對應的設定檔目錄為hparams/YUOR_METHOD/YOUR_MODEL.YAML
,如hparams/MEND/gpt2-xl.yaml
,設定對應的model_name
來選擇知識編輯的物件。
model_name : gpt2-xl
model_class : GPT2LMHeadModel
tokenizer_class : GPT2Tokenizer
tokenizer_name : gpt2-xl
model_parallel : false # true for multi-GPU editing
Step2:選擇合適的知識編輯方法
## In this case, we use MEND method, so you should import `MENDHyperParams`
from easyeditor import MENDHyperParams
## Loading config from hparams/MEMIT/gpt2-xl.yaml
hparams = MENDHyperParams . from_hparams ( './hparams/MEND/gpt2-xl' )
Step3:提供編輯描述符和編輯目標
## edit descriptor: prompt that you want to edit
prompts = [
'What university did Watts Humphrey attend?' ,
'Which family does Ramalinaceae belong to' ,
'What role does Denny Herzig play in football?'
]
## You can set `ground_truth` to None !!!(or set to original output)
ground_truth = [ 'Illinois Institute of Technology' , 'Lecanorales' , 'defender' ]
## edit target: expected output
target_new = [ 'University of Michigan' , 'Lamiinae' , 'winger' ]
第四步:將它們組合成BaseEditor
EasyEdit
提供了一種簡單且統一的方式來初始化Editor
,例如 Huggingface: from_hparams 。
## Construct Language Model Editor
editor = BaseEditor . from_hparams ( hparams )
步驟5:提供評估資料注意,可攜性和局部性的資料都是可選的(設定為「無」僅用於基本編輯成功率評估)。兩者的資料格式都是dict ,對於每個測量維度,都需要提供相應的提示及其對應的groundtruth。以下是資料範例:
locality_inputs = {
'neighborhood' :{
'prompt' : [ 'Joseph Fischhof, the' , 'Larry Bird is a professional' , 'In Forssa, they understand' ],
'ground_truth' : [ 'piano' , 'basketball' , 'Finnish' ]
},
'distracting' : {
'prompt' : [ 'Ray Charles, the violin Hauschka plays the instrument' , 'Grant Hill is a professional soccer Magic Johnson is a professional' , 'The law in Ikaalinen declares the language Swedish In Loviisa, the language spoken is' ],
'ground_truth' : [ 'piano' , 'basketball' , 'Finnish' ]
}
}
在上面的例子中,我們評估了有關「鄰裡」和「分散注意力」的編輯方法的表現。
Step6:編輯和評估完成!我們可以對您要編輯的模型進行編輯和評估。 edit
功能將傳回一系列與編輯過程相關的指標以及修改後的模型權重。 [ sequential_edit=True
表示連續編輯]
metrics , edited_model , _ = editor . edit (
prompts = prompts ,
ground_truth = ground_truth ,
target_new = target_new ,
locality_inputs = locality_inputs ,
sequential_edit = False # True: start continuous editing ✈️
)
## metrics: edit success, rephrase success, locality e.g.
## edited_model: post-edit model
EasyEdit 的最大輸入長度為 512。您可以在以下文件中修改最大長度:LINK
步驟7:回滾在連續編輯中,如果您對其中一項編輯的結果不滿意,並且不希望丟失先前的編輯,可以使用回滾功能來撤銷先前的編輯。目前,我們僅支援GRACE方法。您需要做的只是一行程式碼,使用 edit_key 來恢復您的編輯。
editor.rolllback('edit_key')
在 EasyEdit 中,我們預設使用 target_new 作為 edit_key
我們將返回指標指定為dict
格式,包括編輯前後的模型預測評估。對於每次編輯,它將包含以下指標:
rewrite_acc
rephrase_acc
locality
portablility