NLP & fastai | Transformer Model

Source: Deep Learning on Medium

Principe de l’attention

Nous avons déjà présenté le principe et l’implémentation du mécanisme d’attention (cf. le post Attention Mechanism) inventé en 2014 en particulier par Yoshua Bengio et dévoilé dans le papier scientifique “Neural Machine Translation by Jointly Learning to Align and Translate”: il s’agissait pour la première fois dans un modèle de Deep Learning (ici, un modèle Seq2Seq avec RNN pour de la traduction instantanée) d’utiliser un vecteur de contexte spécifique au moment de générer par le decoder un nouveau mot (token) de la séquence de sortie, vecteur résultant de la somme pondérée des vecteurs d’état émis par l’encoder lors de l’encodage de chaque mot (token) de la séquence d’entrée. Ce vecteur est dit de contexte car les valeurs des poids de pondération (score) qui sont utilisés pour le créer témoignent de l’importance relative des mots de la séquence d’entrée à prendre en compte à ce moment de la génération d’un nouveau mot de la séquence de sortie.

Plus tard, en juin 2017, lors de la présentation du modèle Transformer par l’équipe Google AI dans le papier scientifique “Attention Is All You Need”, un nouveau mécanisme d’attention dit “self-attention avec multi-head” est venu améliorer considérablement l’efficacité de ce mécanisme initial mais toujours avec la même idée centrale: le vecteur de contexte qui permet lors de l’encodage d’un mot d’une séquence de tenir compte de l’importance relative des autres mots (plus exactement, qui permet de tenir compte des relations au sens large du terme comme les relations grammaticales, de sens, de co-référence, etc.).

Et plus récemment, lors de NeurIPS 2019 en décembre 2019, Yoshua Bengio est revenu sur l’importance des mécanismes d’attentions utilisés à présent dans tous les modèles de Deep Learning (et pas uniquement les modèles de NLP) en introduisant la conscience dans le vocabulaire traditionnel de l’apprentissage automatique. Il considère en effet que l’ingrédient central de la conscience est l’attention. Il a comparé les mécanismes d’attention utilisés dans l’apprentissage machine à la façon dont notre cerveau choisit ce à quoi il faut prêter attention: “L’apprentissage automatique peut être utilisé pour aider les scientifiques du cerveau à mieux comprendre la conscience, mais ce que nous comprenons de la conscience peut également aider l’apprentissage automatique à développer de meilleures capacités.” (en anglais: “Machine learning can be used to help brain scientists better understand consciousness, but what we understand of consciousness can also help machine learning develop better capabilities.”) Selon Yoshua Bengio, une approche inspirée par la conscience est la voie à suivre si nous voulons des algorithmes d’apprentissage automatique qui peuvent se généraliser à des exemples hors des distributions utilisées pour leur entraînement.

Modèle Transformer

Voici ci-dessous le modèle Transformer développé par Google AI, entraîné 12 heures sur 8 GPUs NVIDIA P100 et présenté dans le papier scientifique “Attention Is All You Need” en juin 2017.

Modèle Transformer de 2017 à 6 couches (N=6) (Image source: Attention Is All You Need)

Comme le fait le post “The Illustrated Transformer” ou la vidéo ci-dessous, examinons fonctionnement du modèle Transformer de manière générale vers plus de détails ensuite mais nous pouvons déjà remarquer qu’il possède 3 mécanismes d’attention et non pas un seul comme les modèles Seq2Seq: encoder-encoder, decoder-decoder et decoder-encoder (semblable aux modèlex Seq2Seq).

Vidéo Attention Is All You Need

Modèle en couches

Comme le cerveau dont les neurones fonctionnent en couches et les ConvNet qui se sont inspirés de ce fonctionnement, le modèle Transformer possède 6 couches d’encodage puis 6 couches de décodage, chaque couche apprenant des caractéristiques qu’elle fournit à la couche suivante (note: ce nombre de 6 n’est pas magique: il constitue plus un compromis pour avoir un temps d’entraînement acceptable selon les possibilités de computation de l’époque: le modèle BERT développé plus tard en novembre 2018 possède par exemple 24 couches et le modèle Turing-NLG révélé en février 2020 en possède 78).

Caractéristiques apprises par les différentes couches d’un ConvNet (Image Source: Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations)
Transformer est un modèle en 6 couches (Image source: The Illustrated Transformer)

Encoder

Chaque encoder est identique: il possède un mécanisme de self-attention multi_head suivi par un un réseau fully-connected, chacun suivi par une couche de concaténation des vecteurs et de normalisation.

