13 points par ninebow 2024-04-22 | 1 commentaires | Partager sur WhatsApp
  • ℹ️ Après avoir lu l’article guide visuel des Visual Transformers présenté par xguru, nous avons traduit, avec l’autorisation de son auteur Dennis Turp, Data Scientist et Software Engineer, son texte Explication visuelle de Vision Transformer (ViT) (A Visual Guide to Vision Transformers).

  • Vision Transformer (ViT) est un modèle qui applique le Transformer au domaine de la CV (Computer Vision) et offre d’excellentes performances dans des domaines comme la détection d’objets et la classification d’images. Il est notamment largement utilisé comme Visual Encoder pour extraire des caractéristiques (features) à partir d’images.

  • Comme les explications du texte original sont brèves et peuvent parfois être difficiles à comprendre, quelques annotations ont été ajoutées pour faciliter la compréhension.


Explication visuelle de Vision Transformer (ViT)

Cet article est une explication visuelle des Vision Transformers (ViT), des modèles de deep learning qui atteignent des performances de pointe (SotA, State-of-the-Art) sur les tâches de classification d’images. Vision Transformer applique à des données d’image l’architecture Transformer, initialement conçue pour le traitement du langage naturel (NLP). Dans cet article, vous pourrez comprendre le fonctionnement de Vision Transformer grâce à de brèves explications accompagnées de visualisations qui aident à suivre le flux des données au fil du défilement. (:pytorch::kr:: Ici, il est difficile de reproduire l’explication par défilement, elle est donc remplacée par des captures d’écran. Il est recommandé de consulter également le texte original.)
> This is a visual guide to Vision Transformers (ViTs), a class of deep learning models that have achieved state-of-the-art performance on image classification tasks. Vision Transformers apply the transformer architecture, originally designed for natural language processing (NLP), to image data. This guide will walk you through the key components of Vision Transformers in a scroll story format, using visualizations and simple explanations to help you understand how these models work and how the flow of the data through the model looks like.

0. Examiner les données / Lets start with the data

Comme les réseaux de neurones convolutionnels (CNN) classiques, Vision Transformer est lui aussi entraîné en apprentissage supervisé (Supervised Learning). Autrement dit, le modèle est entraîné sur un jeu de données composé d’images et de leurs labels correspondants.
> Like normal convolutional neural networks, vision transformers are trained in a supervised manner. This means that the model is trained on a dataset of images and their corresponding labels.

1. Se concentrer sur une seule donnée / Focus on one data point

Pour mieux comprendre ce qui se passe à l’intérieur de Vision Transformer, concentrons-nous d’abord sur une seule donnée (taille de batch de 1). Posons ensuite cette question : comment faut-il préparer (prétraiter) cette donnée pour qu’elle puisse être utilisée en entrée d’un Transformer ?
> To get a better understanding of what happens inside a vision transformer lets focus on a single data point (batch size of 1). And lets ask the question: How is this data point prepared in order to be consumed by a transformer?

2. Mettre le label de côté pour le moment / Forget the label for the moment

Nous reviendrons au label plus tard, lorsqu’il deviendra plus pertinent. Pour l’instant, il ne nous reste qu’une seule image à observer.
> The label will become more relevant later. For now the only thing that we are left with is a single image.

3. Découper l’image en patches / Create patches of the image

Pour préparer l’image à être utilisée dans le Transformer, on divise l’image entière en patches d’image de même taille (p x p).
> To prepare the image for the use inside the transformer we divide the image into equally sized patches of size p x p.

4. Aplatir les patches d’image / Flatting of the image patches

Les patches sont aplatis en vecteurs de dimension p' = p² x c. Ici, p correspond à la taille d’un côté du patch, et c au nombre de canaux. (:pytorch::kr:: Par exemple, pour une image RGB, le nombre de canaux est 3.)
> The patches are now flattened into vectors of dimension p'= p²*c where p is the size of the patch and c is the number of channels.

5. Créer des embeddings à partir des patches / Creating patch embeddings

