Auto-attention dans les Transformers
Auto-attention dans les Transformers' - Auto-attention in Transformers.
Un guide convivial pour comprendre le mécanisme d’auto-attention

Êtes-vous intrigué par les technologies récentes telles que ChatGPT d’OpenAI, DALL-E, Stable Diffusion, Midjourney, et plus encore?
“Transformer”, l’un des principaux moteurs derrière toutes les avancées actuelles dans le domaine de l’IA. Il y a seulement quelques années, l’IA était perçue comme de la science-fiction, mais en 2022, des technologies telles que ChatGPT et DALL-E ont commencé à devenir essentielles dans la vie des gens. Et tout le mérite revient à l’article révolutionnaire de 2017 intitulé “Attention Is All You Need” [1] de Google et de l’Université de Toronto, qui a introduit le Transformer – une architecture de réseau neuronal profond qui repose fortement sur le mécanisme d’attention. Par conséquent, comprendre l’attention et ses fondements mathématiques ouvre de nombreuses opportunités pour un ingénieur ou un chercheur en IA.
Explorer la signification de “Attention”
Commençons par la signification littérale du terme “Attention”. Selon Wikipedia,
“C’est un processus de concentration sélective sur un aspect discret de l’information”.
Imaginez avoir une conversation avec votre ami, où vous ne prêtez attention qu’à certains mots alors que vos tympans les entendent tous. Vous accordez plus d’importance à certains mots et ignorez le reste. Et ce processus est effectué par votre subconscient sans que vous le sachiez. C’est une capacité cognitive sophistiquée inhérente à nous, les humains.
L’attention en apprentissage automatique est la même que cette attention, à l’exception de l’implication des mathématiques. C’est comme permettre aux modèles d’IA de se concentrer sur les informations pertinentes et importantes et d’ignorer les informations moins pertinentes / importantes, ce qui aide à comprendre le contexte de l’entrée.
Compréhension contextuelle
Considérons les phrases suivantes,
Phrase 1 : “Je suis allé à la banque pour déposer de l’argent”.
Phrase 2 : “La berge de la rivière était sèche et boueuse”.
Regardons le mot “banque”. Le sens de ce mot est différent dans les deux phrases. Prenez un moment pour deviner vous-même la signification. Pour la première, vous avez probablement deviné qu’il s’agit d’une sorte d’institution financière, et pour la seconde, vous l’avez probablement deviné comme la terre qui borde un corps d’eau, si je ne me trompe pas. Rappelez-vous, j’ai déjà mentionné plus tôt que les humains sont dotés de dons, et nous devrions en être fiers.
Examinons comment vous avez pu arriver au résultat correct de manière subconsciente. Votre esprit a observé d’autres mots voisins dans la phrase et a essayé de comprendre le contexte de la phrase. Dans la première phrase, vous avez observé des mots tels que «dépôts» et «argent». Dans la seconde, il y a des mots tels que «rivière», «sèche» et «boueuse». Nous pouvons donc deviner que les mots voisins ont aidé votre cerveau à comprendre le contexte du mot «banque», et une fois que le contexte était clair, vous l’avez deviné correctement.
Une chose très importante que cette expérience a clarifiée, c’est que la signification de chaque mot dans une phrase dépend du contexte, qui dépend à son tour des autres mots. Par conséquent, il est très important d’ajouter des informations contextuelles à la phrase lorsque le modèle d’apprentissage automatique traite l’entrée.
Auto-Attention
Comparer chaque mot de la phrase avec le mot «banque» peut nous donner des informations contextuelles sur le mot «banque». Mais les choses ne sont pas toujours aussi simples. Pour saisir les informations contextuelles globales d’une phrase, nous devons prendre en compte tous les mots de la phrase, et pas seulement un seul mot «banque».
Les informations contextuelles d’une phrase entière dépendent des informations contextuelles de tous les mots. Je veux dire, pour chaque mot d’une phrase, nous devrions essayer de déterminer ses informations contextuelles en utilisant tous les mots présents dans la phrase. C’est exactement ce que nous allons faire, mais en utilisant les mathématiques. Nous allons imiter le processus de pensée humain pour modéliser notre attention. Cela permettra à notre modèle d’apprendre et de comprendre facilement des phrases complexes. Nous devons construire une sorte de mécanisme qui fait cela pour nous, et aha! nous appellerons cela l’auto-attention.
L’auto-attention prend en entrée des vecteurs représentant chaque mot/jeton. Modifie chaque vecteur d’entrée pour incorporer des informations contextuelles et produit en sortie des vecteurs de même dimension que les entrées.

