該存儲庫包含以下論文的代碼和數據:
混合:通過混合前進和反向跨凝管來培訓自迴旋語言模型
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
代碼作者: Shiyue Zhang
python -m pip install -r requirements.txt可選:避免任何版本與現有軟件包發生衝突,您可能需要在虛擬環境下執行安裝:
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txt綜合。 Py是運行合成實驗的腳本。運行實驗非常簡單,只需運行:
python synthetic.py
可以在腳本中指定和更改配置(例如種子,詞彙大小等), if __name__ == '__main__':
綜合中有一些重要的配置。 PY確定您可以運行哪種合成實驗:
real_dataset :如果None ,則將隨機初始化過渡矩陣;或者,如果是'webtext' ,則將從WebText上的預計過渡矩陣初始化過渡矩陣。
Zero_percent :確定過渡矩陣中有多少個值為0。例如,如果zero_percent==0.5 ,則過渡矩陣中的50%概率為0。
vocab_size :詞彙大小。我們測試21、51、101、501或1001。請注意,21表示我們有20個普通令牌(包括EOS)和1個墊子令牌。
種子:我們為每個實驗運行5種種子(7、42、777、4222、99999)。
lose_func :我們測試4個損失功能:(1) 'two_xens' :在我們的論文中表示為Mixce*,並使用金數據分佈P和Gumbel Softmax; (2) 'qlogq_mix' :這是我們近似的混合損耗函數; (3) 'two_kls' :兩個KL差異的混合物; (4) 'js' :JS Divergence。
Train_eta :這些損失功能的混合率。如果train_eta==1.0 'two_xens' ,則為mle。如果train_eta==1.0對於'two_kls' ,則是前kl(也等於mle)。如果train_eta==0.0對於'two_kls' ,則是反向kl。我們使用JS的一般定義(有關更多詳細信息,請參見本文),當train_eta接近0.0或1.0時,JS收斂到0。當train_eta = 0.5時,這是JS差異的正常定義。
我們通過將學習的過渡矩陣與金過渡矩陣進行比較,評估了經過合成訓練的Bigram LMS。我們使用兩個指標:
(1) AVG。 JS :我們計算了黃金和學習過渡矩陣的每一行之間的JS差異以及行之間的平均水平。
(2) AVG。 0s :我們從學習概率= 0位置的學習矩陣中獲取值,然後平均它們。
compare_parameters()函數Synthetic.py中用於計算這兩個指標。
模型將全部保存在synthetic_logs/ Directory下。每個模型目錄的名稱始於實驗的日期時間。在模型目錄下,您還將找到Tensorboard事件文件以及all_best_metrics.json ,可在每個混合比率上節省最佳的度量分數。請參閱synthetic_logs/。
每個時期之後進行模型評估,並根據開發集合的損失選擇最佳檢查點。
最終,對於每個實驗,我們平均來自5種種子的結果。對於每個目標,我們選擇基於AVG的最佳混合率。 JS。
get_synthetic_results()在結果中。 JS。
要使用get_synthetic_results() ,您需要先準備Synthetic_models.json來指定模型目錄。一個示例顯示在synthetic_models.json中。然後,您可以通過運行get_synthetic_results('webtext', '20', 'two_kls') ,可以獲得使用WebText初始化過渡矩陣,vocab = 20和objection = tix_kls的實驗結果。
污點。您首先需要在此處從Moses下載detokenizer.perl ,然後將其放在路徑data/detokenizer.perl下,因為以下python腳本取決於它。
然後:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
預處理數據將在data/wikitext , data/webtext以及data/writingPrompts下保存。
遵循擁抱臉提供的指令,使用gpt-2型號使用git lfs -2型號。
git lfs install
git clone https://huggingface.co/gpt2
GPT2是最小的GPT-2模型。我們還嘗試了GPT2-MEDIUM和GPT2-LARGE。 GPT2-LARGE用於計算淡紫色,因此也請下載它們:
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
為紫菜製作GPT2-LARGE的副本:
cp -r gpt2-large gpt2-large-mauve
因為我們將直接寫入GPT2-LARGE,這將影響Mauve計算。
您可以通過執行以下操作開始運行實驗:
python run.py
可以在run.py中手動指定配置。請參閱一個示例, if __name__ == '__main__' 。
run.py中有一些重要的配置:
triench_size :訓練數據大小,我們測試'10K' , '25K' , '50K'和'100K' ;默認情況下,我們使用'50K' 。
模型:可以是'gpt2' , 'gpt2-meidum'或'gpt2-large' 。
數據集:它可以是"wikitext" , "webtext"或"writingPrompts" 。
Mixing_ratio :我們搜索[0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] ,並根據Dev Set Mauve Score選擇最佳的mixing_ratio 。
Train_batch_size,累計,eval_batch_size :這些配置應由您使用的平台確定。我們使用一個Tesla V100 GPU(32G內存),此設置中的建議配置在run.py中。
run.py中有一個和三個功能:
data_sets {} :它保存數據文件的路徑。
run_no_trainer() :用於培訓和評估模型的功能。
run_no_trainer_eval() :僅用於模型評估的功能。
run_no_trainer_turn_topp() :用於調整Top-P採樣的p的功能。
除了運行。
gpt2.py (最重要的文件)包含一個gpt2mixmodel模型類,該類別實現了我們的混合損失函數。
run_clm_no_trainer.py是訓練和評估GPT-2型號的腳本。
run_clm_no_trainer_tune_topp.py類似於run_clm_no_trainer.py ,只是它僅用於調整TOP-P採樣的超參數P。
Metircs.py包含我們用來評估模型世代的指標。
模型將在train/目錄下保存。
每個模型目錄的名稱始於實驗的日期時間。在模型目錄下,我們保存最佳檢查點(基於開發人員損失選擇)。
dev/test.sample , dev/test.sample1 , dev/test.sample2和dev/test.human是3個無偏的採樣世代和人類文本。
dev/test_results.json保存了困惑,多樣性和重複的結果。
調整POP-P採樣P之後, dev/test.topp(p=*)是具有不同P值的頂級Pampling Generations。
在計算淡紫色和連貫性之後(有關詳細信息,請參見下一節), dev/test_mauve_coherence_*.json具有不同最大長度的淡紫色和連貫得分。
在計算控制的淡紫色和連貫性之後(有關詳細信息,請參見下一節), dev/test_controlled_mauve_coherence_*.json受控制的Mauve和Cooherence分數,並具有不同的最大長度。
我們在論文中報告了6個指標的分數:
與模型培訓/評估一起計算困惑(請參見Run_clm_no_trainer.py )。
多樣性是由Metircs.py中的diversity()函數實現的,並且還通過調用run_clm_no_trainer.py中的compute_diversity_repetition()函數來計算模型培訓/評估。請注意,重複是我們實施但沒有在論文中報告的另一個指標。它檢查了文本的重複循環的百分比,還可以返回重複的短語長度。
淡紫色和連貫性是通過使用保存的生成文件以事後方式計算的。 compute_mauve()和compute_coherence()中的compute_coherence() 。它們是由compute_mauve_coherence()函數在results.py中調用的。要使用compute_mauve_coherence() ,您必須首先準備模型。
同樣,也可以通過compute_controlled_mauve_coherence()函數以resutes.py的compute_controlled_mauve_coherence()函數以事後方式計算受控的muve和受控固定。
| 數據集 | 型號大小 | 培訓數據大小 | 客觀的 | 擁抱臉部樞紐名稱 |
|---|---|---|---|---|
| wikitext | gpt2-large | 50k | mle | shiyue/wikitext_train50k_gpt2-large_mix1.0 |
| wikitext | gpt2-large | 50k | 混合(ETA = 0.1) | shiyue/wikitext_train50k_gpt2-large_mix0.1 |
| WebText | gpt2-large | 50k | mle | shiyue/webtext_train50k_gpt2-large_mix1.0 |
| WebText | gpt2-large | 50k | 混合(ETA = 0.3) | shiyue/webtext_train50k_gpt2-large_mix0.3 |
| 寫作提示 | gpt2-large | 50k | mle | shiyue/writingprompts_train50k_gpt2-large_mix1.0 |
| 寫作提示 | gpt2-large | 50k | 混合(ETA = 0.7) | shiyue/writingprompts_train50k_gpt2-large_mix0.7 |
嘗試以以下方式審慎的模型:
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
我們的貢獻。
您對這個項目有很好的經驗嗎?為什麼不分享一些愛和貢獻代碼,或者只是讓我們知道您對此遇到的任何問題?
我們歡迎這裡發行報告;確保為您的問題選擇適當的問題模板,以便我們確定您為我們提供必要的信息。
在發送拉動請求之前,請確保您閱讀我們的貢獻指南。
以下兩個文件從transformers存儲庫中藉來並採用,因此保留其原始版權。
最初是從https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.py拾取的。最重要的是,我們應用了以下修改:
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub ”選項的未使用的代碼塊。DataCollatorWithPadding而不是默認碰撞器。do_eval ”選項的評估邏輯,其中大多數都進入了新功能' evaluate() '。通過更改generate()函數的調用方式以啟用top_p選項的調整,從run_clm_no_trainer.py (見上文)進一步修改了此文件。
該項目採用了行為準則。如果您對項目中經歷的代碼或行為有任何疑問,請通過[email protected]與我們聯繫。