Key Findings
  • Self-Supervised Learning (SSL) durchbricht den Engpass manueller Annotation, indem es automatisch Überwachungssignale aus unlabeled Daten konstruiert — BERTs[1] Masked Language Model und MAEs[2] maskierte Bildrekonstruktion sind zwei repräsentative Paradigmen
  • SSL-Methoden lassen sich in drei Hauptkategorien einteilen: generativ (MLM, MAE), kontrastiv (SimCLR[4], MoCo) und selbstdestillierend (DINO[3], BYOL[10]), die sowohl in NLP als auch in CV bahnbrechende Ergebnisse erzielt haben
  • Der Kern des Foundation Model[13] ist „groß angelegtes selbstüberwachtes Pre-Training + nachgelagertes Fine-Tuning" — Modelle wie BERT, GPT[5] und ViT[9] sind zur Infrastruktur der modernen KI geworden
  • Dieser Artikel enthält zwei Google Colab Praxisübungen: BERT MLM Prediction und Sentiment-Klassifikation Fine-Tuning sowie MAE-Bildmaskierungsrekonstruktionsvisualisierung, die direkt im Browser ausgeführt werden können

1. Der Engpass gelabelter Daten: Warum Self-Supervised Learning der Schlüssel zur KI-Skalierung ist

Der Erfolg des Deep Learning hängt von großen Mengen hochwertiger gelabelter Daten ab, doch manuelle Annotation steht vor einem fundamentalen Skalierungsengpass. Die 14 Millionen gelabelten Bilder von ImageNet erforderten über 25.000 Personenjahre an Annotationsarbeit; die Experten-Annotation medizinischer Bilder kostet sogar mehrere Dutzend Dollar pro Bild. Wenn wir über Milliarden von Webseiten-Texten und Bildern verfügen, wird die Annotation zum größten Engpass.

Self-Supervised Learning (SSL) bietet einen Durchbruch: Es konstruiert automatisch Überwachungssignale aus der Struktur der Daten selbst und ermöglicht es dem Modell, bedeutungsvolle Repräsentationen ohne manuelle Annotation zu lernen. Die Kernphilosophie lautet:

Supervised Learning:       Eingabe x  →  manuelle Annotation y  →  Lernen f(x) ≈ y
Self-Supervised Learning:  Eingabe x  →  automatisch generiertes Pseudo-Label ŷ (aus der Struktur von x extrahiert)  →  Lernen f(x̃) ≈ ŷ

Typische „Pseudo-Label"-Strategien:
  Text:     Teilweise Token maskieren, maskierte Token vorhersagen (BERT MLM)
  Bild:     Teilweise Patches maskieren, maskierte Pixel rekonstruieren (MAE)
  Sprache:  Teilweise Zeitschritte maskieren, maskierte Sprachrepräsentationen vorhersagen (wav2vec 2.0)
  Allgemein: Zwei augmentierte Ansichten sollten auf ähnliche Repräsentationen abgebildet werden (Contrastive Learning)

Die Stärke von SSL liegt darin, dass es die nahezu unbegrenzten unlabeled Daten im Internet erschließt. BERT[1] nutzte BooksCorpus + English Wikipedia (3,3 Milliarden Token) für das Pre-Training; GPT-3[8] verwendete 300 Milliarden Token aus gemischten Korpora. Daten dieser Größenordnung können unmöglich manuell annotiert werden, aber Self-Supervised Learning ermöglichte es den Modellen, daraus reichhaltiges Sprach- und Weltwissen zu erlernen.

2. Die Gesamtübersicht des Self-Supervised Learning: Vom Pretext Task zum Contrastive Learning

Die Entwicklung des Self-Supervised Learning hat sich von manuell gestalteten Pretext Tasks zu universellen Frameworks weiterentwickelt[12]. Im Folgenden finden Sie die Klassifikation der wichtigsten aktuellen Methoden:

