Stable Diffusion zeigt, wie man komplexe generative Modelle praktisch nutzbar macht, indem man im latenten Raum (statt im Bild-Raum) arbeitet.
Das Problem mit Diffusion
Originale Diffusions-Modelle (DDPM, 2020) waren extrem langsam:
Training:
- Trainiere auf 512x512 Bildern
- Das sind 262.144 Pixel
- Braucht ~1000 Diffusion Steps
- Sehr Memory-intensiv
Inferenz:
- 50-1000 Iterationen, um ein Bild zu erzeugen
- Auf GPU: 30+ Sekunden pro Bild
- Auf CPU: Minuten
Lösung von Stable Diffusion: Arbeite nicht im Bild-Raum, arbeite im latenten Raum (VAE).
Die Architektur: VAE + Diffusion + CLIP
Step 1: VAE Encoder
Input: 512x512 RGB Image
Output: 64x64x4 Latent Tensor
Step 2: Diffusion in Latent Space
Noise + Denoise (4x weniger Daten als original)
Step 3: CLIP Encoding (für Text)
Input: "A cat on a sunny beach"
Output: 768-dim Embedding
Step 4: U-Net mit Cross-Attention
Kombiniere latent + CLIP embedding
Step 5: VAE Decoder
Input: 64x64x4 Latent
Output: 512x512 Image
VAE (Variational Autoencoder)
Der Trick: Komprimiere die Bilder in einen kleineren latenten Raum:
Encoder: 512x512 → 64x64x4
- 8x8x4 Kompression
- Verlustfrei (mit Quantization)
Decoder: 64x64x4 → 512x512
- Trainiert gemeinsam mit Encoder
- Lernt wie man aus Latents rekonstruiert
Vorteil:
- 64x weniger Parameter
- 64x schneller
- Diffusion im latenten Raum ist praktisch
CLIP: Der Text-Encoder
CLIP (Contrastive Language-Image Pre-Training) ist das Herzstück:
Input: "A cat on a sunny beach"
Processing:
1. Tokenisiere (BPE)
2. Transformer Encoder
3. Output: 768-dim Embedding
Dieses Embedding wird als Condition für U-Net verwendet
CLIP wurde auf Milliarden von Image-Text Paaren trainiert, so dass die Embeddings sehr aussagekräftig sind.
U-Net mit Cross-Attention
Der Diffusion Process selbst:
def forward(latent, timestep, clip_embedding):
# timestep: Sagt dem Modell "wie verrauscht ist das Bild?"
# clip_embedding: "Was möchte der User?"
# Gehe durch U-Net Blöcke
x = latent
for block in encoder_blocks:
x = block(x, timestep, clip_embedding) # Cross-Attention!
# Predict noise to remove
noise_pred = decoder(x)
return noise_pred
Cross-Attention:
Self-Attention: Token achtet auf andere Tokens
Cross-Attention: Latent attends zu CLIP embedding
Query: Latent (512x512/64 = 4096 tokens)
Key/Value: CLIP (77 tokens)
→ Effizient, weilen CLIP ist klein
Training vs. Inference
Training
Daten: LAION-5B (5 Milliarden Image-Text Paare)
1. Lade Bild, enkodiere zu Latent (VAE Encoder)
2. Sample random noise level t
3. Füge Noise hinzu: x_t = sqrt(alpha_t) * x + sqrt(1 - alpha_t) * noise
4. Sage Modell: "Entferne Noise"
5. Loss: MSE zwischen predicited noise und actual noise
Effekt: Modell lernt was "relevant" Tokens sind
Inference
1. Start: Pure noise (512x512x4 random values)
2. Loop 50 Schritte:
- Frage Modell: "Was ist weniger Noise?"
- Subtrahiere predict noise
- Reduziere Varianz basierend auf Timestep
3. Nach 50 Schritten: Halbwegs sauberes Bild
4. VAE Decoder: Latent → Bild
5. Output: 512x512 Bild
Die Evolutions-Kette
Stable Diffusion v1 (2022)
Modell: 860M Parameter
Trained: LAION-5B Subset
Context: 77 Token CLIP
Größe: 4 GB
Stable Diffusion v1.5 (2022)
Verbesserungen:
- Fine-tuned auf bessere Daten
- +5% bessere Qualität
- Bessere Anatomie, Hände
SDXL (2023)
Größer:
- 3.5B Parameter (4x größer)
- Zwei CLIP Models statt einem
- Größerer Latent Space
- Besser für 1024x1024 Images
Ergebnis: Deutlich bessere Qualität
Stable Diffusion 3 (2024)
Architektur-Änderung:
- Switched von U-Net zu Diffusion Transformer
- MMDiT (Multimodal Diffusion Transformer)
- Bessere Scaling Properties
Performance:
- Besser Text-Alignment
- Bessere Qualität
Praktische Auswirkungen
Performance-Vergleiche
Bild-Generierung Zeit:
DALL-E 2: 30-60 Sekunden
Midjourney: ~30 Sekunden (aus API)
Stable Diffusion v1 (A100): 5-10 Sekunden
Stable Diffusion v1 (RTX 3090): 20-30 Sekunden
Stable Diffusion v1 (CPU): 5-10 Minuten
Hardware-Anforderungen
VRAM für Inference:
Optimiert: 2-4 GB (mit Quantization)
Standard: 8 GB
Nicht optimiert: 24 GB
Das ist warum Stable Diffusion "Stable" ist:
- Läuft auf consumer GPUs
- Nicht nur auf A100/H100
Fine-tuning und Customization
Stable Diffusion ist extrem anpassbar:
LoRA (Low-Rank Adaptation):
- Trainiere nur kleine Adapter
- Nur 1-10 MB Größe
- Kann neuen "Stil" lehren
Textual Inversion:
- Lerne neue "Konzepte"
- Aus 3-5 Bildern
- Als Token im Text-Space
DreamBooth:
- Personalisierung
- Lerne "wie person X aussieht"
Warum Stable Diffusion "stable" ist
- Trainiert auf öffentlich verfügbarer Daten (LAION, nicht proprietary)
- Offen verfügbares Modell (nicht nur API)
- Läuft lokal (nicht abhängig von externem Server)
- Keine NSFW Filter (Nutzer können selbst entscheiden)
Das macht es zum politisch am wenigsten umstritten Generative Model.
