Le transformateur illustré

Illustrated Transformer



Avant-propos

Traduire un très bon article expliquant l'article de Transformer, Lien d'origine
dans le précédent article L'attention est devenue une méthode omniprésente dans le modèle d'apprentissage en profondeur. C'est une idée qui aide à améliorer l'effet de traduction de NMT (Neural Machine Translation). Dans ce blog, nous analysons le Transformer, qui étend l'attention pour accélérer la formation et g Les performances NMT d'Oogle sont exceptionnelles. Cependant, son plus grand avantage est qu'il peut être mis en parallèle. En fait, Google Cloud recommande Transformer comme modèle de dérivation du cloud TPU. Désassemblons maintenant Transformer pour voir comment cela fonctionne.
Le transformateur est à ' L'attention est tout ce dont vous avez besoin 'Proposé dans la demande de TF est Tensor2Tensor Sous-module. L’équipe PNL de Harvard a produit la PyTorch correspondante Description du guide . Le but de cet article est de simplifier la difficulté et d'expliquer les concepts étape par étape, dans l'espoir de faciliter la compréhension des débutants.



Un look de haut niveau



Nous considérons d'abord le modèle entier comme une boîte noire, comme dans la traduction automatique, en acceptant une phrase d'une langue comme entrée, puis en la traduisant dans une autre langue de sortie.



Regardez de plus près, qui consiste en un composant de codage, un composant de décodage et une couche de connexion entre eux.



Le composant de codage est une pile de six couches de codeurs, et le composant de décodage est également un décodeur à six couches.

Le codeur a une structure complètement identique, maisNe partagez pas les paramètresChaque encodeur peut être démonté dans les deux mots suivants.

L'entrée de l'encodeur passe d'abord par une couche d'auto-attention qui aide l'encodeur à voir d'autres mots dans la séquence d'entrée lorsqu'il code un mot. Plus tard, nous examinerons de plus près la structure interne de l'attention personnelle.
La sortie de l'auto-attention s'écoule vers un réseau aller, et le réseau aller correspondant à chaque emplacement d'entrée est indépendant l'un de l'autre.
Le décodeur a également ces sous-couches, mais une couche d'attention est ajoutée entre les deux sous-couches, ce qui aide le décodeur à se concentrer sur les parties pertinentes de la phrase d'entrée, modèle seq2seq L'effet Attention est similaire.

Faire entrer les tenseurs dans l'image

Maintenant, nous analysons les principaux composants du modèle, en commençant par vector / Tensor, puis comment ils circulent à travers les différents composants et la sortie.
Tout comme l'exemple courant des applications PNL, utilisez d'abord le mot d'entrée algorithme d'intégration Transformez-vous en vecteur.

Chaque mot est mappé à un vecteur de 512 dimensions, où le vecteur est représenté par boîte

La vectorisation des mots se produit uniquement à l'entrée du codeur de niveau le plus bas, de sorte que chaque codeur reçoit une liste (chaque élément est un vecteur de mot de 512 dimensions), sauf que l'entrée de l'autre codeur est la précédente. La sortie du codeur. La taille de la liste est un super-paramètre qui peut être défini, généralement la longueur de la phrase la plus longue de l'ensemble d'apprentissage.
Après avoir vectorisé les séquences d'entrée, elles traversent les deux sous-couches suivantes du codeur.

Ici, vous pouvez voir une fonctionnalité clé de Transformer, où chaque mot ne passe que par son propre chemin d'encodeur. Dans la couche d'auto-attention, ces chemins sont interdépendants. La couche réseau directe n'a pas ces dépendances. , mais ces chemins peuvent être exécutés en parallèle tout en traversant le réseau aller.

Maintenant, nous encodons!

Comme mentionné précédemment, le codeur reçoit une liste de vecteurs pour l'entrée. Il est ensuite envoyé au traitement d'auto-attention, puis au réseau de transfert et enfin au codeur suivant.

Le vecteur de mot pour chaque emplacement est envoyé au module d'auto-attention, puis au réseau aller (la structure du réseau est identique pour chaque vecteur)

Auto-attention à un niveau élevé