KategorieKernideeNLP-VertreterCV-VertreterVorteile
Generativ (Generative)Eingabe maskieren oder korrumpieren, Originaldaten rekonstruierenBERT MLM[1], GPT CLM[5]MAE[2], BEiT[14]Intuitiv, stabiles Training, feingranulare Repräsentationen
Kontrastiv (Contrastive)Positive Paare annähern, negative Paare abstoßenSimCLR[4], MoCoSemantische Repräsentationen, starke Transferfähigkeit
Selbstdestillation (Self-Distillation)Student-Netzwerk sagt die Ausgabe des Teacher-Netzwerks vorherDINO[3], BYOL[10]Keine negativen Samples nötig, automatisch entstehende Semantik
Dekorrelation (Decorrelation)Unabhängigkeit zwischen Merkmalsdimensionen maximierenBarlow Twins[17]Konzeptionell einfach, vermeidet Mode Collapse
Diskriminativ (Discriminative)Echte Token von ersetzten Token unterscheidenELECTRA[16]Hohe Sample-Effizienz, Lernen an allen Positionen

Bemerkenswert ist, dass die neuesten Methoden beginnen, mehrere Paradigmen zu fusionieren. DINOv2[15] verwendet gleichzeitig DINOs Selbstdestillationsziel und iBOTs Masked-Prediction-Ziel; BEiT[14] kombiniert Masked Prediction mit diskreter Tokenisierung. Dieser Hybridtrend verwischt zunehmend die Grenzen zwischen den Methodenkategorien.

3. Die Self-Supervised Revolution in der Text-KI: BERT und das Masked Language Model

Im Jahr 2018 veränderten Devlin et al.[1] mit BERT (Bidirectional Encoder Representations from Transformer-Architekturs) das Forschungsparadigma der NLP grundlegend. Die zentrale Innovation bestand aus zwei selbstüberwachten Aufgaben:

Masked Language Model (MLM)

Es werden zufällig 15 % der Token in der Eingabesequenz maskiert, und das Modell muss die maskierten Token vorhersagen. Dies zwingt das Modell, den bidirektionalen Kontext zu verstehen — im Gegensatz zu GPTs unidirektionaler Autoregression[5] nutzt BERT gleichzeitig die Informationen von links und rechts:

Eingabe: The cat [MASK] on the [MASK]
Ziel:    Vorhersage [MASK] → "sat", "mat"

BERTs Maskierungsstrategie (Vermeidung von Pre-Training-Fine-Tuning-Diskrepanz):
  Von den ausgewählten 15 % Token:
    80 % → Ersetzung durch [MASK]         z.B. sat → [MASK]
    10 % → Ersetzung durch zufälliges Token  z.B. sat → dog
    10 % → Unverändert belassen              z.B. sat → sat

MLM-Zielfunktion:
  L_MLM = -E[Σ_{i∈masked} log P(x_i | x_\masked)]

BERT-Architektur:
  BERT-Base:  L=12, H=768,  A=12, Params=110M
  BERT-Large: L=24, H=1024, A=16, Params=340M

  Wobei L=Transformer-Schichten, H=verborgene Dimension, A=Attention-Köpfe

Next Sentence Prediction (NSP)

Gegeben ein Satzpaar (A, B), soll vorhergesagt werden, ob B der nächste Satz nach A ist. Diese Aufgabe soll dem Modell das Verständnis von Satzbeziehungen ermöglichen. Nachfolgende Forschung[6] zeigte jedoch, dass der Effekt von NSP begrenzt war — RoBERTa erzielte nach Entfernung von NSP sogar bessere Ergebnisse.

Pre-Training → Fine-Tuning Paradigma

BERT etablierte das zweistufige Paradigma „Pre-Training + Fine-Tuning" und wurde zum Prototyp des Foundation Model[13]:

Phase 1: Selbstüberwachtes Pre-Training
  Großer unlabeled Korpus → MLM + NSP → Universelle Sprachrepräsentationen

Phase 2: Überwachtes Fine-Tuning
  Aufgabenspezifischen Klassifikationskopf hinzufügen → Mit wenigen gelabelten Daten fine-tunen

  Textklassifikation:   [CLS]-Repräsentation → Linear → softmax
  Named Entity:         Jede Token-Repräsentation → Linear → BIO-Labels
  Question Answering:   Jede Token-Repräsentation → Start/End-Position vorhersagen
  Satzähnlichkeit:      [CLS]-Repräsentation → Cosine Similarity

