Blame
|
1 | # 9. Attention |
||||||
|
2 | |||||||
| 3 | Les modèles encodeur-décodeur récurrents font passer toute une séquence d'entrée par un unique vecteur de contexte de taille fixe, ce qui limite ce qu'ils peuvent mémoriser pour de longues entrées. L'attention supprime ce goulot d'étranglement en laissant le décodeur lire directement chaque état de l'encodeur, en pondérant chacun selon sa pertinence pour l'étape de sortie courante. Cette leçon construit le mécanisme depuis les scores d'alignement jusqu'à la vision requête-clé-valeur, qui est le socle que le Transformeur va généraliser. |
|||||||
| 4 | ||||||||
|
5 | ## 9.1 Le goulot d'étranglement du seq2seq |
||||||
|
6 | |||||||
|
7 | Prenons un exemple fil rouge : traduire « nous mangeons du pain » en l'anglais « we are eating bread ». Un modèle séquence-à-séquence utilise un réseau récurrent encodeur pour lire les jetons d'entrée $x_1, \dots, x_T$ vers des états cachés $h_1, \dots, h_T$, puis un réseau récurrent décodeur pour émettre les jetons de sortie, un par pas. Dans la conception de base, le décodeur est initialisé à partir d'un unique vecteur de contexte, le dernier état caché de l'encodeur : |
||||||
|
8 | |||||||
| 9 | $$\boxed{ c = h_T }$$ |
|||||||
| 10 | ||||||||
| 11 | Chaque étape $i$ du décodeur produit son état $s_i$ et sa sortie à partir de cet unique vecteur $c$ et de la sortie précédente. Tout le sens de l'entrée, aussi longue soit-elle, doit être compressé dans un unique $h_T$ de taille fixe. |
|||||||
| 12 | ||||||||
| 13 | *Remarque :* il s'agit d'un véritable goulot d'étranglement de l'information. Pour une phrase courte, $h_T$ peut en contenir assez, mais à mesure que $T$ grandit les premiers jetons sont écrasés et la qualité de la traduction ou du résumé chute fortement sur les longues entrées. |
|||||||
| 14 | ||||||||
|
15 |  |
||||||
|
16 | |||||||
| 17 | *Le séquence-à-séquence simple comprime toute l'entrée dans un unique vecteur de contexte de taille fixe, un goulot d'étranglement pour les longues séquences.* |
|||||||
| 18 | ||||||||
| 19 | La solution consiste à garder disponibles tous les états de l'encodeur $h_1, \dots, h_T$ et à laisser le décodeur décider, à chaque étape, lesquels lire. |
|||||||
| 20 | ||||||||
|
21 | ## 9.2 Le mécanisme d'attention |
||||||
|
22 | |||||||
| 23 | Au lieu d'un unique vecteur de contexte partagé entre toutes les étapes, l'attention construit un nouveau vecteur de contexte $c_i$ pour chaque étape $i$ du décodeur. Elle procède en trois temps : scorer, normaliser, combiner. |
|||||||
| 24 | ||||||||
|
25 | ### 9.2.1 Scores d'alignement |
||||||
|
26 | |||||||
| 27 | Pour l'étape $i$ du décodeur d'état $s_i$, une fonction de score mesure à quel point cet état s'aligne avec chaque état de l'encodeur $h_j$ : |
|||||||
| 28 | ||||||||
| 29 | $$e_{i,j} = \operatorname{score}(s_i, h_j)$$ |
|||||||
| 30 | ||||||||
| 31 | Un $e_{i,j}$ élevé signifie que la position $j$ de l'encodeur est pertinente pour produire la sortie $i$. Les scores forment un vecteur sur les $T$ positions d'entrée. |
|||||||
| 32 | ||||||||
| 33 | *Remarque :* $s_i$ est généralement l'état du décodeur juste avant d'émettre le jeton $i$, de sorte que le modèle choisit ce qu'il regarde en fonction de ce qu'il a produit jusqu'ici. |
|||||||
| 34 | ||||||||
|
35 |  |
||||||
| 36 | ||||||||
| 37 | *Étape 1 : l'état du décodeur $s_i$ est confronté à chaque état de l'encodeur $h_j$, un score par position d'entrée. Tout l'aval est encore grisé.* |
|||||||
| 38 | ||||||||
| 39 | ### 9.2.2 Poids d'attention |
|||||||
|
40 | |||||||
| 41 | Les scores sont transformés en une distribution de probabilité sur les positions d'entrée par une softmax sur $j$ : |
|||||||
| 42 | ||||||||
| 43 | $$\boxed{ \alpha_{i,j} = \frac{\exp(e_{i,j})}{\sum_{k=1}^{T} \exp(e_{i,k})} }$$ |
|||||||
| 44 | ||||||||
| 45 | Chaque $\alpha_{i,j} \in (0,1)$ et $\sum_j \alpha_{i,j} = 1$, donc les poids indiquent quelle part de l'attention du décodeur à l'étape $i$ va à la position d'entrée $j$. |
|||||||
| 46 | ||||||||
|
47 |  |
||||||
| 48 | ||||||||
| 49 | *Étape 2 : la softmax transforme les $T$ scores en poids $\alpha_{i,j}$ de somme un, une barre par position d'entrée.* |
|||||||
| 50 | ||||||||
| 51 | ### 9.2.3 Vecteur de contexte |
|||||||
|
52 | |||||||
| 53 | Le vecteur de contexte pour l'étape $i$ est la moyenne pondérée des états de l'encodeur, en utilisant les poids d'attention : |
|||||||
| 54 | ||||||||
| 55 | $$\boxed{ c_i = \sum_{j=1}^{T} \alpha_{i,j}\, h_j }$$ |
|||||||
| 56 | ||||||||
| 57 | Ce $c_i$ est recalculé à chaque étape du décodeur, de sorte que le modèle lit un mélange différent de l'entrée pour chaque jeton de sortie. Le décodeur combine ensuite $c_i$ avec son état $s_i$ pour prédire le jeton, et les poids d'alignement $\alpha_{i,j}$ peuvent se visualiser comme une matrice douce qui montre quels mots d'entrée chaque mot de sortie regarde. |
|||||||
| 58 | ||||||||
|
59 | *Remarque :* comme chaque étape effectue une moyenne sur tous les $h_j$, aucun vecteur fixe unique n'a à porter toute l'entrée. Le goulot d'étranglement de la section 9.1 a disparu, et les longues entrées ne se dégradent plus aussi vite. |
||||||
| 60 | ||||||||
| 61 |  |
|||||||
| 62 | ||||||||
| 63 | *Le mécanisme complet : scorer, normaliser, combiner. Le contexte $c_i$ est la moyenne des états de l'encodeur pondérée par $\alpha$, reconstruite à chaque pas du décodeur.* |
|||||||
|
64 | |||||||
|
65 | ## 9.3 Fonctions de score |
||||||
|
66 | |||||||
|
67 | La fonction de score de la section 9.2.1 est un choix de conception. Deux formes dominent la littérature initiale sur l'attention. |
||||||
|
68 | |||||||
|
69 | ### 9.3.1 Score additif (Bahdanau) |
||||||
|
70 | |||||||
| 71 | Le score additif, dû à Bahdanau et ses co-auteurs, fait passer les deux états dans un petit réseau à une couche cachée avec des matrices apprises $W_1$ et $W_2$ et un vecteur appris $v$ : |
|||||||
| 72 | ||||||||
| 73 | $$\boxed{ e_{i,j} = v^{\top} \tanh\!\left( W_1 s_i + W_2 h_j \right) }$$ |
|||||||
| 74 | ||||||||
| 75 | Il fonctionne même lorsque $s_i$ et $h_j$ ont des dimensions différentes, puisque $W_1$ et $W_2$ projettent les deux dans un espace commun avant le $\tanh$. |
|||||||
| 76 | ||||||||
|
77 | ### 9.3.2 Score multiplicatif (Luong) |
||||||
|
78 | |||||||
| 79 | Le score multiplicatif, dû à Luong et ses co-auteurs, est un simple produit scalaire entre les deux états : |
|||||||
| 80 | ||||||||
| 81 | $$\boxed{ e_{i,j} = s_i^{\top} h_j }$$ |
|||||||
| 82 | ||||||||
| 83 | Il n'a aucun paramètre supplémentaire dans sa forme la plus simple et est bien moins coûteux à calculer, puisqu'une matrice entière de scores est un unique produit matriciel. Une variante générale insère une matrice apprise $W$ sous la forme $s_i^{\top} W h_j$ pour gérer les dimensions non concordantes. |
|||||||
| 84 | ||||||||
|
85 | ### 9.3.3 Lequel utiliser |
||||||
|
86 | |||||||
| 87 | | Aspect | Additif (Bahdanau) | Multiplicatif (Luong) | |
|||||||
| 88 | | --- | --- | --- | |
|||||||
| 89 | | Formule | $v^{\top}\tanh(W_1 s_i + W_2 h_j)$ | $s_i^{\top} h_j$ | |
|||||||
| 90 | | Paramètres supplémentaires | $W_1$, $W_2$, $v$ | aucun (ou une matrice $W$) | |
|||||||
| 91 | | Dimensions différentes | géré par projection | nécessite la variante $W$ | |
|||||||
| 92 | | Coût | plus lent, petit réseau par paire | rapide, un produit matriciel | |
|||||||
| 93 | | Idéal quand | petits modèles, dimensions mixtes | grands modèles, dimensions concordantes | |
|||||||
| 94 | ||||||||
| 95 | *Remarque :* le produit scalaire croît avec la dimension des états, donc à grande largeur sa variance devient grande et pousse la softmax vers des régions plates. Mettre le score à l'échelle par $1/\sqrt{d}$ corrige cela, et ce produit scalaire mis à l'échelle est exactement ce que le Transformeur va adopter. |
|||||||
| 96 | ||||||||
|
97 | ## 9.4 Requête, clé, valeur |
||||||
|
98 | |||||||
| 99 | L'attention admet une lecture plus nette qui abandonne le cadre encodeur-décodeur. Renommons les pièces : l'état qui regarde est une requête, et chaque chose qui peut être regardée fournit une clé (utilisée pour le scoring) et une valeur (utilisée dans la somme). |
|||||||
| 100 | ||||||||
|
101 |  |
||||||
|
102 | |||||||
| 103 | *Une matrice de poids d'attention : chaque jeton de sortie puise surtout dans quelques jetons d'entrée.* |
|||||||
| 104 | ||||||||
| 105 | $$\boxed{ q = s_i, \quad k_j = h_j, \quad v_j = h_j }$$ |
|||||||
| 106 | ||||||||
| 107 | Avec cette dénomination, le score compare la requête à chaque clé, la softmax transforme les scores en poids, et la sortie est la somme pondérée des valeurs : |
|||||||
| 108 | ||||||||
| 109 | $$\boxed{ \operatorname{Attention}(q, K, V) = \sum_{j} \operatorname{softmax}_j\!\left(\operatorname{score}(q, k_j)\right) v_j }$$ |
|||||||
| 110 | ||||||||
| 111 | Dans l'attention seq2seq classique, la clé et la valeur sont le même état d'encodeur $h_j$, mais rien n'y oblige. Séparer les trois rôles est ce qui débloque l'étape suivante. |
|||||||
| 112 | ||||||||
| 113 | *Remarque :* dans cette leçon, la requête vient du décodeur tandis que les clés et les valeurs viennent de l'encodeur, de sorte que la requête porte son attention sur une séquence différente. Lorsque la requête, les clés et les valeurs viennent toutes de la même séquence, chaque jeton porte son attention sur ses propres voisins. C'est l'auto-attention, et l'empiler est l'idée entière derrière le Transformeur. |
|||||||
| 114 | ||||||||
| 115 | *Construire la requête, la clé et la valeur à partir d'une seule séquence avec des projections apprises transforme l'attention en une couche de séquence générale, ce qui est exactement là où commence la prochaine leçon sur les Transformeurs.* |
|||||||
| 116 | ||||||||
| 117 | --- |
|||||||
|
118 | Suivant : [Transformeurs](/fr/Deep%20Learning/10%20Transformers) · [Vue d'ensemble du cours](/fr/Deep%20Learning) |
||||||
