[PYTHON] Natural Language: Machine Translation Part2 - Transformateur de traduction automatique neurale

Cible

Il s'agit d'une continuation de la traduction automatique à l'aide du Microsoft Cognitive Toolkit (CNTK).

Dans la partie 2, nous formerons le modèle de traduction automatique par Transformer à l'aide de l'ensemble de données bilingues japonais-anglais préparé dans la partie 1. On suppose que CNTK et NVIDIA GPU CUDA sont installés.

introduction

Dans Natural Language: Machine Translation Part1 - Japanese-English Subtitle Corpus, le corpus de sous-titres japonais-anglais [1] se traduit en japonais et en anglais. J'ai préparé.

Dans la partie 2, vous allez créer et entraîner un modèle de traduction automatique avec Transformer.

Transformer Le transformateur [2] a été proposé pour remplacer RNN [3] et CNN [4], qui étaient auparavant courants dans le traitement du langage naturel.

Dans RNN, les performances ont été améliorées par la structure de la porte et le mécanisme d'attention, mais comme RNN ne peut pas calculer la prochaine fois jusqu'à ce que le calcul de l'heure actuelle soit terminé, il n'est pas possible d'utiliser le calcul parallèle du GPU et il faut du temps pour s'entraîner. Il ya un problème.

Transformer peut effectuer des calculs parallèles par GPU pendant l'entraînement, a une structure plus simple que RNN et a la particularité de pouvoir réaliser un champ de réception plus large que CNN.

transformer.png

La partie entourée de bleu sur le côté gauche est Encoder, et la partie entourée de vert sur le côté droit est Decoder, dont chacun a 6 couches.

Comme technique pour améliorer la précision et réduire les paramètres, la couche intégrée et la couche entièrement connectée du décodeur utilisent le partage de poids [5].

Paramètres en formation

