Residualverbindungen erklärt: Warum sich tiefe Transformer überhaupt trainieren lassen
Warum stumpfes Stapeln von Schichten das Training bricht, wie Skip-Verbindungen x + F(x) den Gradientenfluss retten, wie Pre-LayerNorm-Blöcke sie nutzen, und eine kurze PyTorch-Implementierung.
Stapelt man naiv Dutzende Schichten übereinander, wird das Training instabil. Residualverbindungen, auch Shortcuts genannt, lösen das, indem sie Informationen und Gradienten direkt durch das Netz wandern lassen.
Warum einfaches Stapeln scheitert
An diesem Punkt besteht ein Transformer-Block aus drei Teilen: Multi-Head-Self-Attention, Layer-Normalisierung und einem Feed-Forward-Netz. Es liegt nahe, sie einfach nacheinander zu wiederholen:
Input
│
▼
Attention
│
▼
Feed Forward
│
▼
Attention
│
▼
Feed Forward
│
▼
...
Das trainiert schlecht. Je tiefer ein Netz wird, desto schwerer lässt es sich optimieren, und das war eines der größten Hindernisse im Deep Learning, bis 2015 mit ResNet die Residualverbindungen kamen. Fast jeder aktuelle Transformer, darunter GPT, BERT, LLaMA, Claude und Gemini, ist auf sie angewiesen.
Beginnen wir mit einem Netz aus zwei Schichten:
Input ↓Layer 1 ↓Layer 2 ↓Output
Das zu trainieren ist meist problemlos. Stellen Sie sich jetzt 96 Schichten vor:
Input↓Layer 1↓Layer 2↓...↓Layer 96↓Output
Jede Schicht transformiert die Ausgabe der vorherigen. Bei der Backpropagation muss der Gradient auf dem Weg nach unten durch jede Schicht zurück, und unterwegs kann er gegen null schrumpfen (verschwinden), unbegrenzt wachsen (explodieren) oder immer verrauschter werden. Am Ende lernen die ersten Schichten kaum noch etwas.
Stille Post
Denken Sie an eine Nachricht, die durch fünfzig Personen weitergeflüstert wird:
Person 1↓Person 2↓Person 3↓...↓Person 50
Am Ende hat sie sich stark verändert. Teile fehlen, Teile sind verdreht. Ein tiefes Netz verhält sich ähnlich, denn jede Schicht verschiebt die Repräsentation ein wenig, und nach genügend vielen davon kann das nützliche Signal verblassen.
Eine Abkürzung einbauen
Was wäre, wenn die Daten nicht durch jede Schicht müssten, sondern sie auch umgehen könnten?
Input
│
├──────────────┐
▼ │
Layer │
▼ │
Output │
│ │
└────── Add ◄──┘
│
▼
Final Output
Die ursprüngliche Eingabe hat nun immer einen direkten Weg zu späteren Schichten, und diese kleine Änderung verändert das Verhalten tiefer Netze grundlegend.
Die Mathematik
Angenommen, eine Schicht berechnet Folgendes:
F(x)
Ohne Residualverbindung ist die Ausgabe einfach das Ergebnis der Schicht:
Output = F(x)
Mit einer wird die Ausgabe zu:
Output = x + F(x)
Die Eingabe wird direkt auf die transformierte Ausgabe addiert. Diese Operation heißt Skip-Verbindung oder Shortcut-Verbindung.
Warum das hilft
Angenommen, eine bestimmte Schicht hat nichts Nützliches beizutragen. In einem einfachen Netz müsste sie irgendwie lernen, sich wie eine Identitätsfunktion zu verhalten, und das ist erstaunlich schwer. Mit einer Residualverbindung gibt es die Identität gratis. Die Schicht muss nur lernen:
F(x) = 0
sodass:
Output = x + 0 = x
Die Eingabe geht unverändert durch, und die Optimierung wird viel einfacher.
Die Differenz lernen
Daher kommt der Name. Eine Schicht muss nicht die gesamte Transformation lernen, sondern nur die Differenz, das Residuum, zwischen Eingabe und Zielausgabe. Bildbearbeitung ist ein guter Vergleich: Man malt selten das ganze Bild neu, man passt es an, hellt es auf, erhöht den Kontrast oder schärft Kanten. Auch eine Transformer-Schicht muss selten die ganze Repräsentation ersetzen. Sie muss sie nur ein wenig verbessern.
Zwei Abkürzungen pro Block
Jeder Transformer-Block enthält zwei Residualverbindungen. Die erste umschließt die Attention-Schicht:
Input
│
├──────────────┐
▼ │
Multi-Head Attention
▼ │
Add ◄───────────┘
│
▼
Output
Die zweite umschließt das Feed-Forward-Netz:
Input
│
├──────────────┐
▼ │
Feed Forward Network
▼ │
Add ◄───────────┘
│
▼
Output
Pre-LayerNorm
Aktuelle GPT-Modelle verwenden das Pre-LayerNorm-Layout, das so berechnet wird:
Input
│
▼
LayerNorm
│
▼
Multi-Head Attention
│
▼
Add Residual
│
▼
LayerNorm
│
▼
Feed Forward Network
│
▼
Add Residual
│
▼
Output
LayerNorm läuft hier vor jeder Teilschicht, nicht danach, und diese Anordnung macht das Training tiefer Transformer spürbar stabiler.
Gradientenfluss
Bei der Backpropagation hat der Gradient jetzt zwei Wege:
Gradient↓Transformer Layer↓Residual Path
Erweist sich die Haupttransformation als schwer optimierbar, bietet die Abkürzung trotzdem einen anderen Rückweg, sodass der Gradient nicht vollständig verschwinden kann. Analytisch gesprochen ist die Ableitung von
x + F(x)
gleich
1 + F'(x)
Diese konstante 1 ist enorm wichtig. Selbst wenn
F'(x)
sehr klein wird, hat der Gradient über die Identitätsverbindung noch einen direkten Weg. Das ist einer der Hauptgründe, warum Residualnetze erfolgreich trainieren.
Ein Zahlenbeispiel
Angenommen, das Eingabe-Embedding ist:
[0.5, 1.2, -0.3]
und die Attention liefert:
[0.1, -0.2, 0.4]
Statt die Eingabe zu ersetzen, werden beide addiert:
[0.5, 1.2, -0.3] + [0.1, -0.2, 0.4] = [0.6, 1.0, 0.1]
Die ursprüngliche Information bleibt erhalten, während die neue hinzugemischt wird.
In PyTorch
Im Code kostet das fast nichts:
x = x + self.attention(
self.layer_norm1(x)
)
x = x + self.ffn(
self.layer_norm2(x)
)
Diese Addition ist eine der bedeutendsten Operationen der gesamten Architektur.
Ein vollständiger Block
Input
│
▼
LayerNorm
│
▼
Multi-Head Attention
│
▼
Add Residual
│
▼
LayerNorm
│
▼
Feed-Forward Network
│
▼
Add Residual
│
▼
Output
Moderne LLMs wiederholen diese Struktur Dutzende oder sogar Hunderte Male.
Was sich mit und ohne ändert
Ohne Residualverbindungen sind tiefe Netze schwer zu optimieren, Gradienten verschwinden leichter, Informationen gehen nach und nach verloren, und zusätzliche Schichten verschlechtern die Ergebnisse oft. Mit ihnen fließt Information direkt durch das Netz, Gradienten bleiben stabil, tiefere Modelle werden trainierbar und die Optimierung wird deutlich einfacher. Residuales Lernen ist einer der Durchbrüche, die heutige große Sprachmodelle erst möglich gemacht haben.