Jetons un coup d’œil plus attentif sur le bloc d’auto-attention et son fonctionnement interne.
L’auto-attention examine chaque mot dans une phrase et calcule l’importance qu’il doit accorder à tous les autres mots.
Dans notre exemple, le mot “bank” accorde plus d’attention/importance à “money” et “deposit” qu’aux autres mots. Ou nous pouvons dire qu’ils sont plus liés.
Cependant, le défi réside dans la détermination de l’importance/attention/focus entre deux mots ou du degré de leur relation. La solution réside dans notre exemple lui-même. Prenons le mot “bank” ; pour cela, l’attention portée à “money” et “deposit” est plus élevée que pour les autres mots. J’espère que vous pouvez également observer que ces mots sont les plus similaires à “bank” par rapport aux autres mots. Nous pouvons utiliser un score de similarité comme proxy pour l’attention/focus/importance. Oui, c’est ce que les auteurs de l’article “Attention is all you need” ont mis en œuvre.

Mais comment calculons-nous la similarité entre deux mots ?
Pour nous, les humains, les mots sont omniprésents, mais le modèle ne comprend pas les mots. La seule chose sur laquelle il opère est le vecteur/Matrice/Tenseur.
Avant de nourrir notre phrase à notre bloc d’auto-attention, elle est d’abord convertie en un vecteur d’incorporation. La dimension du vecteur est toujours fixe. Après le vecteur d’incorporation, les informations de position de chaque mot sont également ajoutées car la position compte et peut changer le sens du mot/de la phrase. Ainsi, le modèle peut suivre la position de chaque vecteur/mot. Tous ces concepts sont hors de la portée de cet article. Nous nous concentrerons uniquement sur l’auto-attention. En résumé, les mots textuels réels ne sont pas introduits dans le bloc d’attention ; à la place, une représentation vectorielle de chaque mot/jeton est introduite.
Maintenant, les choses sont un peu plus simples car nous obtenons des vecteurs au lieu de mots, et notre objectif, pour l’instant, est de calculer la similarité entre deux vecteurs.
Rappelez-vous l’algèbre linéaire du lycée. Il existe deux mesures que nous pouvons utiliser pour calculer la similarité entre deux vecteurs.
i. Produit scalaire
ii. Similarité cosinus
Cependant, le produit scalaire est beaucoup plus rapide à calculer et est optimisé en termes d’espace, nous nous en tiendrons donc au produit scalaire. Mais n’hésitez pas à expérimenter également la similarité cosinus.
Produit scalaire


Et pour le score de similarité, nous voulons un nombre, un scalaire. Heureusement pour nous, le produit scalaire nous donne toujours des résultats scalaires.
Prenons une phrase plus simple, “Bonjour, je joue à des jeux”. Et voyons comment les scores de similarité sont calculés.

Les vecteurs s sont les vecteurs contenant les scores de similarité.
sᵢ contient les scores de similarité pour le vecteur vᵢ avec tous les autres vecteurs. Par exemple, s₁ contient les scores de similarité pour le vecteur v₁ avec tous les autres vecteurs (v₁ représente le mot “Bonjour” dans notre exemple). Maintenant que nous avons les scores de similarité, faisons une normalisation, en particulier le redimensionnement et le softmax.
Réduire l’échelle du produit scalaire
Sans mise à l’échelle, la magnitude plus grande du produit scalaire dominerait et éclipserait les autres. Nous voulons que la distribution de l’attention/importance soit plus équilibrée et qu’elle accorde de l’importance à plusieurs vecteurs au lieu de seulement au vecteur le plus similaire.
Nous divisons donc le résultat (les scores de similarité) par une valeur constante qui est √dₖ

Normalisation à l’aide de Softmax
En général, en apprentissage profond, au lieu de gros nombres, nous normalisons en utilisant LayerNorm/BatchNorm afin d’obtenir des valeurs plus petites qui facilitent une convergence plus rapide. Nous faisons la même chose ici car nous voulons que la valeur des scores d’attention/similarité soit inférieure à 1. Et pour chaque mot, le score d’attention avec tous les autres mots doit s’additionner à 1. C’est ce que fait la fonction softmax. La fonction softmax transforme les scores ou logits obtenus à partir du produit scalaire en une distribution de probabilité.
Lorsque les scores d’attention d’un mot à tous les autres mots s’additionnent à 1, cela devient également interprétable par les humains.
La fonction softmax prend un vecteur de k valeurs réelles et le transforme en un vecteur de k valeurs réelles qui s’additionnent à 1.
Indépendamment des valeurs d’entrée, la sortie est toujours un nombre réel entre 0 et 1, et elles s’additionnent toutes à 1, donc on peut également l’interpréter comme un poids sur 1.
Le résultat de softmax est que nous obtiendrons des scores entre 0 et 1. Cela s’appelle un poids d’attention. Cela représente combien de poids d’attention un vecteur/mot doit donner aux autres mots sur 1. (s’il vous plaît, ne vous laissez pas tromper par le terme poids, il ne doit pas être considéré comme un paramètre du modèle)

