Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| ef:ki:nn [2026/04/21 11:11] – andristn | ef:ki:nn [2026/04/23 14:17] (aktuell) – andristn | ||
|---|---|---|---|
| Zeile 88: | Zeile 88: | ||
| < | < | ||
| ⎧ z wenn z > 0 | ⎧ z wenn z > 0 | ||
| - | f(z) = max(0, z) = ⎨ | + | f(z) = max(0, z) = ⎨ |
| ⎩ 0 sonst | ⎩ 0 sonst | ||
| </ | </ | ||
| Zeile 204: | Zeile 204: | ||
| ==== Schritt 1: Fehler messen ==== | ==== Schritt 1: Fehler messen ==== | ||
| - | Der erste Schritt ist, den Fehler zu messen. Das macht die **Loss Function**, | + | Der erste Schritt ist, den Fehler zu messen. Das macht die **Loss Function**. Davon gibt es natürlich mehrere Varianten, die zwei wichtigsten sind //Mean Squared Error// und //Cross Entropy Loss//. |
| + | |||
| + | Der **Mean Squared Error** (MSE) ist der Klassiker und wird zum Beispiel auch von 3Blue1Brown in seiner bekannten YouTube-Serie über neuronale Netzwerke verwendet. Er misst den Fehler, indem er für jedes Output-Neuron die Differenz zwischen Vorhersage und richtigem Wert quadriert und dann den Durchschnitt bildet: | ||
| + | |||
| + | < | ||
| + | 1 | ||
| + | MSE = ─── | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Wir haben uns aber für **Cross Entropy Loss** entschieden, | ||
| <code python> | <code python> | ||
| Zeile 211: | Zeile 221: | ||
| </ | </ | ||
| - | Mathematisch gesehen berechnet | + | Mathematisch gesehen berechnet |
| < | < | ||
| Zeile 217: | Zeile 227: | ||
| i | i | ||
| </ | </ | ||
| + | |||
| + | Der grosse Vorteil von Cross Entropy gegenüber MSE ist, dass er starke Fehler viel härter bestraft. Sagt das Netz mit 99% Sicherheit " | ||
| War die Vorhersage für " | War die Vorhersage für " | ||
| Zeile 224: | Zeile 236: | ||
| Hier kommt der **Gradient** ins Spiel. Ein Gradient sagt uns für jedes einzelne Gewicht, in welche Richtung und wie stark es den Loss beeinflusst. Man kann sich das wie einen Hügel vorstellen. Der Loss ist die Höhe, und wir wollen den tiefsten Punkt finden. Der Gradient zeigt uns die steilste Richtung bergauf, also gehen wir genau die entgegengesetzte Richtung bergab. Das nennt sich **Gradientenabstieg**. | Hier kommt der **Gradient** ins Spiel. Ein Gradient sagt uns für jedes einzelne Gewicht, in welche Richtung und wie stark es den Loss beeinflusst. Man kann sich das wie einen Hügel vorstellen. Der Loss ist die Höhe, und wir wollen den tiefsten Punkt finden. Der Gradient zeigt uns die steilste Richtung bergauf, also gehen wir genau die entgegengesetzte Richtung bergab. Das nennt sich **Gradientenabstieg**. | ||
| - | Bei einem einzelnen Neuron ist das noch überschaubar. Angenommen, wir haben einen Output-Neuron mit nur einem Gewicht | + | Um den Gradienten zu berechnen, müssen |
| < | < | ||
| - | δ = | + | w ──► |
| + | | ||
| + | | ||
| </ | </ | ||
| - | Das Gewicht | + | Das Gewicht |
| < | < | ||
| - | ∂L / ∂w | + | ∂L ∂L ∂ŷ ∂z |
| + | ──── | ||
| + | | ||
| </ | </ | ||
| - | Und das Gewicht wird dann in die entgegengesetzte Richtung angepasst: | + | Wir leiten also drei Mal einzeln ab und multiplizieren |
| + | |||
| + | **1. Ableitung des Loss nach der Vorhersage** | ||
| + | |||
| + | Cross Entropy Loss ist L = −Σ yᵢ · log(ŷᵢ). Leiten wir ihn nach ŷ ab: | ||
| < | < | ||
| - | w_neu = w_alt − η · (∂L / ∂w) | + | |
| + | ──── | ||
| + | | ||
| + | </ | ||
| + | |||
| + | **2. Ableitung der Softmax nach der gewichteten Summe** | ||
| + | |||
| + | Hier wird es etwas komplizierter. Softmax ist nämlich eine Funktion, bei der jeder Output ŷᵢ von //allen// z-Werten gleichzeitig abhängt (wegen der Summe im Nenner). Die vollständige Ableitung ist deshalb eine sogenannte Jacobi-Matrix und würde den Rahmen hier sprengen. Wir sparen uns den detaillierten Zwischenschritt und halten einfach fest: es gibt eine wohldefinierte Ableitung. | ||
| + | |||
| + | **3. Ableitung der gewichteten Summe nach dem Gewicht** | ||
| + | |||
| + | Die gewichtete Summe ist z = w·x + b. Leiten wir nach w ab, bleibt einfach x übrig: | ||
| + | |||
| + | < | ||
| + | | ||
| + | ──── | ||
| + | | ||
| + | </ | ||
| + | |||
| + | **Alles einsetzen** | ||
| + | |||
| + | Wenn man nun alle drei Teile in die Kettenregel einsetzt und sauber ausrechnet (das ist der Punkt, an dem sich die komplizierte Softmax-Ableitung mit der −y/ŷ aus dem Cross Entropy Loss gegenseitig auffrisst), bleibt am Ende dieser wunderschön einfache Ausdruck übrig: | ||
| + | |||
| + | < | ||
| + | | ||
| + | ──── | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Das ist genau das, was wir vorhin als " | ||
| + | |||
| + | **Gradient für den Bias** | ||
| + | |||
| + | Für den Bias b läuft dieselbe Kettenregel, | ||
| + | |||
| + | < | ||
| + | | ||
| + | ──── | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Also ist der Gradient für den Bias einfach der Fehler selbst, ohne Multiplikation mit dem Input: | ||
| + | |||
| + | < | ||
| + | | ||
| + | ──── | ||
| + | | ||
| + | </ | ||
| + | |||
| + | **Update-Regel** | ||
| + | |||
| + | Jetzt wo wir beide Gradienten kennen, können wir Gewicht und Bias in die entgegengesetzte Richtung anpassen: | ||
| + | |||
| + | < | ||
| + | w_neu = w_alt − η · (∂L / ∂w) | ||
| + | |||
| + | b_neu = b_alt − η · (∂L / ∂b) = b_alt − η · δ | ||
| </ | </ | ||
| Zeile 249: | Zeile 325: | ||
| Ist die Lernrate zu gross, springt das Netz über das Minimum hinweg. Ist sie zu klein, braucht das Training ewig. 0.01 ist ein guter Startwert für unser Netz. | Ist die Lernrate zu gross, springt das Netz über das Minimum hinweg. Ist sie zu klein, braucht das Training ewig. 0.01 ist ein guter Startwert für unser Netz. | ||
| + | |||
| + | **Das Ganze als Matrix** | ||
| + | |||
| + | Bisher haben wir so getan, als hätten wir nur ein einziges Gewicht w und einen einzigen Input x. In Wirklichkeit ist w natürlich die ganze **Gewichtsmatrix W** und x der ganze **Input-Vektor**. Schauen wir uns ein Mini-Beispiel mit 3 Inputs und 2 Hidden-Neuronen an: | ||
| + | |||
| + | < | ||
| + | X = [ x₁ x₂ x₃ ] | ||
| + | |||
| + | |||
| + | ⎡ w₁₁ | ||
| + | W = ⎢ w₂₁ | ||
| + | ⎣ w₃₁ | ||
| + | |||
| + | |||
| + | b = [ b₁ b₂ ] | ||
| + | </ | ||
| + | |||
| + | Die gewichtete Summe ist dann eine Matrix-Multiplikation: | ||
| + | |||
| + | < | ||
| + | z = X · W + b | ||
| + | |||
| + | = [x₁·w₁₁ + x₂·w₂₁ + x₃·w₃₁ + b₁ , x₁·w₁₂ + x₂·w₂₂ + x₃·w₃₂ + b₂] | ||
| + | </ | ||
| + | |||
| + | Für die Ableitung gilt genau dasselbe Prinzip wie vorher, nur eben für alle Gewichte auf einmal. Statt δ · x schreiben wir die Matrix-Version: | ||
| + | |||
| + | < | ||
| + | ∂L | ||
| + | ──── | ||
| + | ∂W | ||
| + | </ | ||
| + | |||
| + | Das Xᵀ (X transponiert) sorgt dabei einfach dafür, dass die Dimensionen zusammenpassen. Im Code ist genau das diese Zeile, die du schon von oben kennst: | ||
| + | |||
| + | <code python> | ||
| + | self.W1 -= self.lr * (X.T @ d1) / N | ||
| + | </ | ||
| + | |||
| + | Der Vorteil der Matrix-Schreibweise ist enorm: statt 100' | ||
| ==== Schritt 3: Fehler zurück durch das Netz ==== | ==== Schritt 3: Fehler zurück durch das Netz ==== | ||
| Zeile 268: | Zeile 384: | ||
| </ | </ | ||
| - | Jetzt muss dieser Fehler zurück durch die Gewichte W₂ in die Hidden Layer propagiert werden. | + | Jetzt muss dieser Fehler zurück durch die Gewichte W₂ in die Hidden Layer propagiert werden. |
| + | |||
| + | < | ||
| + | z₁ ──► | ||
| + | | ||
| + | </ | ||
| + | |||
| + | z₁ wirkt also über mehrere Zwischenschritte auf den Loss. Die Kettenregel sagt uns: | ||
| + | |||
| + | < | ||
| + | | ||
| + | ──── | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Schauen wir uns jeden Teil an: | ||
| + | |||
| + | * **∂L / ∂z₂** | ||
| + | * **∂z₂ / ∂a₁** | ||
| + | * **∂a₁ / ∂z₁** | ||
| + | |||
| + | Setzen wir alles zusammen: | ||
| < | < | ||
| Zeile 274: | Zeile 411: | ||
| </ | </ | ||
| - | Das ReLU' ist die Ableitung von ReLU, also '' | + | Das ⊙ steht dabei für " |
| + | |||
| + | Das ReLU'(z₁) | ||
| <code python> | <code python> | ||
| Zeile 365: | Zeile 504: | ||
| * **Tiefe neuronale Netze (Deep Neural Networks)** – Netze mit vielen Hidden Layers | * **Tiefe neuronale Netze (Deep Neural Networks)** – Netze mit vielen Hidden Layers | ||
| * **flache vs. tiefe Netze** – eine vs. viele Hidden Layers, Komplexität und Rechenaufwand steigen | * **flache vs. tiefe Netze** – eine vs. viele Hidden Layers, Komplexität und Rechenaufwand steigen | ||
| + | |||
| + | ===== Quellen ===== | ||
| + | |||
| + | ==== Videos ==== | ||
| + | |||
| + | Die Videoserie von // | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ==== Wikipedia ==== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ==== Weiterführende Literatur ==== | ||
| + | |||
| + | * Michael Nielsen: //Neural Networks and Deep Learning// – kostenloses Online-Buch unter [[http:// | ||
| + | * Ian Goodfellow, Yoshua Bengio, Aaron Courville: //Deep Learning// – frei verfügbar unter [[https:// | ||
| + | |||
| + | ==== Bibliotheken und Tools ==== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||