BERT erzielte SOTA auf 11 NLP-Aufgaben,
mit einer durchschnittlichen Verbesserung von 2–7 Prozentpunkten und leitete die NLP-Pre-Training-Ära ein

BERTs Nachfolger optimierten die Pre-Training-Strategie kontinuierlich: RoBERTa[6] entfernte NSP und verwendete dynamische Maskierung und mehr Daten; ELECTRA[16] ersetzte MLM durch „Replaced Token Detection", sodass das Modell an allen Positionen (statt nur 15 %) lernt und die Trainingseffizienz deutlich steigert.

4. Der Self-Supervised Durchbruch in der Bild-KI: MAE und DINO

Der enorme Erfolg von SSL in der NLP inspirierte ein schnelles Aufholen im CV-Bereich. Nachdem der Vision Transformer (ViT)[9] eine einheitliche Architekturgrundlage lieferte, kristallisierten sich zwei Ansätze im selbstüberwachten CV-Lernen heraus.

Masked Autoencoder (MAE): Aus Maskierung lernen

He et al.[2] übertrugen mit MAE die Masked-Prediction-Idee von BERT elegant auf den visuellen Bereich, mit einer entscheidenden Erkenntnis: Bilder haben eine weit höhere Informationsredundanz als Sprache, weshalb eine extrem hohe Maskierungsrate (75 %) erforderlich ist, um eine sinnvolle Herausforderung zu schaffen:

MAE-Architektur:
  Bild → In 16×16 Patches aufteilen → 75 % zufällig maskieren → Nur sichtbare Patches kodieren
                                                                  ↓
  Encoder (ViT): Verarbeitet nur 25 % der sichtbaren Patches (deutliche Rechenreduktion)
                                                                  ↓
  Decoder (leichter Transformer): Sichtbare Patch-Kodierungen + Maskierungs-Token → Pixel rekonstruieren
                                                                  ↓
  Verlust: MSE(rekonstruierte Pixel, Originalpixel)   Nur an maskierten Positionen berechnet

Wesentliche Designentscheidungen:
  1. Asymmetrische Architektur: Schwerer Encoder + leichter Decoder (Decoder nur für Pre-Training)
  2. Nur sichtbare Patches kodieren: 75 % Maskierung = 4× Rechenbeschleunigung
  3. Pixellevel-Rekonstruktion: Kein zusätzlicher Tokenizer nötig (im Vergleich zu BEiT)
  4. Zufällige Maskierung: Jede Trainingsiteration sieht ein anderes Maskierungsmuster

MAE erzielte auf ImageNet-1K mit reinem selbstüberwachtem Pre-Training eine Top-1-Genauigkeit von 87,8 % (ViT-Huge) und übertraf damit bisherige Supervised-Learning-Benchmarks. Noch wichtiger ist die extrem hohe Trainingseffizienz — da nur 25 % der Patches kodiert werden, sinken Speicher- und Rechenanforderungen erheblich.

DINO: Emergente Semantik durch Selbstdestillation

Caron et al.[3] verfolgten mit DINO (self-distillation with no labels) einen anderen Ansatz — die Selbstdestillation. Die erstaunlichste Entdeckung war: Die Attention Maps selbstüberwachter ViTs lernen automatisch semantische Segmentierung, ohne jegliche Pixellevel-Annotation:

DINO-Architektur:
  Student-Netzwerk g_θs  ←── Gradientenupdate
  Teacher-Netzwerk g_θt  ←── Exponentieller gleitender Durchschnitt (EMA): θt ← λθt + (1-λ)θs

  Trainingsablauf:
  1. Dasselbe Bild → Zwei verschiedene Datenaugmentierungen (Crops)
     - Globale Crops (224×224): 2 Stück
     - Lokale Crops (96×96):   Mehrere
  2. Teacher verarbeitet globale Crops → softmax(g_θt(x) / τ_t)  (τ_t klein → scharfe Verteilung)
  3. Student verarbeitet alle Crops → softmax(g_θs(x) / τ_s)
  4. Verlust: Kreuzentropie H(p_teacher, p_student)

  Schlüssel: Der Student mit lokalen Crops muss die Ausgabe des Teachers mit globalen Crops vorhersagen
             → Zwingt das Modell, aus lokaler Information globale Semantik zu verstehen