La notion de multi-head signifie que le processus d’attention (cf. paragraphe ci-après) est répliqué plusieurs fois dans chaque encoder (8 fois ici).

Un schéma d’un encoder du modèle Transformer (Image source: The Illustrated Transformer)

Self-attention dans l’encoder

Le mécanisme de self-attention (ou d’attention interne puisqu’il intervient dès l’encodage de la séquence d’entrée et non seulement à partir du décodage comme dans un modèle Seq2Seq avec RNNs) revient à transformer chaque vecteur x de token de la séquence d’entrée en un vecteur de contexte z qui prend en compte une relation particulière avec les autres tokens de la séquence. Cette notion de relation est vaste et est apprise par l’entraînement: certaines “head” vont faire attention aux relations grammaticales, d’autres aux relations de co-référence, etc. C’est pour cela qu’il y a plusieurs “head” (ie, il y a plusieurs relations à apprendre).

Comme le montre l’image ci-dessous issue du post The Illustrated Transformer, le mécanisme de self-attention demande l’entraînement de 3 matrices qui pour chaque mot d’une séquence vont créer un vecteur par multiplication avec son vecteur d’embeddings (en fait le vecteur d’embeddings sommé au vecteur de position):

  1. la matrice Q qui permet de créer un vecteur q de QUERY qui représente principalement le mot dont il est issu
  2. la matrice K qui permet de créer un vecteur k de KEY qui représente la singularité (une relation particulière) de chacun des mots de la séquence par rapport au mot dont on est entrain de calculer le vecteur de contexte
  3. la matrice V qui permet de créer un vecteur v de VALUE qui représente la valeur de chacun des mots de la séquence par rapport au mot dont on est entrain de calculer le vecteur de contexte

Ainsi en faisant un dot multiplication du vecteur de QUERY q avec chacun des vecteurs de KEY k, on obtient un score pour chacun des mots de la séquence qui après passage par un softmax représente un poids entre 0 et 1 avec une somme de tous les poids à 1.

Ces poids vont permettre de faire une somme pondérée des vecteurs de VALUE v et créé ainsi le vecteur de contexte z. A tous les tokens d’une séquence, il va donc être possible de calculer en parallèle son vecteur de contexte. Le problème de traitement séquentiel des modèles Seq2Seq est éliminé par cette architecture.

Transformation par self-attention de chaque vecteur de mot en un vecteur de contexte dans l’encoder (Image source: The Illustrated Transformer)

Ces multiplications de matrices suivie par un softmax et une normalisation peuvent se résumer par le calcul matriciel suivant (ce qui explique la rapidité de calcul d’un modèle Transformer):

Le mécanisme de self-attention sous forme d’un équation matricielle (Image source: The Illustrated Transformer)

Vecteur de position

Afin de ne pas traiter les tokens d’une séquence d’entrée comme un “bag of words”, un vecteur de position est ajouté à son vecteur d’embeddings avant que le vecteur résultant n’entre dans le premier encoder.

Afin de comprendre comment est calculé ce vecteur de position, lire le paragraphe “Representing The Order of The Sequence Using Positional Encoding” du post The Illustrated Transformer.

Multi-Head

Comme nous l’avons noté, chaque encoder possède 8 “head” qui permettent chacune de caractériser des relations différentes entre les tokens. Au final, chaque “head” produit une matrice de vecteurs de contextes Z (nombre de ligne étant égal au nombre de tokens et le nombre de colonnes étant la dimensionnalité des matrices Q, K et V, ici 64). Ces matrices Z sont concaténées puis multipliées par une matrice (dont les paramètres seront appris par entraînement) 0 qui permettra de retrouver une seule matrice Z de sortie.

Procédé de self-attention multi-head dans un encoder du modèle Transformer (Image source: The Illustrated Transformer)

Les “residuals”, les normalisations et le réseau fully-connected de sortie de l’encoder

Ce vecteur Z est alors additionné au vecteur d’entrée (residual) puis normalisé avant d’être passé à un réseau fully-connected (dont les paramètres seront appris par entraînement), qui lui même sera suivi par une telle procédure. Le vecteur résultant sera passé à l’encoder suivant.

Un encoder du modèle Transformer (Image source: The Illustrated Transformer)

Decoder, couche linéaire et softmax finale et fonction de loss

Afin de comprendre les particularités du décodage (6 decoders), de la couche linéaire et softmax finale et de la fonction de loss utilisée, lire les paragraphes The Decoder Side, The Final Linear and Softmax Layer et The Loss Function du post The Illustrated Transformer.

Pour aller plus loin