Les vecteurs obtenus à partir des patches d’image sont ensuite encodés via une transformation linéaire. Le vecteur d’embedding de patch (Patch Embedding Vector) ainsi obtenu a une taille fixe d.
> These image patch vectors are now encoded using a linear transformation. The resulting Patch Embedding Vector has a fixed size d.

6. Embedding de tous les patches / Embedding all patches

Une fois tous les patches d’image convertis en vecteurs de taille fixe, on obtient un tableau de taille n x d, où n est le nombre de patches de l’image et d la taille de l’embedding de patch.
> Now that we have embedded our image patches into vectors of fixed size, we are left with an array of size n x d where n is the the number of image patches and d is the size of the patch embedding

7. Ajouter un token de classification (CLS) / Appending a classification token

Afin d’entraîner efficacement le modèle, on ajoute aux patch embeddings un vecteur supplémentaire appelé token de classification (token CLS). Ce vecteur est un paramètre apprenable du réseau de neurones, initialisé aléatoirement. À noter qu’il n’existe qu’un seul token CLS, et que le même vecteur est ajouté à toutes les données. (:pytorch::kr:: À ce stade, en ajoutant le token CLS aux n patch embeddings, on obtient (n+1) éléments, chacun de taille d’embedding d, soit (n+1) x d.)
> In order for us to effectively train our model we extend the array of patch embeddings by an additional vector called classification token (cls token). This vector is a learnable parameter of the network and is randomly initialized. Note: We only have one cls token and we append the same vector for all data points.

8. Ajouter des vecteurs d’embedding positionnel / Add positional embedding Vectors

Jusqu’ici, les patch embeddings ne contiennent aucune information de position. Pour corriger cela, on ajoute à chaque patch embedding un vecteur d’embedding positionnel (Positional Embedding Vector) apprenable et initialisé aléatoirement. On ajoute également un tel vecteur positionnel au token de classification (token CLS) ajouté précédemment. (:pytorch::kr:: Dans un Transformer, on « ajoute » les valeurs du Positional Encoding. La taille des vecteurs ne change donc pas.)
> Currently our patch embeddings have no positional information associated with them. We remedy that by adding a learnable randomly initialized positional embedding vector to all our patch embeddings. We also add a such a positional embedding vector to our classification token.

9. Entrée du Transformer / Transformer Input

Une fois les vecteurs d’embedding positionnel ajoutés, il nous reste un tableau de taille (n+1) x d. Ce sera l’entrée du Transformer, que nous expliquerons plus en détail dans les étapes suivantes.
> After the positional embedding vectors have been added we are left with an array of size (n+1) x d. This will be our input for the transformer which will be explained in greater detail in the next steps.

10.1. Transformer : création de QKV / QKV Creation

Les vecteurs de patch embedding en entrée du Transformer sont projetés linéairement en plusieurs grands vecteurs. Ces nouveaux vecteurs sont ensuite séparés en trois parties de même taille : Q pour les vecteurs de requête (Query), K pour les vecteurs de clé (Key) et V pour les vecteurs de valeur (Value). On obtient (n+1) exemplaires de chacun de ces vecteurs.
> Our transformer input patch embedding vectors are linearly embedded into multiple large vectors. These new vectors are than separated into three equal sized parts. The Q - Query Vector, the K - Key Vector and the V - Value Vector . We will have (n+1) of a all of those vectors.

10.2. Transformer : calcul des scores d’attention / Attention Score Calculation

Pour calculer les scores d’attention A, on commence par multiplier tous les vecteurs de requête Q par tous les vecteurs de clé K.
> To calculate our attention scores A we will now multiply all of our query vectors Q with all of our key vectors K.

10.3. Transformer : matrice des scores d’attention / Attention Score Matrix

Une fois la matrice des scores d’attention A obtenue, on applique la fonction softmax à chaque ligne afin que la somme des valeurs de chaque ligne soit égale à 1.
> Now that we have the attention score matrix A we apply a softmax function to every row such that every row sums up to 1.

