该存储库包含以下论文的代码和数据:
混合:通过混合前进和反向跨凝管来培训自回旋语言模型
@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]与我们联系。