- Backpropagation ist der Kern des Trainings von neuronalen Netzen, doch ohne Verständnis der internen Funktionsweise treten unerwartete Fehler in einer Struktur auf, die eine „leaky abstraction“ darstellt
- Aktivierungsfunktionen wie Sigmoid oder tanh können bei falscher Gewichtsinitialisierung zu vanishing gradients führen, wodurch das Training zum Stillstand kommt
- ReLU kann das Phänomen der dead ReLUs verursachen, bei dem Neuronen dauerhaft deaktiviert werden, wenn der Eingang 0 oder kleiner ist
- Bei RNNs kommt es durch wiederholte Matrixmultiplikation zu exploding gradients; um das zu verhindern, sind gradient clipping oder der Einsatz von LSTM nötig
- Wer die Funktionsweise der Backpropagation nicht versteht, verliert selbst dann deutlich an Debugging- und Modellverbesserungsfähigkeit, wenn das Framework alles automatisch verarbeitet
Warum man Backpropagation verstehen muss
- In Stanfords CS231n-Kurs sind die Aufgaben so aufgebaut, dass Studierende Forward Pass und Backpropagation selbst implementieren
- Einige Studierende beschwerten sich, das sei unnötig, weil Frameworks wie TensorFlow die Backpropagation automatisch berechnen
- Backpropagation ist jedoch keine vollständige Abstraktion, sondern eine leaky abstraction; ohne Kenntnis der internen Abläufe ist es schwer, die Ursache für fehlgeschlagenes Training zu finden
- Die Haltung „Das Framework regelt das schon“ führt letztlich zu schwächerem Modelldesign und schlechteren Debugging-Fähigkeiten
Vanishing Gradients bei Sigmoid
- Nichtlineare Funktionen wie Sigmoid oder tanh geraten bei großen Eingabewerten in einen Sättigungszustand (saturation), bei dem die Ausgabe nahe 0 oder 1 liegt
- Dann wird der lokale Gradient z(1-z)* zu 0, sodass bei der Backpropagation die Weitergabe des Gradienten blockiert wird
- Der maximale Gradient von Sigmoid beträgt 0,25; bei jedem Durchlauf wird das Signal also auf höchstens ein Viertel reduziert
- Dadurch lernen tiefere Schichten deutlich langsamer als höhere Schichten
- Wer Sigmoid-Schichten verwendet, muss daher besonders auf Gewichtsinitialisierung und Datenvorverarbeitung achten
Das Problem der dead ReLUs
- ReLU ist eine Funktion, die die Ausgabe auf 0 setzt, wenn der Eingang 0 oder kleiner ist
- Ist die Neuronenausgabe im Forward Pass 0, dann ist im Backward Pass auch der Gradient 0, wodurch das Neuron dauerhaft deaktiviert werden kann
- Während des Trainings kann ein Neuron durch große Gewichtsupdates oder eine hohe Lernrate in diesem „toten Zustand“ feststecken
- Nach dem Training kann es vorkommen, dass ein erheblicher Teil aller Neuronen nur 0 ausgibt
- Deshalb sind bei ReLU Lernratenanpassung und Initialisierungsstrategie besonders wichtig
Exploding Gradients in RNNs
- In einfachen RNNs wird bei jedem Zeitschritt dieselbe Hidden-State-Matrix (Whh) wiederholt multipliziert
- Bei der Backpropagation konvergiert der Gradient abhängig von der Größe des Eigenwerts (eigenvalue) dieser Matrix gegen 0 oder wächst unbegrenzt an
- Bei |b| < 1 entstehen vanishing gradients, bei |b| > 1 exploding gradients
- Um das zu verhindern, verwendet man typischerweise gradient clipping oder eine LSTM-Architektur
Fallbeispiel für falsches Clipping in DQN-Code
- In einer TensorFlow-basierten DQN-Implementierung wurde Code gefunden, der mit
tf.clip_by_value direkt delta (den Q-Fehler) clippt
- Bei diesem Ansatz wird der Gradient 0, sobald delta den Bereich verlässt, und das Training stoppt
- Beabsichtigt war jedoch Gradient Clipping; stattdessen sollte Huber loss verwendet werden
- Im Beispielcode wird der Huber-Verlust bedingt mit einer Kombination aus
tf.square und tf.abs implementiert
- Das Problem wurde als GitHub-Issue gemeldet und sofort behoben
Fazit
- Backpropagation ist nicht bloß ein Automatisierungswerkzeug, sondern ein System der Credit Assignment, das komplexe Folgen nach sich zieht
- Ohne Verständnis der inneren Abläufe stößt man auf Modellinstabilität, Trainingsfehlschläge und Debugging-Grenzen
- Backpropagation ist mathematisch nicht besonders schwer und lässt sich mit CS231n-Kurs und Aufgaben intuitiv erlernen
- Wer Backpropagation versteht, verbessert seine Fähigkeiten bei Design und Problemlösung für neuronale Netze deutlich
- Statt sich nur auf die automatische Differenzierung des Frameworks zu verlassen, ist es wichtig, den tatsächlichen Fluss der Backpropagation zu verstehen
1 Kommentare
Hacker-News-Kommentare
Mir scheint, dass Backpropagation hier einen ungerechtfertigt schlechten Ruf bekommt
Eigentlich geht es in dieser Diskussion weniger um Backpropagation selbst als darum, wie unvollständige Abstraktionen Gradienten und Varianten von Gradient Descent im Optimierungsprozess sind
Backpropagation ist lediglich ein Algorithmus zur Berechnung der Ableitung zusammengesetzter Funktionen, und Probleme wie verschwindende Gradienten bei mehrfach gestapelten Sigmoid-Funktionen sind kein Problem der Backpropagation, sondern eine Eigenschaft der Funktion selbst
Der Grund, warum man Leute den Backward Pass direkt implementieren lässt, ist, dass sie durch das eigene Berechnen der Ableitungen ein Gefühl dafür bekommen, wie Exponentialterme wirken
Der Kern ist, dass sich die Details der Backpropagation in manchen Situationen nicht abstrahieren lassen, einschließlich der Berechnung des Gradienten
Besonders bei Gradient Descent ist das so, bei anderen globalen Optimierungsalgorithmen könnte das Problem geringer sein
Da Backpropagation derzeit praktisch die einzige Methode ist, um in Deep Learning Gradienten zu berechnen, ist diese undichte Abstraktion in der Praxis real
Ich respektiere Karpathys Beitrag, aber seine Texte und Vorträge verwischen oft begriffliche Unterscheidungen, was zu Missverständnissen führt
Auf seinem Niveau erwartet man eine höhere Präzision
Karpathys Beitrag zur Deep-Learning-Ausbildung ist wirklich enorm
Von kurzen Texten bis zu dem hervorragenden Artikel über RNNs, dazu YouTube-Vorlesungen und GitHub-Projekte — alles hervorragend
Das kürzlich veröffentlichte nanochat ist ebenfalls ein großartiges Beispiel: kleine, klare und vollständige Beispiele helfen Lernenden enorm
Später wurde mir klar, dass sie mehr daran interessiert waren, LLMs zu vertrauen und sie zu nutzen, als sie wirklich zu verstehen
Tatsächlich interessierten sie sich mehr für spekulative Debatten wie „eine Gesellschaft, in der intelligente Maschinen alles erledigen“ als für die Funktionsweise von LLMs
Statt einfach nur „ChatGPT zu fragen“, recherchiert er selbst, liest Code und findet Bugs
Diese erkundende Herangehensweise ist echtes Lernen
Im Masterstudium hatte ich eine Aufgabe, Backpropagation anhand eines Papers direkt zu implementieren
Man musste Forward und Backward Pass nur mit mathematischen Operationen schreiben, und es war die beste Lernerfahrung des Jahres
Solche Aufgaben macht man von sich aus selten, aber wenn man dazu gezwungen wird, helfen sie enorm
Ich habe sogar eine UI gebaut, um zu visualisieren, wie sich Gewichte und Biases während des Trainings verändern
Ich habe mich über die Beziehung zwischen Backpropagation und dem Optimizer gewundert
SGD bewegt sich einfach in Richtung des Gradienten, aber fortgeschrittene Optimizer wie Adam verwenden den Gradienten nicht direkt, sondern wenden Normalisierung, Momentum, Clipping usw. an
Ist eine exakte Gradientenberechnung also wirklich nötig, oder reicht es, die ungefähre Richtung zu kennen?
Dazu gibt es passende Arbeiten wie Papers zu SGD-Rauschen und Visualisierungsforschung
Die Richtung nur grob zu schätzen ist aber riskant — die Krümmung der Loss-Funktion (Hessian) kann sich stark ändern
Tatsächlich entstand aus dieser Idee stochastic gradient descent, und darüber hinaus gibt es Ansätze wie Direct Feedback Alignment
Auch Ben Rechts Zusammenfassung zur Beziehung zwischen Optimierung und Reinforcement Learning ist interessant
Entscheidend ist nicht der Wert der Loss-Funktion, sondern die Form von Gradient und Krümmung
Optimizer wie Adam schätzen als Näherung erster Ordnung die Skalenempfindlichkeit jedes Parameters und passen den Gradienten entsprechend an
Optimierung höherer Ordnung ist bei nichtlinearen Funktionen wie ReLU nicht möglich
Es ist eine notwendige Maßnahme, um das Vanishing-Gradient-Problem zu lösen
In hochdimensionalen Räumen können schon kleine Fehler große Auswirkungen haben, deshalb ist eine präzise Gradientenberechnung sehr wichtig
Das Problem beginnt schon bei der Frage, wie man überhaupt eine „ungefähre Richtung“ berechnen will
Auch fortgeschrittene Optimizer wie AdamW basieren weiterhin zentral auf Gradienten
Um 2016 herum wurden Tricks wie Gradient Clipping wohl viel häufiger verwendet
Im Paper von Alex Graves aus dem Jahr 2013, Sequence Generation with RNNs, steht zum Beispiel, dass Clipping eingesetzt wurde, um explodierende Gradienten bei LSTMs zu verhindern
Ich selbst fand Backpropagation so wichtig, dass ich sogar eine Spezialvorlesung nur zu PyTorch autograd besucht habe
Heute unterstützen Frameworks Clipping direkt, und das Verständnis von Trainingsproblemen ist größer geworden
Das bedeutet aber nicht, dass das Problem verschwunden ist — ReLU und GELU sind noch immer Standardaktivierungen, und das Training von LLMs kommt immer noch einer „black art“ nahe
Das Smol Training Playbook von Hugging Face ist ein Beleg dafür
Langfristig könnte es vorteilhaft sein, Modelle zu trainieren, die robust gegenüber einer Vielfalt von Aktivierungsfunktionen sind
Wenn man zum Beispiel beim Training zufällig zwischen ReLU, Swish und GELU wechselt, könnte man ähnlich wie bei Dropout eine Art Regularisierungseffekt erzielen
Dann könnte man bei der Inferenz sogar auf die rechnerisch günstigste Funktion umstellen
Der ursprüngliche Titel „Yes you should understand backprop“ ist viel klarer und besser
Wenn zu viel vom Code übernommen wird, verfällt man leicht der Illusion, dass es irgendwie magisch funktioniert
Mir hat im Graduiertenstudium sehr geholfen, Faltungen und Backpropagation einmal direkt per Hand auszurechnen
Die Frage „Warum sollte ich den Backward Pass selbst schreiben, wenn das Framework ihn automatisch berechnet?“ ist besorgniserregend, weil sie derselben Logik folgt wie
„Warum Addition lernen, wenn es Taschenrechner gibt?“
So wie es nützlich ist, Compiler, Sortieralgorithmen oder die Funktionsweise von Transistoren zu verstehen, ist es auch wertvoll, Backpropagation zu lernen
Allerdings ist Lernzeit begrenzt, daher ist die eigentliche Frage, ob das nützlicher ist als andere Themen
Backpropagation ist deshalb lernenswert, weil man ohne Verständnis der inneren Abläufe verborgene Fehlermodi nur schwer erkennt
Ich habe sie selbst mehrfach implementiert, und sie hat genau die richtige Komplexität, um eine neue Sprache zu evaluieren
Als ich zum ersten Mal Deep Learning lernte, wirkte Backpropagation auf mich fast wie Magie
Aber als ich sie selbst implementierte, war es nur eine Folge einfacher Berechnungen, und dadurch hatte ich viel mehr Vertrauen beim Debugging oder bei der Suche nach Ursachen für stagnierende Loss-Werte
Wer Deep Learning lernt, sollte es mindestens einmal selbst von Hand implementieren
Es gibt auch eine Gegenposition
Ich denke nicht, dass Studierende Backpropagation unbedingt in NumPy implementieren müssen
Die Undichtigkeiten von Backprop lösen Forschende durch neue Optimizer, und Entwickler müssen dann nur noch gute Hyperparameter finden
Ein Teil des Problems entsteht im Modelldesign oder in der Trainingsschleife
Gradient Clipping ist zum Beispiel in den meisten Frameworks nicht standardmäßig aktiviert
Dieser Text richtet sich an Leserinnen und Leser mit Forschungs- oder akademischer Perspektive
Wer das Gradientenverhalten von Funktionen wie Sigmoid oder ReLU nicht versteht, kann Probleme mit explodierenden oder verschwindenden Gradienten nicht lösen
Wer neue Modellarchitekturen entwerfen will, muss verstehen, wie Backpropagation funktioniert, sonst schlägt das Training fehl oder die Leistung leidet
Erst wenn man die Abstraktion durchdringt, entdeckt man die wirklich unbekannten Bereiche (unknown unknowns)