10.4. Transformer : calcul de l’information contextuelle agrégée / Aggregated Contextual Information Calculation

Pour calculer l’information contextuelle agrégée (aggregated contextual information) du premier vecteur de patch embedding, on se concentre sur la première ligne de la matrice d’attention. On utilise ensuite les poids de cette ligne avec les vecteurs de valeur V pour produire le vecteur d’information contextuelle agrégée (aggregated vector) correspondant au premier patch de l’image.
> To calculate the aggregated contextual information for the first patch embedding vector. We focus on the first row of the attention matrix. And use the entires as weights for our Value Vectors V. The result is our aggregated contextual information vector for the first image patch embedding.

10.5. Transformer : information contextuelle agrégée pour tous les patchs / Aggregated Contextual Information for every patch

On répète ensuite le même processus pour les autres lignes de la matrice des scores d’attention, ce qui donne N+1 vecteurs d’information contextuelle agrégée. Autrement dit, un pour chaque patch (=N), plus un pour le token de classification (token CLS) (=1). Cette étape conclut le premier head d’attention (Attention Head).
> Now we repeat this process for every row of our attention score matrix and the result will be N+1 aggregated contextual information vectors. One for every patch + one for the classification token. This steps concludes our first Attention Head.

10.6. Transformer : attention multi-head / Multi-Head Attention

Comme il s’agit d’attention multi-head (du Transformer), on répète tout le processus des étapes 10.1 à 10.5 avec une autre projection QKV. Dans l’illustration ci-dessus, on suppose seulement 2 heads, mais un ViT en possède généralement beaucoup plus. On obtient ainsi plusieurs vecteurs d’information contextuelle agrégée (Multiple Aggregated Contextual Information Vectors).
> Now because we are dealing multi head attention we repeat the entire process from step 10.1 - 10-5 again with a different QKV mapping. For our explanatory setup we assume 2 Heads but typically a VIT has many more. In the end this results in multiple Aggregated contextual information vectors.

10.7. Transformer : dernière étape de la couche d’attention / Last Attention Layer Step

Après avoir empilé les différentes têtes ainsi créées, on les projette vers des vecteurs de taille d, identique à celle des patch embeddings.

These heads are stacked together and are mapped to vectors of size d which was the same size as our patch embeddings had.

10.8. Transformer : obtenir le résultat de la couche d’attention / Attention Layer Result

À cette étape, la couche d’attention est terminée, et l’on obtient des embeddings de taille exactement identique à ceux utilisés en entrée.

The previous step concluded the attention layer and we are left with the same amount of embeddings of exactly the same size as we used as input.

10.9. Transformer : ajouter les connexions résiduelles / Residual connections

Les Transformers utilisent largement les connexions résiduelles (Residual Connection), qui consistent simplement à ajouter l’entrée de la couche précédente à la sortie de la couche actuelle. C’est également ce que nous allons faire ici.

Transformers make heavy use of residual connections which simply means adding the input of the previous layer to the output the current layer. This is also something that we will do now.

10.10. Transformer : obtenir le résultat des connexions résiduelles / Residual connection Result

Grâce à ces connexions résiduelles, on obtient des vecteurs de même taille (en additionnant des vecteurs de taille identique d).

The addition results in vectors of the same size.

10.11. Transformer : passage dans le réseau feed-forward / Feed Forward Network

On fait passer la sortie obtenue jusqu’ici dans un réseau de neurones feed-forward doté de fonctions d’activation non linéaires.

Now these outputs are feed through a feed forward neural network with non linear activation functions

10.12. Transformer : obtenir le résultat final / Final Result

Dans un Transformer, il existe encore une autre connexion résiduelle après les opérations effectuées jusqu’ici, mais nous allons l’ignorer ici par souci de simplicité afin de conclure les calculs de la couche Transformer. Au final, le Transformer produit une sortie de même taille que l’entrée.

After the transformer step there is another residual connections which we will skip here for brevity. And so the last step concluded the transformer layer. In the end the transformer produced outputs of the same size as input.

