01 · Problem
Wofür braucht man das?
Ein dichtes neuronales Netz approximiert eine Funktion, indem es gewichtete Summen durch nichtlineare Aktivierungen schickt und Fehler rückwärts verteilt.
02 · Denkmodell
Das mentale Modell
Layer sind Matrizen statt rekursiver Objektgraphen. Forward erzeugt Aktivierungen; Backprop berechnet Deltas; ein Optimizer aktualisiert Gewichte und Biases.
Neuron, Layer und Network bilden einen rekursiven Graphen. Bias und propagate verändern nichts, train kann nicht lernen, Shapes sind ungeprüft und Serialisierung läuft in Zyklen.
03 · Kontrollfluss
Was passiert in welcher Reihenfolge?
- Eingabevektor auf erwartete Layerbreite prüfen.
- Pro Layer Matrix-Vektor-Produkt plus Bias berechnen und aktivieren.
- Loss zwischen Ausgabe und Ziel bestimmen.
- Deltas mit Ableitungen rückwärts durch die Layer propagieren.
- Gewichte und Biases um Learning-Rate mal Gradient aktualisieren.
04 · Bauteile
Die entscheidenden Verträge
Neuron<T>
Speichert Verbindungen und Bias, nutzt den Bias im Repository aber nicht.
Layer<T>
Erzeugt mehrere Neuronen und vollständige Verbindungen.
Network<T>.activate / train
Soll Forward und Training ausführen; propagate aktualisiert gegenwärtig keine Parameter.
toObject
Versucht den zyklischen Verbindungsgraph rekursiv zu serialisieren.
05 · Build it yourself
Selbst implementieren
Implementiere ein kleines numerisches Dense-Netz und beweise Lernen zunächst an XOR, bevor du Generics oder Graphen ergänzt.
- Speichere Gewichte als number[][] und Biases als number[] mit validierten Shapes.
- Implementiere Forward inklusive Aktivierung und bewahre Zwischenwerte für Backprop auf.
- Berechne Gradienten und aktualisiere Parameter mit einer expliziten Learning Rate.
type Layer = { weights: number[][]; biases: number[] };
function forward(input: number[], layers: Layer[]) {
const activations = [input];
for (const layer of layers) {
const previous = activations.at(-1) as number[];
const next = layer.weights.map((row, output) => {
const sum = row.reduce((value, weight, i) => value + weight * previous[i], 0);
return 1 / (1 + Math.exp(-(sum + layer.biases[output])));
});
activations.push(next);
}
return activations;
}06 · Verifizieren
Was du testen solltest
- Forward eines kleinen Netzes stimmt mit handberechneten Werten überein.
- Numerischer Gradient und Backprop-Gradient liegen innerhalb einer engen Toleranz.
- XOR-Loss sinkt reproduzierbar unter einen festgelegten Wert.
07 · Grenzen
Kompromisse und Stolperfallen
- Objektgraphen sind anschaulich, Matrizen aber einfacher, schneller und serialisierbar.
- Math.random ohne Seed verhindert reproduzierbare Trainingsfehler.
- Ein Lernbeispiel ist keine produktive ML-Bibliothek; numerische Stabilität und Batching fehlen.
Der vorhandene train-Aufruf verändert keine Gewichte. Das Modul ist eine Graphskizze, kein trainierbares Netz.
08 · Weiterdenken