Polynomiale Regression
Wie neuronale Netze nicht-lineare Funktionen lernen.
👋 HerrKI hier — heute lernt dein Netz, dass „mehr“ nicht immer besser ist
Gieß deine Pflanze doppelt so viel — wächst sie dann doppelt so schnell? Eben nicht: Zu wenig Wasser lässt sie verdursten, zu viel ertränkt sie. Die Wahrheit ist eine Kurve mit einem Optimum in der Mitte. Und eine Gerade — alles, was dein Netz bisher konnte — ist gegen so etwas chancenlos.
In „Multiple Regression“ hast du deinem Netz mehr Eingänge gegeben. Heute bekommt es zum ersten Mal Tiefe: einen Hidden Layer — eine Zwischenschicht aus 8 Neuronen zwischen Eingang und Ausgang. Mit ihr kann das Netz Geraden knicken, stapeln und zu Kurven zusammensetzen. Das ist der Moment, in dem neuronale Netze wirklich mächtig werden. 🚀
- Was ein Hidden Layer ist — und warum er aus 1 Zahl 8 „Meinungen“ macht
- Warum es ohne Aktivierungsfunktion (ReLU) keine Kurven gäbe
- Warum 8 Neuronen mit derselben Formel trotzdem 8 verschiedene Dinge lernen
- Der Unterschied zwischen Training und Inferenz
💡 Roter Faden: Wir gehen wieder den ganzen Weg — von der Gießkanne runter zu den Tensoren und mit einer fertigen Vorhersage wieder hoch.
🏗️ Die neue Architektur: eine Schicht dazwischen
Bisher sah dein Netz so aus: eine Zahl rein, ein Neuron rechnet, eine Zahl raus. Jetzt schieben wir eine Zwischenschicht ein — und plötzlich läuft jede Eingabe durch 8 Neuronen gleichzeitig:
📦 Was mit dem Tensor passiert:
- Input-Tensor: [1] — eine einzige Zahl, z. B. 250 ml
- Hidden Layer: [1] wird zu [8] — aus einer Zahl werden 8 verschiedene „Blickwinkel“
- Aktivierung (ReLU): jedes der 8 Neuronen schneidet Negatives ab:
max(0, x) - Output Layer: [8] wird zu [1] — die 8 Blickwinkel werden zu EINER Vorhersage gemischt
🔑 Schlüssel-Erkenntnis:
Der Hidden Layer ist wie ein Team aus 8 Gutachtern: Alle sehen dieselbe Wassermenge, aber jeder achtet auf etwas anderes — „ist es zu wenig?“, „ist es optimal?“, „ist es zu viel?“. Das Output-Neuron hört sich alle 8 Meinungen an und mischt daraus die endgültige Antwort.
📦 Schauen wir einer Zahl bei der Reise zu: 250 ml
Genug Überblick — wir schicken jetzt EINEN konkreten Wert durchs Netz und rechnen jeden Schritt mit. Das ist unser gewohnter Weg „runter zum Tensor“:
📥 Schritt 1: Input Layer
Tensor: [1]
[250]
Eine einzige Zahl: die Wassermenge in Milliliter.
🧠 Schritt 2: Hidden Layer — aus 1 mach 8
Transformation: [1] → [8]. Jedes der 8 Neuronen rechnet dieselbe Mini-Formel, aber mit eigenem Gewicht und Bias:
neuron[i] = input × gewicht[i] + bias[i]
Neuron 1 zum Beispiel:
neuron[0] = 250 × 0.05 + (−2.0) = 10.5
Alle 8 zusammen (vor ReLU):
[10.5, −5.2, 8.3, −1.0, 15.6, 3.2, −8.1, 12.4]
8 verschiedene „Blickwinkel“ auf dieselbe Wassermenge — manche positiv, manche negativ.
⚡ Schritt 3: ReLU — der Türsteher
Regel: ReLU(x) = max(0, x) — Positives darf durch, Negatives wird zu 0.
Vor ReLU:
[10.5, −5.2, 8.3, −1.0, 15.6, 3.2, −8.1, 12.4]
Nach ReLU:
[10.5, 0, 8.3, 0, 15.6, 3.2, 0, 12.4]
🔑 Warum dieser simple Schnitt alles ändert: Ohne ReLU wäre das ganze Netz — egal wie viele Schichten — nur eine kompliziert aufgeschriebene Gerade. Erst die Knicke machen Kurven möglich. In „Warum eine Gerade nicht reicht“ baust du solche Kurven aus einzelnen ReLU-Knicken selbst zusammen!
📤 Schritt 4: Output Layer — aus 8 mach 1
Transformation: [8] → [1]. Das Ausgabe-Neuron gewichtet alle 8 Meinungen und addiert sie zusammen:
output = h[0]×w[0] + h[1]×w[1] + … + h[7]×w[7] + bias
output = 10.5×0.8 + 0×0.3 + 8.3×0.6 + … = 20.1
Finale Vorhersage: 20,1 cm Wachstum
🎯 Die ganze Reise in vier Zeilen
Input: [250] ← Wassermenge
Hidden vor ReLU: [10.5, −5.2, 8.3, −1.0, 15.6, 3.2, −8.1, 12.4]
Hidden nach ReLU: [10.5, 0, 8.3, 0, 15.6, 3.2, 0, 12.4]
Output: [20.1] ← Wachstum in cm
🎲 Warum rechnen die 8 Neuronen nicht alle das Gleiche?
Die Frage ist absolut berechtigt: Alle 8 benutzen exakt dieselbe Formel input × gewicht + bias. Müssten sie dann nicht alle dasselbe Ergebnis liefern — und wir hätten 8-mal dasselbe Neuron bezahlt?
Die Antwort steckt in zwei Wörtern: Zufall + Feedback.
Schritt 1: Der Zufall verteilt die Startpositionen
Vor dem Training würfelt TensorFlow für jedes Neuron ein eigenes Startgewicht. Schon beim allerersten Forward Pass (Input: 250 ml) rechnet deshalb jedes Neuron etwas anderes:
| Neuron | Start-Gewicht (gewürfelt) | 250 × Gewicht | nach ReLU |
|---|---|---|---|
| 1 | +0.523 | +130.8 | 130.8 |
| 2 | −0.812 | −203.0 | 0 ✂️ |
| 3 | +0.156 | +39.0 | 39.0 |
| 4 | −0.391 | −97.8 | 0 ✂️ |
| 5 | +0.687 | +171.8 | 171.8 |
| 6 | +0.234 | +58.5 | 58.5 |
| 7 | −0.567 | −141.8 | 0 ✂️ |
| 8 | +0.445 | +111.3 | 111.3 |
(Alle Biases starten bei 0, deshalb lassen wir sie in der Tabelle weg. ✂️ = von ReLU abgeschnitten.)
💡 Das nennt man „Symmetry Breaking“: Würden alle 8 mit demselben Gewicht starten, bekämen sie auch immer dasselbe Feedback — und blieben für alle Ewigkeit identische Klone. Der Zufall am Anfang bricht diese Symmetrie. Einmal verschieden, immer verschieden.
Schritt 2: Das Feedback verstärkt die Unterschiede
Bei der Backpropagation (kennst du aus „Gradient Descent“) fragt das Netz: „Wie viel hat JEDES Neuron zum Fehler beigetragen?“ Weil alle 8 unterschiedlich gerechnet haben, bekommt auch jedes seinen eigenen Korrektur-Befehl:
| Neuron | Gradient | Korrektur |
|---|---|---|
| 1 | −0.42 | Gewicht wird kleiner |
| 2 | +1.83 | Gewicht wird größer (weniger negativ) |
| 3 | −0.87 | Gewicht wird kleiner |
| 4 | +0.56 | Gewicht wird größer |
| 5 | −1.21 | Gewicht wird kleiner |
| 6 | −0.34 | Gewicht wird kleiner |
| 7 | +0.91 | Gewicht wird größer |
| 8 | −0.67 | Gewicht wird kleiner |
✅ Der entscheidende Punkt: Jedes Neuron hat einen anderen Output produziert, deshalb bekommt jedes einen anderen Gradienten. Die Unterschiede werden mit jedem Trainingsschritt größer, nicht kleiner!
Schritt 3: Nach 300 Epochen — jeder hat seinen Job
Aus 8 zufälligen Startpunkten sind 8 Spezialisten geworden:
| Neuron | Gelerntes Gewicht | Sein Spezialgebiet |
|---|---|---|
| 1 | +0.382 | Mittlere Wassermengen (linearer Anteil) |
| 2 | −0.623 | „Zu wenig Wasser“-Detektor |
| 3 | +0.891 | „Optimaler Bereich“-Detektor |
| 4 | −0.287 | Unterstützt die „Zu wenig“-Erkennung |
| 5 | +0.534 | Allgemeine Wachstumsrate |
| 6 | +0.112 | Kleine Korrekturen |
| 7 | −0.478 | „Zu viel Wasser“-Warner |
| 8 | +0.723 | Verstärkt den optimalen Bereich |
🎯 Darum lohnt sich das 8er-Team
- 🎲 Zufälliger Start: jedes Neuron beginnt woanders
- 📊 Andere Rechnung: andere Gewichte → andere Outputs
- 🔄 Anderes Feedback: jedes bekommt seinen eigenen Gradienten
- 🧠 Spezialisierung: über die Epochen entstehen 8 verschiedene „Rollen“
💡 Analogie: 8 Leute lösen gemeinsam ein Puzzle. Jeder fängt zufällig woanders an — und ganz von selbst wird einer zum Rand-Spezialisten und eine zur Himmel-Expertin. Niemand hat das eingeteilt! Genau so entstehen die „Zu-wenig-Wasser-Detektoren“ und „Übergieß-Warner“ in deinem Netz.
🔄 Training vs. Inferenz — zwei Betriebsarten, ein Netz
Dein Netz kennt zwei Modi — genau wie du beim Lernen: Üben mit Lösungsheft (Training) und die Prüfung (Inferenz). Der ganze Unterschied steckt darin, was mit den Gewichts-Tensoren passiert:
🎓 Training (Üben mit Lösungsheft)
Ziel: Die Gewichte so lange anpassen, bis die Vorhersagen zu den bekannten Antworten passen.
Input-Tensor → Hidden Layer → Output-Tensor
[250] → [8 Neuronen] → [20.5] (Vorhersage)
Wie falsch war die Vorhersage? (Kennst du aus „Fehler messen“)
Loss = (20 − 20.5)² = 0.25
Der Fehler wandert rückwärts durchs Netz und berechnet für jedes einzelne Gewicht einen Gradienten — erst im Output Layer, dann im Hidden Layer.
Der Optimizer macht bei jedem Gewicht einen kleinen Schritt bergab:
W = W − Lernrate × Gradient
🎯 Inferenz (die Prüfung)
Ziel: Mit den fertig gelernten Gewichten neue Fragen beantworten.
Input-Tensor → Hidden Layer → Output-Tensor
[300] → [8 Neuronen] → [19.2] (Vorhersage)
✅ Das war’s. Wirklich.
Kein Backward Pass, keine Gewichts-Updates. Die Gewichte sind eingefroren — das Netz wendet nur noch an, was es gelernt hat.
⚡ Deshalb ist Inferenz so schnell:
1× vorwärts rechnen statt vorwärts + rückwärts + Update. Genau darum kann dir ChatGPT in Sekunden antworten, obwohl sein Training Monate gedauert hat — du erlebst dort immer nur die Inferenz.
🚀 Jetzt trainierst du das Netz selbst!
🌱 Das Szenario
Wir simulieren 30 Messungen an unserer roten Pflanze mit Wassermengen von 0 bis 500 ml. Die Natur folgt dabei heimlich dieser Regel:
Wachstum = −0.0003 × (Wasser − 250)² + 20
Eine umgedrehte Parabel: Optimum bei 250 ml (20 cm Wachstum) — exakt der „Übergießen“-Effekt aus der Einleitung. Wichtig: Das Netz bekommt diese Formel nie zu sehen. Es kennt nur die 30 verrauschten Messpunkte und muss die Kurve selbst entdecken.
⚙️ Die Zutaten
- Hidden Layer: 8 Neuronen mit ReLU — also bis zu 8 Knicke für die Kurve
- Output Layer: 1 Neuron, linear — mischt die 8 Meinungen zusammen
- Optimizer: Adam mit Lernrate 0.01 — der mitdenkende Schrittmacher aus „Gradient Descent“
- 300 Epochen, Loss: Mean Squared Error („Fehler messen“)
📏 Und ja — normalisiert wird wieder! Diesmal aber nicht auf 0 bis 1 wie in „Daten vorbereiten“, sondern per z-Score: Jeder Wert wird zu „Wie weit weg vom Durchschnitt, gemessen in Streuungen?“. Anderes Rezept, gleiches Ziel — alle Zahlen in einen Bereich bringen, in dem das Netz gut lernt. Nach der Vorhersage rechnen wir natürlich wieder in ml und cm zurück.
🎲 Kleine Wette, bevor du drückst?
Nach dem Training zeigt dir eine Tabelle die echten gelernten Gewichte deiner 8 Neuronen. Meine Wette: Mehrere davon sind negativ. Warum sollte ein Netz, das Wachstum vorhersagt, „Bremser“-Neuronen brauchen? Weil die Parabel eine rechte Hälfte hat! Ab 250 ml muss irgendetwas im Netz rufen: „Stopp, jetzt wird’s schlechter!“ — und genau das erledigen die Neuronen mit negativem Gewicht. Schau nach dem Training nach, ob ich recht behalte. 😉