11. Répéter les opérations du Transformer / Repeat Transformers

On répète plusieurs fois l’ensemble des opérations du Transformer décrites des étapes 10.1 à 10.12. Ici, l’exemple montré les répète 6 fois.

Repeat the entire transformer calculation Steps 10.1 - Steps 10.12 for the Transformer several times e.g. 6 times.

12. Identifier la sortie du token de classification / Identify Classification token output

La dernière étape consiste à identifier la sortie du token de classification (token CLS). Ce vecteur sera utilisé à l’étape finale du parcours du Vision Transformer.

Last step is to identify the classification token output. This vector will be used in the final step of our Vision Transformer journey.

13. Étape finale : prédire les probabilités de classification / Final Step: Predicting classification probabilities

Lors de l’étape finale, on fait passer ce token de sortie de classification dans un autre réseau de neurones entièrement connecté (fully-connected) afin de prédire les probabilités de classification de l’image en entrée.

In the final and last step we use this classification output token and another fully connected neural network to predict the classification probabilities of our input image.

14. Entraîner le Vision Transformer / Training of the Vision Transformer

On entraîne le Vision Transformer à l’aide d’une fonction de perte standard de type cross-entropy, qui compare les probabilités de classe prédites aux vraies étiquettes de classe. Le modèle est entraîné via la rétropropagation (backpropagation) et la descente de gradient (gradient descent), en mettant à jour ses paramètres pour minimiser la fonction de perte.

We train the Vision Transformer using a standard cross-entropy loss function, which compares the predicted class probabilities with the true class labels. The model is trained using backpropagation and gradient descent, updating the model parameters to minimize the loss function.

Conclusion

À travers cette explication visuelle, nous avons passé en revue les principaux composants des Vision Transformers, de la préparation des données à l’entraînement du modèle. Nous espérons que ce guide vous aura aidé à comprendre comment fonctionnent les Vision Transformers et comment ils peuvent être utilisés pour classifier des images.

In this visual guide, we have walked through the key components of Vision Transformers, from the data preparation to the training of the model. We hope this guide has helped you understand how Vision Transformers work and how they can be used to classify images.

Pour vous aider à encore mieux comprendre le Vision Transformer, un petit Colab Notebook a également été préparé. N’hésitez pas non plus à consulter le commentaire du « Blogpost ». Ce code provient de l’excellente implémentation ViT en PyTorch de @lucidrains, alors pensez aussi à aller voir son travail.

I prepared this little Colab Notebook to help you understand the Vision Transformer even better. Please have look for the 'Blogpost' comment. The code was taken from @lucidrains great VIT Pytorch implementation be sure to checkout his work.

N’hésitez pas à me contacter si vous avez des questions ou des retours. Merci de votre lecture ! (GitHub, GitHub, X(Twitter), Threads, LinkedIn)
> If you have any questions or feedback, please feel free to reach out to me. Thank you for reading!

Remerciements / Acknowledgements


Pour aller plus loin

Article original

https://blog.mdturp.ch/posts/…

Article de synthèse

https://fr.news.hada.io/topic?id=14370

Article Vision Transformer

https://arxiv.org/abs/2010.11929v2

Vidéo de revue de l’article Vision Transformer par PR12

https://www.youtube.com/watch?v=D72_Cn-XV1g

Dépôt Vision Transformer de Google Research

https://github.com/google-research/vision_transformer

Articles, code et autres ressources sur Vision Transformer compilés par PapersWithCode

https://paperswithcode.com/method/vision-transformer


⚠️Publicité⚠️ : Avez-vous trouvé utile cet article compilé par le groupe d’utilisateurs coréens de :pytorch: PyTorch ? Inscrivez-vous comme membre et nous vous enverrons les principaux articles par e-mail ! (La fréquence par défaut est hebdomadaire, mais vous pouvez aussi la passer en quotidien.)

1 commentaires

 
gcback 2024-04-22

Merci pour ces ressources utiles et pour vos efforts.^