Ne soyez pas dérouté par le mot auto-attention, il semble que tout le monde le connaisse, mais avant de lire l'article Attention is All You Need, je n'ai personnellement pas compris le concept. Ci-dessous, nous décomposons progressivement comment cela fonctionne.
Prenons l'exemple de la phrase suivante, comme la phrase d'entrée «L'animal n'a pas traversé la rue parce qu'il était trop fatigué» que nous voulons traduire. Que signifie «cela» dans une phrase? Est-ce que «cela» fait référence à la «rue» ou à «l'animal»? Une question simple pour les gens, mais pas simple pour un algorithme.
Lorsque le modèle traite le mot «ça», l'attention personnelle permet d'associer «ça» et «animal». Lorsque le modèle traite des mots à chaque emplacement, l'auto-attention permet au modèle de voir d'autres informations d'emplacement pour la phrase comme un indice secondaire pour mieux coder le mot actuel. Si vous êtes familier avec RNN, vous pouvez penser à la façon dont l'état caché du RNN permet au vecteur de mot précédent d'interpréter le vecteur d'interprétation du mot courant. Transformer utilise l'attention personnelle pour coder la compréhension des mots apparentés dans le mot courant.

Lors de l'encodage de 'it' (la sortie finale de l'encodeur), une partie de l'attention est focalisée sur 'l'animal' et sa représentation est fusionnée dans l'encodage de 'it'

L'image ci-dessus est Ordinateur portable Tensor2Tensor Exemple de visualisation

Auto-attention en détail

Voyons d'abord comment calculer le vecteur de l'attention personnelle, puis voyons comment le calculer dans une matrice.
premier pas Selon le vecteur d'entrée du codeur, trois vecteurs sont générés. Par exemple, pour chaque vecteur de mot, query-vec, key-vec, value-vec sont générés, et la méthode de génération est multipliée respectivement par trois matrices, et ces matrices sont dans le processus d'apprentissage. Besoin d'apprendre. [Remarque: tous les vecteurs de mots ne bénéficient pas de 3 matrices, mais toutes les entrées partagent 3 matrices de transformation La matrice de poids est une matrice de transformation basée sur la position d'entrée Il y a un point à essayer. Si chaque mot a une matrice de conversion, sera-t-il plus efficace? 】
Notez que les dimensions de ces nouveaux vecteurs sont plus petites que les dimensions du vecteur mot d'entrée (512–> 64), pas nécessairement petites, afin de rendre le calcul de l'attention multi-têtes plus stable.

Multipliez par W ^ q pour obtenir la requête