DINOs Attention Maps → Automatisch entstehende Objektgrenzen und semantische Segmentierung
  (Ohne jegliche Pixellevel-Annotation, rein aus dem selbstüberwachten Lernen emergent)

DINOv2[15] fusionierte Selbstdestillation und Masked-Prediction-Ziele weiter, trainiert auf einem groß angelegten kuratierten Datensatz, und produzierte leistungsstarke universelle visuelle Merkmale — mit exzellenter Leistung bei Klassifikation, Segmentierung, Tiefenschätzung und weiteren Aufgaben ohne Fine-Tuning.

5. Hands-on Lab 1: BERT Masked Language Model Prediction und Fine-Tuning (Google Colab)

Das folgende Experiment nutzt HuggingFace Transformers für zwei Operationen: (1) BERTs MLM Fill-Mask Prediction, um die Sprachverständnisfähigkeit des vortrainierten Modells zu beobachten; (2) Fine-Tuning von BERT auf der SST-2 Sentiment-Klassifikationsaufgabe, um das „Pre-Training → Fine-Tuning"-Paradigma zu erleben.

# ============================================================
# Lab 1: BERT — MLM Masked Prediction + SST-2 Sentiment-Klassifikation Fine-Tuning
# Umgebung: Google Colab (CPU ausreichend, GPU beschleunigt Fine-Tuning)
# ============================================================
# --- 0. Installation ---
!pip install -q transformers datasets torch

import torch
from transformers import (
    BertTokenizer, BertForMaskedLM,
    BertForSequenceClassification, Trainer, TrainingArguments
)
from datasets import load_dataset
import numpy as np

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Device: {device}")

# ============================================================
# Part A: MLM Fill-Mask Prediction
# ============================================================
print("\n" + "="*60)
print("Part A: BERT Masked Language Model Prediction")
print("="*60)

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
mlm_model = BertForMaskedLM.from_pretrained('bert-base-uncased').to(device)
mlm_model.eval()

# Testsätze
test_sentences = [
    "The capital of France is [MASK].",
    "Artificial [MASK] is transforming every industry.",
    "The cat sat on the [MASK].",
    "Self-supervised learning uses [MASK] data for pre-training.",
    "BERT was developed by [MASK] AI research team.",
]

print("\n--- MLM Predictions ---")
for sentence in test_sentences:
    inputs = tokenizer(sentence, return_tensors='pt').to(device)
    mask_idx = (inputs['input_ids'] == tokenizer.mask_token_id).nonzero(as_tuple=True)[1]

    with torch.no_grad():
        outputs = mlm_model(**inputs)
        logits = outputs.logits

    mask_logits = logits[0, mask_idx[0]]
    top5 = torch.topk(mask_logits, 5)

    print(f"\nInput: {sentence}")
    print("Top-5 predictions:")
    for i, (score, idx) in enumerate(zip(top5.values, top5.indices)):
        token = tokenizer.decode([idx.item()])
        print(f"  {i+1}. {token:15s} (score: {score.item():.2f})")

# ============================================================
# Part B: SST-2 Sentiment-Klassifikation Fine-Tuning
# ============================================================
print("\n" + "="*60)
print("Part B: BERT Fine-tuning on SST-2 Sentiment Classification")
print("="*60)

# --- 1. Daten laden ---
dataset = load_dataset("glue", "sst2")
print(f"Train: {len(dataset['train'])}, Val: {len(dataset['validation'])}")
print(f"Sample: {dataset['train'][0]}")

# --- 2. Tokenize ---
def tokenize_fn(examples):
    return tokenizer(examples['sentence'], truncation=True, padding='max_length', max_length=128)

tokenized = dataset.map(tokenize_fn, batched=True)
tokenized = tokenized.rename_column("label", "labels")
tokenized.set_format("torch", columns=["input_ids", "attention_mask", "labels"])

# Teilmenge für schnellere Demonstration (Colab-freundlich)
small_train = tokenized["train"].shuffle(seed=42).select(range(2000))
small_val = tokenized["validation"]

# --- 3. Modell laden ---
model = BertForSequenceClassification.from_pretrained(
    'bert-base-uncased', num_labels=2
).to(device)

