Um método automatizado baseado em pesquisa guiada por gradiente para criar prompts para um conjunto diversificado de tarefas de PNL. O Autoprompt demonstra que os modelos de linguagem mascarados (MLMs) têm uma capacidade inata de realizar análises de sentimentos, inferência de linguagem natural, recuperação de fatos e extração de relação. Confira nosso site para obter o artigo e mais informações.
conda create -n autoprompt -y python=3.7 && conda activate autoprompt
Instale os pacotes necessários
pip install -r requirements.txt
Faça o download também o modelo Spacy
python -m spacy download en
Os conjuntos de dados para análise de sentimentos, NLI, recuperação de fatos e extração de relação estão disponíveis para download aqui
Existem alguns conjuntos de dados diferentes para recuperação de fatos e extração de relações, então aqui estão breves visões gerais de cada um:
original : Usamos o subconjunto T-Rex fornecido pelo LAMA como nosso conjunto de testes e reunimos mais fatos do conjunto de dados T-Rex original que particionamos em conjuntos de trem e devoriginal_rob : filtramos fatos no original para que cada objeto seja um único token para Bert e Robertatrex : dividimos os dados T-Rex extras coletados (para conjuntos de trem/val de original ) em trens, dev e conjuntos de testesoriginal para compensar a linha de base e Roberta. Também excluímos as relações P527 e P1376 porque a linha de base do ER não as considera. Um prompt é construído mapeando coisas como a entrada original e os tokens de gatilho para um modelo que se parece com algo como
[CLS] {sub_label} [T] [T] [T] [P]. [SEP]
O exemplo acima é um modelo para gerar instruções de recuperação de fatos com 3 tokens de gatilho em que {sub_label} é um espaço reservado para o assunto em qualquer recuperação (sujeito, relação, objeto). [P] denota a colocação de um token [MASK] especial que será usado para "preencher-o-blank" pelo modelo de idioma. Cada token de gatilho no conjunto de tokens de gatilho que são compartilhados em todas as instruções é indicado por [T] .
Dependendo do modelo de idioma (ou seja, Bert ou Roberta), você escolhe gerar instruções, os tokens especiais serão diferentes. Para Bert, coloque [CLS] e [SEP] em cada extremidade do modelo. Para Roberta, use <s> e </s> em vez disso.
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
Para análise de sentimentos
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'
Para 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
Clone nosso garfo do repositório do Lama e siga as instruções para configurá -lo fora do repositório automático. Recomendamos a criação de um ambiente de conda separado para o LAMA devido a diferentes dependências e requisitos.
Copie a pasta de dados do AutoProMPT no diretório data do LAMA ou defina data_path_pre em scripts/run_experiments.py em um local de dados personalizado.
Para fazer o Lama trabalhar com Roberta, execute os seguintes comandos:
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
Atualize o arquivo data/relations.jsonl com seus próprios prompts gerados automaticamente
Para alterar as configurações de avaliação, vá para scripts/run_experiments.py e atualize os valores configuráveis de acordo. Nota: Cada uma das configurações configuráveis é marcada com um comentário [CONFIGURABLE] .
LMs na parte superior do arquivocommon_vocab_filename para o arquivo apropriado. Qualquer coisa que avalie Bert e Roberta exige que esse campo seja common_vocab_cased_rob.txt em vez do habitual common_vocab_cased.txt .use_ctx como True se executar a avaliação para extração de relaçãosynthetic como True para avaliação de sentenças perturbadas para extração de relaçãoget_TREx_parameters , defina data_path_pre no caminho de dados correspondente (por exemplo "../data/relation_extraction" para extração de relação)Execute o código de avaliação
python scripts/run_experiments.py
Defina PYTHONPATH se ocorrer o seguinte erro: 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}
}