Vision Transformer (ViT)
Ein Vision Transformer (ViT) teilt ein Bild in Bildausschnitte und verknüpft sie mithilfe von Self-Attention. Behandelt werden Architektur, Varianten und Vor- und Nachteile im Vergleich zu CNNs.
Ein Vision Transformer (ViT) ist ein neuronales Netz, das die Transformer-Architektur aus der Sprachmodellierung auf Bilder anwendet. Es zerteilt ein Bild in Ausschnitte fester Größe, wandelt jeden Ausschnitt in eine Token-Einbettung um und verarbeitet die Sequenz mit Self-Attention. So kann jeder Ausschnitt bereits ab der ersten Schicht Informationen aus allen anderen Ausschnitten beziehen. Google-Forscher stellten die Architektur in „An Image is Worth 16x16 Words“ vor. Sie zeigten, dass ein reiner Transformer ohne Faltung-Schichten bei ausreichenden Vortrainingsdaten mit modernsten Faltungsneuronalen Netzen (CNNs) für die Bildklassifizierung mithalten kann. ViTs dienen heute als Bildencoder für Vision-Language-Modelle, Foundation-Modelle zur Segmentierung und selbstüberwachte Backbones.
So funktionieren Vision Transformer#
Ein ViT wandelt ein Bild in eine Sequenz um und verarbeitet sie anschließend ähnlich wie Text. Die folgenden Schritte verwenden ViT-Base/16 mit einem Bild von 224×224 Pixeln:
- Patch-Einbettung: Das Bild wird in Ausschnitte von 16×16 Pixeln zerteilt, die ein Raster mit 14×14 beziehungsweise 196 Ausschnitten bilden. Jeder Ausschnitt wird abgeflacht und mit einer gelernten Matrix multipliziert, sodass eine Einbettung mit 768 Dimensionen entsteht. Üblicherweise wird das mit einer 16×16-Faltung und Stride 16 umgesetzt.
- Klassentoken und Positionseinbettungen: Der Sequenz wird ein lernbares Klassentoken vorangestellt, und jedem Token werden lernbare Positionseinbettungen hinzugefügt. Attention allein berücksichtigt die Reihenfolge nicht. Daher sind diese Einbettungen die einzige Informationsquelle darüber, von welcher Stelle im Bild jeder Ausschnitt stammt.
- Transformer-Encoder: Eine Folge identischer Blöcke – zwölf bei ViT-Base – wechselt zwischen Multi-Head-Self-Attention, die Informationen zwischen allen Token mischt, und einem zweischichtigen MLP mit GELU-Aktivierungen, das jedes Token einzeln transformiert. Vor jeder Unterschicht kommt eine Schichtnormalisierung, und eine Residualverbindung umschließt sie.
- Kopf: Die endgültige Ausgabe des Klassentokens wird einem linearen Klassifikator zugeführt. Für dichte Aufgaben wie Segmentierung werden stattdessen die Patch-Token verwendet und wieder zu einem Raster mit 14×14 Elementen angeordnet.
Der folgende PyTorch-Code erstellt die Token-Sequenz für ein Bild und leitet sie durch einen einzelnen Encoderblock.
import torch
from torch import nn
# ViT-Base/16-Einstellungen: 16x16-Patches, Token mit 768 Dimensionen, 12 Attention-Köpfe
image = torch.randn(1, 3, 224, 224)
patch_embed = nn.Conv2d(3, 768, kernel_size=16, stride=16) # eine lineare Projektion pro Patch
# Das Bild in ein Raster aus 14x14 Patches zerteilen und zu 196 Token abflachen
tokens = patch_embed(image).flatten(2).transpose(1, 2)
# Ein lernbares Klassentoken voranstellen und lernbare Positionseinbettungen hinzufügen
cls_token = nn.Parameter(torch.zeros(1, 1, 768))
pos_embed = nn.Parameter(torch.zeros(1, 197, 768))
tokens = torch.cat([cls_token, tokens], dim=1) + pos_embed
# Ein Encoderblock mit Normierung vor den Unterschichten, in dem jedes Token jedes andere Token berücksichtigt
block = nn.TransformerEncoderLayer(
d_model=768, nhead=12, dim_feedforward=3072, activation="gelu", batch_first=True, norm_first=True
)
print(block(tokens).shape)Es gibt torch.Size([1, 197, 768]) aus: die 196 Patch-Token plus das Klassentoken, alle weiterhin 768-dimensional und bereit für den nächsten der zwölf Blöcke von ViT-Base.
Modellgrößen und Varianten#
Die Namen von ViT geben Modell- und Patchgröße an: ViT-B/16 ist das Basismodell mit 86 Millionen Parametern und Patches von 16×16 Pixeln. Die großen und sehr großen Modelle haben 307 Millionen beziehungsweise 632 Millionen Parameter. Kleinere Patches ergeben mehr Token und damit mehr Details, allerdings auch einen höheren Rechenaufwand. Mehrere Varianten veränderten das Training oder den Aufbau von ViTs:
- DeiT: Eine Trainingsmethode mit starker Datenerweiterung und einem Destillationstoken, mit der sich allein auf ImageNet-1k und ohne zusätzliche Vortrainingsdaten konkurrenzfähige ViTs trainieren lassen.
- Swin Transformer: Berechnet Attention in verschobenen lokalen Fenstern und führt Patches zwischen den Stufen zusammen. Dadurch entsteht eine CNN-ähnliche Hierarchie, die sich für Objekterkennung und Segmentierung eignet.
- Maskierte Autoencoder (MAE) und DINOv2: Selbstüberwachte Verfahren zum Vortraining von ViTs mit nicht annotierten Bildern. MAE rekonstruiert dabei maskierte Patches, DINOv2 gleicht die Ausgaben eines Lehrernetzes ab.
- CLIP und SigLIP: ViT-Bildencoder, die darauf trainiert werden, Bilder ihren Bildunterschriften zuzuordnen. Sie werden häufig als Bildverarbeitungskomponente multimodaler Modelle wiederverwendet.
Anwendungen#
- Visuell-sprachliche Modelle: Ein ViT-Encoder wandelt ein Bild in eine Folge von Token um, die ein großes Sprachmodell zusammen mit Text verarbeitet, wodurch das Erstellen von Bildbeschreibungen und die Beantwortung von Fragen zu Bildern möglich werden.
- Dichte Vorhersagen: Patch-Token aus ViT-Backbones dienen der Bildsegmentierung und Tiefenschätzung, bei denen jedes Ausgabepixel Informationen aus weit entfernten Bildbereichen benötigt.
- Videoverständnis: Video-ViTs zerteilen Clips in raumzeitliche Patches. Selbstüberwachte Videomodelle wie V-JEPA lernen Bewegungs- und Erscheinungsmerkmale aus nicht annotiertem Videomaterial für Aufgaben wie die Aktionserkennung.
Vision Transformer im Vergleich zu CNNs#
CNNs beruhen in jeder Schicht auf zwei Annahmen: Lokalität, denn jeder Filter erfasst eine kleine Nachbarschaft, und Translationsäquivarianz, denn derselbe Filter wird an jeder Position angewendet. Abgesehen vom Patch-Raster muss ein ViT die räumliche Struktur aus Daten lernen. Im ursprünglichen Artikel schnitten ViTs, die nur mit ImageNet (1,3 Millionen Bilder) trainiert wurden, einige Prozentpunkte schlechter ab als ähnlich große ResNets. Durch Vortraining mit dem Datensatz JFT-300M mit 300 Millionen Bildern erreichte ViT-H/14 eine ImageNet-Top-1-Genauigkeit von 88,55 %. Ein weiterer Unterschied ist der Rechenaufwand. Self-Attention vergleicht jedes Token mit jedem anderen. Eine Verdopplung der Bildseitenlänge vervierfacht daher die Tokenzahl und versechzehnfacht den Aufwand für Attention. Flash Attention verringert den Speicherverkehr bei dieser Berechnung, und Fenster-Attention begrenzt die Anzahl der Vergleiche selbst. Ultralytics führt Metas Segment Anything Model aus. Dessen Checkpoint sam_b.pt kodiert jedes Bild mit 1024×1024 Pixeln mithilfe eines ViT-B-Backbones: Die 16×16-Patches bilden ein Raster aus 4.096 Token mit einer Größe von 64×64. Daher wenden acht der zwölf Blöcke Attention nur innerhalb von Fenstern mit 14×14 Elementen an, während vier globale Attention verwenden.










