Quelle - Neuronale Netze selbst programmieren

Aus Zweites Gehirn, dem persönlichen Wiki
Quelle - Neuronale Netze selbst programmieren
TypQuelle
Rohdateisources/Neuronale_Netze_selber_erstellen.pdf (nur lokal, per .gitignore vom Repository ausgeschlossen)
AutorTariq Rashid, übersetzt von Frank Langenau
VerlagO'Reilly / dpunkt.verlag, Heidelberg
Datum_quelle2024 (2., aktualisierte und erweiterte Auflage; englisches Original „Make Your Own Neural Network“)
FormatPDF (lizenziertes E-Book), 251 Seiten, mit Textebene
Erstellt2026-09-26
Aktualisiert2026-09-26
Tagsneuronale-netze, maschinelles-lernen, python, pytorch, buch

Einsteigerbuch von Tariq Rashid (2. Auflage 2024): Es entwickelt neuronale Netze Schritt für Schritt aus Schulmathematik, programmiert eines in Python für die handgeschriebenen Ziffern von MNIST und überträgt es zum Schluss auf PyTorch.

Lizenz

Das PDF ist ein auf den Nutzer lizenziertes E-Book. Die Lizenz erlaubt nur die eigene Nutzung und keine Weitergabe an Dritte. Deshalb liegt die Rohdatei nur lokal in sources/ und ist per .gitignore vom Repository ausgeschlossen (Entscheid des Nutzers vom 2026-09-26). Die Wiki-Seiten fassen den Inhalt in eigenen Worten zusammen und zitieren Code nur in kurzen Zeilen.

Aufbau der Quelle

Seiten Kapitel Eingeflossen in
9–14 Einführung: Suche nach Denkmaschinen, KI-Winter, biologisches Vorbild Künstliches neuronales Netz
15–43 Vorhersagemaschine, linearer Klassifizierer, Lernrate, Grenzen bei XOR Linearer Klassifikator
44–72 Neuronen, Schwellwert, Sigmoid, Schichten, Gewichte, Matrizenmultiplikation Künstliches neuronales Netz, Aktivierungsfunktion
73–84 Fehler aufteilen und zurückführen, Matrixform mit transponierter Gewichtsmatrix Backpropagation
84–103 Gradientenverfahren, Fehlerfunktionen, Herleitung der Gewichtsaktualisierung Gradientenverfahren, Backpropagation
103–108 Daten vorbereiten: Skalierung, Zielwerte, Anfangsgewichte Künstliches neuronales Netz
109–132 Python-Grundlagen: Notebooks, Schleifen, Funktionen, numpy, Klassen –
132–176 Die Klasse neuralNetwork, MNIST, Lernrate, Epochen, versteckte Knoten Künstliches neuronales Netz, MNIST
177–188 Eigene Handschrift, Rückwärtsabfrage („Gedächtnis“), Drehungen als Zusatzdaten Künstliches neuronales Netz
189–219 PyTorch: Classifier, Dataset, Training, BCE, Leaky ReLU, Adam, LayerNorm PyTorch, Aktivierungsfunktion, Gradientenverfahren
221 Epilog: Deep Learning, AlphaGo 2016 Künstliches neuronales Netz
223–243 Anhang: Einführung in die Analysis, Potenz- und Kettenregel Differentialrechnung

Kernaussagen

  1. Lernen heisst: einen Parameter anhand des Fehlers schrittweise verbessern, gedämpft durch eine Lernrate. Ein einzelner linearer Klassifizierer kann aber nur Daten trennen, die sich durch eine Gerade trennen lassen, und scheitert schon an XOR (Linearer Klassifikator).
  2. Ein künstliches neuronales Netz besteht aus Schichten von Knoten. Jeder Knoten summiert die gewichteten Eingänge und wendet eine Aktivierungsfunktion an. Mit Matrizen wird das zu X = W·I und O = sigmoid(X), unabhängig von der Netzgrösse (Künstliches neuronales Netz, Aktivierungsfunktion).
  3. Die Backpropagation verteilt den Ausgabefehler im Verhältnis zu den Gewichten rückwärts auf die inneren Knoten, in Matrixform e_hidden = Wᵀ · e_output (Backpropagation).
  4. Die Gewichte werden mit dem Gradientenverfahren angepasst: kleine Schritte entgegen der Steigung der Fehlerfunktion. Die Steigung liefert die Kettenregel der Differentialrechnung (Gradientenverfahren).
  5. Ein einfaches dreischichtiges Netz in etwa 50 Zeilen Python erkennt die handgeschriebenen Ziffern von MNIST zu rund 97,5 %. Mit gedrehten Zusatzbildern sind es 97,9 %. In PyTorch bringen BCE-Verlust, Leaky ReLU, Adam und LayerNorm die Genauigkeit von 87 % auf 97 % (MNIST, PyTorch).

