Ich habe 4 Transformer Feed-Forward-Architekturen an einem 2M-Parameter-GPT getestet - Das ist der Gewinner
Einführung
Wenn LLaMA, Mistral und DeepSeek alle SwiGLU in ihren Feed-Forward-Netzwerken verwenden, ist es leicht anzunehmen, dass man das auch sollte. Aber spielt es auf den kleinen Skalierungen, mit denen die meisten von uns experimentieren, überhaupt eine Rolle? Oder ist es nur noch ein Trick für Milliarden von Parametern?
Ich wollte es wissen. Also führte ich ein kontrolliertes Experiment durch: Ich trainierte ein 2M-Parameter-GPT von Grund auf 12 Mal, wobei ich nichts als die FFN-Architektur und die Aktivierungsfunktion änderte. Gleiche Daten, gleicher Seed, gleicher Optimierer. Das Ergebnis ist ein sauberes, reproduzierbares Benchmark, das eine sehr praktische Frage beantwortet: Was sollte ich in meinem eigenen kleinen Transformer verwenden?
Hier ist der gesamte Ablauf, die Zahlen und ein Schritt-für-Schritt-Guide, damit Sie das Experiment selbst replizieren können.
1. Die Trainings-Pipeline (von Grund auf gebaut)
Be wir zu den Architekturen kommen, ein kurzer Blick auf die Pipeline. Alles ist in rohem PyTorch implementiert - kein HuggingFace Trainer, kein PyTorch Lightning. Dies gibt volle Kontrolle über jedes Detail, was für einen fairen Vergleich entscheidend ist.
Pipeline-Schritte:
Datenaufnahme: Extrahiere Text aus 6 PDF-Büchern (Finanzen, Risikomanagement, Ökonomie) mit PyMuPDF. Bereinige, dedupliziere und kombiniere zu einem einzigen Korpus.
Tokenizer: Trainiere einen BPE-Tokenizer von Grund auf mit Vokabulargröße 4096.
Modell: Ein nur-decoder Transformer (MiniGPT) mit konfigurierbarem FFN - dazu später mehr.
Training: Handschleife mit Gradientenclipping, Validierungsverlust und Perplexity-Tracking.
Reproduzierbarheit: Fester Zufallsseed (42), deterministisches cuDNN, überprüfter Anfangsverlust und ein erfolgreicher Overfit-Test auf einem einzelnen Batch.
Die gesamte Pipeline ist Open Source und kann mit einem einzigen Befehl ausgeführt werden (siehe Abschnitt 7).
2. Experimentelles Setup
| Hyperparameter | Wert |
|---|---|
| Vokabulargröße | 4096 |
| d_model | 128 |
| Attention Heads | 4 |
| Schichten | 4 |
| Maximale Sequenzlänge | 64 |
| Dropout | 0.0 (deaktiviert) |
| FFN versteckte Dimension | 512 (d_model × 4) |
| Gesamtparameter (std.) | 1.85M |
| Gesamtparameter (gated) | 2.11M |
| Daten | 750K Tokens (6 Bücher) |
| Train/Val-Aufteilung | 90% / 10% |
| Optimierer | AdamW (lr=1e-3) |
| Batch-Größe | 128 |
| Epochen | 5 |
| Seed | 42 |
3. Die vier FFN-Architekturen
Standard-FFN (originaler Transformer, BERT, GPT-2)
FFN(x) = Linear2( Activation( Linear1(x) ) )
Zwei lineare Schichten, Aktivierung dazwischen. Einfach, schnell, gut verstanden.
Gated FFNs (SwiGLU, ReGLU, GiGLU)
Gate(x) = Activation( Linear_gate(x) )
Up(x) = Linear_up(x)
FFN(x) = Linear_down( Gate(x) * Up(x) )
Drei lineare Projektionen. Das "Gate" steuert, welche Information durchfließt; der "Up"-Pfad liefert den Inhalt. Das verwenden LLaMA und Mistral.
Die drei Varianten unterscheiden sich nur in der Aktivierung, die auf das Gate angewendet wird:
- SwiGLU: SiLU (Swish)
- ReGLU: ReLU
- GiGLU: GELU
Für jede Architektur testete ich alle drei Aktivierungen - ja, sogar "ReGLU mit GELU" - denn wir wollen sehen, ob die Aktivierung unabhängig von der Gate-Idee selbst eine Rolle spielt.
4. Ergebnisse: Trainingsverlust nach 5 Epochen
| FFN-Typ | Aktivierung | Train Loss (↓) | Parameter |
|---|---|---|---|
| Standard | ReLU | ~0.82* | 1.85M |
| Standard | GELU | 0.78 | 1.85M |
| Standard | SiLU | 0.84 | 1.85M |
| SwiGLU | ReLU | 0.76 | 2.11M |
| SwiGLU | SiLU | 0.74 | 2.11M |
| SwiGLU | GELU | 0.75 | 2.11M |
| ReGLU | SiLU | 0.74 | 2.11M |
| ReGLU | GELU | 0.75 | 2.11M |
| ReGLU | ReLU | 0.76 | 2.11M |
| GiGLU | ReLU | 0.92 | 2.11M |
| GiGLU | GELU | 0.92 | 2.11M |
| GiGLU | SiLU | 0.92 | 2.11M |
Wichtige Erkenntnisse aus der Tabelle:
- SwiGLU+SiLU gewinnt mit einem Verlust von 0.74 und entspricht dem LLaMA-Rezept.
- Standard+GELU ist ein sehr enger Zweiter mit 0.78 - nur 5% schlechter.
- SiLU ist die beste Aktivierung für gated FFNs, schlägt konsistent ReLU und GELU.
- GELU ist die beste für Standard-FFNs (0.78 vs. 0.84 für SiLU, 0.82 für ReLU).
- GiGLU versagt auf dieser Skala - seine Leistung liegt deutlich hinter anderen Architekturen zurück.
5. Warum Gating hilft (und warum nicht immer)
In einem gated FFN lernt das Modell, welche Informationen behalten werden sollen. Denken Sie so:
- Standard-FFN: "Verarbeite alles auf die gleiche Weise."
- Gated FFN: "Entscheide, was wichtig ist, und verarbeite das dann."
Das Gate kann Rauschen unterdrücken, relevante Merkmale verstärken oder sogar irrelevante Dimensionen abschalten. Das ist wirkungsvoll, aber es hat einen Preis: eine dritte Gewichtsmatrix, etwas langsameres Training und die Notwendigkeit genug Modellkapazität, um nützliche Gate-Verhaltensweisen zu lernen.
Bei 2M Parametern ist der Gewinn real, aber bescheiden (0.04 Verlust). Bei 7B Parametern zeigen LLaMA und andere, dass diese Lücke erheblich wächst. Für kleine Modelle können Sie also ruhig bei Standard+GELU bleiben und es einfach halten.
6. Welches FFN sollte man also verwenden?
| Ihre Situation | Meine Empfehlung |
|---|---|
| Modell < 1M Parameter | Standard + GELU |
| Modell 1M-10M Parameter | SwiGLU + SiLU oder Standard + GELU (Gleichstand) |
| Modell > 10M Parameter | SwiGLU + SiLU |
| Speicher- oder Geschwindigkeitskritisch | Standard + GELU |
| LLaMA/Mistral reproduzieren | SwiGLU + SiLU |
7. Dieses Experiment selbst replizieren
Alles ist in meinem GitHub-Repo: raw-pytorch-minigpt.
Klonen und einrichten
git clone https://github.com/hussainnazary2/raw-pytorch-minigpt.git
cd raw-pytorch-minigpt
bash setup.sh
Ein bestimmtes Experiment ausführen (z.B. SwiGLU+SiLU)
git checkout exp-ffn-swiglu-silu
python src/trainer.py
Jedes Experiment hat seinen eigenen Git-Tag. Die config.yaml enthält die genauen Hyperparameter. Alle Läufe verwenden Seed 42 - Sie erhalten dieselben Zahlen.
Wenn Sie alle Experimente ausführen und die Tabelle selbst erstellen möchten, schauen Sie im experiments/-Ordner nach Skripten.
8. Was kommt als Nächstes
Ich werde dieses Benchmark mit folgenden Erweiterungen fortsetzen:
- Validierungsverlustmetriken für alle Konfigurationen
- Größere Modellgrößen (2M, 5M Parameter)
- Unterschiedliche Datendomänen
Das Ziel ist es, eine praktische, Open-Source-Referenz für alle aufzubauen, die kleine Transformer von Grund auf trainieren.
Haben Sie verschiedene FFN-Architekturen in Ihren eigenen Modellen ausprobiert? Ich würde gerne hören, was für Sie funktioniert hat - hinterlassen Sie einen Kommentar oder kontaktieren Sie mich.
Dieser Beitrag ist Teil der Serie "Building GPT from Scratch". Folgen Sie mir für weitere Experimente darüber, was beim Transformer-Training wirklich zählt.
Brauchen Sie Hilfe bei Ihren Transformer-Experimenten? Kontaktieren Sie uns um Architekturoptimierung und Trainingsstrategien zu besprechen.