[PYTHON] De l'attention de Zero Tsuku 2 au transformateur

1.Tout d'abord

J'ai étudié le ** Deep Learning2 Natural Language Processing ** à partir de zéro. Il y a ** Attention ** au chapitre 8, mais seulement 4 pages ont été consacrées à ** Transformer **, qui est la base de ** BERT **, qui est actuellement courant.

En fait, ce n'est pas déraisonnable, car Zero Tsuku 2 a été publié en juillet 2018, Transformer en décembre 2017 et BERT en octobre 2018.

Cette fois, je voudrais passer de ** Zero Tsuku 2 Attention ** à l'article de ** Transformer ** ** Attention Is All You Need **, qui peut être considéré comme la base du traitement actuel du langage naturel.

2. Qu'est-ce que Zero Tsukuri 2 Attention?

スクリーンショット 2020-09-04 19.00.17.png Dans le chapitre 8 Attention de Zero Tsuku 2, afin d'améliorer les performances du ** modèle de traduction Seq2Seq **, ** faites attention au "I" de l'Encoder lors de la traduction de "I" avec Decoder **. Mettre en œuvre Attention **.

スクリーンショット 2020-09-05 11.59.10.png

Tout d'abord, avec Attention Weight, calculez le ** produit interne ** pour trouver la similitude entre le vecteur «I» du décodeur et chaque vecteur mot de l'encodeur, et multipliez le résultat par ** Softmax ** pour obtenir le ** poids a. ** Demander. Cependant, en donnant la priorité à la facilité de compréhension, le produit interne est calculé par ** multiplication + axe H SUM **.

Ensuite, dans Attention Sum, la ** somme pondérée ** de chaque vecteur de mot de Encoder est calculée à partir du poids a, et ** Context Vector ** est obtenu. Ce vecteur de contexte est un reflet fort du vecteur de mot «je», indiquant que «je» devrait faire attention à «je».

3. De l'attention de Zero Tsuku 2 au transformateur

Le processus de mise à zéro 2 donne la priorité à la facilité de compréhension, et est calculé intentionnellement par ** multiplication + axe SOMME ** sans utiliser ** produit interne **. Ensuite, que se passe-t-il si vous calculez correctement en utilisant le produit interne?

スクリーンショット 2020-09-04 19.28.16.png

Le calcul du poids et le calcul de la somme des poids seront actualisés comme ceci s'ils se présentent sous la forme d'un produit intérieur. C'est plus rationnel, n'est-ce pas?

À propos, dans Attention, en général, la cible à calculer est ** Query **, l'ensemble de vecteurs de mots utilisé pour le calcul de similitude est ** Key ** et l'ensemble de vecteurs utilisé pour le calcul de la somme pondérée est ** Value **. dire. Si vous examinez la figure pour refléter ces derniers,

スクリーンショット 2020-09-04 19.33.57.png

La cible à calculer ** "I" est Requête **, l'ensemble de vecteurs de mots utilisé pour le calcul de similarité ** hs est Clé ** et l'ensemble de vecteurs utilisé pour le calcul de somme pondérée ** hs est Valeur **. Dans Zero Tsuku 2, la clé et la valeur sont les mêmes, mais rendre les deux indépendants améliorera l'expressivité.

Une autre chose, en général, l'attention est divisée en fonction de l'origine de l'entrée.

スクリーンショット 2020-09-04 19.51.27.png Lorsque Qurery et Key / Value proviennent de différents endroits, cela s'appelle ** Sorce Taget Attention **, et lorsque Quety, Key et Value viennent tous du même endroit (Self), cela s'appelle ** Self Attention **. .. Attention avec zéro s'appelle Sorce Taget Attention.

Maintenant, changeons un peu le style d'écriture et ajoutons un terme au format ** Self Attention **.

スクリーンショット 2020-09-04 19.54.55.png

J'ai ajouté la section ** divisée par la racine dk **. La raison de la division par la racine dk est que s'il y a une valeur trop grande dans le calcul du produit interne, lors de la multiplication par ** Softmax **, les autres valeurs seront 0 et ** le dégradé disparaîtra **, alors évitez cela. Faire. dk est le nombre de dimensions de l'expression distribuée par mot, qui est de 512 dans l'article.

