Neural Network Layers
Die Bausteine neuronaler Netze – Input Layer empfängt Daten, Hidden Layers verarbeiten sie, Output Layer liefert das Ergebnis. Mehr Layers = tieferes Netz = Deep Learning.
Eine Technik, die die Eingaben jeder Schicht normalisiert – stabilisiert das Training, ermöglicht höhere Lernraten und beschleunigt die Konvergenz deutlich.
Batch Normalization ist eine Technik, die das Training von neuronalen Netzen stabilisiert und beschleunigt.
Das Problem: Während des Trainings ändern sich die Gewichte ständig. Das bedeutet, dass die Eingaben für jede Schicht sich ständig verschieben – das Netz muss sich ständig neu anpassen.
Die Lösung: Batch Norm normalisiert die Werte nach jeder Schicht auf Mittelwert 0 und Varianz 1. Das hält alles stabil.
Ohne Batch Norm: Werte driften → instabiles Training → langsam
Mit Batch Norm: Werte normalisiert → stabiles Training → schnell
Vorteile:
Wichtig: In Transformern wird stattdessen Layer Normalization verwendet – das funktioniert unabhängig von der Batch-Größe.
1. Mittelwert: μ = mean(x)
2. Varianz: σ² = var(x)
3. Normalisieren: x̂ = (x - μ) / √(σ² + ε)
4. Skalieren: y = γ · x̂ + β (lernbare Parameter)
Batch Normalization wurde 2015 von Sergey Ioffe und Christian Szegedy in ihrem Paper “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift” eingeführt. Die Technik entstand als Antwort auf das Problem des “Internal Covariate Shift”, welches auftritt, wenn sich die Verteilung der Eingaben für eine Schicht während des Trainings ändert. Durch die Normalisierung der Eingaben wurde nicht nur das Training stabiler, sondern auch die Entwicklung tieferer Netzwerke wurde erheblich erleichtert.
Batch Normalization wird häufig in CNNs eingesetzt, um die Trainingsgeschwindigkeit zu erhöhen und die Leistung zu verbessern. Ein typisches Beispiel ist die Verwendung von Batch Norm zwischen den Convolutional- und den Aktivierungsschichten:
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3)
self.bn1 = nn.BatchNorm2d(32)
self.relu = nn.ReLU()
self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
self.bn2 = nn.BatchNorm2d(64)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.conv2(x)
x = self.bn2(x)
return x
Obwohl Batch Normalization in RNNs weniger gebräuchlich ist, kann sie dennoch verwendet werden, um die Trainingsstabilität zu erhöhen. Hierbei wird häufig Layer Normalization bevorzugt, da sie besser mit den zeitlichen Abhängigkeiten in RNNs zurechtkommt. Ein Beispiel für die Verwendung von Layer Norm in einem RNN könnte so aussehen:
class SimpleRNN(nn.Module):
def __init__(self, input_size, hidden_size):
super(SimpleRNN, self).__init__()
self.rnn = nn.RNN(input_size, hidden_size)
self.layer_norm = nn.LayerNorm(hidden_size)
def forward(self, x):
out, _ = self.rnn(x)
out = self.layer_norm(out)
return out Batch Normalization ist wie das Kalibrieren einer Waage vor jeder Messung: Ohne Kalibrierung driften die Werte ab und die Ergebnisse werden unzuverlässig. Mit Normalisierung bleibt alles stabil.
Normalisiert Aktivierungen auf Mittelwert 0 und Varianz 1 innerhalb eines Mini-Batches
Ermöglicht höhere Lernraten und schnellere Konvergenz
Layer Normalization (statt Batch Norm) ist Standard in Transformern
CNN-Training
Batch Norm nach jeder Convolutional Layer für stabiles Training
Transformer
Layer Normalization in jedem Transformer-Block (Pre-Norm oder Post-Norm)
Tiefe Netze
Ermöglicht Training von sehr tiefen Netzen (100+ Layers) ohne Instabilität
Batch Norm normalisiert über den Batch (alle Beispiele pro Feature). Layer Norm normalisiert über die Features (alle Features pro Beispiel). Layer Norm ist unabhängig von der Batch-Größe und daher Standard in Transformern.
Es reduziert Internal Covariate Shift – die Verteilung der Eingaben ändert sich während des Trainings weniger stark, was das Lernen stabilisiert.
Batch Normalization ermöglicht höhere Lernraten, da es die Eingaben jeder Schicht stabilisiert und die interne Verteilung der Daten während des Trainings kontrolliert. Dies führt zu schnelleren Konvergenzzeiten und verbessert die Gesamtleistung des Modells.
Batch Normalization kann in den meisten neuronalen Netzwerken eingesetzt werden, ist jedoch besonders vorteilhaft in tiefen Netzwerken mit vielen Schichten. In bestimmten Architekturen, wie z.B. bei rekurrenten neuronalen Netzen, kann es jedoch weniger effektiv sein.