Código -fonte para o artigo da ACL 2022 "Boosting de coerência: quando seu modelo de idioma pré -treinado não está prestando atenção suficiente" (Arxiv, ACL Anthology)
A coerência semântica de longo alcance continua sendo um desafio na geração e no entendimento automáticas da linguagem. Demonstramos que grandes modelos de linguagem aprenderam insuficientemente o efeito de palavras distantes na previsão do próximo toque. Apresentamos o aumento da coerência , um procedimento de inferência que aumenta o foco de um LM em um longo contexto. Mostramos os benefícios da coerência que aumenta com modelos pré -ridicularizados por análises distributivas das respostas de texto e diálogo comuns geradas. Verificou-se também que a coerência aumentando com modelos de última geração para várias tarefas de PNL com tiro zero produz ganhos de desempenho sem treinamento adicional.
Se você achar útil o papel e o código, por favor, por favor, estrela este repo e cite o papel. Muito obrigado!
@inproceedings { malkin-etal-2022-coherence , title = " Coherence boosting: When your pretrained language model is not paying enough attention " , author = " Malkin, Nikolay and Wang, Zhen and Jojic, Nebojsa " , booktitle = " Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers) " , month = may, year = " 2022 " , address = " Dublin, Ireland " , publisher = " Association for Computational Linguistics " , url = " https://aclanthology.org/2022.acl-long.565 " , doi = " 10.18653/v1/2022.acl-long.565 " , pages = " 8214--8236 " }Apresentamos um programa de demonstração para demonstrar a falta de coerência no LMS pré-treinado existente, ou seja, não prevendo corectamente o próximo token, dado um contexto, o que claramente requer a compreensão de palavras distantes. Tais erros podem ser resolvidos por nossa proposta de aumento de coerência , que prevê contrastemente o próximo token pela mistura de log-linear duas distribuições do contexto completo e de um contexto parcial.
> >> from cb_demo import contrasting > >> contrasting ( model_name = 'gpt2' , context = ' Ballad metre is "less regular and more conversational" than common metre' , - - partial_length = 8 , - - alpha = 0.5 ) [ out ] Top tokens based on full context : Ballad metre is "less regular and more conversational" than common Rank Tokens Logprobs Probs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Ġsense - 2.405 9.03 % 2 Ġin - 3.900 2.02 % 3 . - 3.978 1.87 % 4 , - 4.097 1.66 % 5 Ġpractice - 4.287 1.37 % ... ... ... ... 13 Ġmetre ** - 5.098 0.610609 % * * Target Token Top tokens based on partial context : regular and more conversational " than common Rank Tokens Logprobs Probs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Ġsense - 2.547 7.83 % 2 ĠEnglish - 3.352 3.50 % 3 . - 3.427 3.25 % 4 Ġconversation - 3.445 3.19 % 5 , - 3.634 2.64 % ... ... ... ... 14103 Ġmetre ** - 13.450 0.000144 % * * Target Token Contrastive next token prediction : Rank Tokens Logprobs Probs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Ġmetre ** - 0.923 39.74 % 2 Ġsense - 2.334 9.69 % 3 Ġmeter - 2.785 6.17 % 4 Ġin - 3.210 4.03 % 5 Ġfoot - 3.220 3.99 % * * Target TokenVocê pode replicar os resultados para alguns exemplos na Figura 1 do artigo pelo seguinte código:
python cb_demo . py - - context = ' Ballad metre is "less regular and more conversational" than common metre' - - model_name = 'gpt2' - - partial_length = 8 - - alpha = 0.5 python cb_demo . py - - context = ' Isley Brewing Company: Going Mintal — a minty milk chocolate stout' - - model_name = 'gpt2' - - partial_length = 8 - - alpha = 0.5 python cb_demo . py - - context = ' Other times anxiety is not as easy to see, but can still be just as debilitating' - - model_name = 'gpt2' - - partial_length = 8 - - alpha = 0.5uma tarefa de Lambada de contexto longo é semelhante aos exemplos mostrados acima, onde o modelo deve prever a palavra final nas passagens de várias frases. Este conjunto de dados é um benchmark padrão para avaliar os modernos modelos Langauge (exemplo).
Mais importante, essa tarefa requer explicitamente o raciocínio em um contexto amplo: os humanos podem adivinhar com segurança a última palavra quando recebidos uma passagem inteira, mas não quando recebidos apenas a última frase. Essa propriedade faz desta referência um cenário perfeito para avaliar a eficácia de nossa proposta de aumento de coerência .
Para executar as experiências de Lambada, basta executar o seguinte comando:
python main . py - - tasks = 'lambada' - - models = 'gpt2-small' - - use_val = False - - alpha_start = 1 - - alpha_end = 1 - - alpha_step = 0.1 - - slen_start = 10 - - slen_end = 10python main.py --help argumentos importantes estão listados como a seguir, use.
--models : o nome dos modelos de idiomas pré-treinados, separados por Semicolon se você quiser executar vários modelos ao mesmo tempo, por exemplo, 'gpt2-small;gpt2-medium' ; Se você deseja usar os modelos GPT-3, consulte Notas sobre o GPT-3.--use_val : Whether to use a validation set to select two hyperparameters, alpha and slen representing the boosting coefficient and length for the partial context--alpha_start , --alpha_end , --alpha_step : Grid search parameters for the alpha hyperparameter--slen_start , --slen_end , --slen_step : Grid search parameters for the slen hiperparâmetro; Observe que ambas as configurações de hiperparâmetro influenciam a velocidade de inferência para a tarefa de Lambadaavaliamos o aumento da coerência proposta nas seguintes tarefas da NLU.
| Tarefa | fechar tarefa | pergunta respondendo | classificação de texto | NLI | FACT FACK CONHECIMENTO |
|---|---|---|---|---|---|
| DATASETS | StoryCloze Hellaswag Copa | Commonsenseqa Openbookqa Arco fácil/desafio PIQA | SST-2/5 Trec Agnews | Rte Cb Boolq | Lama |
A maioria dos conjuntos de dados pode ser carregada pelos conjuntos de dados do Hugginface; Apenas alguns deles exigem download manualmente com instruções solicitadas quando você executa o código.
Para executar experimentos da NLU, basta executar o seguinte comando:
python main . py - - tasks = 'storycloze;csqa;openbookqa' - - models = 'gpt2-small;gpt2-medium;gpt2-large' - - alpha_start = 2 - - alpha_end = - 3 - - alpha_step = 0.01Alguns argumentos importantes são listados como seguintes, python main.py --help .
--models : The name of pre-trained language models, seperated by semicolon if you want to run multiple models at the same time, eg, 'gpt2-small;gpt2-medium'--use_val : Whether to use a validation set to select two hyperparameters, alpha and slen representing the boosting coefficient and length for the partial context--alpha_start , --alpha_end , --alpha_step : Parâmetros de pesquisa de grade para o hiperparâmetro alpha ; Observe que o código cache os resultados intermediários e você pode alterar esses parâmetros depois de executar a inferência por um horárioapi_key.txtalém das tarefas anteriores, nossa base de código é flexível o suficiente para incorporar qualquer novo conjunto de dados multi-escolha com esforços miniais (inspirados no projeto de código aberto, LM-Avaliação-Harness). Lá, aproximadamente três etapas:
__init__.py na pasta tasks .MultipleChoiceTask com funções de pré-processamento de dados (por exemplo, load_data , standardize )get_contrast_ctx , que é onde você define seu próprio premissa de premissa paravocê se apóie em qualquer problema, quando você se apóia.
fornecemos um modelo de geração compatível com a biblioteca de transformers Huggingface em generation/generation.py . Você pode criar variantes de coerência de qualquer LM autoregressivo usando a classe no script de exemplo:
> >> boosted_model = generation . BoostedModel ( base_model , k = 8 , alpha_long = 1.5 , alpha_short = - 0.5 )O boosted_model pode ser usada com flexibilidade com a função generate ,
> >> ins = T . LongTensor ([ tokenizer . encode ( 'Once upon a midnight dreary,' )]) > >> outputs = boosted_model . generate ( input_ids = ins , do_sample = True , max_length = 100 , top_p = 0.95 ) > >> tokenizer . decode ( outputs [ 0 ]) "Once upon a midnight dreary, while I pondered over these things, I suddenly became aware of a strange and terrible noise. I turned round, and saw that the old man was standing near me. He was wearing a black suit, with a black tie, and a black hat. He had a long, thin, black beard, and his eyes were black. His hair was of a dark brown colour, and was very long. His face was rather large, and his lips were somewhat"The model wrapper is readily Adaptado aos cenários em que o contexto curto é o texto atualmente gerado, menos um prefixo de um certo comprimento ( por exemplo , a curva anterior em uma conversa), definindo dinamicamente o aprimoramento boosted_model.k ao comprimento do prefixo negativo.
Apresentamos algumas saídas de geração condicional. As métricas de avaliação mostradas na Tabela 1 podem ser avaliadas usando o código deste repositório para as quatro primeiras colunas ou usando o código aqui para as novas métricas de coerência de longo alcance que introduzimos.
se tiver alguma dúvida, não hesite em entrar em contato com Kolya (nikolay.malkin em mila.quebec) e Zhen (Wang.9215 em Osu.edu).