En passant, Transformer n'utilise aucun RNN qui nécessite un traitement séquentiel, et se compose uniquement de Attention qui permet un traitement parallèle. Par conséquent, il n'est pas nécessaire de calculer chaque requête une par une, et ** toutes les requêtes peuvent être calculées en même temps **, de sorte qu'elle peut être exprimée comme suit.

![Capture d'écran 2020-09-04 23.07.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/ebf59620-7432-2f75-6714- 4e37375c7af9.png)

Dans le document L'attention est tout ce dont vous avez besoin, cela s'appelle ** Attention au produit scalaire à l'échelle ** et est exprimé par la formule suivante. C'est le cœur de Transformer.

スクリーンショット 2020-09-05 12.06.29.png

4.Attention Is All You Need Maintenant, pour comprendre l'article ** Attention Is All You Need ** publié en décembre 2017, je vais vous expliquer les chiffres qui apparaissent dans l'article. スクリーンショット 2020-09-05 12.13.10.png

Tout d'abord, le diagramme Attention scaled Dot-product. ** Matmul ** est le produit interne et ** Scale ** est la racine dk. ** Mask (opt) ** signifie masquer la partie remplie lorsque le nombre de mots à saisir est inférieur à la longueur de la séquence. Vous pouvez voir qu'il est codé comme la formule Attention (Q, K, V).

スクリーンショット 2020-09-05 12.17.11.png

Il s'agit de ** Attention multi-têtes **, y compris l'attention du produit scalaire mentionné précédemment. Une sortie de l'étage précédent est entrée comme Q, K, V via trois ** linéaires (couches entièrement connectées) **. En d'autres termes, Q, K et V sont les sorties de l'étape précédente multipliées respectivement par les poids Wq, Wk et Wv, et ces poids sont obtenus par apprentissage.

Un ensemble de requête, clé, valeur est appelé ** tête **. Il est préférable d'avoir plusieurs petites têtes, de calculer l'expression latente pour chacune et de concaténer à la fin, plutôt que d'avoir une seule grosse tête. C'est pourquoi nous utilisons Multi-Head. Dans l'article, la sortie de l'étape précédente est de 512 dimensions, et elle est divisée en 8 par la tête de 64 dimensions.

スクリーンショット 2020-09-05 12.29.03.png

La configuration globale est le ** modèle de traduction encodeur-décodeur **. Le but est d'arrêter le RNN du calcul séquentiel et de configurer uniquement Attention qui peut effectuer un calcul parallèle pour accélérer le traitement. Nx signifie que la même configuration est répétée N fois, et N = 6 dans le papier.

① Input Embedding Les entrées sont (nombre de lots, nombre de colonnes d'ID de mot). Produit un vecteur converti à l'aide d'une représentation de distribution de mots pré-entraînée (nombre de lots, nombre de colonnes d'ID de mot, nombre de dimensions). Le nombre de dimensions du papier est de 512.

② Positional Encoding Lors du calcul de la somme de poids, ** les informations sur l'ordre des mots sont perdues ** ("Je l'aime" et "elle m'aime" ne peuvent pas être distinguées), donc les informations de position des mots (fonction sin) dans l'expression distribuée Et le modèle de la fonction cos) sont ajoutés pour faciliter l'apprentissage des ** positions relatives des mots **. En d'autres termes, le même mot aura des vecteurs différents s'il se trouve à des endroits différents. La formule des informations de position dans le document est la suivante. スクリーンショット 2020-09-05 12.39.28.png

③ Add & Norm Utilisez ** Ignorer la connexion ** pour effectuer la normalisation par ** Normalisation de couche ** et la régularisation par abandon. La normalisation des couches normalise chaque unité de données (phrase) du lot, pas en unités de lot.

④ Feed Foward La sortie de la couche Attention est convertie en entités avec deux couches entièrement connectées.

⑤ Masked Multi-Head Attention スクリーンショット 2020-09-05 11.48.38.png Lors du calcul de l’attention de «je», si vous incluez «suis», «a» et «chat», vous pourrez annuler le mot à prédire, afin de rendre le mot précédent dans Key invisible Mettez le masque.

