Código fuente para el documento de ACL 2022 "Boosting de coherencia: cuando su modelo de lenguaje previamente practicado no presta suficiente atención" (ARXIV, ACL Antología)
La coherencia semántica de largo alcance sigue siendo un desafío en la generación y comprensión de idiomas automáticos. Demostramos que los modelos de lenguaje grande han aprendido insuficientemente el efecto de las palabras distantes en la predicción de la siguiente token. Presentamos el impulso de coherencia , un procedimiento de inferencia que aumenta el enfoque de un LM en un contexto largo. Mostramos los beneficios del aumento de coherencia con modelos previos al detrota mediante análisis de distribución de respuestas generadas de texto y diálogo de texto ordinario. También se encuentra que la coherencia que aumenta con modelos de vanguardia para varias tareas de PNL de disparo cero produce ganancias de rendimiento sin capacitación adicional.
Si encuentra útiles el papel y el código, por favor, estre a este repositorio y cita el documento. ¡Muchas gracias!
@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 " }Presentamos un programa de demostración para demostrar la falta de coherencia en los LMS previamente capacitados existentes, es decir, no predecir corectamente el siguiente token dado un contexto, lo que claramente requiere la comprensión de las palabras distantes. Dichos errores pueden resolverse mediante nuestro impulso de coherencia propuesto, lo que predice contrastivamente el siguiente token al mezclar log-lineal mezclando dos distribuciones desde el contexto completo y un 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 TokenPuede replicar los resultados para algunos ejemplos en la Figura 1 del documento mediante el siguiente 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.5una tarea de lambada de contexto largo es similar a los ejemplos que se muestran arriba donde se espera que el modelo predice la palabra final en pasajes de varias oraciones. Este conjunto de datos es un punto de referencia estándar para evaluar modelos modernos de Langauge (ejemplo).
Más importante aún, esta tarea requiere explícitamente razonamiento en un contexto amplio: los humanos pueden adivinar de manera confiable la última palabra cuando se le da un pasaje completo, pero no cuando se le da solo la última oración. Dicha propiedad hace que este punto de referencia sea una prueba perfecta para evaluar la efectividad de nuestro impulso de coherencia propuesto.
Para ejecutar los experimentos de Lambada, simplemente ejecute el siguiente 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 = 10Algunos argumentos importantes se enumeran a continuación, use python main.py --help a la lista completa.
--models : el nombre de los modelos de lenguaje previamente capacitados, separados por Semicolon si desea ejecutar múltiples modelos al mismo tiempo, por ejemplo, 'gpt2-small;gpt2-medium' ; Si desea usar modelos GPT-3, vea las notas sobre GPT-3.--use_val : si se debe usar un conjunto de validación para seleccionar dos hiperparámetros, alpha y slen representando el coeficiente y la longitud de impulso para el contexto parcial--alpha_start , --alpha_end , --alpha_step : parámetros de búsqueda de cuadrícula para los parámetros alpha Hyperparmeter--slen_start , --slen_end Slen_end, --slen_step : Parámetros de Slen de Alpha para slen hiperparámetro; Tenga en cuenta que ambas configuraciones de hiperparameter influyen en la velocidad de inferencia para la tarea de lambadaEvaluamos el impulso de coherencia propuesto en las siguientes tareas de la NLU.
| Tarea | Cerrar Tarea | Pregunta Respondiendo a | la clasificación de texto | NLI | Conocimiento Conocimiento |
|---|---|---|---|---|---|
| DataSets | Storycloze Helaswag Copa | Commonsenseqa OpenBookqa Arco fácil/desafío PIQA | SST-2/5 Trec Agnews | rte CB Boolq | lama |
La mayoría de los conjuntos de datos se pueden cargar mediante conjuntos de datos de Hugginface; Solo unos pocos requieren descargar manualmente con instrucciones solicitadas cuando ejecuta el código.
Para ejecutar experimentos NLU, simplemente ejecute el siguiente comando:
python main . py - - tasks = 'storycloze;csqa;openbookqa' - - models = 'gpt2-small;gpt2-medium;gpt2-large' - - alpha_start = 2 - - alpha_end = - 3 - - alpha_step = 0.01Algunos argumentos importantes se enumeran como se enumeran los siguientes, por favor use python main.py --help a la lista para ver un listado completo.
--models : el nombre de los modelos de lenguaje previamente capacitados, separados por Semicolon si desea ejecutar múltiples modelos al mismo tiempo, por ejemplo, 'gpt2-small;gpt2-medium'--use_val : si se debe usar un conjunto de validación para seleccionar dos hiperparámetros, alpha y slen representando el coeficiente de nivel de elevación y la longitud para el contexto parcial --alpha_start,-,-,-,-,-,-,-,-,-, que representan el coeficiente de elevación y la longitud para el contexto parcial--alpha_start ,-,-,-,-,-,-,-, --alpha_end ,- --alpha_step : parámetros de búsqueda de cuadrícula para el hiperparameter alpha ; Tenga en cuenta que el código almacena en caché los resultados intermedios y usted es libre de cambiar estos parámetros después de ejecutar la inferencia porapi_key.txtademás de las tareas anteriores, nuestra base de código es lo suficientemente flexible como para incorporar cualquier nuevo conjunto de datos de la selección múltiple con esfuerzos minial (inspirados en el proyecto de código abierto, LM-Evaluation-Harness). Hay aproximadamente tres pasos:
__init__.py en la carpeta tasks .MultipleChoiceTask con funciones de preprocesamiento de datos (por ejemplo, load_data , standardize )get_contrast_ctx , que es donde define su propio indicador gratuito para aumentar la coherencia paraver otros clases de tareas como ejemplos y, por favor, sintiéndonos saber si usted tiene algún problema cuando adopta nuestro código.
Proporcionamos un envoltorio de modelo de generación compatible con la biblioteca transformers Huggingface en generation/generation.py . Puede crear variantes de coherencia de cualquier LM autorregresivo utilizando la clase en el script de ejemplo:
> >> boosted_model = generation . BoostedModel ( base_model , k = 8 , alpha_long = 1.5 , alpha_short = - 0.5 )El boosted_model se puede usar de manera flexible con la función 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"modelo negro y sus ojos eran negros. Adaptado a escenarios en los que el contexto corto es el texto generado actualmente menos un prefijo de cierta longitud ( por ejemplo , el giro anterior en una conversación) configurando dinámicamente boosted_model.k en la longitud del prefijo negativo.
Presentamos algunas salidas de generación condicional. Las métricas de evaluación que se muestran en la Tabla 1 se pueden evaluar utilizando el código de este repositorio para las primeras cuatro columnas o utilizando el código aquí para las nuevas métricas de coherencia de largo alcance que presentamos.
si tiene alguna pregunta, no dude en comunicarse con Kolya (Nikolay.Malkin en Mila.quebec) y Zhen (Wang.9215 en OSU.edu).