Prenons l’exemple du mot ‘Je’. Il se concentre davantage sur lui-même, que nous ignorerons (chaque mot se concentre davantage sur lui-même en raison de la similarité), puis il accorde de l’importance au mot ‘Jouer’. Nous pouvons supposer que c’est parce que le mot ‘Je’ est une réponse à la question ‘Qui joue à un jeu ?’. C’est le résultat de softmax. Ce sont les poids.
Rappelez-vous ce que je vous ai dit au début de l’auto-attention, ‘extraire les informations contextuelles’ et ‘les injecter dans la phrase d’entrée’. Nous pouvons penser que tout ce que nous avons fait, c’est extraire les informations contextuelles. Maintenant, passons à l’injection de ces informations.
Injection des informations contextuelles
La fonction softmax nous a donné une matrice d’attention contenant des poids et maintenant que nous savons combien d’attention chaque mot devrait accorder aux autres mots, pourquoi ne pas mettre en évidence les mots importants et supprimer les mots moins importants ?
C’est ce que nous allons faire. Pour chaque vecteur vᵢ, nous allons multiplier ses poids d’attention qui sont conservés dans wᵢ avec V (une matrice composée de tous les vecteurs d’entrée). qui contient tous les vecteurs d’entrée d’origine. De cette manière, les caractéristiques/mots importants seront mis en évidence et leur impact sera plus grand, tandis que les mots moins importants seront supprimés, ce qui signifie que leur impact sur la sortie ne sera pas aussi important.
De plus, il est important de comprendre pourquoi un vecteur devrait accorder une plus grande attention à lui-même lorsqu’on considère le mécanisme d’attention. La raison derrière cela réside dans le désir de préserver les informations propres du vecteur.
Alors que l’incorporation d’informations contextuelles est cruciale, nous ne devons pas négliger l’importance de conserver les informations d’origine d’un vecteur.
L’équation pour y₁ peut fournir une clarté supplémentaire sur cette question.

Concept du Query, de la Clé et de la Valeur
Ta-da, nous avons réussi à modifier les vecteurs d’origine pour y incorporer des informations contextuelles. Mais tout cela semble désordonné, n’est-ce pas ? Rendons-le clair et concis. Au lieu de travailler sur des vecteurs, les algorithmes d’apprentissage profond fonctionnent généralement sur des tenseurs/matrices. Et remarquez que nous utilisons la matrice d’entrée (V) 3 fois. Donnons-leur un nom pour que ce soit facile pour nous. La première fois que nous effectuons un produit scalaire, nous utilisons cette matrice V deux fois. Disons les choses ainsi, posons-nous une question, qu’avons-nous exactement fait à l’étape du produit scalaire ?
La réponse nous donnera un nom approprié. Pour chaque vecteur vᵢ, nous avons demandé à quel point tous les autres vecteurs (v₁, v₂, v₃, v₄) sont similaires. Alors pourquoi ne pas donner le nom ‘Query’ à la matrice V (composée de vecteurs v) pour laquelle nous demandons le score de similarité ?
D’après l’exemple des deux phrases précédentes, lors de la détermination du contexte du mot ‘bank’, on peut le considérer comme un mot de requête (qui est identique à un vecteur de requête et la concaténation des vecteurs de requête pour tous les mots peut être considérée comme une matrice de requête). Et d’autres mots tels que ‘deposits’, ‘money’, etc., peuvent être considérés comme des mots-clés (qui constituent la matrice de clés).
Et pourquoi ne pas donner le nom ‘Key’ à la matrice V que nous utilisons pour calculer la similarité par produit scalaire avec Query ?
La meilleure analogie serait de rechercher une vidéo sur YouTube. Vous tapez votre requête dans la barre de recherche et l’arrière-plan de YouTube essaie de faire correspondre votre requête avec le titre de toutes les vidéos stockées dans la base de données de YouTube. La vidéo la plus similaire/correspondante sera affichée en premier. C’est exactement ce que nous avons fait à l’étape du produit scalaire. Nous avons demandé à quel point la matrice de requête est similaire à la matrice de clés, ce qui nous a donné la matrice de score de similarité. Les matrices de requête et de clés sont identiques, c’est-à-dire égales, car elles sont toutes deux la représentation matricielle des vecteurs d’entrée.
La troisième fois que nous avons utilisé la matrice V, c’est lors de l’injection des informations contextuelles dans la matrice d’entrée. Nous avons extrait avec succès les informations contextuelles et nous devions mettre en évidence les informations importantes et supprimer les informations moins pertinentes. Nous devrions l’appeler une matrice de valeurs. Cette étape peut être mise en œuvre en utilisant la multiplication de matrices lorsque les opérations sont sous forme matricielle.
La multiplication de matrices est identique à une couche linéaire sans fonction d’activation ni biais – donc cela ne devrait pas poser de problème lors de la mise en œuvre.
Il convient de noter que les matrices Q, K et V sont essentiellement identiques et égales en valeur. La seule raison pour laquelle nous leur attribuons des noms différents est de désigner leurs rôles et leurs fonctions spécifiques au sein du mécanisme d’attention. En leur fournissant des étiquettes distinctes basées sur leur utilisation, nous pouvons efficacement transmettre leurs fonctions prévues tout en maintenant leur égalité. Les étapes claires et concises de notre processus sont les suivantes :

