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.
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.
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].
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.
・ Processeur Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 6000 24 Go
・ 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
Le programme de formation est disponible sur GitHub.
nmtt_training.py
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 $.
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 **.
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.
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)} $.
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.
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
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
Encoder 6
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.
JESC Deep learning library that builds on and extends Microsoft CNTK
Natural Language : Machine Translation Part1 - Japanese-English Subtitle Corpus