# --- 4. Training ---
def compute_metrics(eval_pred):
    logits, labels = eval_pred
    preds = np.argmax(logits, axis=-1)
    acc = (preds == labels).mean()
    return {"accuracy": acc}

training_args = TrainingArguments(
    output_dir="./bert-sst2",
    num_train_epochs=3,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=64,
    eval_strategy="epoch",
    save_strategy="no",
    learning_rate=2e-5,
    weight_decay=0.01,
    logging_steps=50,
    report_to="none",
    fp16=torch.cuda.is_available(),
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train,
    eval_dataset=small_val,
    compute_metrics=compute_metrics,
)

print("\nFine-tuning BERT on SST-2 (2000 samples, 3 epochs)...")
trainer.train()

# --- 5. Evaluierung ---
results = trainer.evaluate()
print(f"\n--- Results ---")
print(f"Validation Accuracy: {results['eval_accuracy']:.4f}")

# --- 6. Inferenz-Demo ---
print("\n--- Inference Demo ---")
test_texts = [
    "This movie is absolutely wonderful and inspiring!",
    "The film was boring, poorly acted, and a waste of time.",
    "An interesting concept but the execution was mediocre.",
    "I loved every minute of this brilliant masterpiece.",
]

model.eval()
for text in test_texts:
    inputs = tokenizer(text, return_tensors='pt', truncation=True, max_length=128).to(device)
    with torch.no_grad():
        logits = model(**inputs).logits
    pred = torch.argmax(logits, dim=-1).item()
    prob = torch.softmax(logits, dim=-1)[0]
    label = "Positive" if pred == 1 else "Negative"
    print(f"  [{label} {prob[pred]:.2%}] {text}")

print("\nLab 1 Complete!")

6. Hands-on Lab 2: MAE-Bildmaskierungsrekonstruktions-Visualisierung (Google Colab)

Das folgende Experiment nutzt ein vortrainiertes ViT-MAE-Modell von HuggingFace, um an realen Bildern eine Maskierungsrekonstruktion durchzuführen und eine dreispaltige Visualisierung von Originalbild, maskiertem Bild und rekonstruiertem Bild darzustellen.

# ============================================================
# Lab 2: MAE — Bildmaskierungsrekonstruktions-Visualisierung
# Umgebung: Google Colab (CPU ausreichend)
# ============================================================
# --- 0. Installation ---
!pip install -q transformers torch pillow requests matplotlib

import torch
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import requests
from transformers import ViTMAEForPreTraining, ViTMAEConfig, ViTFeatureExtractor

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Device: {device}")

# --- 1. Vortrainiertes MAE-Modell laden ---
print("Loading ViT-MAE model...")
feature_extractor = ViTFeatureExtractor.from_pretrained('facebook/vit-mae-base')
model = ViTMAEForPreTraining.from_pretrained('facebook/vit-mae-base').to(device)
model.eval()
print(f"Model params: {sum(p.numel() for p in model.parameters()):,}")

# --- 2. Testbilder laden ---
urls = [
    "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png",
    "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Camponotus_flavomarginatus_ant.jpg/320px-Camponotus_flavomarginatus_ant.jpg",
]

images = []
for url in urls:
    try:
        img = Image.open(requests.get(url, stream=True, timeout=10).raw).convert('RGB')
        images.append(img)
        print(f"Loaded image: {img.size}")
    except Exception as e:
        print(f"Failed to load {url}: {e}")

# Falls das Laden fehlschlägt, synthetische Bilder verwenden
if len(images) == 0:
    print("Using synthetic test images...")
    img = Image.fromarray(np.random.randint(0, 255, (224, 224, 3), dtype=np.uint8))
    images = [img]

# --- 3. MAE-Rekonstruktionsfunktion ---
def mae_reconstruct(model, feature_extractor, image, mask_ratio=0.75):
    """MAE-Maskierungsrekonstruktion ausführen"""
    # Vorverarbeitung
    inputs = feature_extractor(images=image, return_tensors='pt')
    pixel_values = inputs['pixel_values'].to(device)

    # Forward Pass (Modell maskiert intern zufällig)
    with torch.no_grad():
        outputs = model(pixel_values)

    # Maskierungsinformationen abrufen
    # ids_restore und mask bestimmen, welche Patches maskiert wurden
    mask = outputs.mask  # [1, num_patches], 1=masked, 0=visible
    pred = outputs.logits  # [1, num_patches, patch_size**2 * 3]

    return pixel_values, pred, mask

