Convolutional Neural Networks: wie Maschinen sehen
Warum nicht einfach MLPs verwenden?
Ein 224×224-RGB-Bild besitzt Eingabewerte. Eine vollverbundene Hidden Layer mit 1.000 Einheiten würde ungefähr 150 Millionen Parameter benötigen — allein für die erste Schicht. Das ist rechnerisch teuer, statistisch ineffizient und ignoriert die räumliche Struktur von Bildern.
CNNs nutzen drei wichtige induktive Biases:
- Lokale Konnektivität — benachbarte Pixel hängen stärker zusammen als weit entfernte
- Weight Sharing — derselbe Feature-Detektor ist überall im Bild nützlich
- Translationsäquivarianz — eine Katze bleibt eine Katze, unabhängig davon, wo sie erscheint
Die Faltungsoperation
Eine Faltungsschicht wendet einen gelernten Filter der Größe an, indem sie ihn über die Eingabe schiebt und Skalarprodukte berechnet:
Für eine Eingabe der Größe und einen Filter mit Stride und Padding ist die räumliche Ausgabegröße:
Eine Schicht mit Filtern lernt unterschiedliche Feature Maps, die jeweils verschiedene Muster erkennen (Kanten, Texturen, Formen).
Pooling
Pooling reduziert räumliche Dimensionen und erzeugt Translationsinvarianz. Max Pooling nimmt den maximalen Wert innerhalb einer lokalen Region:
Ein Max Pool mit Stride 2 halbiert Höhe und Breite. Average Pooling wird in späteren Schichten oder für globale Aggregation (AdaptiveAvgPool2d) verwendet.
Rezeptives Feld
Das rezeptive Feld eines Neurons ist der Bereich der Eingabe, der seine Aktivierung beeinflusst. Mit Schichten von -Faltungen und Stride 1 gilt:
Kleine -Filter zu stapeln ist parametereffizienter als große Filter und erreicht dasselbe rezeptive Feld. Zwei -Schichten decken einen -Bereich mit weniger Parametern und einer zusätzlichen Nichtlinearität ab.
Klassische Architekturen
LeNet-5 (1998)
Das erste praktische CNN. Zwei Conv-Layer + Pooling, gefolgt von vollverbundenen Schichten. Für 32×32-Graustufenbilder von Ziffern entwickelt.
AlexNet (2012)
Gewann ImageNet mit großem Abstand. Zentrale Innovationen: ReLU-Aktivierungen, Dropout, Data Augmentation und GPU-Training. Verwendete - und -Filter in frühen Schichten.
VGG (2014)
Zeigte, dass Tiefe entscheidend ist. Verwendete ausschließlich gestapelte -Faltungen in 16–19 Schichten. Einfach und äußerst einflussreich; noch heute als Backbone gebräuchlich.
ResNet (2015)
Führte Residualverbindungen ein, um sehr tiefe Netze (50–152 Schichten) trainieren zu können:
Die Skip Connection hilft gegen verschwindende Gradienten, indem sie einen direkten Gradientenpfad bereitstellt. ResNet50 bleibt eine Standard-Baseline.
Moderne Ansätze: EfficientNet, ConvNeXt
EfficientNet nutzt Neural Architecture Search, um Tiefe, Breite und Auflösung gemeinsam zu skalieren. ConvNeXt greift reine Faltungsdesigns mit Transformer-inspirierten Anpassungen wieder auf (Layer Norm, größere Kernel, GELU).
Ein ResNet-Block in PyTorch
import torch
import torch.nn as nn
class ResidualBlock(nn.Module):
def __init__(self, channels: int):
super().__init__()
self.block = nn.Sequential(
nn.Conv2d(channels, channels, 3, padding=1, bias=False),
nn.BatchNorm2d(channels),
nn.ReLU(inplace=True),
nn.Conv2d(channels, channels, 3, padding=1, bias=False),
nn.BatchNorm2d(channels),
)
self.relu = nn.ReLU(inplace=True)
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.relu(self.block(x) + x)
Batch-Normalisierung
BatchNorm normalisiert die Eingabe jeder Schicht über den Mini-Batch auf Mittelwert null und Varianz eins und wendet anschließend die lernbare Skalierung und Verschiebung an:
Das stabilisiert das Training, erlaubt höhere Lernraten und wirkt als milder Regularisierer. BatchNorm wird vor oder nach der Aktivierungsfunktion eingesetzt; davor ist in modernen Netzen häufiger.
Transfer Learning
Features vortrainierter CNNs lassen sich bemerkenswert gut zwischen Aufgaben übertragen. Der Standard-Workflow:
import torchvision.models as models
# Load pre-trained weights
backbone = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
# Replace the classifier head
num_classes = 10
backbone.fc = nn.Linear(backbone.fc.in_features, num_classes)
# Fine-tune: freeze early layers, train later ones
for name, param in backbone.named_parameters():
if "layer4" not in name and "fc" not in name:
param.requires_grad = False
Wichtigste Erkenntnisse
- Faltung nutzt lokale räumliche Struktur mit deutlich weniger Parametern als vollverbundene Schichten
- Residualverbindungen gehören zu den wirkungsvollsten Architekturinnovationen für tiefe CNNs
- -Faltungen plus Tiefe schlagen große Einzel-Filter
- BatchNorm ist in tiefen Faltungsnetzen fast immer hilfreich
- Transfer Learning aus ImageNet-Vortraining liefert starke Initialisierungen für die meisten Vision-Aufgaben