# Transformeur

Un transformeur (ou modèle auto-attentif) est une architecture d'apprentissage profond introduite en 2017. Elle est principalement utilisée dans le domaine du traitement automatique des langues en servant de base aux grands modèles de langage, mais peut aussi servir à traiter d'autres modalités comme les images, les vidéos ou le son, parfois simultanément.
À l'instar des réseaux de neurones récurrents (RNN pour recurrent neural network en anglais), les transformeurs sont conçus pour gérer des données séquentielles, notamment du texte, pour des tâches telles que la traduction et la génération de texte. Cependant, contrairement aux RNN, les transformeurs ne nécessitent pas un traitement séquentiel des données. Ainsi, pour une phrase en entrée, un transformeur peut analyser simultanément différentes parties du texte, sans devoir commencer par le début. Cette caractéristique permet aux transformeurs d'offrir une parallélisation supérieure à celle des RNN, réduisant ainsi le temps d'entraînement des modèles.
Les transformeurs sont devenus le modèle de choix pour les problèmes de traitement automatique des langues, remplaçant les anciens modèles de réseaux de neurones récurrents tels que le LSTM. Étant donné que le modèle transformeur facilite davantage la parallélisation pendant l'entraînement, celui-ci peut s'effectuer sur des ensembles de données plus volumineux. Cela a conduit au développement de systèmes pré-entraînés tels que BERT (Bidirectional Encoder Representations from Transformers) et GPT (Generative Pre-Trained Transformer), qui ont été entraînés sur d'énormes ensembles de données textuelles, incluant des sources diverses telles que Wikipédia, et peuvent être affinés pour réaliser des tâches linguistiques spécifiques.

## Contexte

Avant l'introduction des transformeurs, la majorité des systèmes de traitement automatique des langues reposaient sur des réseaux de neurones récurrents (RNN) chainés, tels que les LSTMs et les GRUs (Gated recurrent units en anglais), enrichis avec des mécanismes d'attention. Le transformeur s'appuie sur ces techniques d'attention sans utiliser de structure RNN, mettant ainsi en évidence que les mécanismes d'attention seuls sont suffisamment puissants pour réaliser les performances des RNN avec attention.

### Réseaux de neurones récurrents

Les RNN chainés traitent les lexèmes (tokens en anglais) séquentiellement, en maintenant un vecteur d'état qui contient une représentation des données vues après chaque lexème. Pour traiter le n-ième lexème, le modèle combine l'état représentant la séquence d'entrée jusqu'au (n-1)-ième lexème avec l'information du nouveau lexème pour créer un nouvel état représentant la séquence d'entrée jusqu'au n-ième lexème. Théoriquement, l'information d'un lexème peut se propager loin vers le début de la séquence d'entrée, si à chaque point l'état continue à encoder de l'information relative au lexème. Mais en pratique, ce mécanisme est imparfait : à cause du problème de l'évanescence du gradient, l'état du modèle à la fin du traitement d'une longue séquence d'entrée n'arrive pas à se rappeler une information précise à propos des premiers lexèmes.

### Mécanisme d'attention

Ce problème a été résolu par l'introduction des mécanismes d'attention. Ces mécanismes permettent à un modèle de regarder directement et d'extraire l'état de n'importe quel lexème précédent dans la séquence. La couche d'attention peut accéder à tous les précédents états et leur donner un poids selon leur pertinence par rapport au lexème courant, fournissant ainsi une information saillante sur les lexèmes éloignés.
Un exemple de l'utilité de l'attention est la traduction. Dans un système de traduction d'une phrase en anglais vers une phrase équivalente en français, le premier mot français de la séquence de sortie dépend le plus probablement du début de la séquence d'entrée. Cependant, dans un modèle classique d'encodeur-décodeur à base de LSTMs, dans le but de produire le premier mot de la séquence de mots en français, le modèle reçoit seulement le vecteur d'état du dernier mot en anglais. Théoriquement, ce vecteur peut encoder l'information de toute la phrase en anglais, donnant ainsi au modèle toute la connaissance nécessaire, mais en pratique cette information n'est souvent pas bien préservée. En introduisant un mécanisme d'attention, le modèle peut à la place apprendre des états liés aux lexèmes anglais précédents lorsqu'il produit le début d'une sortie en français, donnant ainsi une meilleure compréhension de ce qu'il traduit.

### Garder l'attention en se débarrassant des RNN

Ajoutés aux RNN, les mécanismes d'attention ont amené de larges gains de performance. L'introduction du transformeur a mis en lumière le fait que les mécanismes d'attention étaient suffisamment puissants pour se suffire à eux-mêmes, sans nécessiter de RNN. Le fait que les transformeurs ne s'appuient pas sur un traitement séquentiel, et qu'ils permettent de mettre facilement en œuvre de la parallélisation, permet aux transformeurs d'être entraînés plus efficacement sur de grands jeux de données.

## Architecture