Mais il manque encore quelque chose, devinez quoi ?
Où sont tous les paramètres apprenables ??
Remarquez qu’il n’y a pas de paramètres apprenables qui peuvent être optimisés lors de la rétropropagation. Sans cela, tout notre système serait inutile, je doute fortement que nous puissions appeler cela un modèle d’apprentissage automatique sans poids apprenables.
La question se pose donc : où devrions-nous ajouter le paramètre apprenable ?
Remarquez que tout ce que nous faisons, ce sont des calculs basés sur les vecteurs d’entrée Query(Q), Key(K) et Value(V). Pourquoi ne pas multiplier ces matrices avant de les utiliser afin que nous ayons nos paramètres apprenables et que la dimension de Q, K et V reste la même (comment ? la multiplication de matrices peut maintenir la dimension intacte si elle est multipliée par une matrice de forme appropriée) ?
On dirait que nous avons trouvé la solution ; c’est ainsi que le document l’a également implémentée. Maintenant, nous sommes prêts à avancer. Nous appellerons les matrices, Poids de la Requête (Wᵩ), Poids de la Clé (Wₖ) et Poids de la Valeur (Wᵥ).



Cette formule résume l’ensemble de notre processus. Tout d’abord, le produit point entre Q et K (transposé – vous comprendrez pourquoi transposer lorsque vous essayez de creuser plus profondément/mettre en œuvre, c’est laissé en tant que devoir). Et la réduction de la mise à l’échelle est suivie de l’application de la fonction softmax pour obtenir les poids d’attention et enfin la multiplication avec le vecteur d’entrée d’origine pour pondérer selon les poids reçus de softmax.
Et c’est tout !
Le Transformer est sans aucun doute l’une des avancées les plus remarquables de la recherche depuis la rétropropagation dans le domaine de l’IA. Chaque semaine, de nombreux modèles de pointe sont introduits, ajoutant encore à l’excitation et à l’innovation dans le domaine. Je recommande vivement de lire cet article[2] et de regarder cette vidéo[3] sur Youtube. Ces ressources peuvent fournir des informations et des perspectives précieuses, vous aidant à saisir les subtilités et l’importance de cette architecture révolutionnaire.
N’oubliez pas de mettre les mains dans le cambouis. Restez curieux et suivez-moi pour plus de contenu comme celui-ci.
Références
[1] Vaswani, Ashish & Shazeer, Noam & Parmar, Niki & Uszkoreit, Jakob & Jones, Llion & Gomez, Aidan & Kaiser, Lukasz & Polosukhin, Illia, “Attention is all you need”, 2017.
[2] Micheal Phi, “Guide illustré des transformateurs – Explication étape par étape”, article de blog, 2020.
[3] Ark, “Mécanisme d’auto-attention intuitif dans les réseaux de transformateurs”, 2021, Youtube.
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Adaptez votre LLM sur une seule GPU avec le Gradient Checkpointing, LoRA et la Quantification.
- Mettez-moi rapidement au centre Subject-Diffusion est un modèle d’IA qui peut réaliser une génération de texte vers image personnalisée dans un domaine ouvert.
- Déployez MusicGen en un rien de temps avec les points de terminaison d’inférence
- Six Croyances Qui Font Que Votre Travail En Science des Données Est Truffé de Biais
- OpenAI dévoile 6 fonctionnalités passionnantes de ChatGPT pour révolutionner l’expérience utilisateur
- Classification multilabel Une introduction avec Scikit-Learn de Python
- Fraude par « deepfake » pilotée par l’IA La bataille en cours du Kerala contre les escrocs