UNE PLONGÉE PROFONDE DANS L’APPLICATION DE L’ARCHITECTURE DES TRANSFORMATEURS ET DE SON OPÉRATION D’AUTO-ATTENTION POUR LA VISION
Dans le domaine de l’apprentissage automatique, l’auto-attention est déjà largement adoptée dans le traitement naturel du langage (NLP) et contribue considérablement aux performances des modèles de pointe. De plus en plus de travaux sont en cours pour obtenir des résultats similaires en vision. Bien qu’il existe des approches hybrides qui combinent par exemple des réseaux de neurones convolutionnels (CNN) avec l’attention ou appliquent des transformations linéaires sur des patchs de l’image, un modèle purement basé sur l’attention est plus difficile à entraîner efficacement en raison de diverses raisons que nous enquêterons plus en détail.
Dans cet article, nous explorerons l’idée d’utiliser un modèle purement basé sur l’attention pour la vision. Nous aborderons également les notions de l’auto-attention globale et locale, ainsi que la manière dont les convolutions locales peuvent être appliquées pour améliorer les performances.
LA NÉCESSITÉ DE L’ATTENTION DANS LA VISION
Les CNN sont couramment utilisés pour construire des réseaux de neurones pour le traitement d’images en raison de leur puissant préalable géométrique d’équivariance à la translation. Ils peuvent gérer efficacement les déplacements relatifs de l’entrée, ce qui les rend robustes.
D’autre part, l’auto-attention n’a pas cette priorité. Elle est plutôt permutativement équivalente, ce qui signifie que si l’entrée est réarrangée, la sortie sera réarrangée de manière équivalente. Bien que la permutativité soit plus générale, elle n’est pas aussi utile pour les images que l’équivariance à la translation.
Heureusement, différentes codifications de position peuvent être utilisées pour contraindre l’opération d’auto-attention et atteindre l’équivariance à la translation. Le codage de position permet d’avoir une architecture plus souple que les CNN tout en étant capable d’incorporer certains préjugés.
LA MISE EN OEUVRE DE BASE DE L’AUTO-ATTENTION
Pour les entrées unidimensionnelles telles que les textes et les paroles, l’opération d’auto-attention à tête unique est définie comme une Attention-Produit-Ponctué escalée telle que celle proposée dans l’article.
Pour les entrées 2D, le bloc mémoire est essentiellement le même que le champ réceptif utilisé dans les CNN, mais au lieu d’utiliser un CNN, nous appliquons l’opération d’auto-attention aux pixels du champ réceptif N.
L’auto-attention pour une sortie spécifique yᵢⱼ peut être définie comme suit dans PyTorch :
“`
import torch
import torch.nn as nn
import torch.nn.functional as F
from einops import rearrange, einsum
device = torch.device(“cuda:0”) if torch.cuda.is_available() else torch.device(“cpu”)
img = torch.randn(1, 3, 28, 28) # placeholder for an RGB image with shapes: batch_size, channels, height, width
k = 3 # spatial extend of the memory block N
q = query(x)
k = key(x)
v = value(x)
scaling_factor = 1/torch.sqrt(torch.tensor(d_k))
scaled_dot_product = F.softmax(einsum(q, k, “b t k, b l k -> b t l”) * scaling_factor, dim=-1 )
self_attention = torch.einsum(‘b i j , b j d -> b i d’, scaled_dot_product, v)
“`
L’AUTO-ATTENTION GLOBALE ET LOCALE
Lorsque nous parlons d’auto-attention globale et locale dans les modèles visuels, nous faisons référence à la quantité d’image sur laquelle le modèle se concentre. L’auto-attention globale prend en compte l’ensemble de l’image à la fois, tandis que l’auto-attention locale ne se concentre que sur certaines parties.
Lorsque nous appliquons l’auto-attention à des images de plus en plus grandes, dont la longueur est approximativement de n²= h*w en raison de leur nature 2D, la complexité d’espace et de temps de l’opération devient de plus en plus importante. C’est une raison pour laquelle les champs réceptifs locaux sont une solution attrayante.
LES CONVOLUTIONS LOCALES
Dans les réseaux de neurones convolutionnels (CNN), nous utilisons des carrés appelés noyaux qui se déplacent sur l’image. Nous choisissons un point central [i, j] sur l’image et une taille de noyau, qui détermine la quantité d’image incluse dans le noyau.
La taille du noyau peut varier entre les couches du réseau. Cela permet au réseau d’apprendre des structures de corrélation locales au sein d’une couche particulière.
Le bloc mémoire comme champ réceptif local en 2D
Pour effectuer l’auto-attention sur une image 2D, les chercheurs de l’article ont inventé un concept de bloc mémoire inspiré du fonctionnement des CNN. Si vous voulez appliquer l’auto-attention de manière globale, vous devez simplement rendre le bloc mémoire aussi grand que toute l’image.
Le bloc mémoire est essentiellement le même que le champ réceptif utilisé dans les CNN, mais au lieu d’utiliser un CNN, nous appliquons l’opération d’auto-attention aux pixels du champ réceptif N.
Pour définir l’opération d’auto-attention à tête unique pour ce cas 2D, nous pouvons utiliser l’équation suivante :
“`
import torch
import torch.nn as nn
import torch.nn.functional as F
from einops import rearrange, einsum
device = torch.device(“cuda:0”) if torch.cuda.is_available() else torch.device(“cpu”)
img = torch.randn(1, 3, 28, 28) # placeholder for an RGB image with shapes: batch_size, channels, height, width
k = 3 # spatial extend of the memory block N
q = query(x)
k = key(x)
v = value(x)
scaling_factor = 1/torch.sqrt(torch.tensor(d_k))
scaled_dot_product = F.softmax(einsum(q, k, “b t k, b l k -> b t l”) * scaling_factor, dim=-1 )
self_attention = torch.einsum(‘b i j , b j d -> b i d’, scaled_dot_product, v)
“`