Este repositorio presenta el trabajo realizado durante la tesis de mi maestría con el título "Mejora de la traducción al máquina neural de baja recursos de los idiomas relacionados mediante el aprendizaje de transferencia" asesorado por Alexandra Birch y Rachel Bawden en la Universidad de Edimburgo. Se presentó en agosto de 2020. Investigó algunos de los enfoques de aprendizaje de transferencia para los sistemas de traducción automática neural (NMT) utilizando los modelos de lenguaje enmascarados como XLM-Roberta (XLM-R) [1]. Este proyecto se construyó principalmente sobre la fusión basada en la atención de las representaciones contextualizadas de palabras de los modelos de lenguaje enmascarados (MLM) con el sistema NMT basado en transformador [2]. También rastreó empíricamente la transferencia del conocimiento sintáctico mediante un análisis de los cabezales de atención en este sistema basado en el trabajo de referencia [3]. Esta guía proporciona las instrucciones de instalación necesarias junto con un pequeño ejemplo de trabajo utilizando un pequeño subconjunto del conjunto de datos paralelos IIT Bombay English Hindi-Hindi [4]. Se puede acceder a todos los hiperparámetros utilizados en este trabajo desde la tesis.
Tabla de contenido
- Una descripción general de la fusión basada en la atención
- Instalación
- Preprocesamiento
- Sistema NMT de línea de base
- Sistema NMT con fusible XLM
- Finetuning xlm-r
- Conversión de guiones
- Análisis sintáctico
- Información adicional
- Referencias
1. Una descripción general de la fusión basada en la atención
- Conectamos el XLM-R con el sistema NMT basado en el transformador utilizando la fusión basada en la atención después del trabajo [2].
- Lo llamamos el sistema NMT con fusible XLM-R que consiste en un módulo XLM-R adicional que no sea el NMT-Engoder estándar y el Decoder NMT.
- Se pasa una oración de entrada tanto al XLM-R como al NMT-Ecoder, que proporciona dos representaciones diferentes para la oración. La representación de palabras contextualizada del XLM-R se fusiona con la representación del codificador NMT utilizando una fusión basada en la atención. Del mismo modo, la representación XLM-R se fusiona con el decodificador.
2. Instalación
2.1. Requisitos
- Python> = 3.5
- Pytorch> = 1.5.0
- TensorFlow == 1.13.1
- Huggingface Transformers == 2.11.0
- Mate
- Marino
- Lear
- Sacrebleu> = 1.4.10
- SentencePiece> = 0.1.91
- Biblioteca indic nlp> = 0.6
- Decodificador
2.2 Instalación en el directorio de paquetes
- Descargue, extraiga e instale Mosesdecoder en esta ubicación.
- Descargue, extraiga e instale la biblioteca indic NLP en esta ubicación. Además, extraiga los recursos indic NLP en esta ubicación. Podemos omitir este paso si no estamos trabajando con los idiomas indic.
- Descargue, extraiga e instale la biblioteca Huggingface Transformers en esta ubicación.
2.3 Instalación de FairSeq
- Clon este repositorio. Su directorio matriz actuará como directorio de inicio para todos los scripts de preprocesamiento, capacitación y evaluación en este trabajo.
- Ejecute los siguientes comandos desde el directorio de inicio.
cd 'work/systems/baseline-NMT/fairseq'
pip install --editable ./
- Instalará el sistema de línea de base-NMT basado en la biblioteca Fairseq junto con sus dependencias. Tenga en cuenta que utilizamos múltiples versiones de los sistemas Fairseq ubicados en esta ubicación. Por lo tanto, siempre utilizamos las rutas exactas de los archivos de capacitación y evaluación para evitar los conflictos.
2.4 Descarga y extracción de XLM-R
- Descargue todos los archivos asociados con el XLM-R desde el Hub Huggingface. Use la opción 'Enumere todos los archivos en el modelo' para ver y descargar los archivos, a saber , config.json, pytorch_model.bin, sentencepiece.bpe.model y tokenizer.json .
- Pon estos archivos en este directorio.
3. Preprocesamiento
- Visite las bibliotecas Fairseq y Bert-NMT para familiarizarse con los pasos básicos de preprocesamiento, capacitación y evaluación, ya que nuestro trabajo se construye sobre ellas.
- Utilizamos Mosesdecoder para preprocesar los conjuntos de datos en inglés, pero cambiamos a la biblioteca indic NLP para los idiomas indic como hindi, gujarati, bengalí y marathi.
- Usamos el bpe de oración para la segmentación de la palabra. Cuando los lenguajes de origen y de destino compartían caracteres sustanciales, procesamos los conjuntos de datos con el BPE conjunto utilizando este script. De lo contrario, se usó un script diferente.
- Para el conjunto de datos en inglés-hindi utilizado para demostrar este trabajo, utilizamos el último script.
- Establezca el home_dir en el directorio principal de este repositorio.
- Ya hemos puesto archivos de tren, prueba y desarrollo en el RAW_DATA_DIR . Puede cambiarlos con sus archivos con las mismas convenciones de nombres.
- Fusionamos los datos de capacitación con los conjuntos de datos monolingües masivos para aprender una mejor segmentación de BPE. Coloque estos conjuntos de datos en raw_monolingual_data_dir . Utilizamos Massive Oscar Corpus en nuestro trabajo, pero para esta demostración, solo usamos los mismos archivos de tren.
- Cambie entre la biblioteca NLP o Moses en función de los idiomas comentando la función Clean_Norm_Tok , como se muestra en el script.
- Ejecute este script que preprocese todos los archivos y guarda en preproced_data_dir . El directorio de BPE tokenizado contiene todos los archivos intermedios después de la normalización, la tokenización, etc., así como todos los archivos BPET finales.
- Luego, este script binariza los datos que deben utilizar los sistemas basados en Fairseq y ahorra en el directorio binario . Utiliza el binariser de FairSeq del sistema de fusiones XLM-R-RE-RE-FUSTIVA para binarizar los archivos para la línea de base, así como los sistemas fusionados por XLM-R. Utiliza el nombre del modelo de cerveza para acceder al tokenizer XLM-R para tokenizar los archivos de origen, ya que también fueron utilizados por el componente XLM-R junto con el NMT-ENCODER estándar en los sistemas con fusiones XLM-R.
- (Opcional) Tenga en cuenta que este sistema se basa principalmente en el XLM-R, pero también podemos usar otros modelos de lenguaje enmascarados proporcionados por la Biblioteca Huggingface Transformers. Necesitamos hacer algunos cambios de la siguiente manera:
- Descargue y extraiga el nuevo modelo de idioma como se menciona en el paso 2.4.
- Importe el tokenizador y el modelo correspondientes de la biblioteca de transformadores Huggingface en el sistema de fundición XLM-R con el predeterminado como se menciona a continuación:
from transformers import XLMRobertaModel
BertModel = XLMRobertaModel
from transformers import XLMRobertaTokenizer
BertTokenizer = XLMRobertaTokenizer
- Necesitamos importarlos en los siguientes archivos:
- Work/Systems/XLM-R-Fused/Bert-NMT/Preprocess.py
- Work/Systems/XLM-R-Fused/Bert-NMT/Interactive.py
- Work/Systems/XLM-R-Fused/Bert-NMT/Fairseq_cli/Preprocess.py
- Work/Systems/XLM-R-Fused/Bert-NMT/Fairseq_cli/Interactive.py
- Work/Systems/XLM-R-Fused/Bert-NMT/Fairseq/Tasks/Translation.py
- Work/Systems/XLM-R-Fused/Bert-NMT/Fairseq/Models/Transformer.py
- Work/Systems/XLM-R-Fused/Bert-NMT/Fairseq/binarizer.py
- Además, necesitamos cambiar los tokens de inicio
(<s>) y finalizar (</s>) en estos archivos según el nuevo modelo de idioma.
4. Sistema de NMT de línea de base
4.1 Sistema de NMT de línea de base de capacitación
- Entrene el sistema de referencia basado en el transformador con este script.
- Acumulará los gradientes para formar un tamaño de lote efectivo más grande. Tamaño por lotes = (número de GPU) * ( --max-tokens ) * ( -update-frreq ).
- Utiliza una estrategia de validación de detención temprana con la paciencia que determina el número máximo de puntos de control con las puntuaciones de BLU en declinación.
- Nuestro trabajo usa la arquitectura de transformador: transformer_iwslt_de_en como predeterminado. Los sistemas de fundición XLM-Restauran los parámetros de los sistemas de referencia, por lo que sus arquitecturas deberían coincidir. También podemos usar otras arquitecturas más grandes para el sistema de línea de base, pero también debemos dar la misma arquitectura subyacente para el sistema XLM-Rfused. Consulte este archivo para obtener arquitecturas adicionales que implementen la fusión basada en la atención.
- Guarda los puntos de control en la línea de base_nmt_checkpoints_dir .
4.2 Evaluación del sistema NMT de referencia
- Evaluar el sistema de referencia con este script.
- Necesitamos evaluar el archivo de prueba BPET con el mejor punto de control. Use --Remove-BPE = SentencePiece para eliminar la segmentación BPE del archivo de salida.
- Use indique NLP o Moisés para contener el archivo de salida como se muestra en el script.
- Este script calcula las puntuaciones finales de BLU usando Sacrebleu utilizando el archivo de prueba no tocado del idioma de destino.
5. Sistema NMT con fusiones de ruido XLM
5.1 Sistema NMT de entrenamiento XLM-R-Fused
- Capacite los sistemas de fusiones XLM-R con este script que utilizará el sistema en esta ubicación.
- Bert_Name almacena la ruta a la variante XLM-R utilizada con este sistema. Podemos usar variantes previamente capacitadas o finetas aquí.
- Este script copia el mejor punto de control del sistema de línea de base y restaura los parámetros para una mayor capacitación con el sistema de fusiones XLM-R-r.
- Este sistema se construyó a través de una versión anterior de FairSeq que no proporcionó una parada temprana, por lo que este script guarda todos los puntos de control para los pasos de capacitación -actualización-actualización , que luego se evalúan más adelante.
- Para la fusión de atención tanto en el lado del codificador como en el decodificador, use el --Arch as Transformer_S2_IWSLT_DE_EN , mientras que para la fusión de solo decodificador, use Transformer_IWSLT_DE_EN .
- Asegúrese de utilizar una pequeña tasa de aprendizaje, ya que los parámetros ya están cerca de los niveles óptimos.
5.2 Evaluación del sistema NMT con fusiones XLM
- Evalúe los sistemas de fusiones XLM-R con este script, que es similar al script utilizado para el sistema de referencia.
- Este script utiliza un punto de control particular para calcular la puntuación BLEU, mientras que otro script lo extiende para calcular los puntajes de todos los puntos de control.
- Como se mencionó anteriormente, no hay una función de detención temprana con este sistema. Entonces, guardamos todos los puntos de control cada pocas épocas y las evaluamos con un conjunto de validación. Luego, el mejor punto de control se puede establecer utilizando Best_Checkpoint en el script anterior para la evaluación del conjunto de pruebas.
- Utiliza las rutas a dos archivos de prueba diferentes que utilizan diferentes componentes de los sistemas NMT con fusiones de XLM-R. Test_src_bped apunta al archivo que utiliza el NMT-ENCODER estándar, mientras que test_src_raw apunta al archivo fuente sin procesar que utiliza el componente XLM-R. El XLM-R necesita el archivo sin procesar, ya que utiliza su propia tokenización interna utilizando el tokenizer proporcionado por la biblioteca Huggingface Transformers. Asegúrese de que Bert_Name apunte al directorio de variante XLM-R correspondiente, para que pueda acceder a su tokenizador correspondiente.
6. Finetuning XLM-R
6.1 Variantes multilingües y monolingües
- Finetizamos los modelos XLM-R para crear las variantes multilingües y monolingües de los modelos originales previamente capacitados.
- Indo-aryan-xlm-r-base es la variante multilingüe, que se crea mediante la base XLM-R Fineting con los idiomas relacionados: hindi, gujarati, marathi y bengalí. Explota sus similitudes sintácticas, morfológicas, ortográficas y léxicas.
- Gujarati-XLM-R-Base y Gujarati-XLM-R-Large son las variantes monolingües finetas con el conjunto de datos de Gujarati. Además, Gujarati-Dev-XLM-R-Base se crea con el lenguaje Gujarati convertido al guión Devanagari. Estos modelos se han lanzado en el HuB Huggingface que están disponibles aquí.
- Utilizamos las variantes de Pytorch del XLM-R disponible aquí como los modelos previamente capacitados.
6.2 Preparación de datos
- Seguimos principalmente este tutorial, que le recomendamos que visite antes de continuar.
- Use este script para preparar los datos. Prepara los archivos de capacitación y validación para un solo conjunto de datos monolingües cuya ruta se establece utilizando RAW_MONO_SOURCE . Luego, se preprocesa utilizando la biblioteca NLP indic, como se hace para los archivos de capacitación anteriores.
- En este script, Bert_Name apunta al modelo XLM-R original previamente que se utiliza para acceder a su diccionario.
- Luego, se binariza utilizando otra variante de la biblioteca Fairseq disponible aquí. Utiliza el tokenizador XLM-R, que garantiza que nuestros datos se tokenizan de la misma manera que los datos originales se realizaron para realizar previamente el XLM-R.
- (Opcional) Si desea Finetune cualquier otro modelo de lenguaje enmascarado, entonces debe importar ese modelo de idioma en este archivo. Hacer los siguientes cambios:
- Importar el tokenizador correspondiente en lugar de nuestro XLMROBERTATATATIVE predeterminado
from transformers import XLMRobertaTokenizer
BertTokenizer = XLMRobertaTokenizer
- Reemplace el nombre del modelo aquí
dict = BertTokenizer.from_pretrained("xlm-roberta-base")
- Reemplace los tokens de inicio y finalización similar a una sugerencia en el preprocesamiento.
- Del mismo modo, prepare los datos para otros idiomas si desea crear un modelo multilingüe.
6.3 Entrenamiento y evaluación del modelo
- Use este script para Finetune la variante monolingüe.
- Utiliza el mismo sistema NMT de línea de base que se utiliza en el paso 4.1 para finentar el modelo. Aquí, Restore_Point señala el punto de control del modelo previamente capacitado. Use el - -Task como Masked_LM para la variante monolingüe.
- Similalrly, use este script para crear la variante multilingüe. Utiliza el - -Task como multilingüe_masked_lm que combina los datos de diferentes idiomas.
- También lo resume para minimizar el impacto del desequilibrio de datos donde los conjuntos de datos más grandes superan a los más pequeños. Use --multilang-sample-alfa para ajustar la relación de muestreo. Consulte el documento XLM-R original [1] para obtener los detalles.
- Guardamos los puntos de control a intervalos regulares y elegimos el modelo con la pérdida mínima de validación.
6.4 Hacer un punto de control de Pytorch compatible con Huggingface Transformers
- Necesitamos convertir el punto de control de Pytorch guardado en una versión diferente compatible con la biblioteca Huggingface Transformers.
- Asumimos que ha instalado la biblioteca Transformers en el directorio de paquetes. Luego, use el siguiente comando.
python packages/transformers/src/transformers/convert_roberta_original_pytorch_checkpoint_to_pytorch.py --roberta_checkpoint_path best_ck_dir/ --pytorch_dump_folder_path ./
- Aquí, BEST_CK_DIR contiene el punto de control XLM-R Finetuned llamado Model.PT , Dict.txt y SentencePiece.bpe.model . Los últimos 2 archivos son los mismos para los modelos pre-entrenados y finetos, a los que se puede acceder aquí. Pytorch_dump_folder_path se refiere al directorio donde se debe guardar la versión de Pytorch compatible con los transformadores.
- Tenga en cuenta que la biblioteca Transformers tuvo algunos problemas con el archivo convert_roberta_original_pytorch_checkpoint_to_pytorch.py , que solucionamos y agregamos al directorio Utils. Reemplace este archivo y reconstruya la biblioteca.
- (Opcional) Podemos usar las guías Huggingface directamente para Finetune el modelo sin usar primero la biblioteca Fairseq. Encontramos este enfoque extremadamente lento debido al pobre soporte de múltiples GPU proporcionado por Huggingface. Implementaron múltiples lecturas sobre multiprocesamiento, lo que causa el uso desequilibrado de la GPU. Fairseq implementó su propio módulo para manejar esto, que se discute aquí.
- Después de Finetuning, solo use la versión final de Pytorch para reemplazar los modelos originales previamente capacitados para el entrenamiento y la evaluación de los sistemas con fusibles XLM-R.
7. Conversión de guiones
- Utilizamos algunas estrategias de conversión de script, donde intentamos explotar las similitudes léxicas entre los idiomas relacionados mediante el uso de un script común. Utilizamos la biblioteca indic NLP para convertir lo mismo.
- A medida que el sistema de fusiones XLM-R procesa las mismas oraciones de entrada en el XLM-R, así como, el NMT-Endoder, probamos diferentes combinaciones de los scripts para estos módulos. Por ejemplo, para el par gujarati-hindi, pasamos oraciones de guión de gujarati al módulo XLM-R, pero Gujarati en el script Devanagari al codificador NMT para maximizar la superposición léxica con el lenguaje de destino.
- Las oraciones en los diferentes guiones tienen el mismo significado semántico, por lo que su fusión basada en la atención fue posible. Consulte la tesis para obtener más detalles.
- Esta funcionalidad se puede utilizar con el sistema de fusiones XLM-Range cambiando los archivos de origen para ser binars para el XLM-R. Se puede hacer usando este script, que convierte estos archivos en el script de destino.
- Del mismo modo, el script se puede usar para convertir el script de los archivos de origen que se pasarán al XLM-R, así como al ENCODADOR NMT estándar.
- Luego, entrene los sistemas NMT de base y XLM-R-R-rate como antes de usar los scripts de entrenamiento iniciales.
- Evalúe estos sistemas como antes utilizando los scripts de evaluación iniciales. Si el idioma de destino se convierte en el script del lenguaje de origen, entonces debe convertirse nuevamente en su script inicial como un paso posterior al procesamiento. Esto se puede hacer utilizando los scripts de evaluación presentes en el directorio convertido en script dentro de la línea de base y los directorios de scripts de los sistemas de rango XLM-r.
8. Análisis sintáctico
Familiarícese con el trabajo de [3], cuyo código está disponible aquí. Nuestro trabajo lo extiende para rastrear la transferencia del conocimiento sintáctico en los sistemas de fusiones XLM-R.
8.1 Preparación de datos
- Procesar el conjunto de datos de las dependencias universales (UD)
- Utilizamos el conjunto de datos Hindi UD [5] [6] para el análisis sintáctico.
- Use este script para procesar el tren UD en bruto y los archivos de prueba. Extraerá la cabeza sintáctica y las relaciones sintácticas correspondientes de los archivos UD.
- Luego, use este script para convertir los archivos anteriores en formato JSON utilizando las instrucciones aquí.
- Finalmente, extraiga las oraciones sin procesar de los archivos anteriores utilizando este script.
- Procesar archivos fuente para la inferencia de FairSeq
- Use los archivos anteriores con las oraciones sin procesar como archivos de prueba de origen. Evaluamos nuestros mejores puntos de control del sistema de referencia y del sistema XLM-R-ron con estos archivos.
- Preprocese estos archivos como se mencionó en el paso 3 (preprocesamiento) y prepare los archivos binarizados para FairSeq. Como no tenemos ningún datos del lado de destino aquí, utilizamos un script de preprocesamiento modificado para procesar solo los archivos del lado de origen.
8.2 Extracción de mapas de atención de los sistemas de base y con fusiones de XLM
- Use los datos binarsiados anteriores para extraer los mapas de atención del sistema de fusiones XLM-R utilizando el script de evaluación. Del mismo modo, use este script para extraer los mapas del sistema de referencia.
- Estos scripts utilizan dos sistemas diferentes construidos sobre el sistema NMT de línea de base y el sistema NMT con fusiones XLM-R, a los que se puede acceder aquí y aquí, respectivamente.
- Estos sistemas extraen los mapas de autoatención para todos los cabezales de atención presentes en todas las capas del codificador del transformador. Además, el sistema construido sobre el fusible XLM-R-ROW también extrae los mapas de Atención Bert resultante de la fusión basada en la atención de las representaciones XLM-R y las representaciones NMT-codificador.
- Use el parámetro adicional --save_attn_maps para dar la ruta para guardar los mapas de atención. Cree las carpetas: Self , Bert y Batch_Sentences dentro de él para almacenar los mapas respectivos. Batch_sentences almacena las oraciones correspondientes en el orden se extraen los mapas de atención. Este archivo se puede usar para verificar el orden de las oraciones procesadas.
- Estos mapas se guardarán en las matrices Numpy donde un solo archivo contiene el número de oraciones igual que el tamaño del lote.
- Use este script para procesar más los mapas de atención.
- Crea los objetos de Pickle usando los mapas de atención y los archivos JSON.
- Luego, convierte los mapas de atención para los tokens de nivel BPE en el nivel de la palabra. Consulte la tesis para obtener más detalles.
- Para probar nuestro código, puede usar nuestros archivos de encurtido tanto para la línea de base como para los sistemas con fusión de XLM-R que están disponibles aquí. Descargue y extraiga el archivo comprimido en esta ubicación. Estos archivos de encurtidos funcionarán con los datos preprocesados de Hindi UD ya presentes en la ubicación mencionada.
8.3 Visualización de mapas de atención y clasificador de sondeo basado en la atención
- Ejecute el cuaderno de análisis sintáctico disponible aquí. Point Train_path y dev_path al tren anterior y pruebe los archivos de Pickle. Aquí, nuestros archivos de desarrollo y prueba son los mismos, ya que no usamos ningún hiperparámetro.
- Los pesos obtenidos de la línea de base y los sistemas con fusibles de XLM se usaron para determinar la cabeza sintáctica correcta en diferentes capas y cabezas de atención.
- Tiene algunos ejemplos cualitativos en los que se predijo con éxito una cabeza sintáctica.
- Finalmente, ofrece una puntuación UAS final entrenando y evaluando el clasificador de sondeo basado en la atención. Se requiere una combinación ponderada de los pesos de autoatensión dados por todas las capas y cabezas de atención para dar una medida general del conocimiento sintáctico.
9. Información adicional
- Licencias: Tenga en cuenta que nuestro trabajo tiene licencia bajo la licencia MIT. Pero, utilizamos otros trabajos y conjuntos de datos que tienen sus propias licencias. Específicamente, todos los sistemas que se basan en la biblioteca Fairseq tienen sus licencias correspondientes presentes en sus respectivos directorios. Además, consulte las licencias del conjunto de datos paralelos de English-Hindi IIT Bombay y el conjunto de datos de dependencias universales hindi utilizando los enlaces dados en el archivo ReadMe. Del mismo modo, verifique la licencia de la biblioteca Huggingface Transformers, ya que modificamos uno de sus archivos como se menciona en el ReadMe.
- Plantear un problema si necesita ayuda. Si encuentra útil este trabajo, no dude en usarlo y por favor cita mi tesis también.
10. Referencias
[1] Conneau, Alexis, et al. "Learning sin supervisión de representación multilingüe a escala". ARXIV Preprint Arxiv: 1911.02116 (2019)
[2] Zhu, Jinhua, et al. "Incorporando a Bert a la traducción del automóvil neural". Conferencia internacional sobre representaciones de aprendizaje. 2019
[3] Clark, K., Khandelwal, U., Levy, O. y Manning, CD (2019, agosto). ¿Qué mira Bert? Un análisis de la atención de Bert. En Actas del Taller de ACL 2019 BlackboxNLP: Análisis e interpretación de redes neuronales para PNL (pp. 276-286).
[4] Anoop Kunchukuttan, Pratik Mehta, Pushpak Bhattacharyya. El Corpus paralelo IIT Bombay English-Hindi. Conferencia de recursos lingüísticos y evaluación. 2018.
[5] Riyaz Ahmad Bhat, Rajesh Bhatt, Annahita Farudi, Prescott Klassen, Bhuvana Narasimhan, Martha Palmer, Owen Rambow, Dipti Misra Sharma, Ashwini Vaidya, Sri Ramagururrhy Vishnu y Fei Xia. El proyecto Hindi/Urdu Treebank. En el Manual de Anotación Lingüística (editado por Nancy Ide y James Pustejovsky), Springer Press. 2015.
[6] Martha Palmer, Rajesh Bhatt, Bhuvana Narasimhan, Owen Rambow, Dipti Misra Sharma, Fei Xia. Sintaxis hindi: dependencia de anotación, estructura léxica de predicado-argumento y estructura de frases. En las Actas de la 7ª Conferencia Internacional sobre Procesamiento del Lenguaje Natural, Icon-2009, Hyderabad, India, 14-17 de diciembre de 2009.