Comme les modèles précédemment inventés pour le traitement d'une séquence de taille variable en une autre séquence de taille variable, le transformeur utilise une architecture d'encodeur-décodeur. L'encodeur consiste en un ensemble de couches d'encodage qui traitent la séquence d'entrée itérativement couche après couche et le décodeur consiste en un ensemble de couches de décodage qui effectue la même chose sur la séquence de sortie de l'encodeur.
La fonction de chaque encodeur est de traiter sa séquence d'entrée pour générer des encodages contenant de l'information sur les entrées qui sont pertinentes entre elles. Il passe son ensemble d'encodages à l'encodeur suivant. Chaque décodeur réalise l'opération inverse, en prenant et traitant tous les encodages, puis en utilisant l'information contextuelle qui y est présente pour générer la séquence de sortie. A cette fin, chaque encodeur et décodeur utilisent un mécanisme d'attention, qui, pondère la pertinence de chaque lexème de l'entrée par rapport à chaque autre lexème de l'entrée et en élabore de l'information en conséquence pour produire la sortie. Chaque couche du décodeur met aussi en œuvre un mécanisme d'attention qui extrait de l'information des sorties des précédents décodeurs, avant que la couche du décodeur n'extraie de l'information des flux encodés. L'encodeur et le décodeur contiennent tous les deux un réseau de neurones à propagation avant pour un traitement additionnel des sorties, des connexions résiduelles, ainsi qu'une couche de normalisation.

### L'opération matricielle d'attention

Les modules élémentaires d'un transformeur sont les unités d'un produit matriciel pondéré. Lorsqu'une séquence est fournie au modèle transformeur, les poids d'attention sont calculés entre eux simultanément. L'unité d'attention fournit des plongements (embeddings) pour chaque lexème qui contiennent non seulement de l'information sur le lexème courant lui-même, mais aussi une information pondérée des autres lexèmes pertinents.
Concrètement, pour chaque unité d'attention, le transformeur apprend trois matrices de poids ; les poids de la requête (query) $W_{Q}$, les poids de la clé (key) $W_{K}$, et les poids de la valeur (value) $W_{V}$. Pour chaque lexème $i$ de la séquence d'entrée, le vecteur de plongement du mot (word embedding) $x_{i}$ est multiplié avec chacune des trois matrices $W_{Q}$, $W_{K}$, $W_{V}$ pour produire respectivement un vecteur de requête $q_{i}=x_{i}W_{Q}$, un vecteur de clé $k_{i}=x_{i}W_{K}$, et un vecteur de valeur $v_{i}=x_{i}W_{V}$.
Les poids d'attention sont calculés en utilisant les vecteurs de requête et de clé : le poids d'attention $a_{ij}$ du lexème $i$ sur le lexème $j$ est la résultante du produit scalaire de $q_{i}$ et $k_{j}$. Les poids d'attention sont divisés par la racine carrée de la dimension des vecteurs clé, ${\sqrt {d_{k}}}$, ce qui permet d'obtenir des vecteurs de variance 1, puis passent à travers une fonction softmax qui normalise les poids de manière qu'ils correspondent à une distribution de probabilité — positifs et de somme $1$. Le fait que $W_{Q}$ et $W_{K}$ soient des matrices différentes permet à l'attention d'être non symétrique: si un lexème $i$ affecte un autre lexème $j$ (i.e. que $q_{i}\cdot k_{j}$ soit grand), cela n'implique pas forcément que le lexème $j$ affecte le lexème $i$ (i.e. $q_{j}\cdot k_{i}$ est grand). La sortie de l'unité d'attention pour le lexème $i$ est la somme pondérée des vecteurs de valeurs de tous les lexèmes, pondérée par $a_{ij}$, l'attention du lexème $i$ sur chaque autre lexème.
Le calcul d'attention pour l'ensemble des lexèmes peut être exprimé comme un produit matriciel, opération réalisable rapidement par les cartes graphiques, à l'aide de shaders.
Le calcul ci-avant peut alors s'écrire comme suit : ${\begin{aligned}{\text{Attention}}(Q,K,V)={\text{softmax}}\left({\frac {QK^{\mathrm {T} }}{\sqrt {d_{k}}}}\right)V\end{aligned}}$
où le vecteur $K$est transposé afin de rendre les dimensions compatibles.

### L'attention multi-tête

Un ensemble composé des matrices $\left(W_{Q},W_{K},W_{V}\right)$ est appelé une tête d'attention. L'initialisation de la valeur des poids de ces matrices étant aléatoire, certaines valeurs initiales peuvent déstabiliser le processus d'apprentissage. D'où l'utilisation de plusieurs têtes d'attention dans chaque couche d'un transformeur pour rendre plus robuste l'apprentissage.
Étant donné que les transformeurs possèdent plusieurs têtes d'attention, ils ont la possibilité d'être traités en parallèle, ce qui rend le traitement de la séquence d'entrée rapide. Les multiples sorties de l'attention multi-tête sont ensuite concaténées pour être passées aux couches de réseaux de neurones à propagation avant.

### Pré-entraînement

La grande majorité des transformeurs performants sont pré-entraînés sur de grands ensembles de données, avant d'être affinés sur le problème visé (fine-tuning). Ce pré-entraînement est ainsi en général effectué sur des problèmes d'apprentissage auto-supervisé pour ne pas être limité par le besoin de données labellisées.
En vision, la première proposition à démontrer ce que peuvent apporter les transformeurs par rapport aux réseaux de neurones convolutifs, est une application directe de l'encodeur d'un transformeur classique sur une séquence de morceaux des images. Ce réseau, baptisé ViT, a pu dépasser la performance atteinte par les réseaux de neurones convolutifs de l'époque. Il a été pré-entraîné avec un jeu de données propriétaire de Google, JFT-3B, contenant quelque 3 milliards d'images.