def visualize_reconstruction(pixel_values, pred, mask, image_size=224, patch_size=16):
    """Originalbild, maskiertes Bild und rekonstruiertes Bild visualisieren"""
    # Patch-Anzahl berechnen
    num_patches_per_side = image_size // patch_size
    num_patches = num_patches_per_side ** 2

    # Originalbild (aus Tensor wiederherstellen)
    original = pixel_values[0].cpu()
    # Denormalisierung
    mean = torch.tensor(feature_extractor.image_mean).view(3, 1, 1)
    std = torch.tensor(feature_extractor.image_std).view(3, 1, 1)
    original = original * std + mean
    original = original.clamp(0, 1).permute(1, 2, 0).numpy()

    # Rekonstruiertes Bild (aus Patch-Vorhersagen zusammengesetzt)
    pred_patches = pred[0].cpu()  # [num_patches, patch_size**2 * 3]
    # Als Bild umordnen
    pred_img = pred_patches.reshape(num_patches_per_side, num_patches_per_side,
                                     patch_size, patch_size, 3)
    pred_img = pred_img.permute(0, 2, 1, 3, 4).reshape(image_size, image_size, 3)
    pred_img = pred_img.numpy()
    # Denormalisierung
    pred_img = pred_img * feature_extractor.image_std + feature_extractor.image_mean
    pred_img = np.clip(pred_img, 0, 1)

    # Maskiertes Bild (maskierte Bereiche grau gefüllt)
    mask_np = mask[0].cpu().numpy()  # [num_patches]
    masked_img = original.copy()
    for i in range(num_patches):
        if mask_np[i] == 1:  # Maskiert
            row = i // num_patches_per_side
            col = i % num_patches_per_side
            r_start, r_end = row * patch_size, (row + 1) * patch_size
            c_start, c_end = col * patch_size, (col + 1) * patch_size
            masked_img[r_start:r_end, c_start:c_end] = 0.5  # Grau

    # Kombiniertes Bild: Maskierte Positionen mit Rekonstruktion, sichtbare Positionen mit Original
    combined = original.copy()
    for i in range(num_patches):
        if mask_np[i] == 1:
            row = i // num_patches_per_side
            col = i % num_patches_per_side
            r_start, r_end = row * patch_size, (row + 1) * patch_size
            c_start, c_end = col * patch_size, (col + 1) * patch_size
            combined[r_start:r_end, c_start:c_end] = pred_img[r_start:r_end, c_start:c_end]

    mask_ratio = mask_np.sum() / len(mask_np)

    return original, masked_img, combined, mask_ratio

# --- 4. Rekonstruktion ausführen und visualisieren ---
n_images = len(images)
fig, axes = plt.subplots(n_images, 3, figsize=(15, 5 * n_images))
if n_images == 1:
    axes = axes[np.newaxis, :]

for idx, img in enumerate(images):
    pixel_values, pred, mask = mae_reconstruct(model, feature_extractor, img)
    original, masked_img, combined, mask_ratio = visualize_reconstruction(pixel_values, pred, mask)

    axes[idx, 0].imshow(original)
    axes[idx, 0].set_title(f'Original Image', fontsize=13)
    axes[idx, 0].axis('off')

    axes[idx, 1].imshow(masked_img)
    axes[idx, 1].set_title(f'Masked ({mask_ratio:.0%} patches hidden)', fontsize=13)
    axes[idx, 1].axis('off')

    axes[idx, 2].imshow(combined)
    axes[idx, 2].set_title('Reconstruction (masked patches filled)', fontsize=13)
    axes[idx, 2].axis('off')

plt.suptitle('MAE: Masked Autoencoder — Image Reconstruction', fontsize=16, y=1.02)
plt.tight_layout()
plt.show()

# --- 5. Experiment zur Maskierungsrate ---
print("\n--- Mask Ratio Experiment ---")
print("MAE verwendet eine Maskierungsrate von 75 %. Beobachten wir die Rekonstruktionsergebnisse bei verschiedenen Maskierungen:")