Qu'est-ce que la soi-disant requête / clé / valeur-vec?
Ce type d'extraction est bon pour le calcul et la réflexion sur l'attention. Après avoir lu l'attention suivante, vous aurez une meilleure compréhension des rôles de ces vecteurs.
Deuxième étape Calculer l'attention, c'est calculer un score. Pour l'expression «Thinking Matchines», calculez le score d'attention pour «Thinking» (pos # 1). Nous devons calculer le score d'évaluation pour chaque mot et «Pensée». Ce score détermine l'attention sur laquelle chaque mot d'entrée doit se concentrer lors de l'encodage de «Pensée» (une position fixe).
Ce score est obtenu par produit scalaire correspondant au vecteur de requête et au key-vec de tous les mots. Ainsi, lorsque nous traitons la position n ° 1, le premier score est le produit scalaire de q1 et k1, et le second score est le produit scalaire de q1 et k2.

Étapes 3 et 4 , divisé par 8 (= ), le gradient sera donc plus stable. Ajoutez ensuite l'opération softmax, en normalisant les scores pour que tous soient positifs et que la somme soit 1.

Le score softmax détermine le degré d'expression (attention) de chaque mot à cet endroit. De toute évidence, les mots dans cette position devraient avoir le score normalisé le plus élevé, mais la plupart du temps, il est toujours utile de prêter attention aux mots pertinents du mot.
la cinquième étape , multipliez le score softmax par value-vec. Conservez la valeur du mot d'intérêt et affaiblissez la valeur du mot sans rapport.
Étape 6 , additionnant tous les vecteurs de pondération pour produire la sortie de l'auto-attention à cette position.

Ce qui précède est le processus de calcul d'auto-attention, et le vecteur généré s'écoule dans le réseau aller. Dans les applications pratiques, les calculs ci-dessus sont effectués dans une matrice plus rapide. Ci-dessous, nous examinons le calcul de la matrice au niveau du mot.

Calcul matriciel de l'auto-attention

premier pas , calculer la matrice requête / clé / valeur, fusionner tous les vecteurs de mot d'entrée dans une matrice d'entrée Et multipliez-les par la matrice de poids

Chaque ligne de la matrice d'entrée X représente un vecteur mot de la phrase d'entrée

Enfin Puisque nous utilisons le traitement matriciel, combinez les étapes 2 à 6 dans une formule qui calcule la sortie de la couche d'auto-attention.

Calcul d'auto-attention sous forme matricielle

La bête à plusieurs têtes

Le document augmente encore le mécanisme à plusieurs têtes de l'auto-attention, améliorant l'effet de la couche d'attention de deux manières:

  1. Le mécanisme haussier étend la capacité du modèle à se concentrer sur différents endroits. Dans l'exemple ci-dessus, z1 ne contient qu'une petite quantité d'informations sur d'autres mots, uniquement déterminées par les mots réels. Dans d'autres cas, comme la traduction «L'animal n'a pas traversé la rue parce qu'il était trop fatigué», nous voulons savoir à quoi fait référence le mot «il».
  2. Le mécanisme multi-têtes confère de multiples sous-expressions d'attention. Comme le montre l'exemple ci-dessous, il y a plusieurs ensembles de requête / clé / matrice de valeur sous la longue tête, pas seulement un ensemble (8 têtes dans l'article). Chaque groupe est initialisé de manière aléatoire et, après l'apprentissage, les vecteurs d'entrée peuvent être mappés dans différents espaces de sous-expression.

Chaque tête a un ensemble de matrice Q / K / V

Si nous calculons l'auto-attention à plusieurs têtes, il y a huit ensembles différents de matrices Q / K / V, et nous obtenons huit matrices différentes.

Cela cause des problèmes. Le réseau de transfert ne peut pas recevoir huit matrices. Au lieu de cela, on s'attend à ce que l'entrée soit une matrice, il existe donc un moyen de traiter les huit matrices suivantes en une seule matrice.

Ce qui précède est le contenu du mécanisme d'auto-attention multi-têtes. Je pense que ce n'est qu'une partie de la matrice. Essayons de les mettre sur un graphique et visualisons-le comme suit.

Maintenant, après avoir ajouté des têtes d'attention, repensez aux têtes d'attention qui seront concentrées lors du codage «it».

Lors de l'encodage de «ça», une tête d'attention est concentrée sur «l'animal» et l'autre tête sur «fatigué». Dans un sens, le modèle synthétise «animal» et «fatigué» pour l'expression de «ça».

Si nous mettons toutes les têtes d'attention dans l'image, il est difficile de l'expliquer intuitivement.

Représentation de l'ordre de la séquence à l'aide du codage positionnel

Jusqu'à présent, nous n'avons pas discuté de la façon de comprendre l'ordre des mots dans l'instruction d'entrée.
Pour résoudre le problème de l'utilisation de l'ordre des mots, Transformer a ajouté une paire de vecteurs pour chaque mot. Ces vecteurs suivent le modèle spécifié d'apprentissage du modèle pour déterminer la position du mot, ou des exemples de différents mots dans la séquence. . Pour comprendre cela, ajoutez ces valeurs pour fournir la distance entre les vecteurs de mots lorsqu'ils sont mappés sur le vecteur Q / K / V et l'attention multipliée par points.

Afin de fournir les informations d'ordre des mots au modèle, un nouveau vecteur d'emplacement emb est ajouté et chaque valeur vectorielle suit le modèle spécifié.

Si vous supposez que le vecteur de position a 4 dimensions, le vecteur de position réel ressemblera à ceci:

Un exemple de représentation vectorielle avec seulement 4 dimensions

Quel est le mode dit désigné?
Dans la figure ci-dessous, chaque ligne représente une position pos-emb, donc la première ligne est le vecteur que nous allons ajouter au premier mot vecteur de la phrase. Chaque ligne a 512 valeurs, chaque valeur est entre [-1, 1], et nous allons peindre pour pouvoir visualiser le motif.

Un vrai exemple est 20 mots, chaque mot 512 dimensions. Vous pouvez observer la séparation significative au milieu, car le côté gauche est généré par la fonction sinus et le côté droit est généré par le cosinus.

La méthode de codage du vecteur de position est mentionnée dans la section 3.5 de l'article, et vous pouvez également voir le code. get_timing_signal_ld () Il n'y a pas qu'une seule façon de positionner le code. Il est à noter que la méthode de codage doit être capable de gérer des séquences de longueur inconnue.

Les résidus

Un détail qui mérite l'attention dans la structure du codeur est que dans chaque sous-couche (slef-attention, ffnn), il y a une connexion résiduelle, suivie de normalisation des couches

Si nous visualisons les opérations de vecteur et de norme de couche, cela ressemblerait à ceci:

La même chose est vraie dans le décodeur. On suppose que le codeur à deux couches + le décodeur à deux couches constitue un transformateur, et sa structure est la suivante:

Le côté décodeur

Maintenant que nous avons vu la plupart des concepts du côté des encodeurs, nous avons une compréhension de base du fonctionnement des décodeurs. Voyons comment ils travaillent ensemble.
Le codeur commence par le traitement de la séquence d'entrée, et la sortie du codeur final est convertie en K et V, qui sont utilisés par la couche «d'attention codeur-décodeur» de chaque décodeur. Aidez le décodeur à se concentrer sur l'emplacement approprié de la séquence d'entrée.

Après le codage, c'est le processus de décodage que chaque étape de décodage délivre un élément en tant que séquence de sortie.

Les étapes suivantes sont répétées jusqu'à ce qu'un symbole spécial apparaisse indiquant que le décodeur a terminé la sortie de traduction. La sortie de chaque étape est transmise au décodeur suivant. Comme pour le traitement de l'entrée du codeur, un vecteur de position est ajouté à l'entrée du décodeur.

La couche d'auto-attention du décodeur est légèrement différente de celle du codeur. Dans le décodeur, la couche d'auto-attention permet uniquement d'attirer l'attention sur les emplacements antérieurs à la sortie de courant. Avant softmax, ceci est réalisé en occultant les futurs emplacements (définissez-les sur -inf).
La couche «Encoder-Decoder Attention» fonctionne de la même manière que l'auto-attention à plusieurs têtes. Sauf pour un point, il prend la sortie de la couche précédente et la convertit en une matrice de requête, recevant la clé du dernier encodeur de couche. Et la matrice de valeur pour faire la matrice de clé et de valeur.

La couche finale linéaire et Softmax

Le décodeur sort enfin le vecteur virgule flottante. Comment le transformez-vous en un mot? C'est le travail principal de la couche linéaire finale et de la couche softmax.
La couche linéaire est une couche entièrement connectée simple qui mappe la sortie finale du décodeur à un très grand vecteur logits. Supposons que le modèle soit connu pour avoir 10 000 mots (le vocabulaire de la sortie) appris à partir de l'ensemble d'apprentissage. Ensuite, le vecteur logits a 10 000 dimensions, et chaque valeur représente une valeur de propension possible pour un mot.
La couche softmax convertit ces scores en valeurs de probabilité (à la fois positives et additionnées à 1), et le mot de la dimension correspondant à la valeur la plus élevée est le mot de sortie pour cette étape.

Récapitulatif de la formation

Maintenant que nous avons vu le processus avancé d'un transformateur formé, il est également très utile de se pencher sur le concept de formation.
Pendant l'entraînement, le modèle passera par le processus avancé décrit ci-dessus, et lorsque nous nous entraînons sur l'ensemble d'apprentissage des marqueurs, nous pouvons comparer la sortie prévue avec la sortie réelle.
Pour la visualisation, supposons que la sortie ne contienne que 6 mots ('a', 'am', 'i', 'thanks', 'student', '')

Le vocabulaire du modèle est généré lors du prétraitement avant l'entraînement.

Une fois le vocabulaire défini, nous pouvons construire un vecteur de même dimension pour représenter chaque mot, tel que l'encodage one-hot. L'exemple suivant code «am».

Par exemple, en utilisant un vocabulaire de sortie de codage à chaud

Discutons de la perte de perte du modèle, des indicateurs utilisés pour l'optimisation pendant le processus de formation et guidons l'apprentissage pour obtenir un modèle très précis.

La fonction de perte

Nous utilisons un exemple simple pour démontrer la formation, comme la traduction. merci 'Cette'. Cela signifie que la distribution de probabilité de la sortie pointe vers le mot «merci», mais comme le modèle n'est pas formé pour être initialisé au hasard, il est peu probable qu'il s'agisse de la sortie attendue.

Étant donné que les paramètres du modèle sont initialisés de manière aléatoire, le modèle non entraîné génère des valeurs aléatoires. Nous pouvons comparer la sortie réelle, puis utiliser l'erreur post-transfert pour ajuster les poids du modèle afin que la sortie soit plus proche de la sortie réelle.

Comment comparer deux distributions de probabilité? Adoption simple entropie croisée ou Divergence Kullback-Leibler L'un d'eux.
Étant donné qu'il s'agit d'un exemple extrêmement simple, le cas le plus réel est d'utiliser une phrase comme entrée. Par exemple, l'entrée est «je suis étudiant» et la sortie attendue est «je suis étudiant». Dans cet exemple, nous nous attendons à ce que le modèle génère une distribution de probabilité continue qui satisfait aux conditions suivantes:
1 Chaque distribution de probabilité a la même dimension que le vocabulaire.
2 La première distribution de probabilité a la valeur de probabilité prédite la plus élevée pour «i».
3 La deuxième distribution de probabilité a la valeur de probabilité prédite la plus élevée pour «suis».
4 Jusqu'à ce que la cinquième sortie pointe vers la balise «».

Pour une phrase, la distribution de probabilité cible du modèle d'apprentissage

Après un temps d'entraînement suffisant sur un ensemble d'entraînement suffisamment grand, la distribution de probabilité que nous prévoyons de produire est la suivante:

Après l'entraînement, la sortie du modèle est la traduction attendue. Bien entendu, cela ne signifie pas que le processus provient d'un ensemble de formation. Notez que chaque emplacement a une valeur, même s'il n'a pas grand-chose à voir avec la sortie, c'est là que softmax peut aider à l'entraînement.

Maintenant, comme le modèle ne produit qu'un seul ensemble de sorties par étape, en supposant que le modèle choisit la probabilité la plus élevée et rejette les autres parties, c'est une façon de produire une prédiction, appelée décodage gourmand. L'autre méthode est la recherche par faisceau. Chaque étape ne conserve que les deux sorties avec la probabilité la plus élevée de la tête. Selon les deux sorties, l'étape suivante est prédite, puis les deux sorties à forte probabilité de la tête sont réservées et répétées jusqu'à la fin de la prédiction. Top_beams est un ajustement testable super-paramètre.

Allez-y et transformez-vous

J'espère que cet article pourra aider les lecteurs à avoir un effet brise-glace sur la compréhension du concept principal de Transformer. Si vous souhaitez en savoir plus, les étapes suivantes sont recommandées:
1 Lire L'attention est tout ce dont vous avez besoin Paper, article de blog de Transformer Transformer: Une nouvelle architecture de réseau neuronal pour la compréhension du langageTensor2Tensor Mode d'emploi.
2 Regarder ' Discours de Łukasz Kaiser ', peignez l'ensemble du modèle et ses détails.
3 Lisez le projet Jupyter Notebook fourni dans le cadre du dépôt Tensor2Tensor
4 Essayez le projet suivant Tensor2Tensor

Travaux connexes

  1. Convolutions séparables en profondeur pour la traduction automatique neuronale
  2. Un modèle pour tous les apprendre
  3. Autoencodeurs discrets pour les modèles de séquence
  4. Générer Wikipedia en résumant de longues séquences
  5. Transformateur d'image
  6. Conseils de formation pour le modèle de transformateur
  7. Auto-attention avec des représentations de position relative
  8. Décodage rapide dans les modèles de séquence à l'aide de variables latentes discrètes
  9. Adafactor: taux d'apprentissage adaptatifs avec coût de mémoire sublinéaire

Reconnaissance:
Merci à Illia Polosukhin, Jakob Uszkoreit, Llion Jones, Lukasz Kaiser, Niki Parmar et Noam Shazeer pour leurs commentaires sur les versions antérieures de cet article.
S'il te plait, frappe-moi Twitter pour toute correction ou rétroaction.