13 Punkte von ninebow 2024-04-22 | 1 Kommentare | Auf WhatsApp teilen
  • ℹ️ Nachdem ich den von xguru vorgestellten Artikel Visual Transformers visueller Leitfaden gelesen hatte, habe ich mit Erlaubnis des Autors Dennis Turp, Data Scientist und Software Engineer, seinen Artikel Visuelle Erklärung zu Vision Transformer (ViT) (A Visual Guide to Vision Transformers) übersetzt.

  • Vision Transformer (ViT) ist ein Modell, das Transformer im Bereich CV (Computer Vision) einsetzt und bei Aufgaben wie Objekterkennung und Bildklassifizierung hervorragende Leistung zeigt. Insbesondere wird es häufig als Visual Encoder verwendet, um Merkmale (Features) aus Bildern zu extrahieren.

  • Da die Erläuterungen im Original knapp gehalten sind und stellenweise schwer verständlich sein können, habe ich zur besseren Verständlichkeit einige Anmerkungen ergänzt.


Eine visuelle Erklärung zu Vision Transformer (ViT)

Dieser Artikel ist eine visuelle Einführung in Vision Transformers (ViTs), Deep-Learning-Modelle, die bei Bildklassifizierungsaufgaben Spitzenleistungen (SotA, State-of-the-Art) erzielen. Vision Transformer überträgt die ursprünglich für die natürliche Sprachverarbeitung (NLP) entwickelte Transformer-Architektur auf Bilddaten. In diesem Artikel wird mithilfe von Visualisierungen und kurzen Erklärungen gezeigt, wie Vision Transformer funktioniert und wie die Daten durch das Modell fließen, während man sich Schritt für Schritt durch den Inhalt bewegt. (:pytorch::kr:: Da sich die Erklärung per Scrollen hier nur schwer umsetzen lässt, werden stattdessen Bildschirmaufnahmen verwendet. Es ist empfehlenswert, zusätzlich den Originalartikel zu lesen.)
> 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. Ein Blick auf die Daten / Lets start with the data

Wie herkömmliche Convolutional Neural Networks (CNNs) werden auch Vision Transformer im Supervised-Learning-Verfahren trainiert. Das heißt, das Modell wird mit einem Datensatz aus Bildern und den dazugehörigen Labels trainiert.
> 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. Auf genau einen Datenpunkt fokussieren / Focus on one data point

Um besser zu verstehen, wie Vision Transformer intern arbeitet, konzentrieren wir uns zunächst nur auf einen einzelnen Datenpunkt (Batch-Größe 1). Und stellen wir uns dabei folgende Frage: Wie muss dieser Datenpunkt vorbereitet (vorverarbeitet) werden, damit er von einem Transformer verarbeitet werden kann?
> 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. Das Label kurz beiseitelegen / Forget the label for the moment

Das Label wird später relevanter. Im Moment bleibt für uns nur ein einzelnes Bild übrig.
> The label will become more relevant later. For now the only thing that we are left with is a single image.

3. Das Bild in Patches aufteilen / Create patches of the image

Um das Bild für die Verwendung im Transformer vorzubereiten, teilen wir das gesamte Bild in gleich große Patch-Bilder der Größe p x p auf.
> To prepare the image for the use inside the transformer we divide the image into equally sized patches of size p x p.

4. Die Bild-Patches abflachen / Flatting of the image patches

Die Patches werden zu Vektoren der Größe p' = p² x c abgeflacht. Dabei ist p die Länge einer Patch-Seite und c die Anzahl der Kanäle. (:pytorch::kr:: Bei einem RGB-Bild beträgt die Anzahl der Kanäle beispielsweise 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. Embeddings aus den Patches erzeugen / Creating patch embeddings

Die zuvor aus den Bild-Patches erzeugten Vektoren werden nun mithilfe einer linearen Transformation kodiert. Der daraus entstehende Patch-Embedding-Vektor hat eine feste Größe d.
> These image patch vectors are now encoded using a linear transformation. The resulting Patch Embedding Vector has a fixed size d.

6. Alle Patches einbetten / Embedding all patches

Sobald alle Bild-Patches als Vektoren fester Größe eingebettet sind, erhalten wir ein Array der Größe n x d. Dabei ist n die Anzahl der Bild-Patches und d die Größe eines Patch-Embeddings.
> 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. Ein Klassifikationstoken (CLS) anhängen / Appending a classification token

