一种基于梯度引导搜索的自动化方法,为各种NLP任务创建提示。 Autoprompt表明,蒙版语言模型(MLMS)具有天生的情感分析,自然语言推断,事实检索和关系提取的能力。查看我们的网站以获取论文和更多信息。
conda create -n autoprompt -y python=3.7 && conda activate autoprompt
安装所需的软件包
pip install -r requirements.txt
也下载Spacy模型
python -m spacy download en
可用于情感分析,NLI,事实检索和关系提取的数据集可在此处下载
有几个不同的数据集用于事实检索和关系提取,因此每个数据集的简要概述:
original :我们使用了Lama提供的T-Rex子集作为我们的测试集,并从原始T-Rex数据集中收集了更多事实original_rob :我们用original过滤事实,以使每个对象都是Bert和Roberta的单个令牌trex :我们将收集的额外T-Rex数据(用于original的火车/瓦尔)分为火车,开发,测试集original数据集以补偿重新基线和罗伯塔。我们还排除了关系P527和P1376 ,因为重新基线不考虑它们。 通过将原始输入和触发令牌之类的内容映射到看起来像类似的模板来构建提示
[CLS] {sub_label} [T] [T] [T] [P]. [SEP]
上面的示例是一个模板,用于使用3个触发令牌生成事实检索提示,其中{sub_label}是任何(主题,关系,对象)三胞胎的占位符。 [P]表示将使用语言模型“填充”的特殊[MASK]令牌的位置。 [T]表示在所有提示中共享的触发令牌集中的每个触发令牌。
根据您选择生成提示的语言模型(即Bert或Roberta),特殊令牌将有所不同。对于Bert,将[CLS]和[SEP]粘在模板的每一端。对于Roberta,请改用<s>和</s> 。
python -m autoprompt.create_trigger
--train glue_data/SST-2/train.tsv
--dev glue_data/SST-2/dev.tsv
--template '<s> {sentence} [T] [T] [T] [P] . </s>'
--label-map '{"0": ["Ġworse", "Ġincompetence", "ĠWorse", "Ġblamed", "Ġsucked"], "1": ["ĠCris", "Ġmarvelous", "Ġphilanthrop", "Ġvisionary", "Ġwonderful"]}'
--num-cand 100
--accumulation-steps 30
--bsz 24
--eval-size 48
--iters 180
--model-name roberta-large
python -m autoprompt.create_trigger --train SICK_TRAIN_ALL_S.tsv --dev SICK_DEV_ALL_S.tsv --template '<s> {sentence_A} [P] [T] [T] [T] [T] {sentence_B} </s>' --label-map '{"ENTAILMENT": ["u0120Taiwan", "u0120Ara", "abet"], "CONTRADICTION": ["u0120Only", "u0120Didn", "u0120BUT"], "NEUTRAL": ["icy", "oder", "agna"]}' --bsz 120 --model-name roberta-large
python -m autoprompt.create_trigger
--train $path/train.jsonl
--dev $path/dev.jsonl
--template '<s> {sub_label} [T] [T] [T] [P] . </s>'
--num-cand 10
--accumulation-steps 1
--model-name roberta-large
--bsz 56
--eval-size 56
--iters 1000
--label-field 'obj_label'
--tokenize-labels
--filter
--print-lama
python -m autoprompt.create_trigger
--train $path/train.jsonl
--dev $path/dev.jsonl
--template '[CLS] {context} [SEP] {sub_label} [T] [T] [T] [P] . [SEP]'
--num-cand 10
--accumulation-steps 1
--model-name bert-base-cased
--bsz 32
--eval-size 32
--iters 500
--label-field 'obj_label'
--tokenize-labels
--filter
--print-lama
--use-ctx
用于情感分析
python -m autoprompt.label_search --train ../data/SST-2/train.tsv --template '[CLS] {sentence} [T] [T] [T] [P]. [SEP]' --label-map '{"0": 0, "1": 1}' --iters 50 --model-name 'bert-base-cased'
对于NLI
python -m autoprompt.label_search --train ../data/SICK-E-balanced/3-balance/SICK_TRAIN_ALL_S.tsv --template '<s> {sentence_A} [P] [T] [T] [T] [T] {sentence_B} </s>' --label-map '{"ENTAILMENT": 0, "CONTRADICTION": 1, "NEUTRAL": 2}' --iters 50 --model-name roberta-large
克隆我们的喇嘛仓库的叉子,然后按照指示将其设置在Autoprompt Repo之外。由于不同的依赖性和要求,我们建议为LAMA创建单独的Conda环境。
将自动启动数据文件夹复制到LAMA的data目录中,或将scripts/run_experiments.py中的data_path_pre设置为自定义数据位置。
为了让Lama与Roberta合作,请运行以下命令:
mkdir pre-trained_language_models/roberta
cd pre-trained_language_models/roberta
curl -O https://dl.fbaipublicfiles.com/fairseq/models/roberta.large.tar.gz
tar -xvzf roberta.large.tar.gz
使用您自己的自动生成的提示更新data/relations.jsonl
要更改评估设置,请转到scripts/run_experiments.py并相应地更新可配置的值。注意:每个可配置的设置都标有[CONFIGURABLE]注释。
LMs列表中评估(并评论其他LM设置)common_vocab_filename字段更新为适当的文件。评估Bert和Roberta的任何内容都要求此字段为common_vocab_cased_rob.txt ,而不是通常的common_vocab_cased.txt 。use_ctx设置为Truesynthetic为True以进行扰动的句子评估以进行关系提取get_TREx_parameters函数中,将data_path_pre设置为相应的数据路径(例如"../data/relation_extraction"以进行关系提取)运行评估代码
python scripts/run_experiments.py
设置PYTHONPATH如果发生以下错误: ModuleNotFoundError: No module named 'lama'
export PYTHONPATH="${PYTHONPATH}:/path/to/the/AutoPrompt/repo"
@inproceedings{autoprompt:emnlp20,
author = {Taylor Shin and Yasaman Razeghi and Robert L. Logan IV and Eric Wallace and Sameer Singh},
title = { {AutoPrompt}: Eliciting Knowledge from Language Models with Automatically Generated Prompts },
booktitle = {Empirical Methods in Natural Language Processing (EMNLP)},
year = {2020}
}