La valeur initiale de chaque paramètre est la valeur initiale de Glorot [[6]](# reference).

Puisqu'il s'agit d'un problème de classification qui prédit le mot suivant, nous avons défini la fonction de perte comme Erreur d'entropie croisée et avons adopté Adam [7] comme algorithme d'optimisation. L'hyperparamètre d'Adam $ \ beta_1 $ est défini sur 0.9 et $ \ beta_2 $ est défini sur la valeur par défaut de CNTK.

Pour le taux d'apprentissage, utilisez le taux d'apprentissage cyclique (CLR) [8], le taux d'apprentissage maximal est de 0,04, le taux d'apprentissage de base est de 1e-8, la taille du pas est 10 fois le nombre d'époques et la stratégie est exp_range, J'ai mis $ \ gamma $ à 0,99994.

La formation du modèle a couru 10 Epoch par mini-formation par lots.

la mise en oeuvre

Environnement d'exécution

Matériel

・ Processeur Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 6000 24 Go

Logiciel

・ Windows 10 Professionnel 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Cntkx 0.1.33 ・ Numpy 1.17.3 ・ Pandas 0.25.0 ・ Pièce de phrase 0.1.86

Programme à exécuter

Le programme de formation est disponible sur GitHub.

nmtt_training.py


Commentaire

Je compléterai le contenu principal de cette implémentation.

Scaled Dot-Product Attention En supposant que le tenseur constitué de l'état caché à chaque instant de l'encodeur est $ Source $ et que le tenseur constitué de l'état caché à chaque instant du décodeur est $ Target $, l'attention du produit interne de base est exprimée par la formule suivante.

Attention(Target, Source) = Target \cdot Source^T

Ici, comme le montre la figure ci-dessous, copiez $ Source $, prenez $ Target $ comme $ Query $, qui est un objet dictionnaire composé de $ Key $ et $ Value $, et normalisez le produit interne de $ Query $ et $ Key $ avec Softmax. La conversion calcule le poids d'attention et le produit interne du poids d'attention et de $ Value $.

Attention(Q, K, V) = Softmax \left( QK^T \right) V

En copiant $ Source $ vers $ Key $ et $ Value $ de cette manière, nous nous attendons à obtenir une conversion non triviale entre $ Source $ et $ Target $.

source-target_attention.png

Cependant, dans ce cas, si la dimension $ d_ {k} $ du modèle devient grande, le produit interne de $ Q $ et $ K $ devient trop grand, donc redimensionner par la racine carrée de $ d_ {k} $.

Attention(Q, K, V) = Softmax \left( \frac{QK^T}{\sqrt {d_{k}}} \right) V

Le mécanisme d'attention dans la figure ci-dessus est appelé ** Attention Source-Cible **, et le mécanisme d'attention dans la figure ci-dessous où $ Q, K, V $ sont toutes des copies de $ Source $ est appelé ** Auto-Attention **.

self_attention.png

Transformer utilise l'auto-attention dans l'encodeur et l'auto-attention et l'attention source-cible dans le décodeur. Cependant, l'auto-attention de Decoder masque les informations futures pendant la formation.

Multi-Head Attention Au lieu d'appliquer une seule attention de produit scalaire à l'ensemble, Transformer utilise une tête multiple qui se divise en plusieurs parties et joint entièrement la clé, la valeur et la requête avant d'entrer dans chaque tête. Appliquer, concaténer les sorties de chaque tête, puis appliquer à nouveau la jointure complète.

MultiHeadAttention(Q, K, V) = \left[ Attention_1(QW^Q_1, KQ^K_1, VW^V_1), ..., Attention_h(QW^Q_h, KQ^K_h, VW^V_h) \right] W

En exécutant Attention pour chacune des multiples parties de cette manière, nous nous attendons à ce que chaque tête acquière une représentation sous-spatiale différente.

Position-wise Feed-Forward Network Le réseau Feed-Forward de position applique une obligation complète à deux niveaux pour chaque position dans la longueur de séquence. Dans l'article original [1], la dimension extérieure est 512, la dimension intérieure est 2048, ce qui est quatre fois cela, et la fonction d'activation intérieure est ReLU.

FFN(x) = max(0, xW_{inner} + b_{inner})W_{outer} + b_{outer}

Positional Encoding Transformer n'a pas de structure récursive comme RNN, il ne peut donc pas prendre en compte l'ordre de longueur de séquence. Par conséquent, ajoutez les informations de position de chaque mot immédiatement après le calque d'incorporation. [9]

La formule suivante est utilisée dans le codage positionnel.

PE_{(pos, 2i)} = \sin \left( \frac{pos}{10000^{\frac{2i}{d_{k}}}} \right) \\
PE_{(pos, 2i+1)} = \cos \left( \frac{pos}{10000^{\frac{2i}{d_{k}}}} \right)

Où $ d_ {k} $ représente la dimension du calque incorporé, $ pos $ représente la position du mot et $ 2i et 2i + 1 $ représentent respectivement les dimensions paire et impaire du calque incorporé. Lorsque la longueur maximale de la série est de 97 et que la dimension de la couche incorporée est de 512, l'encodage de position est visualisé comme illustré dans la figure ci-dessous.

positional_encoding.png

Transformer utilise cette formule car $ PE_ {pos + \ tau} $ peut être représenté comme une fonction linéaire de $ PE_ {pos} $.

ici,

u_i = \frac{1}{10000^{\frac{2i}{d_{k}}}} 

Ensuite, l'expression du codage positionnel est la suivante.

PE_{(pos, 2i)} = \sin (pos \cdot u_i) \\
PE_{(pos, 2i+1)} = \cos (pos \cdot u_i)

Alors $ PE_ {pos + \ tau} $ est

\begin{align}
PE_{pos+\tau} &= \sin ((pos+\tau) \cdot u_i) \\
&= \sin (pos \cdot u_i) \cos (\tau u_i) + \cos (pos \cdot u_i) \sin (\tau u_i) \\
&= PE_{(pos, 2i)} \cos(\tau u_i) + PE_{(pos, 2i+1)} \sin (\tau u_i)
\end{align}

Elle peut être exprimée comme la somme linéaire de $ PE_ {(pos, 2i)}, PE_ {(pos, 2i + 1)} $.

résultat

Training loss and perplexity La figure ci-dessous est une visualisation de la fonction de perte et des journaux de taux de faux positifs pendant l'entraînement. Le graphique de gauche montre la fonction de perte, le graphique de droite montre la Perplexité, l'axe horizontal montre le nombre d'époques et l'axe vertical montre la valeur et la Perplexité de la fonction de perte, respectivement.

jesc_logging.png

Validation BLEU score Maintenant que le modèle de traduction japonais-anglais a été formé, j'ai essayé d'évaluer les performances en utilisant les données de vérification. Nous avons adopté la méthode gourmande de vérification.

La sous-étude d'évaluation bilingue (BLEU) [10] a été calculée pour cette évaluation du rendement. Le BLEU a été calculé en utilisant nltk et lissé par le NIST. L'utilisation de dev comme données de validation a donné les résultats suivants: Le nombre après le trait d'union représente n-gramme.

BLEU-4 Score 1.84
BLEU-1 Score 12.22

Visualisation de l'auto-attention

Transformer peut visualiser les cartes Attention. La figure ci-dessous montre une visualisation de la carte Attention pour chaque tête des 5e et 6e couches d'auto-attention de l'encodeur, et la carte des couleurs est affichée comme chaude.

Encoder 5 enc5.png

Encoder 6 enc6.png

Dans la 5ème couche, chaque tête semble prêter attention à un mot spécifique, mais la tête du milieu dans la 6ème couche ne semble pas bien fonctionner.

référence

JESC Deep learning library that builds on and extends Microsoft CNTK

Natural Language : Machine Translation Part1 - Japanese-English Subtitle Corpus

  1. Reid Pryzant, Youngjoo Chung, Dan Jurafsky, and Denny Britz. "JESC: Japanese-English Subtitle Corpus", arXiv preprint arXiv:1710.10639 (2017).
  2. Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, and Illia Polosukhin. "Attention Is All You Need", Advances in neural information processing systems. 2017. p. 5998-6008.
  3. Yougnhui Wu, Mike Schuster, Zhifen Chen, Quoc V. Le, Mohammad Norouzi, et. al. "Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation", arXiv preprint arXiv:1609.08144, 2016.
  4. Jonas Gehring, Michael Auli, David Grangier, Denis Tarats, and Tann N. Dauphin, "Convolutional Sequence to Sequence Learning", arXiv preprint arXiv:1705.03122 (2017).
  5. Ofir Press and Lior Wolf. "Using the Output Embedding to Improve Language Models.", arXiv preprint arXiv:1608.05859 (2016).
  6. Xaiver Glorot and Yoshua Bengio. "Understanding the difficulty of training deep feedforward neural networks", Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics. 2010, p. 249-256.
  7. Diederik P. Kingma and Jimmy Lei Ba. "Adam: A method for stochastic optimization", arXiv preprint arXiv:1412.6980 (2014).
  8. Leslie N. Smith. "Cyclical Learning Rates for Training Neural Networks", 2017 IEEE Winter Conference on Applications of Computer Vision. 2017, p. 464-472.
  9. Sainbayer Sukhbaatar, Arthur Szlam, Jason Weston, and Rob Fergus, "End-To-End Memory Networks", Advances in Neural Information Processing Systems. 2015. p. 2440-2448.
  10. Kishore Papineni, Salim Roukos, Todd Ward, and Wei-Jing Zhu. "BLEU: a Method for Automatic Evaluation of Machine Translation", Proceedings of the 40-th Annual Meeting of the Association for Computational Linguistics (ACL). 2002, p. 311-318.

Recommended Posts

Natural Language: Machine Translation Part2 - Transformateur de traduction automatique neurale
Essayons la traduction automatique neuronale avec Transformer
Langage naturel: Word2Vec Part3 - Modèle CBOW
Langage naturel: Word2Vec Part1 - Corpus japonais
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
Langage naturel: Doc2Vec Part2 - Classification des documents
Langage naturel: Word2Vec Part2 - Modèle de saut-gramme
Langage naturel: BERT Part1 - Corpus Wikipedia japonais
Langage naturel: Doc2Vec Part1 --livedoor NEWS Corpus
Langage naturel: BERT Part2 - Préentraînement non supervisé ALBERT
Quoi qu'il en soit, classez immédiatement le langage naturel [simple transformateur, transformateur]
[Traitement du langage naturel / PNL] Comment effectuer facilement une traduction arrière par traduction automatique avec Python
[Traitement du langage naturel] Prétraitement avec le japonais
Langage naturel: Word2Vec Part1 - Corpus japonais
Langage naturel: BERT Part1 - Corpus Wikipedia japonais
Natural Language: Machine Translation Part2 - Transformateur de traduction automatique neurale
Langage naturel: BERT Part2 - Préentraînement non supervisé ALBERT
Quoi qu'il en soit, classez immédiatement le langage naturel [simple transformateur, transformateur]
Python: traitement du langage naturel
RNN_LSTM2 Traitement du langage naturel
Une introduction approximative à la bibliothèque de traduction automatique neuronale
Modèle utilisant un réseau neuronal convolutif dans le traitement du langage naturel
Python: traitement du langage naturel
RNN_LSTM2 Traitement du langage naturel