Este repositório apresenta o trabalho realizado durante a tese do meu mestrado com o título "Melhorando a tradução da máquina neural de baixo recurso de idiomas relacionados pelo Learning Learning", aconselhado por Alexandra Birch e Rachel Bawden na Universidade de Edimburgo. Foi enviado em agosto de 2020. Investigou algumas das abordagens de aprendizado de transferência para os sistemas de tradução da máquina neural (NMT), utilizando os modelos de idiomas mascarados, como XLM-Roberta (XLM-R) [1]. Este projeto foi construído principalmente sobre a fusão baseada em atenção das representações contextualizadas de palavras dos modelos de linguagem mascarada (MLM) com o sistema NMT baseado em transformador [2]. Também traçou empiricamente a transferência do conhecimento sintático por uma análise das cabeças de atenção neste sistema com base no trabalho de referência [3]. Este guia fornece as instruções de instalação necessárias, juntamente com um pequeno exemplo de trabalho usando um pequeno subconjunto do conjunto de dados paralelo do IIT Bombay English-Hindi [4]. Todos os hiperparâmetros usados neste trabalho podem ser acessados a partir da tese.
Índice
- Uma visão geral da fusão baseada em atenção
- Instalação
- Pré -processamento
- Sistema NMT de linha de base
- Sistema NMT fundido XLM-R
- Finetuning XLM-R
- Conversão de script
- Análise sintática
- Informações adicionais
- Referências
1. Uma visão geral da fusão baseada em atenção
- Conectamos o XLM-R ao sistema NMT baseado em transformador usando a fusão baseada em atenção após o trabalho [2].
- Chamamos isso de sistema NMT fundido por XLM-R, que consiste em um módulo XLM-R adicional diferente do Encoder NMT padrão e do decodificador NMT.
- Uma frase de entrada é passada para o XLM-R e o NMT-Encoder, que fornece duas representações diferentes para a frase. A representação contextualizada de palavras do XLM-R é fundida com a representação do codificador NMT usando uma fusão baseada em atenção. Da mesma forma, a representação XLM-R é fundida com o decodificador.
2. Instalação
2.1. Requisitos
- Python> = 3.5
- Pytorch> = 1.5.0
- Tensorflow == 1.13.1
- Transformadores de Huggingface == 2.11.0
- Matplotlib
- Seancen
- Scikit-Learn
- Sacrebleu> = 1.4.10
- Peça de sentença> = 0.1.91
- Indic NLP Library> = 0.6
- MosesDecoder
2.2 Instalação no diretório de pacotes
- Faça o download, extraia e instale o MosesDecoder neste local.
- Faça o download, extraia e instale a biblioteca Indic NLP neste local. Além disso, extrair recursos indicadores de PNL neste local. Podemos pular esta etapa se não estivermos trabalhando com os idiomas indic.
- Faça o download, extraia e instale a biblioteca Huggingface Transformers neste local.
2.3 Instalando o Fairseq
- Clone este repositório. Seu diretório pai atuará como diretório inicial de todos os scripts de pré -processamento, treinamento e avaliação neste trabalho.
- Execute os seguintes comandos do diretório inicial.
cd 'work/systems/baseline-NMT/fairseq'
pip install --editable ./
- Ele instalará o sistema de linha de linha de linha de linha com base na biblioteca Fairseq junto com suas dependências. Observe que usamos várias versões dos sistemas Fairseq localizados neste local. Portanto, sempre usamos os caminhos exatos dos arquivos de treinamento e avaliação para evitar os conflitos.
2.4 Download e extrair XLM-R
- Faça o download de todos os arquivos associados ao XLM-R do hub do Huggingface. Use a opção 'Liste todos os arquivos no modelo' para visualizar e baixar os arquivos, como config.json, pytorch_model.bin, sentencepiece.bpe.model e tokenizer.json .
- Coloque esses arquivos neste diretório.
3. Pré -processamento
- Visite as bibliotecas Fairseq e Bert-NMT para se familiarizar com as etapas básicas de pré-processamento, treinamento e avaliação, à medida que nosso trabalho é construído sobre eles.
- Utilizamos o MosesDecoder para pré -processar os conjuntos de dados em inglês, mas mudamos para a biblioteca Indic NLP para os idiomas INDIX, como hindi, gujarati, bengali e marathi.
- Utilizamos o BPE da peça de sentença para a segmentação da palavra. Quando os idiomas de origem e destino compartilhavam caracteres substanciais, processamos os conjuntos de dados com o BPE conjunta usando esse script. Caso contrário, um script diferente foi usado.
- Para o conjunto de dados em inglês-hindi usado para demonstrar esse trabalho, usamos o último script.
- Defina o home_dir no diretório pai deste repositório.
- Já colocamos arquivos de trem, teste e dev no RAW_DATA_DIR . Você pode alterá -los com seus arquivos com as mesmas convenções de nomenclatura.
- Mesculamos os dados de treinamento com os enormes conjuntos de dados monolíngues para aprender melhor segmentação do BPE. Coloque esses conjuntos de dados em RAW_MONOLINGUAL_DATA_DIR . Utilizamos o maciço Corpus do Oscar em nosso trabalho, mas para esta demonstração, apenas usamos os mesmos arquivos de trem.
- Alterne entre a biblioteca Indic NLP ou Moses com base nos idiomas, comentando a função Clean_Norm_tok , conforme mostrado no script.
- Execute este script que pré -processos todos os arquivos e salva em pré -Proceded_data_dir . O diretório Tokenized-BPE contém todos os arquivos intermediários após a normalização, tokenização, etc., bem como todos os arquivos finais finais.
- Em seguida, esse script binariza os dados a serem usados pelos sistemas baseados em Fairseq e salva no diretório binário . Ele usa o Fairseq Binariser do sistema XLM-R-Fused para binarizar os arquivos para a linha de base, bem como os sistemas XLM-R-Fused. Ele usa -Bert-Model-Name para acessar o tokenizador XLM-R para tokenizar os arquivos de origem, pois eles também foram usados pelo componente XLM-R, juntamente com o codificador NMT padrão nos sistemas XLM-R-Fused.
- (Opcional) Observe que este sistema é baseado principalmente no XLM-R, mas também podemos usar outros modelos de idiomas mascarados fornecidos pela Biblioteca de Transformers do HuggingFace. Precisamos fazer algumas alterações da seguinte maneira:
- Faça o download e extraia o novo modelo de idioma, conforme mencionado na Etapa 2.4.
- Importe o tokenizer correspondente e o modelo da biblioteca de Transformers Huggingface no sistema XLM-R com o padrão, conforme mencionado abaixo:
from transformers import XLMRobertaModel
BertModel = XLMRobertaModel
from transformers import XLMRobertaTokenizer
BertTokenizer = XLMRobertaTokenizer
- Precisamos importá -los nos seguintes arquivos:
- trabalho/sistemas/xlm-r-fusado/bert-nmt/preprocess.py
- trabalho/sistemas/xlm-r-fusado/bert-nmt/interactive.py
- Work/Systems/XLM-R-Fused/Bert-NMT/Fairseq_Cli/Preprocess.py
- trabalho/sistemas/xlm-r-fusível/bert-nmt/fairseq_cli/interactive.py
- trabalho/sistemas/xlm-r-fusado/bert-nmt/fairseq/tasks/tradução.py
- trabalho/sistemas/xlm-r-fusado/bert-nmt/fairseq/modelos/transformador.py
- trabalho/sistemas/xlm-r-fusado/bert-nmt/fairseq/binarizer.py
- Além disso, precisamos alterar os tokens Start
(<s>) e final (</s>) nesses arquivos, conforme o novo modelo de idioma.
4. Sistema de NMT basal
4.1 Sistema de NMT da linha de base de treinamento
- Treine o sistema de linha de base baseado em transformadores com este script.
- Ele acumulará os gradientes para formar um tamanho de lote eficaz maior. Tamanho em lote = (número de GPUs) * ( --max-tokens ) * ( -Update-freq ).
- Ele usa uma estratégia de validação de parada antecipada com -Patiência, determinando o número máximo de pontos de verificação com as pontuações do BLEU em declínio.
- Nosso trabalho usa a arquitetura do transformador: transformador_iwst_de_en como padrão. Os sistemas fundidos XLM-R restauram os parâmetros dos sistemas de linha de base, para que suas arquiteturas sejam correspondentes. Também podemos usar outras arquiteturas maiores para o sistema de linha de base, mas precisamos fornecer a mesma arquitetura subjacente ao sistema XLM-R-Fused. Verifique este arquivo para arquiteturas adicionais que implementam a fusão baseada em atenção.
- Economiza os pontos de verificação em Baseline_NMT_CHECCETS_DIR .
4.2 Avaliando o sistema NMT de linha de base
- Avalie o sistema de linha de base com este script.
- Precisamos avaliar o arquivo de teste BPED com o melhor ponto de verificação. Use --remove-bpe = peça de sentença para remover a segmentação do BPE do arquivo de saída.
- Use o indic NLP ou o Moisés para de detectar o arquivo de saída, conforme mostrado no script.
- Este script calcula as pontuações finais do BLEU usando Sacrebleu usando o arquivo de teste intocado do idioma de destino.
5. Sistema NMT fundido XLM-R
5.1 Sistema NMT de Treinamento XLM-R
- Treine os sistemas XLM-R com este script que usará o sistema neste local.
- O BERT_NAME armazena o caminho para a variante XLM-R usada com este sistema. Podemos usar variantes pré-treinadas ou Finetuned aqui.
- Este script copia o melhor ponto de verificação do sistema de linha de base e restaura os parâmetros para treinamento adicional com o sistema XLM-R-Fused.
- Esse sistema foi criado em uma versão anterior do FairSeq, que não forneceu parada precoce, portanto, esse script salva todos os pontos de verificação para-etapas de treinamento de atualização-max , que serão avaliadas posteriormente.
- Para fusão de atenção no lado do codificador e do decodificador, use o --arch como transformador_s2_iwslt_de_en , enquanto para a fusão somente decodificadora, use Transformer_iwslt_de_en .
- Certifique -se de usar uma pequena taxa de aprendizado, pois os parâmetros já estão próximos dos níveis ótimos.
5.2 Avaliando o sistema NMT fundido XLM-R
- Avalie os sistemas XLM-R-Fused com este script, que é semelhante ao script usado para o sistema de linha de base.
- Este script usa um ponto de verificação específico para calcular a pontuação do BLEU, enquanto outro script o estende para calcular as pontuações para todos os pontos de verificação.
- Como foi mencionado antes, não há recurso de parada antecipada com este sistema. Então, salvamos todos os pontos de verificação a cada poucas épocas e os avaliamos com um conjunto de validação. Em seguida, o melhor ponto de verificação pode ser definido usando o Best_checkpoint no script anterior para a avaliação do conjunto de testes.
- Ele usa os caminhos para dois arquivos de teste diferentes que são usados por diferentes componentes dos sistemas NMT fundidos XLM-R. Test_src_bped pontos para o arquivo usado pelo codificador NMT padrão, enquanto o test_src_raw aponta para o arquivo de origem bruto que é usado pelo componente XLM-R. O arquivo bruto é necessário pelo XLM-R, pois usa sua própria tokenização interna usando o tokenizer fornecido pela Biblioteca de Transformers do Huggingface. Certifique-se de que o BERT_NAME aponte para o diretório variante XLM-R correspondente, para que ele possa acessar o tokenizer correspondente.
6. Finetuning XLM-R
6.1 variantes multilíngues e monolíngues
- Finamos os modelos XLM-R para criar as variantes multilíngues e monolíngues dos modelos pré-treinados originais.
- Indo-ar-arenito-xlm-r-Base é a variante multilíngue, criada pela base do XLM-R Finetuning com os idiomas relacionados-hindi, gujarati, marathi e bengali. Ele explora suas semelhanças sintáticas, morfológicas, ortográficas e lexicais.
- Gujarati-XLM-R-Base e Gujarati-Xlm-R-Large são as variantes monolíngues Finetuned com o conjunto de dados de Gujarati. Além disso, Gujarati-dev-xlm-R-Base é criado com o idioma Gujarati convertido ao script de Devanagari. Esses modelos foram lançados no HUGGINGFACE HUB, que estão disponíveis aqui.
- Utilizamos as variantes Pytorch do XLM-R disponíveis aqui como os modelos pré-treinados.
6.2 Preparando dados
- Seguimos principalmente este tutorial, que o incentivamos a visitar antes de prosseguir.
- Use este script para preparar os dados. Ele prepara os arquivos de treinamento e validação para um único conjunto de dados monolíngues cujo caminho é definido usando RAW_MONO_SOURCE . Em seguida, é pré -processado usando a biblioteca Indic NLP, conforme feito para os arquivos de treinamento acima.
- Neste script, Bert_Name aponta para o modelo XLM-R pré-terenciado original, usado para acessar seu dicionário.
- Em seguida, é binarizado usando outra variante da biblioteca Fairseq disponível aqui. Ele usa o Tokenizer XLM-R, que garante que nossos dados sejam tokenizados da mesma maneira que os dados originais foram feitos para pré-treinar o XLM-R.
- (Opcional) Se você deseja definir qualquer outro modelo de idioma mascarado, precisará importar esse modelo de idioma neste arquivo. Faça as seguintes alterações:
- Importe o tokenizer correspondente em vez do nosso XLMroBerTAkenizer padrão
from transformers import XLMRobertaTokenizer
BertTokenizer = XLMRobertaTokenizer
- Substitua o nome do modelo aqui
dict = BertTokenizer.from_pretrained("xlm-roberta-base")
- Substitua os tokens de início e final semelhantes a uma sugestão no pré -processamento.
- Da mesma forma, prepare os dados para outros idiomas se você deseja criar um modelo multilíngue.
6.3 Treinando e avaliando o modelo
- Use este script para definir a variante monolíngue.
- Ele usa o mesmo sistema NMT de linha de base que é usado na Etapa 4.1 para finalizar o modelo. Aqui, RESTORE_POINT aponta para o ponto de verificação do modelo pré-treinado. Use o -Task como Masked_LM para a variante monolíngue.
- Similalrly, use este script para criar a variante multilíngue. Ele usa o -Task como multilingual_masked_lm , que mescla os dados de diferentes linguagens.
- Ele também reamose para minimizar o impacto do desequilíbrio de dados, onde conjuntos de dados maiores dominam os menores. Use -Multilang-amostragem-alfa para ajustar a taxa de amostragem. Veja o papel XLM-R original [1] para obter os detalhes.
- Salvamos os pontos de verificação em intervalos regulares e escolhemos o modelo com a perda mínima de validação.
6.4 Tornando o ponto de verificação Pytorch compatível com Transformers Huggingface
- Precisamos converter o ponto de verificação Pytorch salvo em uma versão diferente compatível com a biblioteca Huggingface Transformers.
- Assumimos que você instalou a biblioteca Transformers no diretório de pacotes. Em seguida, use o seguinte comando.
python packages/transformers/src/transformers/convert_roberta_original_pytorch_checkpoint_to_pytorch.py --roberta_checkpoint_path best_ck_dir/ --pytorch_dump_folder_path ./
- Aqui, Best_CK_DIR contém o ponto de verificação do XLM-R FinetUned nomeado como Model.pt , Dict.txt e sentencepiece.bpe.model . Os dois últimos arquivos são os mesmos para os modelos pré-treinados e Finetuned, que podem ser acessados aqui. pytorch_dump_folder_path refere -se ao diretório onde a versão Pytorch compatível com Transformers precisa ser salva.
- Observe que a biblioteca Transformers teve alguns problemas com o arquivo convert_roberta_original_pytorch_checkpoint_to_pytorch.py , que corrigimos e adicionamos ao diretório Utils. Substitua este arquivo e reconstrua a biblioteca.
- (Opcional) Podemos usar os guias HuggingFace diretamente para o Finetune o modelo sem primeiro usar a biblioteca Fairseq. Achamos essa abordagem extremamente lenta devido ao mau suporte multi-GPU fornecido pelo HuggingFace. Eles implementaram multithreading sobre o multiprocessamento, o que causa uso de GPU desequilibrado. A Fairseq implementou seu próprio módulo para lidar com isso, que é discutido aqui.
- Após o Finetuning, basta usar a versão final do Pytorch para substituir os modelos pré-treinados originais para treinamento e avaliar os sistemas XLM-R-Fused.
7. Conversão de script
- Utilizamos algumas estratégias de conversão de scripts, onde tentamos explorar as semelhanças lexicais entre os idiomas relacionados usando um script comum. Usamos a biblioteca indic NLP para converter o mesmo.
- À medida que o sistema fundido XLM-R processa as mesmas frases de entrada no XLM-R, assim como o codificador NMT, tentamos combinações diferentes dos scripts para esses módulos. Por exemplo, para o par de Gujarati-Hindi, passamos frases de script de Gujarati para o módulo XLM-R, mas Gujarati no script Devanagari para o codificador NMT para maximizar a sobreposição lexical com a linguagem de destino.
- As frases nos diferentes scripts têm o mesmo significado semântico, de modo que sua fusão baseada na atenção foi possível. Verifique a tese para obter mais detalhes.
- Essa funcionalidade pode ser usada com o sistema XLM-R-Fused, alterando os arquivos de origem para serem binarsiados para o XLM-R. Isso pode ser feito usando este script, que converte esses arquivos no script de destino.
- Da mesma forma, o script pode ser usado para converter o script dos arquivos de origem a serem transmitidos para o XLM-R, bem como o codificador NMT padrão.
- Em seguida, treine a linha de base e os sistemas NMT baseados em XLM-R como antes de usar os scripts de treinamento inicial.
- Avalie esses sistemas como antes de usar os scripts de avaliação inicial. Se o idioma de destino for convertido no script da linguagem de origem, ele precisará ser convertido novamente em seu script inicial como uma etapa de pós -processamento. Isso pode ser feito usando os scripts de avaliação presentes no diretório convertido em scripts dentro da linha de base e nos diretórios de scripts de sistemas XLM-R.
8. Análise sintática
Por favor, familiarize -se com o trabalho de [3], cujo código está disponível aqui. Nosso trabalho o estende para rastrear a transferência do conhecimento sintático nos sistemas XLM-R fundidos.
8.1 Preparando dados
- Processando o conjunto de dados de dependências universais (UD)
- Utilizamos o conjunto de dados Hindi UD [5] [6] para a análise sintática.
- Use este script para processar os arquivos brutos de trem e teste UD. Ele extrairá a cabeça sintática e as relações sintáticas correspondentes dos arquivos UD.
- Em seguida, use este script para converter os arquivos acima no formato JSON usando as instruções aqui.
- Por fim, extraia as frases brutas dos arquivos acima usando este script.
- Processando arquivos de origem para inferência Fairseq
- Use os arquivos acima com as frases RAW como os arquivos de teste de origem. Avaliamos nossos melhores pontos de verificação do sistema de linha de base e XLM-R com esses arquivos.
- Pré -processo esses arquivos, conforme mencionado na Etapa 3 (pré -processamento) e prepare os arquivos binarizados para o Fairseq. Como não temos dados do lado de destino aqui, usamos um script de pré -processamento modificado para processar apenas os arquivos do lado da origem.
8.2 Extraindo mapas de atenção da linha de base e sistemas XLM-R-Fused
- Use os dados binarsiados acima para extrair os mapas de atenção do sistema XLM-R usando o script de avaliação. Da mesma forma, use este script para extrair os mapas do sistema de linha de base.
- Esses scripts usam dois sistemas diferentes construídos no sistema NMT de linha de base e no sistema NMT fundido XLM-R, que pode ser acessado aqui e aqui, respectivamente.
- Esses sistemas extraem os mapas de auto-atendimento para todas as cabeças de atenção presentes em todas as camadas do codificador do transformador. Além disso, o sistema construído sobre o XLM-R-Fused também extrai os mapas de atendimento Bert resultantes da fusão baseada em atenção das representações XLM-R e das representações do codificador NMT.
- Use o parâmetro adicional - -save_attn_maps para dar o caminho para salvar os mapas de atenção. Crie as pastas - Self , Bert e Batch_sentências dentro dela para armazenar os respectivos mapas. Batch_sentences armazena as frases correspondentes na ordem em que os mapas de atenção são extraídos. Este arquivo pode ser usado para verificar a ordem das frases processadas.
- Esses mapas serão salvos nas matrizes Numpy, onde um único arquivo contém o número de frases iguais ao tamanho do lote.
- Use este script para processar ainda mais os mapas de atenção.
- Ele cria os objetos de picles usando os mapas de atenção e os arquivos JSON.
- Em seguida, converte os mapas de atenção para os tokens de nível de BPE para o nível da palavra. Verifique a tese para obter mais detalhes.
- Para testar nosso código, você pode usar nossos arquivos de picles para os sistemas de linha de base e XLM-R que estão disponíveis aqui. Faça o download e extraia o arquivo compactado neste local. Esses arquivos de picles funcionarão com os dados pré -processados hindus UD já presentes no local mencionado.
8.3 Visualizando mapas de atenção e classificador de sondagem baseada em atenção
- Execute notebook de análise sintática disponível aqui. Point Train_Path e dev_path para os arquivos de picles do trem e teste acima. Aqui, nossos arquivos de desenvolvimento e teste são iguais, pois não usamos nenhum hiperparâmetro.
- Os pesos obtidos da linha de base e dos sistemas fundidos com XLM-R foram usados para determinar a cabeça sintática correta em diferentes camadas e cabeças de atenção.
- Possui alguns exemplos qualitativos em que uma cabeça sintática foi prevista com sucesso.
- Finalmente, fornece uma pontuação final do UAS, treinando e avaliando o classificador de investigação baseado em atenção. É necessária uma combinação ponderada dos pesos de auto-ataque fornecidos por todas as camadas e cabeças de atenção para fornecer uma medida geral do conhecimento sintático.
9. Informações adicionais
- Licenças: Observe que nosso trabalho é licenciado sob a licença do MIT. Mas usamos alguns outros trabalhos e conjuntos de dados que têm suas próprias licenças. Especificamente, todos os sistemas baseados na Biblioteca Fairseq têm suas licenças correspondentes presentes em seus respectivos diretórios. Além disso, verifique as licenças para o conjunto de dados de dependências universais do IIT Bombaim e o conjunto de dados Hindi Universal Dependências usando os links fornecidos no arquivo ReadMe. Da mesma forma, verifique a licença da Biblioteca de Transformers do HuggingFace, pois modificamos um de seus arquivos, conforme mencionado no ReadMe.
- Levante um problema se precisar de ajuda. Se você achar esse trabalho útil, sinta -se à vontade para usá -lo e cite minha tese também.
10. Referências
[1] Conneau, Alexis, et al. "Aprendizagem de representação cruzada não supervisionada em escala". Arxiv pré -impressão Arxiv: 1911.02116 (2019)
[2] Zhu, Jinhua, et al. "Incorporando Bert na tradução da máquina neural". Conferência Internacional sobre Representações de Aprendizagem. 2019
[3] Clark, K., Khandelwal, U., Levy, O., & Manning, CD (2019, agosto). O que Bert olha? Uma análise da atenção de Bert. Em Anais do Workshop da ACL de 2019 BlackBoxnlp: Analisando e interpretando redes neurais para PNL (pp. 276-286).
[4] Anoop Kunchukuttan, Pratik Mehta, Pushpak Bhattacharyya. O corpus paralelo do IIT Bombaim Inglês-Hindi. Conferência de Recursos e Avaliação de Idiomas. 2018.
[5] Riyaz Ahmad Bhat, Rajesh Bhatt, Annahita Farudi, Prescott Klassen, Bhuvana Narasimhan, Martha Palmer, Owen Rambow, Dipti Misra Sharma, Ashwini Vaidya, Sri Ramagurumurthy Vishnu e Fei Xia. O projeto Hindi/Urdu Treebank. No Handbook of Lingingistic Anotation (editado por Nancy Ide e James Pustejovsky), Springer Press. 2015.
[6] Martha Palmer, Rajesh Bhatt, Bhuvana Narasimhan, Owen Rambow, Dipti Misra Sharma, Fei Xia. Sintaxe do Hindi: anotação de dependência, estrutura do argumento do predicado lexical e estrutura de frase. Em Anais da 7ª Conferência Internacional sobre Processamento de Linguagem Natural, Icon-2009, Hyderabad, Índia, 14 a 17 de dezembro de 2009.