Bewertung

Einordnung (Claude)

Das Buch ist bewusst elementar: Es erklärt die Mathematik anschaulich und ohne Vorwissen und verzichtet auf moderne Architekturen wie Faltungsnetze (CNN), Transformer oder Stapelverarbeitung. Ein Grossteil des Stoffs von Kapitel 1–3 stammt aus der 1. Auflage (englisch 2016, Code „(c) Tariq Rashid, 2016“), die 2. Auflage ergänzt vor allem Kapitel 4 zu PyTorch.

Nachgerechnet und korrekt: km-in-Meilen-Beispiel, Training des Klassifizierers (A = 0,25 → 0,3083 → 1,6042), Signalfluss im Zwei-Schichten-Netz (0,7408 und 0,6457), sigmoid(1,16) = 0,761, Fehlerrückführung (0,42 / 0,88 und 0,362 / 0,938), Gewichtsaktualisierung (Gradient −0,0265, neues Gewicht 2,00265), Analysis-Anhang (Tangentensteigung 12, Sekante 6, Ableitung 3t² + Δt² → 3t²).

Fehler und Ungenauigkeiten in der Quelle
  • S. 43 (Kernideen): „Ein einzelner linearer Klassifizierer kann keine Daten separieren, wenn diese Daten selbst von einem einzelnen linearen Prozess stammen.“ Hier fehlt ein „nicht“. Gemeint ist: wenn die Daten nicht von einem einzelnen linearen Prozess stammen, wie bei XOR.
  • S. 86: Bei 18 Gewichten mit je 1000 möglichen Werten gebe es „18.000 Möglichkeiten“. Richtig sind 1000¹⁸ = 10⁵⁴ Kombinationen. Auch die „500 Millionen“ für ein Netz mit 500 Knoten pro Schicht sind viel zu tief. Die Schlussfolgerung, dass Durchprobieren unmöglich ist, gilt dadurch erst recht.
  • S. 106 vs. S. 137: Der Text empfiehlt als Streuung der Anfangsgewichte 1/√(Anzahl eingehender Verknüpfungen). Der Code verwendet aber die Knotenzahl der nächsten Schicht (pow(self.hnodes, -0.5)). Für die erste Gewichtsmatrix wären das 1/√784 ≈ 0,036 statt 1/√100 = 0,1.
  • S. 119–120: Python runde bei / 2 auf eine ganze Zahl ab. Das galt nur für Python 2. In Python 3 ist / immer eine Gleitkomma-Division, ganzzahlig teilt //.
  • S. 170: Die Spitzenleistung mit Lernrate 0,1 wird einmal mit 0,9628, einmal mit 0,9689 angegeben. Ausserdem heisst es, 5 Epochen seien das Optimum, obwohl die Spitze bei 7 Epochen liegt.
  • Kleinigkeiten: Abbildung 1-21 zeigt y = 0,3086x statt 0,3083x (S. 37). Der Dateipfad wechselt zwischen myo_gan und gan (S. 193, 207). Im Anhang steht (x² + x)² statt (x³ + x)² (S. 240).
Veraltete Bibliotheksaufrufe (Einordnung Claude, nicht eigens geprüft)

scipy.misc.imread (S. 179) wurde aus SciPy entfernt. numpy.asfarray gibt es in NumPy 2.0 (2024) nicht mehr, scipy.ndimage.interpolation.rotate heisst heute scipy.ndimage.rotate. Der Code aus Kapitel 2 und 3 läuft auf aktuellen Installationen deshalb vermutlich nicht unverändert. Ersatz wären z.B. numpy.asarray(..., dtype=float) und das Paket imageio.

Neu angelegte Seiten

Verwandt