NeuralMath
Eine codezentrierte Einführung, die jede mathematische Operation eines neuronalen Netzes sichtbar macht.
NeuralMath ist ein Bildungsprojekt für Studierende, Lehrende und quantitativ orientierte Leserinnen und Leser, die verstehen möchten, was ein neuronales Netz tatsächlich berechnet. Die Website verfolgt ein einziges vollständiges Python/NumPy-Beispiel von den Daten bis zur gelernten Entscheidungsgrenze. Ausführlichere mathematische Erklärungen bleiben dem begleitenden didaktischen Text vorbehalten, damit diese Seite linear, ausführbar und leicht wiederzuverwenden bleibt.
So zitieren Sie den didaktischen Text
Americo Cunha Jr. „A anatomia matemática de uma rede neural.“ Manuskript eingereicht bei Professor de Matemática Online (PMO), 2026.
Nach der Veröffentlichung wird der Eintrag um Band, Seiten und DOI ergänzt. Bitte zitieren Sie in wissenschaftlichen Arbeiten den didaktischen Text und nicht diese Website.
@unpublished{cunha2026anatomia,
author = {Cunha Jr, Americo},
title = {A anatomia matemática de uma rede neural},
note = {Manuscript submitted to Professor de Matemática Online (PMO)},
year = {2026}
}Aktivierungsfunktionen
Die Implementierung beginnt mit den beiden Nichtlinearitäten des Netzes. ReLU wirkt in der verborgenen Schicht, die Sigmoidfunktion bildet den letzten Score auf einen Wert zwischen 0 und 1 ab.
def relu(s):
return np.maximum(0, s)
def relu_derivative(s):
return (s > 0).astype(float)
def sigmoid(s):
return 1 / (1 + np.exp(-s))Einen breit verteilten synthetischen Datensatz erzeugen
Wir verwenden Masse und Durchmesser als zwei physikalische Merkmale. Die Daten sind synthetisch, bleiben aber in plausiblen Bereichen für das Lehrbeispiel. Eine glatte Referenzkurve dient nur zur Erzeugung einer nichttrivialen Geometrie; das Netz erhält diese Kurve niemals.
def base_boundary(m):
return (
6.68
+ 0.74 * np.exp(-((m - 155) / 20) ** 2)
+ 1.50 / (1 + np.exp(-(m - 202) / 5))
)
X_train = np.vstack([apple_1, apple_2, orange_1, orange_2])
y_train = np.array([1.0] * 32 + [0.0] * 32)Eingaben standardisieren
Masse und Durchmesser liegen auf unterschiedlichen numerischen Skalen. Mittelwert und Standardabweichung werden ausschließlich aus den Trainingsdaten berechnet und anschließend konsistent wiederverwendet.
mean = X_train.mean(axis=0)
std = X_train.std(axis=0)
Xn = (X_train - mean) / stdEin 2–12–1-Netz initialisieren
Das Modell besitzt zwei Eingaben, zwölf verborgene ReLU-Neuronen und einen Sigmoid-Ausgang. Damit ergeben sich 49 trainierbare Parameter, während das Netz klein genug bleibt, um Zeile für Zeile nachvollzogen zu werden.
rng = np.random.default_rng(42)
W1 = 0.1 * rng.standard_normal((12, 2))
b1 = np.zeros(12)
W2 = 0.1 * rng.standard_normal(12)
b2 = 0.0Vorwärtspropagation
Eine Vorhersage ist eine Folge affiner Transformationen und Aktivierungsfunktionen. Diese vier Zeilen bilden den rechnerischen Kern der Inferenz.
z1 = W1 @ x + b1
h = relu(z1)
z2 = W2 @ h + b2
y_hat = sigmoid(z2)Backpropagation
Die Ableitungen werden explizit geschrieben. Es gibt keine automatische Differentiation: Die Kettenregel erscheint direkt im Code, und genau darin liegt der zentrale didaktische Wert des Beispiels.
delta2 = (y_hat - target) * y_hat * (1 - y_hat)
dW2 = delta2 * h
db2 = delta2
delta1 = (delta2 * W2) * relu_derivative(z1)
dW1 = np.outer(delta1, x)
db1 = delta1Stochastischer Gradientenabstieg
In jeder Epoche werden die Beispiele gemischt und die Parameter nach jeder Beobachtung aktualisiert. Das Verfahren verwendet die oben berechneten Gradienten wiederholt, um den Verlust zu reduzieren.
for epoch in range(n_epochs):
for i in rng.permutation(len(Xn)):
# forward pass and backpropagation
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
W2 -= learning_rate * dW2
b2 -= learning_rate * db2Was das Training liefert
Mit dem festen Zufallsstartwert und den hier verwendeten Hyperparametern klassifiziert das kleine Netz alle 64 Trainingsbeispiele und alle 8 illustrativen Testbeispiele gemäß den für das synthetische Experiment festgelegten Labels.
Final mean loss: 0.0001785644
Training accuracy: 1.0000
Illustrative test accuracy: 1.0000
Test outputs:
[121.0, 7.20] -> 0.999927 -> apple
[135.0, 7.45] -> 0.999900 -> apple
[152.0, 7.75] -> 0.999780 -> apple
[171.0, 7.32] -> 0.986972 -> apple
[121.0, 6.28] -> 0.000019 -> orange
[152.0, 6.86] -> 0.000009 -> orange
[189.0, 6.48] -> 0.000028 -> orange
[208.0, 7.55] -> 0.014957 -> orangeDie gelernte Entscheidungsgrenze zeichnen
Nach dem Training wird das Netz auf einem dichten Gitter ausgewertet. Das Niveau y-hat = 0,5 wird zur gelernten Entscheidungsgrenze und macht die von der verborgenen Schicht erzeugte nichtlineare Geometrie sichtbar.
masses = np.linspace(116, 214, 500)
diameters = np.linspace(6.0, 8.85, 500)
M, D = np.meshgrid(masses, diameters)
grid = np.column_stack([M.ravel(), D.ravel()])
P = predict(grid, mean, std, W1, b1, W2, b2).reshape(M.shape)
ax.contour(M, D, P, levels=[0.5], linewidths=2.2)
Vollständige Ressourcen
Die vollständigen Skripte, Notebooks und reproduzierbaren Ausgaben sind unten verfügbar. Der Code verwendet in allen Sprachversionen dieselben kanonischen englischen Bezeichner, damit die ausführbare Quelle nicht zwischen Übersetzungen auseinanderläuft.
Künftige Erweiterungen
NeuralMath soll als Folge rechnerischer Beispiele wachsen. Geplante Erweiterungen umfassen Trainingsdynamik, die Beiträge verborgener Neuronen, Gradientenprüfung, Mehrklassenklassifikation mit Softmax, tiefere Netze und kleine interaktive Experimente im Browser.
Über den Autor
Americo Cunha Jr ist Computational Scientist, Forscher am brasilianischen Laboratório Nacional de Computação Científica (LNCC) und Associate Professor an der Universidade do Estado do Rio de Janeiro (UERJ). Seine Forschung verbindet nichtlineare Dynamik, mathematische und numerische Modellierung, Unsicherheitsquantifizierung, inverse Probleme sowie künstliche Intelligenz und Scientific Machine Learning. 2023 erhielt er den ABMEC Young Scientist Award; außerdem ist er in internationalen wissenschaftlichen und editorischen Kooperationen aktiv.
Lizenz

Sofern nicht anders angegeben, stehen die erklärenden Webtexte und die originären Abbildungen der Website unter der Creative-Commons-Lizenz Namensnennung 4.0 International (CC BY 4.0). Für das didaktische PDF kann die Lizenz der veröffentlichten Zeitschriftenfassung gelten. Der Quellcode wird separat bereitgestellt und sollte eine eigene Softwarelizenz erhalten.
NeuralMath unterstützen
Wenn Ihnen dieses frei zugängliche Material geholfen hat, können Sie seine Pflege mit einem kleinen Beitrag von 5 US-Dollar unterstützen. Die Unterstützung ist vollständig freiwillig und hat keinen Einfluss auf den Zugang zu den Inhalten.