Sofortantwort
CLIP einfach erklärt
OpenAI-Modell, das Text und Bilder in einem gemeinsamen Vektorraum verbindet.
- Kurz gesagt
- Trainiert auf 400 Millionen Bild-Text-Paaren aus dem Internet
- Typischer Einsatz
- Semantische Bildsuche, Zero-Shot-Klassifikation, Content Moderation
- Wichtig zu wissen
- Basis für DALL-E, Stable Diffusion und viele multimodale Modelle
CLIP im Überblick
CLIP (Contrastive Language-Image Pretraining) hat 2021 die Computer Vision neu definiert. Statt ein Modell für eine spezifische Aufgabe zu trainieren, lernte CLIP ein universelles Verständnis der Beziehung zwischen Bildern und Sprache – und das durch schlichtes Lesen des Internets.
Das Training war radikal einfach: 400 Millionen Bild-Text-Paare aus dem Web, und das Modell lernt, dass zusammengehörige Bilder und Texte ähnliche Embeddings haben sollen. Das Ergebnis war überraschend mächtig: CLIP konnte Bilder in beliebige Kategorien einordnen, ohne je auf diesen Kategorien trainiert zu werden – Zero-Shot-Klassifikation auf ImageNet mit Accuracy vergleichbar zu überwachten Modellen von 2019.
Warum CLIP so wichtig ist:
- Es verbindet zwei Modalitäten (Text + Bild) in einem einzigen Vektorraum
- Zero-Shot-Fähigkeiten ohne task-spezifisches Training
- Wurde zur Grundlage für DALL-E, Stable Diffusion und fast alle modernen multimodalen Modelle
Technisch betrachtet
Architektur
CLIP besteht aus zwei Encodern:
Text: "a photo of a dog"
→ Text Encoder (Transformer) → Text-Embedding [512d]
Bild: 🐕 (Foto eines Hundes)
→ Image Encoder (ViT oder ResNet) → Bild-Embedding [512d]
Cosine Similarity(Text-Embedding, Bild-Embedding) → hoch (0.9)
Contrastive Learning
Das Training nutzt eine N×N-Matrix von Ähnlichkeiten:
| Text 1 | Text 2 | Text 3 | |
|---|---|---|---|
| Bild 1 | ✅ Hoch | ❌ Niedrig | ❌ Niedrig |
| Bild 2 | ❌ Niedrig | ✅ Hoch | ❌ Niedrig |
| Bild 3 | ❌ Niedrig | ❌ Niedrig | ✅ Hoch |
Die Diagonale soll maximiert, alles andere minimiert werden.
Zero-Shot-Klassifikation
import clip
import torch
from PIL import Image
model, preprocess = clip.load("ViT-B/32")
image = preprocess(Image.open("dog.jpg")).unsqueeze(0)
text = clip.tokenize(["a photo of a cat", "a photo of a dog", "a photo of a car"])
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
# Cosine Similarity
similarity = (image_features @ text_features.T).softmax(dim=-1)
# → [0.02, 0.95, 0.03] → "a photo of a dog" gewinnt