Um unser Modell effektiv zu trainieren, erweitern wir die Patch-Embeddings um einen zusätzlichen Vektor, den sogenannten Klassifikations-Token (CLS-Token). Dieser Vektor ist ein lernbarer Parameter des neuronalen Netzes und wird zufällig initialisiert. Zur Erinnerung: Es gibt nur einen CLS-Token, und für alle Daten wird derselbe Vektor hinzugefügt. (:pytorch::kr:: Bis hierhin ergibt das bei n Patch-Embeddings zusammen mit dem CLS-Token (n+1) Einträge mit jeweils der Embedding-Größe d, also (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. Positions-Embedding-Vektoren hinzufügen / Add positional embedding Vectors

Unsere Patch-Embeddings enthalten derzeit keine Positionsinformationen. Dieses Problem lösen wir, indem wir zu allen Patch-Embeddings einen lernbaren, zufällig initialisierten Positions-Embedding-Vektor (Positional Embedding Vector) addieren. Außerdem fügen wir auch unserem zuvor hinzugefügten Klassifikations-Token (CLS-Token) einen solchen Positionsvektor hinzu. (:pytorch::kr:: Im Transformer werden die Werte des Positional Encoding „addiert“. Daher ändert sich die Größe der Vektoren nicht.)
> 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. In den Transformer einspeisen / Transformer Input

Nach dem Hinzufügen der Positions-Embedding-Vektoren bleibt ein Array der Größe (n+1) x d übrig. Dieses Array dient als Eingabe für den Transformer, der in den nächsten Schritten genauer erläutert wird.
> 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: QKV erzeugen / QKV Creation

Die Eingabe-Patch-Embedding-Vektoren des Transformers werden linear in mehrere große Vektoren projiziert. Diese neuen Vektoren werden dann in drei gleich große Teile aufgeteilt. Dabei handelt es sich um Q als Query-Vektor, K als Key-Vektor und V als Value-Vektor. Von all diesen Vektoren erhalten wir jeweils (n+1) Stück.
> 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: Attention-Scores berechnen / Attention Score Calculation

Um zunächst die Attention-Scores A zu berechnen, multiplizieren wir alle Query-Vektoren Q mit allen Key-Vektoren 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: Attention-Score-Matrix / Attention Score Matrix

Auf die so erhaltene Attention-Score-Matrix A wenden wir auf jede Zeile die Funktion softmax an, sodass die Summe jeder Zeile 1 ergibt.
> 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: Aggregierte Kontextinformation berechnen / Aggregated Contextual Information Calculation

Um die aggregierte Kontextinformation (aggregated contextual information) für den ersten Patch-Embedding-Vektor zu berechnen, betrachten wir die erste Zeile der Attention-Matrix. Die dortigen Einträge verwenden wir als Gewichte für unsere Value-Vektoren V. Das Ergebnis ist unser Vektor der aggregierten Kontextinformation (aggregated vector) für das erste Bild-Patch-Embedding.
> 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: Aggregierte Kontextinformation für alle Patches berechnen / Aggregated Contextual Information for every patch

Diesen Vorgang wiederholen wir für die anderen Zeilen der Attention-Score-Matrix und erhalten so N+1 Vektoren aggregierter Kontextinformation. Also jeweils einen für jeden Patch (=N Stück) plus einen für den Klassifikations-Token (CLS-Token) (=1 Stück). Damit ist der erste Attention Head abgeschlossen.
> 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: Multi-Head-Attention / Multi-Head Attention

Da wir es mit (der) Multi-Head-Attention des Transformers zu tun haben, wiederholen wir den gesamten Prozess aus 10.1 bis 10.5 mit einer anderen QKV-Abbildung. In der obigen Abbildung werden zur Veranschaulichung nur 2 Heads angenommen, typischerweise hat ein ViT jedoch deutlich mehr. Am Ende entstehen so mehrere Vektoren aggregierter Kontextinformation (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: Letzter Schritt der Attention-Schicht / Last Attention Layer Step

Die so erzeugten mehreren Heads werden anschließend gestapelt und auf Vektoren der Größe d abgebildet, also derselben Größe wie unsere 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: Ergebnis der Attention-Schicht berechnen / Attention Layer Result

Damit ist die Attention-Schicht aus dem vorherigen Schritt vollständig, und wir erhalten wieder Embeddings in genau derselben Größe wie bei der Eingabe.
> 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: Residual-Verbindungen hinzufügen / Residual connections

In Transformern werden Residual-Verbindungen häufig verwendet; das bedeutet schlicht, dass die Eingabe der vorherigen Schicht zur Ausgabe der aktuellen Schicht addiert wird. Das werden wir auch hier tun.
> 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: Ergebnis der Residual-Verbindung berechnen / Residual connection Result

Durch diese Residual-Verbindung entstehen Vektoren derselben Größe, indem Vektoren mit derselben Größe d addiert werden.
> The addition results in vectors of the same size.

10.11. Transformer: Durch das Feed-Forward-Netzwerk leiten / Feed Forward Network

Die bisherigen Ergebnisse (Output) werden nun durch ein Feed-Forward-Neuronales Netz mit nichtlinearen Aktivierungsfunktionen geleitet.
> Now these outputs are feed through a feed forward neural network with non linear activation functions

10.12. Transformer: Endergebnis berechnen / Final Result

Im Transformer folgt nach den bisherigen Berechnungen noch eine weitere Residual-Verbindung, die wir hier der Kürze halber überspringen und damit die Berechnung der Transformer-Schicht abschließen. Am Ende erzeugt der Transformer eine Ausgabe in derselben Größe wie die Eingabe.
> 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. Transformer-Berechnung wiederholen / Repeat Transformers

Die gesamte Transformer-Berechnung aus 10.1 bis 10.12 wird mehrfach wiederholt. Hier wurde als Beispiel eine sechsmalige Wiederholung gezeigt.
> Repeat the entire transformer calculation Steps 10.1 - Steps 10.12 for the Transformer several times e.g. 6 times.

12. Ausgabe des Klassifikations-Tokens identifizieren / Identify Classification token output

Der letzte Schritt besteht darin, die Ausgabe des Klassifikations-Tokens (CLS-Token) zu identifizieren. Dieser Vektor wird im letzten Schritt unserer Vision-Transformer-Reise verwendet.
> Last step is to identify the classification token output. This vector will be used in the final step of our Vision Transformer journey.

13. Letzter Schritt: Klassifikationswahrscheinlichkeiten vorhersagen / Final Step: Predicting classification probabilities

Im abschließenden letzten Schritt wird dieses Klassifikations-Ausgabe-Token durch ein weiteres vollständig verbundenes neuronales Netz geleitet, um die Klassifikationswahrscheinlichkeiten für unser Eingabebild vorherzusagen.
> 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. Training des Vision Transformers / Training of the Vision Transformer

Wir trainieren den Vision Transformer mit einer standardmäßigen Cross-Entropy-Loss-Funktion, die die vorhergesagten Klassenwahrscheinlichkeiten mit den tatsächlichen Klassenlabels vergleicht. Das Modell wird mithilfe von Backpropagation und Gradient Descent trainiert, wobei die Modellparameter so aktualisiert werden, dass die Loss-Funktion minimiert wird.
> 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.

Fazit / Conclusion

In dieser visuellen Erklärung haben wir die zentralen Komponenten von Vision Transformers betrachtet, von der Datenvorbereitung bis zum Training des Modells. Wir hoffen, dass diese Erklärung Ihnen geholfen hat zu verstehen, wie Vision Transformers funktionieren und wie sie zur Bildklassifikation eingesetzt werden können.
> 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.

Um den Vision Transformer noch besser zu verstehen, wurde auch ein kleines Colab Notebook vorbereitet. Bitte schauen Sie sich auch den Kommentar zum 'Blogpost' an. Der Code stammt aus der großartigen VIT Pytorch implementation von @lucidrains, also schauen Sie sich unbedingt auch seine Arbeit an.
> 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.

Wenn Sie Fragen oder Feedback haben, können Sie sich jederzeit gern an mich wenden. Vielen Dank fürs Lesen! (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!

Danksagungen / Acknowledgements


Weiterführende Lektüre

Originaltext

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

Zusammenfassender Beitrag

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

Vision-Transformer-Paper

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

PR12s Video-Review des Vision-Transformer-Papers

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

Vision-Transformer-Repository von Google Research

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

Bei PapersWithCode zusammengestellte Vision-Transformer-bezogene Paper, Code usw.

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


⚠️Werbung⚠️: Fanden Sie diesen von der :pytorch: PyTorch Korean User Group zusammengestellten Artikel hilfreich? Wenn Sie Mitglied werden, senden wir Ihnen wichtige Beiträge per E-Mail zu! (Standard ist wöchentlich, aber eine Umstellung auf täglich ist ebenfalls möglich.)

1 Kommentare

 
gcback 2024-04-22

Vielen Dank für Ihre Mühe und die nützlichen Materialien.^