# Die Maskierungsrate des MAE-Modells wird durch die config gesteuert, hier zeigen wir die Standard-75 %
# In der Forschungspraxis kann config.mask_ratio modifiziert werden, um verschiedene Raten zu testen
pixel_values, pred, mask = mae_reconstruct(model, feature_extractor, images[0])
mask_np = mask[0].cpu().numpy()
visible_count = (mask_np == 0).sum()
masked_count = (mask_np == 1).sum()
total = len(mask_np)

print(f"Total patches: {total}")
print(f"Visible patches: {visible_count} ({visible_count/total:.1%})")
print(f"Masked patches: {masked_count} ({masked_count/total:.1%})")
print(f"\nMAEs Design-Erkenntnis: Bilder haben hohe räumliche Redundanz,")
print(f"daher müssen 75 % der Patches maskiert werden, um das Modell zu sinnvollem Repräsentationslernen zu zwingen.")
print(f"Im Vergleich dazu maskiert BERT nur 15 % der Token —")
print(f"weil die Informationsdichte von Sprache weit höher ist als die von Bildern.")

print("\nLab 2 Complete!")

7. Entscheidungsrahmen: Wie Unternehmen die richtige Self-Supervised Learning Strategie wählen

Angesichts der Vielzahl von SSL-Methoden müssen Unternehmen basierend auf ihrem Datentyp, ihren Rechenressourcen und ihren Anwendungsszenarien eine Auswahl treffen:

MethodeModalitätPre-Training-ZielRechenbedarfAnwendungsszenarienDownstream-Transfer
BERT[1]TextMLM + NSPMittel (4–16 TPU-Tage)Textklassifikation, NER, QAFine-Tuning + [CLS]-Klassifikation
GPT[5]TextAutoregressives CLMHoch (Tausende GPU-Tage)Textgenerierung, Dialog, ReasoningPrompt / In-context
MAE[2]BildMaskierte Patch-RekonstruktionMittel (ViT-L 1600 Epochen)Bildklassifikation, ObjekterkennungFull-Model Fine-Tuning
DINO[3]BildSelbstdestillation + Multi-CropMittel-hochSegmentierung, Retrieval, Zero-ShotLinear Probe / k-NN
SimCLR[4]BildContrastive LearningHoch (große Batch-Größe nötig)Universelle visuelle RepräsentationenLinear Probe / Fine-Tuning
wav2vec 2.0[11]SpracheMaskiert + KontrastivMittelSpracherkennung, SprecheridentifikationCTC Fine-Tuning

Entscheidungslogik für die Wahl einer SSL-Strategie:

Entscheidungsbaum:
1. Datenmodalität?
   ├── Text → 2a
   ├── Bild → 2b
   └── Sprache → wav2vec 2.0

2a. Art der Textaufgabe?
    ├── Verständnisaufgabe (Klassifikation/NER/QA) → BERT-Familie (bidirektionaler Encoder)
    └── Generierungsaufgabe (Zusammenfassung/Dialog/Übersetzung) → GPT-Familie (autoregressiver Decoder)

2b. Menge gelabelter Daten?
    ├── Ausreichend (>10K gelabelte Samples) → MAE (beste Ergebnisse nach Fine-Tuning)
    ├── Knapp (<1K gelabelte Samples) → DINO (stärker bei Zero-Shot/Linear Probe)
    └── Nahezu keine → DINOv2 (eingefrorene Features + k-NN-Klassifikator)

3. Rechenbudget?
   ├── Begrenzt → Open-Source-vortrainierte Modelle nutzen (HuggingFace Hub)
   └── Ausreichend → Weiter auf Domain-Daten vortrainieren (Domain Adaptation)

8. Vom Pre-Training zum Wettbewerbsvorteil: Der strategische Wert von SSL

Self-Supervised Learning ist nicht nur eine Technologie — es gestaltet die KI-Strategie von Unternehmen grundlegend um. Das Konzept des Foundation Model[13] offenbart einen Trend: Groß angelegte selbstüberwachte Pre-Training-Modelle werden zur KI-Infrastruktur, ebenso unverzichtbar wie Strom und Internet.