5. transformateur au-delà

Transformer a été proposé comme modèle de traduction, mais au fur et à mesure que la recherche progressait, il est devenu clair que la capacité de ** Self Attention à extraire le sens des phrases ** était assez puissante, et divers développements ont été réalisés, donc c'est facile. Je vais aborder. スクリーンショット 2020-09-04 23.23.34.png

Juin 2018. En utilisant uniquement le côté encodeur de Transformer, les performances ont été améliorées par l'apprentissage en deux étapes de ** pré-apprentissage + réglage fin **. Le pré-apprentissage est ** deviner quel est le mot suivant **, et il est mauvais de connaître les informations futures, donc je masque les phrases suivantes.

C'est un fait bien connu que structurellement, il existe un inconvénient en ce que le contexte arrière ne peut pas être utilisé, et si le contexte arrière peut être utilisé, une amélioration supplémentaire des performances peut être obtenue.

スクリーンショット 2020-09-04 23.24.25.png

Février 2018. Afin d'utiliser le contexte arrière d'une manière ou d'une autre, j'ai abandonné le mérite du traitement parallèle par Attention et j'ai essayé d'utiliser le contexte arrière en utilisant le LSTM bidirectionnel multicouche. Il s'avère que cela améliore les performances.

スクリーンショット 2020-09-04 23.25.04.png

Octobre 2018. Une méthode révolutionnaire de traitement du langage naturel ** BERT ** a été annoncée. Bref, en remplaçant le pré-apprentissage GPT par les deux tâches suivantes, nous avons réalisé un traitement parallèle en utilisant le contexte du contexte. Pour ainsi dire, la naissance d'un transformateur bidirectionnel.

** ① Modèle de langage masqué **: résolvez le problème de remplissage du blanc. Choisissez 15% des mots, masquez 80%, remplacez 10% par d'autres mots, laissez 10% tels quels. ** ② Prédiction de la phrase suivante **: détermine si les contextes des deux phrases sont liés.

Recommended Posts

De l'attention de Zero Tsuku 2 au transformateur
Apprentissage amélioré pour apprendre de zéro à profond
Résumé de vtkThreshold (mis à jour de temps en temps)
Introduction à Scapy ① (De l'installation à l'exécution de Scapy)
Let Code Day6 commençant à zéro "1342. Nombre d'étapes pour réduire un nombre à zéro"
Récapitulatif des options gcc (mises à jour de temps en temps)
[Procédure d'installation Ansible] De l'installation à l'exécution du playbook
Somme de 1 à 10
Let Code table à partir de zéro
Modifiez le point décimal de la journalisation de, à.
De l'introduction de pyethapp à l'exécution du contrat
Histoire de passer de Pipenv à la poésie
Je veux détecter des images de chats d'Instagram
Soit Code Day74 à partir de zéro "12. Integer to Roman"
[Mis à jour de temps en temps] Examen de Let Code NumPy
DataNitro, implémentation de la fonction de lecture des données de feuille
Convertir les éléments du tableau numpy de float en int
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Transition de WSL1 à WSL2
De zéro connaissance de Python à la création d'IA en première année du collège
De l'édition à l'exécution
"Moyenne des sommes de 1 à 10" et sa vitesse d'exécution
SIGNATURE Quête ② De la création du modèle de ciblage à la création des données soumises
Utilisez codewars kata lambda pour partir de zéro pour renvoyer la fonction? !!
[Mis à jour de temps en temps] Résumé des modèles de conception en Java
Je veux démarrer beaucoup de processus à partir de python
Comment calculer la quantité de calcul appris de ABC134-D
Procédure de communication Ajax de HTML à JSON sur le serveur API
Déployer Django + React de zéro sur GKE: Table des matières
L'histoire de la copie de données de S3 vers TeamDrive de Google
Après tout, l'histoire du retour de Linux à Windows
Comment obtenir une liste de liens à partir d'une page de wikipedia
Soit Code Day87 à partir de zéro "1512. Nombre de bonnes paires"