Domain-Specific Pre-Training

Die strategisch wertvollste SSL-Anwendung für Unternehmen ist das domänenspezifische Pre-Training: Auf der Grundlage allgemeiner Modelle wird mit unternehmenseigenen unlabeled Daten weiter vortrainiert, um einen technologischen Burggraben aufzubauen, den Wettbewerber nur schwer replizieren können:

Beispiele für domänenspezifisches Pre-Training:
  Biomedizin:  PubMedBERT — Pre-Training auf PubMed-Artikeln → Biomedizin-NLP SOTA
  Finanzen:    FinBERT — Pre-Training auf Finanznachrichten und -berichten → Sentiment-Analyse SOTA
  Recht:       Legal-BERT — Pre-Training auf Rechtsdokumenten → Vertragsanalyse
  Code:        CodeBERT — Pre-Training auf Code-Dokumentations-Paaren → Codesuche/-generierung

  Allgemeines Muster:
  Open-Source-Basismodell → Weiter vortrainieren auf Domain-Korpus → Fine-Tuning mit wenigen Labels → Deployment

Return on Investment:
  ✓ Erschließung der riesigen Mengen unlabeled Unternehmensdaten (Dokumente, Logs, Bilder)
  ✓ Drastische Reduzierung des Annotationsbedarfs (von Zehntausenden auf Hunderte)
  ✓ Aufbau schwer replizierbarer Domain-Modelle (Daten als Burggraben)
  ✓ Einheitliche Repräsentationsbasis für mehrere Aufgaben (einmal vortrainieren, mehrfach fine-tunen)

Implikationen von SSL für die KI-Strategie von Unternehmen

Für Entscheidungsträger, die KI-Investitionen evaluieren, bringt SSL drei zentrale Erkenntnisse:

  1. Strategische Neuausrichtung der Datenstrategie: Die Investition in die Sammlung großer Mengen unlabeled Daten (statt weniger präzise gelabelter Daten) bietet eine höhere KI-ROI-Bewertung. Unternehmen sollten systematische Datensammlungs-Pipelines aufbauen statt kostspielige Annotationsprozesse
  2. Hebeleffekt der Recheninvestition: Eine einzige Pre-Training-Investition kann mehrere Downstream-Aufgaben bedienen. Obwohl die Pre-Training-Kosten hoch sind, sinken die Stückkosten bei Verteilung auf Dutzende von Anwendungsszenarien weit unter die Kosten des Trainings jeder einzelnen Aufgabe von Grund auf
  3. Strategische Nutzung des Open-Source-Ökosystems: Der HuggingFace Hub bietet über 500.000 vortrainierte Modelle. Unternehmen müssen nicht von Grund auf vortrainieren — sie wählen das am besten passende Open-Source-Modell und trainieren auf Domain-Daten weiter, um schnell differenzierende Fähigkeiten aufzubauen

9. Fazit und Ausblick

Self-Supervised Learning ist einer der bedeutendsten Paradigmenwechsel im KI-Bereich des letzten Jahrzehnts. Von BERTs[1] Masked Language Model über MAEs[2] maskierte Bildrekonstruktion, von SimCLRs[4] Contrastive Learning bis DINOs[3] Selbstdestillation — SSL hat in vielfältigen Formen eine zentrale These bewiesen: Die Struktur der Daten selbst enthält reichhaltige Überwachungssignale.

Rückblick auf die Kernentwicklungen:

Mit Blick auf die Zukunft umfassen die Entwicklungsrichtungen von SSL: multimodales einheitliches Pre-Training (wie ImageBind, das sechs Modalitäten vereint), effizientere Pre-Training-Methoden (Reduktion des Rechenbedarfs bei gleichbleibender Leistung) sowie der Übergang vom statischen Pre-Training zum kontinuierlichen Lernen (Modelle lernen auch nach dem Deployment weiter aus neuen Daten). Die Transformer-Architektur[7] bietet eine einheitliche Rechenbasis über Modalitäten hinweg, und SSL liefert ein einheitliches Lernparadigma über Modalitäten hinweg — die Kombination beider treibt die Entstehung einer wahrhaft universellen KI-Infrastruktur voran.