Navigation: [[:p:ki:machinelearning1|🤖 Teil 1]] - [[:p:ki:machinelearning2|🤖 Teil 2]] - [[:p:ki:machinelearning3|🤖 Teil 3]] - [[:p:ki:machinelearning4|🤖 Teil 4]]{{gem/mgr}}{{ gem/pageinfo}} ====== 🤖 Wie funktioniert maschinelles Lernen 3 ====== 🎯 In dieser Reihe erfährst du, wie ein Computer mithilfe von Daten lernen kann. ~~INTOC~~ \\ ===== - Der Sache auf den Grund gehen ===== {{gdraw>1l_jwb2olT7mk5n3PVNXrAo5hU3k_ark1O9o2XvSdsp4 width=231 center}} \\ Abb.1: Fehlerfunktion((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])). In den Teilen 1 und 2 hast du gelernt, dass mit Machine Learning Probleme gelöst werden können, welche näherungsweise durch eine Stellvertreter-Funktion $f_{ML}(x)$ mit mehreren Gewichten $w$ und deren Lösung näherungsweise durch das Minimieren einer Fehlerfunktion $J(w)$ beschrieben werden können. Das Ziel besteht nun darin, mithilfe von einem Datensatz (endlich vielen Datenpunkten) die Gewicht-Einstellung $w*$, für welche $e_{min}=J(w^*)$ gilt, möglichst gut anzunähern. Im Teil 2 hattest du dazu drei Strategien kennengelernt. In diesem dritten Teil geht es darum, eine dieser Strategien, die iterativen Verfahren, besser kennenzulernen. Konkret wirst du das sogenannte "Gradientenverfahren" etwas genauer unter die Lupe zu nehmen. Das Gradientenverfahren ist das gebräuchlichste Verfahren zum Trainieren von neuronalen Netzen. Im folgenden Auftrag wirst du den wichtigen Begriff "Steigung" einer Funktion kennenlernen und selbst herausfinden, wie damit das Minimum einer Funktion gefunden werden kann. == ✍ Auftrag Steigung ergründen == 👉 Hier ergründest du den Begriff der "Steigung" und wie damit das Minimum einer Funktion gefunden werden kann. - Finde als Erstes heraus, was mit dem Begriff "Steigung" gemeint ist, indem du mit der Maus auf der im Programm gezeigten Funktion hin und her fährst. - Jetzt die Erklärung in Worten dazu. * Jedem Punkt auf der roten gezeichneten Funktion kann eine Steigung zugeordnet werden. * Die Steigung ist als blaue Gerade durch diesen Punkt eingezeichnet, welche die Funktion in diesem Punkt berührt. * Der Wert der Steigung beschreibt, wie steil die Gerade ist. * Wenn die Gerade nach rechts unten ↘ geht, dann ist das Vorzeichen der Steigung negativ, wenn die Gerade nach rechts oben ↗ geht, dann ist das Vorzeichen positiv. - Wie gross ist die Steigung beim Minimum (beim kleinsten Wert) der Funktion? {{gem/match?0=N4IgTgpg5hAeAOIBcIAUAGAPgOQK4Bt9MAtCMAewEoQAaEAM3wEMoBnZEASxAF8g#1a9be108e7ddb9ff}} - Überlege dir, wie du mithilfe der Steigung das Minimum z.B. einer Fehlerfunktion finden kannst. Lese danach direkt nach diesem Auftrag weiter (dort findest du eine Antwort auf diese Frage). {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Canvas%20coordinates%20are%20X%2C%20Y%2C%20function%20values%20are%20x%2C%20y%0A%0A%2F%2F%20constants%0Aconst%20xMIN%20%3D%20-2.0%3B%0Aconst%20xMAX%20%3D%202.0%3B%0Aconst%20X_CANVAS_SIZE%20%3D%20200%3B%0Aconst%20Y_CANVAS_SIZE%20%3D%20200%3B%0Aconst%20XSHIFT%20%3D%20X_CANVAS_SIZE%20%2F%202%3B%0Aconst%20YSHIFT%20%3D%20Y_CANVAS_SIZE%20%2a%200.9%3B%0Aconst%20XSCALE%20%3D%20X_CANVAS_SIZE%20%2a%200.2%3B%0Aconst%20YSCALE%20%3D%20Y_CANVAS_SIZE%20%2a%200.2%3B%0Aconst%20GRAPH_GRANULARITY%20%3D%200.01%3B%0Aconst%20TEXT_SIZE%20%3D%2020%3B%0Aconst%20LEARNINGRATE%20%3D%201%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20CALCULATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20function%20value%20y%20given%20x%0A%2F%2F%0Afunction%20func%28x%29%20%7B%0A%09return%20x%20%2a%2a%202%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20derivate%20of%20function%20value%20y%20given%20x%0A%2F%2F%0Afunction%20deriv%28x%29%20%7B%0A%09return%202%20%2a%20x%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20gradient%20value%20given%20x%20of%20the%20gradient%20line%20through%20point%20xOrigin%0A%2F%2F%0Afunction%20grad%28xOrigin%2C%20x%29%20%7B%0A%09return%20deriv%28xOrigin%29%20%2a%20%28x%20-%20xOrigin%29%20%2B%20func%28xOrigin%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20x%20of%20the%20endpoint%20of%20the%20gradient%20vector%20that%20starts%20at%20the%20point%0A%2F%2F%20xOrigin%20and%20has%20the%20length%20length%0A%2F%2F%0Afunction%20xOfGrad%28xOrigin%2C%20length%29%20%7B%0A%09if%20%28deriv%28xOrigin%29%20%3E%3D%200%29%20%7B%0A%09%09return%20xOrigin%20-%20length%20%2F%20Math.sqrt%28deriv%28xOrigin%29%20%2a%2a%202%20%2B%201%29%3B%0A%09%7D%20else%20%7B%0A%09%09return%20xOrigin%20%2B%20length%20%2F%20Math.sqrt%28deriv%28xOrigin%29%20%2a%2a%202%20%2B%201%29%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20transform%20x%20value%20into%20canvas%20X%20coordinate%0A%2F%2F%0Afunction%20XGetCoord%28x%29%20%7B%0A%09return%20XSCALE%20%2a%20x%20%2B%20XSHIFT%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20y%20value%20into%20canvas%20Y%20coordinate%0A%2F%2F%0Afunction%20YGetCoord%28y%29%20%7B%0A%09return%20YSHIFT%20-%20YSCALE%20%2a%20y%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20canvas%20X%20coordinate%20into%20x%20value%0A%2F%2F%0Afunction%20xGetVal%28X%29%20%7B%0A%09return%20%28X%20-%20XSHIFT%29%20%2F%20XSCALE%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20canvas%20Y%20coordinate%20into%20x%20value%0A%2F%2F%0Afunction%20yGetVal%28Y%29%20%7B%0A%09return%20%28YSHIFT%20-%20Y%29%20%2F%20YSCALE%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20get%20position%20in%20graph%0A%2F%2F%0Afunction%20getMouseValue%28%29%20%7B%0A%09let%20xPosition%20%3D%20xGetVal%28mouseX%29%3B%0A%09%2F%2F%20stop%20motion%20at%20edges%0A%09if%20%28xPosition%20%3C%20xMIN%29%20%7B%0A%09%09xPosition%20%3D%20xMIN%3B%0A%09%7D%0A%09if%20%28xPosition%20%3E%20xMAX%29%20%7B%0A%09%09xPosition%20%3D%20xMAX%3B%0A%09%7D%0A%09return%20xPosition%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20graph%0A%2F%2F%0Afunction%20drawGraph%28%29%20%7B%0A%09stroke%28%22red%22%29%3B%0A%09strokeWeight%282%29%3B%0A%09for%20%28let%20x%20%3D%20xMIN%3B%20x%20%3C%3D%20xMAX%3B%20x%20%3D%20x%20%2B%20GRAPH_GRANULARITY%29%20%7B%0A%09%09point%28XGetCoord%28x%29%2C%20YGetCoord%28func%28x%29%29%29%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20gradient%20vector%0A%2F%2F%0Afunction%20drawGradientLine%28xOrigin%29%20%7B%0A%09%2F%2F%20draw%20line%0A%09stroke%28%22blue%22%29%3B%0A%09line%280%2C%0A%09%09YGetCoord%28grad%28xOrigin%2C%20xGetVal%280%29%29%29%2C%20X_CANVAS_SIZE%2C%20YGetCoord%28grad%28xOrigin%2C%20xGetVal%28X_CANVAS_SIZE%29%29%29%29%3B%0A%09%2F%2F%20draw%20intersection%20point%0A%09stroke%28%22blue%22%29%3B%0A%09fill%28%22red%22%29%3B%0A%09circle%28XGetCoord%28xOrigin%29%2C%20YGetCoord%28func%28xOrigin%29%29%2C%206%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20write%20text%20output%0A%2F%2F%0Afunction%20writeTextOutput%28xOrigin%29%20%7B%0A%09noStroke%28%29%3B%0A%09fill%28%22black%22%29%3B%0A%09text%28%22Steigung%22%2C%20X_CANVAS_SIZE%20%2F%202%2C%205%20%2a%20TEXT_SIZE%20%2F%204%29%3B%0A%09text%28deriv%28xOrigin%29.toFixed%282%29%2C%20X_CANVAS_SIZE%20%2F%202%2C%2011%20%2a%20TEXT_SIZE%20%2F%204%29%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Afunction%20setup%28%29%20%7B%0A%0A%09%2F%2F%20create%20canvas%20%0A%09createCanvas%28X_CANVAS_SIZE%2C%20Y_CANVAS_SIZE%29%3B%0A%0A%09%2F%2F%20set%20text%20properties%0A%09textSize%28TEXT_SIZE%29%3B%0A%09textAlign%28CENTER%2C%20CENTER%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20draw%28%29%0A%2F%2F%0Afunction%20draw%28%29%20%7B%0A%0A%09%2F%2F%20clear%20everything%0A%09background%28%22white%22%29%3B%0A%09%2F%2F%20draw%20frame%0A%09stroke%28%22black%22%29%3B%0A%09strokeWeight%281%29%3B%0A%09noFill%28%29%3B%0A%09rect%280%2C%200%2C%20X_CANVAS_SIZE%2C%20Y_CANVAS_SIZE%29%3B%0A%0A%09%2F%2F%20get%20x%20value%20of%20mouse%20position%20in%20graph%0A%09let%20xPosition%20%3D%20getMouseValue%28%29%3B%0A%0A%09%2F%2F%20draw%20everything%0A%09drawGraph%28%29%3B%0A%09drawGradientLine%28xPosition%29%3B%0A%09writeTextOutput%28xPosition%29%3B%0A%7D&css=undefined&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&height=360px#Steigung}} \\ === 👉 Das Minimum mithilfe der Steigung finden === 💡 Grob gesagt, bei einer Funktion, die so aussieht: ᑌ , ist die Steigung unten beim Minimum gleich null. ⚠️ Bei einer Funktion, die so aussieht: ᑎ , ist die Steigung oben beim Maximum gleich null. Und bei einer Funktion die so aussieht: ⸺ , ist die Steigung überall null. ℹ️ Es kann durchaus sein, dass eine Fehlerfunktion $J(w)$ eher so aussieht: ᑌᐡ⸺ᑎ , d.h. dass diese mehrere Minima, Maxima und flache Passagen (Sattelpunkte) beinhaltet, bei welchen die Steigung jeweils gleich null ist. Wie damit in der Praxis umgegangen wird, erfährst du im Kapitel 3 weiter unten. \\ === 👉 Das Minimum direkt mit der Steigung berechnen oder doch nicht? === In der Mathematik gibt es ein Hilfsmittel, mit welchem die Steigung in einem Punkt einer Funktion gefunden werden kann. Dieses Hilfsmittel wird "Differenzialrechnung" oder kurz "Ableiten" genannt. Die damit berechnete Steigung wird als "Ableitung" bezeichnet. Bei einer Funktion der Form ᑌ (mit einem eindeutigen Minimum) ist das Finden dieses Minimums gleichbedeutend mit dem Lösen der Gleichung: Ableitung gleich null. Die Ableitung für einen gegebenen Punkt auf einer Funktion lässt sich meist mit einem vertretbaren Aufwand berechnen. Das Umgekehrte, aus der Gleichung "Ableitung gleich null" den zugehörigen Punkt auf der Funktion zu berechnen, ist für die gebräuchlichen Machine-Learning-Verfahren jedoch sehr aufwändig. Daher wird bei den iterativen Verfahren diese Lösung nicht direkt berechnet, sondern schrittweise angenähert. ++++Falls du genauer wissen willst, warum das so ist, hier klicken!| \\ In Wahrheit ist $J(w)$ eine Abkürzung. Eigentlich stecken die Gewichte $w$ in $f_{ML}(x)$ und der Ausgang $y$ wird aus dem Eingang $x$ mithilfe der Gewicht-Einstellung $w$ berechnet. D.h. $y$ hängt von $x$ und von $w$ ab. Somit müsste strenggenommen $y = f_{ML}(w,x)$ geschrieben werden. Der Fehler $e$ wird mit der Fehlerfunktion $J$ aus dem Ausgang $y$ und dem desired Output $d$ berechnet. D.h. $e$ hängt von $y$ und von $d$ ab. Somit müsste strenggenommen $e = J(d, y)$ geschrieben werden. Alles miteinander kombiniert ergibt $e = J(d, y) = J(d,f_{ML}(w,x))$. Wenn nun diese, in der Regel komplizierte Funktion abgeleitet und gleich null gesetzt wird, so entsteht meist eine komplizierte Gleichung, welche nicht mehr mit vernünftigem Aufwand exakt berechnet werden kann, sondern nur näherungsweise.\\ \\ Je nach gewählter Strategie wird die Gewicht-Einstellung $w^*$ mit $e_{min}=J(w^*)$ auf eine andere Art angenähert. Bei den statistischen Verfahren geschieht dies durch Annahmen zur Verteilung der Daten, Formeln der Wahrscheinlichkeitstheorie und Vereinfachungen der Berechnungen. Bei den stochastischen Verfahren wird $w^*$ solange zufällig gewürfelt, bis ein akzeptabler Fehler $e$ erreicht wurde oder das Verfahren gestoppt wird. Beim iterativen Gradientenverfahren wird $w^*$ mithilfe der Steigung in mehreren Schritten immer besser angenähert.++++ \\ ===== - Wo geht es nach unten? ===== {{gdraw>1-vFGaFdbx1OcNiQxEfCP6IzCpLnuI6x0NdRjz2AnqRs width=207 right}} \\ Abb.2: (Negativer) Gradient((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])). ⚠️ Für die folgenden Überlegungen tun wir so, als würde unsere Fehlerfunktion $J(w)$ so aussehen: ᑌ (d.h. eine Funktion mit einem eindeutigen Minimum). ; Gradient : Der Gradient in einem Punkt einer Funktion kann als "Pfeil" entlang der Steigung in diesem Punkt dargestellt werden. Er wird mit dem Zeichen $\nabla$ gekennzeichnet. Die Länge des Pfeils entspricht dem Wert der Steigung. In Abb.2 ist der Gradient für den Punkt $J(w^♡)$ als grüner Pfeil dargestellt.\\ \\ : 💡 Achtung, durch das Vorzeichen der Steigung zeigt der Gradient immer in diejenige Richtung, in welcher die Funktion grösser wird. Der negative Gradient $-\nabla$ zeigt dagegen immer in diejenige Richtung, in welcher die Funktion kleiner wird (blauer Pfeil in der Abbildung). ; Gradientenverfahren I : Grundidee: Um auf der Fehlerfunktion "nach unten" zu gelangen, werden die Gewichte $w$ in Richtung negativer Gradient $-\nabla$ verschoben. Damit dabei kontrolliert werden kann, wie weit verschoben wird, wird der negative Gradient mit einer Zahl multipliziert, der sogenannten Lernrate $\mu$. Somit wird jeweils um $- \mu \cdot \nabla$ verschoben. == ✍ Auftrag Gradientenverfahren I == 👉 Hier untersuchst du die Grundidee des Gradientenverfahrens. ⚠️ Im Programm wird von der Start-Gewicht-Einstellung $w[0]$ ausgegangen. Die $0$ zeigt an, dass es sich um den nullten "Lernschritt" handelt. Im Schritt $1$ wird aus $w[0]$ die neue Gewicht-Einstellung $w[1]$ berechnet. Dafür wird $w[0]$ um den blauen Pfeil $- \mu \cdot \nabla$ verschoben. - Verschiebe mit der Maus die Position der Start-Gewicht-Einstellung $w[0]$ und verändere die Lernrate $\mu$ . Beantworte die folgenden Fragen im untenstehenden Textfeld - In welche Richtung zeigt der blaue Pfeil jeweils? - Wie verändert sich die Länge des blauen Pfeils? - Wie gross ist der Pfeil ganz unten beim Minimum? - Vergleiche danach deine Einsichten mit unseren Kommentaren am Ende dieses Auftrags. {{gem/plain?0=N4XyA#bb1993deecc6bf61}} {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Canvas%20coordinates%20are%20X%2C%20Y%2C%20function%20values%20are%20x%2C%20y%0A%0A%2F%2F%20constants%0Aconst%20xMIN%20%3D%20-4.0%3B%0Aconst%20xMAX%20%3D%204.0%3B%0Aconst%20X_CANVAS_SIZE%20%3D%20400%3B%0Aconst%20Y_CANVAS_SIZE%20%3D%20200%3B%0Aconst%20XSHIFT%20%3D%20X_CANVAS_SIZE%20%2a%200.55%3B%0Aconst%20YSHIFT%20%3D%20Y_CANVAS_SIZE%20%2a%200.85%3B%0Aconst%20XSCALE%20%3D%20X_CANVAS_SIZE%20%2a%200.1%3B%0Aconst%20YSCALE%20%3D%20Y_CANVAS_SIZE%20%2a%200.2%3B%0Aconst%20GRAPH_GRANULARITY%20%3D%200.02%3B%0Aconst%20TEXT_SIZE%20%3D%2018%3B%0A%0A%2F%2F%20global%20variables%0Alet%20slider%3B%0Alet%20xPosition%3B%0Alet%20learningrate%3B%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20CALCULATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20function%20value%20y%20given%20x%0A%2F%2F%0Afunction%20func%28x%29%20%7B%0A%09return%20x%20%2a%2a%202%20%2F%204%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20derivate%20of%20function%20value%20y%20given%20x%0A%2F%2F%0Afunction%20deriv%28x%29%20%7B%0A%09return%20x%20%2F%202%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20gradient%20value%20given%20x%20of%20the%20gradient%20line%20through%20point%20xOrigin%0A%2F%2F%0Afunction%20grad%28xOrigin%2C%20x%29%20%7B%0A%09return%20deriv%28xOrigin%29%20%2a%20%28x%20-%20xOrigin%29%20%2B%20func%28xOrigin%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20x%20of%20the%20gradient%20vector%20that%20starts%20at%20the%20point%0A%2F%2F%20xOrigin%20given%20y%20of%20this%20gradient%20vector%0A%2F%2F%0Afunction%20inverseGrad%28xOrigin%2C%20y%29%20%7B%0A%09return%20%28y%20-%20func%28xOrigin%29%29%20%2F%20deriv%28xOrigin%29%20%2B%20xOrigin%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20x%20of%20the%20endpoint%20of%20the%20gradient%20vector%20that%20starts%20at%20the%20point%0A%2F%2F%20xOrigin%20and%20has%20the%20length%20length%0A%2F%2F%0Afunction%20xOfGrad%28xOrigin%2C%20length%29%20%7B%0A%09if%20%28deriv%28xOrigin%29%20%3E%3D%200%29%20%7B%0A%09%09return%20xOrigin%20-%20length%20%2F%20Math.sqrt%28deriv%28xOrigin%29%20%2a%2a%202%20%2B%201%29%3B%0A%09%7D%20else%20%7B%0A%09%09return%20xOrigin%20%2B%20length%20%2F%20Math.sqrt%28deriv%28xOrigin%29%20%2a%2a%202%20%2B%201%29%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20transform%20x%20value%20into%20canvas%20X%20coordinate%0A%2F%2F%0Afunction%20XGetCoord%28x%29%20%7B%0A%09return%20XSCALE%20%2a%20x%20%2B%20XSHIFT%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20y%20value%20into%20canvas%20Y%20coordinate%0A%2F%2F%0Afunction%20YGetCoord%28y%29%20%7B%0A%09return%20YSHIFT%20-%20YSCALE%20%2a%20y%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20canvas%20X%20coordinate%20into%20x%20value%0A%2F%2F%0Afunction%20xGetVal%28X%29%20%7B%0A%09return%20%28X%20-%20XSHIFT%29%20%2F%20XSCALE%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20canvas%20Y%20coordinate%20into%20x%20value%0A%2F%2F%0Afunction%20yGetVal%28Y%29%20%7B%0A%09return%20%28YSHIFT%20-%20Y%29%20%2F%20YSCALE%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20get%20position%20in%20graph%0A%2F%2F%0Afunction%20getMouseXValue%28%29%20%7B%0A%09let%20xPosition%20%3D%20xGetVal%28mouseX%29%3B%0A%09%2F%2F%20stop%20motion%20at%20edges%0A%09if%20%28xPosition%20%3C%20xMIN%29%20%7B%0A%09%09xPosition%20%3D%20xMIN%3B%0A%09%7D%0A%09if%20%28xPosition%20%3E%20xMAX%29%20%7B%0A%09%09xPosition%20%3D%20xMAX%3B%0A%09%7D%0A%09return%20xPosition%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20axes%0A%2F%2F%0Afunction%20drawAxes%28%29%20%7B%0A%09stroke%28%22black%22%29%3B%0A%09fill%28%22black%22%29%3B%0A%09strokeWeight%282%29%3B%0A%09line%28X_CANVAS_SIZE%20%2a%200.1%2C%20Y_CANVAS_SIZE%20%2a%200.95%2C%20X_CANVAS_SIZE%20%2a%200.95%2C%20Y_CANVAS_SIZE%20%2a%200.95%29%3B%0A%09line%28X_CANVAS_SIZE%20%2a%200.1%2C%20Y_CANVAS_SIZE%20%2a%200.05%2C%20X_CANVAS_SIZE%20%2a%200.1%2C%20Y_CANVAS_SIZE%20%2a%200.95%29%3B%0A%09%2F%2F%20add%20labels%0A%09strokeWeight%281%29%3B%0A%09text%28%22J%22%2C%20X_CANVAS_SIZE%20%2a%200.05%2C%20Y_CANVAS_SIZE%20%2a%200.1%29%0A%09text%28%22w%22%2C%20X_CANVAS_SIZE%20%2a%200.9%2C%20Y_CANVAS_SIZE%20%2a%200.85%29%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20graph%0A%2F%2F%0Afunction%20drawGraph%28%29%20%7B%0A%09stroke%28%22red%22%29%3B%0A%09strokeWeight%282%29%3B%0A%09for%20%28let%20x%20%3D%20xMIN%3B%20x%20%3C%3D%20xMAX%3B%20x%20%3D%20x%20%2B%20GRAPH_GRANULARITY%29%20%7B%0A%09%09point%28XGetCoord%28x%29%2C%20YGetCoord%28func%28x%29%29%29%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20gradient%20vector%0A%2F%2F%0Afunction%20drawGradientVector%28xOrigin%29%20%7B%0A%09%2F%2F%20get%20gradient%20vector%20length%0A%09let%20length%20%3D%20learningrate%20%2a%20Math.abs%28deriv%28xOrigin%29%29%3B%0A%09%2F%2F%20draw%20line%0A%09stroke%28%22blue%22%29%3B%0A%09if%20%28YGetCoord%28grad%28xOrigin%2C%20xOfGrad%28xOrigin%2C%20length%29%29%29%20%3C%20Y_CANVAS_SIZE%20%2a%200.95%29%20%7B%0A%09%09line%28XGetCoord%28xOrigin%29%2C%0A%09%09%09YGetCoord%28func%28xOrigin%29%29%2C%20XGetCoord%28xOfGrad%28xOrigin%2C%20length%29%29%2C%20YGetCoord%28grad%28xOrigin%2C%20xOfGrad%28xOrigin%2C%20length%29%29%29%29%3B%0A%09%7D%20else%20%7B%0A%09%09line%28XGetCoord%28xOrigin%29%2C%0A%09%09%09YGetCoord%28func%28xOrigin%29%29%2C%20XGetCoord%28inverseGrad%28xOrigin%2C%20yGetVal%28Y_CANVAS_SIZE%20%2a%200.95%29%29%29%2C%20Y_CANVAS_SIZE%20%2a%200.95%29%3B%0A%09%7D%0A%09%2F%2F%20draw%20intersection%20point%0A%09stroke%28%22blue%22%29%3B%0A%09fill%28%22red%22%29%3B%0A%09circle%28XGetCoord%28xOrigin%29%2C%20YGetCoord%28func%28xOrigin%29%29%2C%206%29%3B%0A%09%2F%2F%20draw%20end%20point%0A%09fill%28%22blue%22%29%3B%0A%09if%20%28YGetCoord%28grad%28xOrigin%2C%20xOfGrad%28xOrigin%2C%20length%29%29%29%20%3C%20Y_CANVAS_SIZE%20%2a%200.95%29%20%7B%0A%09%09circle%28XGetCoord%28xOfGrad%28xOrigin%2C%20length%29%29%2C%20YGetCoord%28grad%28xOrigin%2C%20xOfGrad%28xOrigin%2C%20length%29%29%29%2C%203%29%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20gradient%20vector%0A%2F%2F%0Afunction%20drawLearningStep%28xOrigin%29%20%7B%0A%09%2F%2F%20get%20gradient%20vector%20length%0A%09let%20length%20%3D%20learningrate%20%2a%20Math.abs%28deriv%28xOrigin%29%29%3B%0A%09%2F%2F%20indicate%20weight%20at%20intersection%20point%0A%09stroke%28%22black%22%29%3B%0A%09strokeWeight%281%29%3B%0A%09fill%28%22black%22%29%3B%0A%09drawingContext.setLineDash%28%5BY_CANVAS_SIZE%20%2a%200.9%20%2F%2019%2C%20Y_CANVAS_SIZE%20%2a%200.9%20%2F%2019%5D%29%3B%0A%09line%28XGetCoord%28xOrigin%29%2C%20Y_CANVAS_SIZE%20%2a%200.05%2C%20XGetCoord%28xOrigin%29%2C%20Y_CANVAS_SIZE%20%2a%200.95%29%3B%0A%09drawingContext.setLineDash%28%5B0%2C%200%5D%29%3B%0A%09text%28%22w%5B0%5D%22%2C%20XGetCoord%28xOrigin%29%2C%20Y_CANVAS_SIZE%2a1.01%29%3B%0A%09%2F%2F%20indicate%20weight%20at%20end%20point%0A%09line%28XGetCoord%28xOfGrad%28xOrigin%2C%20length%29%29%2C%20Y_CANVAS_SIZE%20%2a%200.95%2C%20XGetCoord%28xOfGrad%28xOrigin%2C%20length%29%29%2C%20Y_CANVAS_SIZE%20%2a%200.05%29%3B%0A%09text%28%22w%5B1%5D%22%2C%20XGetCoord%28xOfGrad%28xOrigin%2C%20length%29%29%2C%20Y_CANVAS_SIZE%2a1.11%29%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20write%20text%20output%0A%2F%2F%0Afunction%20writeTextOutput%28xOrigin%29%20%7B%0A%09noStroke%28%29%3B%0A%09fill%28%22blue%22%29%3B%0A%09text%28%22Gradient%20%E2%88%87%22%2C%20XGetCoord%280%29%2C%202%20%2a%20TEXT_SIZE%20%2F%204%29%3B%0A%09text%28deriv%28xOrigin%29.toFixed%282%29%2C%20XGetCoord%280%29%2C%207%20%2a%20TEXT_SIZE%20%2F%204%29%3B%0A%09text%28%22Lernrate%20%CE%BC%22%2C%20XGetCoord%280%29%2C%2012%20%2a%20TEXT_SIZE%20%2F%204%29%3B%0A%09text%28learningrate.toFixed%281%29%2C%20XGetCoord%280%29%2C%2017%20%2a%20TEXT_SIZE%20%2F%204%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20adjust%20learningrate%0A%2F%2F%0Afunction%20adjustLearningrate%28%29%20%7B%0A%09learningrate%20%3D%20slider.value%28%29%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Afunction%20setup%28%29%20%7B%0A%09%2F%2F%20defaults%0A%09learningrate%20%3D%201.0%3B%0A%09xPosition%20%3D%20xMIN%3B%0A%0A%09%2F%2F%20create%20canvas%20%0A%09createCanvas%28X_CANVAS_SIZE%2C%201.3%20%2a%20Y_CANVAS_SIZE%29%3B%0A%0A%09%2F%2F%20set%20text%20properties%0A%09textSize%28TEXT_SIZE%29%3B%0A%09textAlign%28CENTER%2C%20CENTER%29%3B%0A%0A%09%2F%2F%20create%20Slider%0A%09slider%20%3D%20createSlider%280.5%2C%205%2C%201%2C%200.1%29%3B%0A%09slider.position%28X_CANVAS_SIZE%20%2a%200.15%2C%20Y_CANVAS_SIZE%20%2B%2040%29%3B%20%2F%2F%20x%20and%20y%0A%09slider.size%28X_CANVAS_SIZE%20%2a%200.8%2C%2030%29%3B%20%2F%2F%20width%20and%20height%0A%09%2F%2F%20add%20slider%20functionality%0A%09slider.input%28adjustLearningrate%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20draw%28%29%0A%2F%2F%0Afunction%20draw%28%29%20%7B%0A%0A%09%2F%2F%20clear%20everything%0A%09background%28%22white%22%29%3B%0A%0A%09%2F%2F%20get%20x%20value%20of%20mouse%20position%20in%20graph%0A%09if%20%28mouseY%20%3C%3D%20%20Y_CANVAS_SIZE%2a0.95%29%20%7B%0A%09%09xPosition%20%3D%20getMouseXValue%28%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20everything%0A%09drawAxes%28%29%3B%0A%09drawGraph%28%29%3B%0A%09drawGradientVector%28xPosition%29%3B%0A%09drawLearningStep%28xPosition%29%3B%0A%09writeTextOutput%28xPosition%29%3B%0A%7D&css=undefined&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&height=430px#Gradient1}} ++++Unsere Kommentare dazu (zum Öffnen hier klicken)| \\ a. Der blaue Pfeil zeigt immer in Richtung Minimum. Bei sehr grossen Lernraten kann der Pfeil durchaus über das Ziel hinaus schiessen. b. Je steiler die Kurve ist, desto länger ist der blaue Pfeil. Je grösser die Lernrate ist, desto länger wird der blaue Pfeil. c. Unten in Minimum ist die Steigung $0$ und somit ist auch die Länge des blauen Pfeils $0$. ++++ \\ ===== - Schrittweise dem Ziel entgegen ===== 💡 Bisher hatten wir den Gradienten der Fehlerfunktion $J(w)$ kurz als $\nabla$ bezeichnet. Im Folgenden werden wir den Gradienten der Fehlerfunktion $J(w)$ wie sonst üblich als $\nabla J(w)$ schreiben. ; Gradientenverfahren II : Beim Gradientenverfahren wird die erste Gewicht-Einstellung $w[0]$ zufällig gewürfelt. Im ersten Lernschritt wird die neue Gewicht-Einstellung mit $w[1] = w[0] -\mu \cdot \nabla J(w[0])$ berechnet. Im zweiten Lernschritt mit $w[2] = w[1] -\mu \cdot \nabla J(w[1])$, danach $w[3] = w[2] -\mu \cdot \nabla J(w[2])$ usw. Allgemein ausgedrückt, eine neue Gewicht-Einstellung $w[k+1]$ wird aus der alten Gewicht-Einstellung $w[k]$ berechnet durch:\\ \\ $w[k+1] = w[k] -\mu \cdot \nabla J(w[k])\quad$ (Gradientenverfahren),\\ \\ wobei $k$ die Lernschritte durchnummeriert.\\ \\ : Dass dieses Verfahren funktioniert, lässt sich mathematisch beweisen. Es kann gezeigt werden, dass für eine genügend kleine Lernrate $\mu$ für jede Epoche folgendes gilt:\\ \\ $J(w[k+1]) \le J(w[k])$\\ \\ D.h. der Fehler $J(w[k])$ wird mit fortschreitenden $k$ entweder kleiner oder bleibt im schlimmsten Fall gleich. Für grosse Lernraten $\mu$ gilt $J(w[k+1]) \le J(w[k])$ jedoch nicht zwingend und es kann sein, dass beim Training der Fehler wild hin und her springt. ++++Falls du den Beweis sehen willst, hier klicken!| Beim Gradientenverfahren werden ausgehend von einer Initial-Gewicht-Einstellung $w[0]$ in mehreren Schritten $k$ die Gewicht-Einstellungen wie folgt geändert: $w[k+1] = w[k] -\mu \cdot \nabla J(w)$ . **Behauptung** Für das Gradientenverfahren gilt $J(w[k+1]) \le J(w[k])$ für eine hinreichend kleine Lernrate $\mu$. D.h. der Fehler wird bei jedem Schritt kleiner oder bleibt im schlimmsten Fall gleich. **Beweis** In $J(w[k+1]) \le J(w[k])$ wird $J(w[k+1])$ durch $J(w[k+1]) \approx J(w[k]) + \nabla J(w[k])^t \cdot \Delta w$ angenähert (das ist die sogenannte [[wpde>Taylorreihe|Talyor-Näherung]] 1ter Ordnung, welche für kleine Gewichtsänderungen $\Delta w$ eine gute Näherung darstellt). Mit dem Gradientenverfahren kann $\Delta w$ ausgedrückt werden durch $\Delta w = w[k+1] - w[k] = - \mu \cdot \nabla J(w[k])$ Alles eingesetzt ergibt sich $J(w[k+1]) \approx J(w[k]) + \nabla J(w[k])^t \cdot \Delta w$\\ $= J(w[k]) - \mu \cdot \nabla J(w[k])^t \cdot \nabla J(w[k])$\\ $= J(w[k]) - \mu \cdot ||\nabla J(w[k])||^2 \le J(w[k])$ Da der Ausdruck $||\nabla J(w[k])||^2$ beschreibt ein "Quadrat" und somit ist $||\nabla J(w[k])||^2 \ge 0$ . Daraus folgt, dass $J(w[k+1]) \le J(w[k])$ für hinreichend kleine $\mu$ beim Gradientenverfahren erfüllt ist. ++++ \\ == ✍ Auftrag Gradientenverfahren == 👉 Hier untersuchst du, wie das Gradientenverfahren bei komplexeren Fehlerfunktionen funktioniert. ⚠️ Beim Gradientenverfahren wird d ie Start-Gewicht-Einstellung $w[0]$ zufällig gewürfelt. In diesem Programm kannst du $w[0]$ durch Verschieben mit der Maus wählen. - Starte das Gradientenverfahren, indem du eine Start-Gewicht-Einstellung $w[0]$ wählst und auf die Maustaste klickst. Es werden fünf Schritte des Gradientenverfahrens durchgeführt.\\ 💡 Mit einem Klick auf den Button ''▶Run'' kannst du das Programm neu starten. - Wähle verschiedene Start-Gewicht-Einstellung $w[0]$ und verändere die Lernrate $\mu$ mit dem Schieber. Beantworte die folgenden Fragen im untenstehenden Textfeld - Warum ist es sinnvoll, das Gradientenverfahren mehrfach von verschiedenen, zufälligen Start-Gewicht-Einstellung $w[0]$ aus zu starten? - Was passiert, wenn du mit einer Start-Gewicht-Einstellung $w[0]$ nahe dem "Zwischenmaximum" ᑌᑎᑌ in der Mitte startest? - Was würde passieren, wenn du exakt auf dem "Zwischenmaximum" ᑌᑎᑌ in der Mitte starten würdest? - Wie wirken sich kleine und grosse Lernraten aus? - Beurteile, wie gut das Gradientenverfahren funktioniert. - Vergleiche danach deine Einsichten mit unseren Kommentaren unten am Programmierfenster. {{gem/plain?0=N4XyA#51489842d9f30d1f}} {{exorciser/jspg?javascript=%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20CONSTANTS%20AND%20GLOBAL%20VARIABLES%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%2F%2F%20Canvas%20coordinates%20are%20X%2C%20Y%2C%20function%20values%20are%20x%2C%20y%0A%0A%2F%2F%20constants%0Aconst%20xMIN%20%3D%201.61%3B%0Aconst%20xMAX%20%3D%206.55%3B%0Aconst%20X_CANVAS_SIZE%20%3D%20400%3B%0Aconst%20Y_CANVAS_SIZE%20%3D%20200%3B%0Aconst%20XSHIFT%20%3D%20-X_CANVAS_SIZE%20%2a%200.1%3B%0Aconst%20YSHIFT%20%3D%20Y_CANVAS_SIZE%3B%0Aconst%20XSCALE%20%3D%20X_CANVAS_SIZE%20%2a%200.15%3B%0Aconst%20YSCALE%20%3D%20Y_CANVAS_SIZE%20%2a%200.3%3B%0Aconst%20GRAPH_GRANULARITY%20%3D%200.001%3B%0Aconst%20TEXT_SIZE%20%3D%2018%3B%0A%0A%2F%2F%20global%20variables%0Alet%20slider%3B%0Alet%20xPosition%3B%0Alet%20learningrate%3B%0Alet%20learningStep%3B%0Alet%20xAnimation%3B%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20CALCULATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20function%20value%20y%20given%20x%0A%2F%2F%0Afunction%20func%28x%29%20%7B%0A%09return%20%280.5%20%2a%20x%20%2a%2a%204%20-%208%20%2a%20x%20%2a%2a%203%20%2B%2045%20%2a%20x%20%2a%2a%202%20-%20104.5%20%2a%20x%20%2B%2088%29%2F2%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20derivate%20of%20function%20value%20y%20given%20x%0A%2F%2F%0Afunction%20deriv%28x%29%20%7B%0A%09return%20%282%20%2a%20x%20%2a%2a%203%20-%2024%20%2a%20x%20%2a%2a%202%20%2B%2090%20%2a%20x%20-%20104.5%29%2F2%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20gradient%20value%20given%20x%20of%20the%20gradient%20line%20through%20point%20xOrigin%0A%2F%2F%0Afunction%20grad%28xOrigin%2C%20x%29%20%7B%0A%09return%20deriv%28xOrigin%29%20%2a%20%28x%20-%20xOrigin%29%20%2B%20func%28xOrigin%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20returns%20x%20of%20the%20endpoint%20of%20the%20gradient%20vector%20that%20starts%20at%20the%20point%0A%2F%2F%20xOrigin%20and%20has%20the%20length%20length%0A%2F%2F%0Afunction%20xOfGrad%28xOrigin%2C%20length%29%20%7B%0A%09if%20%28deriv%28xOrigin%29%20%3E%3D%200%29%20%7B%0A%09%09return%20xOrigin%20-%20length%20%2F%20Math.sqrt%28deriv%28xOrigin%29%20%2a%2a%202%20%2B%201%29%3B%0A%09%7D%20else%20%7B%0A%09%09return%20xOrigin%20%2B%20length%20%2F%20Math.sqrt%28deriv%28xOrigin%29%20%2a%2a%202%20%2B%201%29%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20transform%20x%20value%20into%20canvas%20X%20coordinate%0A%2F%2F%0Afunction%20XGetCoord%28x%29%20%7B%0A%09return%20XSCALE%20%2a%20x%20%2B%20XSHIFT%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20y%20value%20into%20canvas%20Y%20coordinate%0A%2F%2F%0Afunction%20YGetCoord%28y%29%20%7B%0A%09return%20YSHIFT%20-%20YSCALE%20%2a%20y%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20canvas%20X%20coordinate%20into%20x%20value%0A%2F%2F%0Afunction%20xGetVal%28X%29%20%7B%0A%09return%20%28X%20-%20XSHIFT%29%20%2F%20XSCALE%3B%0A%7D%0A%0A%2F%2F%0A%2F%2F%20transform%20canvas%20Y%20coordinate%20into%20x%20value%0A%2F%2F%0Afunction%20yGetVal%28Y%29%20%7B%0A%09return%20%28YSHIFT%20-%20Y%29%20%2F%20YSCALE%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20FUNCTIONS%20FOR%20VISUALISATION%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20get%20position%20in%20graph%0A%2F%2F%0Afunction%20getMouseXValue%28%29%20%7B%0A%09let%20xPosition%20%3D%20xGetVal%28mouseX%29%3B%0A%09%2F%2F%20stop%20motion%20at%20edges%0A%09if%20%28xPosition%20%3C%20xMIN%29%20%7B%0A%09%09xPosition%20%3D%20xMIN%3B%0A%09%7D%0A%09if%20%28xPosition%20%3E%20xMAX%29%20%7B%0A%09%09xPosition%20%3D%20xMAX%3B%0A%09%7D%0A%09return%20xPosition%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20axes%0A%2F%2F%0Afunction%20drawAxes%28%29%20%7B%0A%09stroke%28%22black%22%29%3B%0A%09fill%28%22black%22%29%3B%0A%09strokeWeight%282%29%3B%0A%09line%28X_CANVAS_SIZE%20%2a%200.1%2C%20Y_CANVAS_SIZE%20%2a%200.95%2C%20X_CANVAS_SIZE%20%2a%200.95%2C%20Y_CANVAS_SIZE%20%2a%200.95%29%3B%0A%09line%28X_CANVAS_SIZE%20%2a%200.1%2C%20Y_CANVAS_SIZE%20%2a%200.05%2C%20X_CANVAS_SIZE%20%2a%200.1%2C%20Y_CANVAS_SIZE%20%2a%200.95%29%3B%0A%09%2F%2F%20add%20labels%0A%09strokeWeight%281%29%3B%0A%09text%28%22J%22%2C%20X_CANVAS_SIZE%20%2a%200.05%2C%20Y_CANVAS_SIZE%20%2a%200.1%29%0A%09text%28%22w%22%2C%20X_CANVAS_SIZE%20%2a%200.9%2C%20Y_CANVAS_SIZE%20%2a%200.85%29%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20graph%0A%2F%2F%0Afunction%20drawGraph%28%29%20%7B%0A%09stroke%28%22red%22%29%3B%0A%09strokeWeight%282%29%3B%0A%09for%20%28let%20x%20%3D%20xMIN%3B%20x%20%3C%3D%20xMAX%3B%20x%20%3D%20x%20%2B%20GRAPH_GRANULARITY%29%20%7B%0A%09%09point%28XGetCoord%28x%29%2C%20YGetCoord%28func%28x%29%29%29%3B%0A%09%7D%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20y%3Df%28x%29%0A%2F%2F%0Afunction%20drawPointOnFunction%28x%2C%20diameter%29%20%7B%0A%09%2F%2F%20draw%20point%0A%09stroke%28%22blue%22%29%3B%0A%09fill%28%22red%22%29%3B%0A%09circle%28XGetCoord%28x%29%2C%20YGetCoord%28func%28x%29%29%2C%20diameter%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20indicate%20weight%0A%2F%2F%0Afunction%20indicateWeight%28label%2C%20x%2C%20isLabel%2C%20isDashed%29%20%7B%0A%09%2F%2F%20indicate%20weight%0A%09stroke%28%22black%22%29%3B%0A%09strokeWeight%281%29%3B%0A%09fill%28%22black%22%29%3B%0A%09if%20%28isDashed%29%20%7B%0A%09%09drawingContext.setLineDash%28%5BY_CANVAS_SIZE%20%2a%200.9%20%2F%2019%2C%20Y_CANVAS_SIZE%20%2a%200.9%20%2F%2019%5D%29%3B%0A%09%7D%0A%09line%28XGetCoord%28x%29%2C%20Y_CANVAS_SIZE%20%2a%200.05%2C%20XGetCoord%28x%29%2C%20Y_CANVAS_SIZE%2a0.95%20%29%3B%0A%09if%20%28isLabel%29%20%7B%0A%09%09text%28label%2C%20XGetCoord%28x%29%2C%20Y_CANVAS_SIZE%2B2%29%3B%0A%09%7D%0A%09drawingContext.setLineDash%28%5B0%2C%200%5D%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20write%20slope%20at%20point%20x%0A%2F%2F%0Afunction%20writeLearningrate%28x%29%20%7B%0A%09%2F%2F%20draw%20point%0A%09noStroke%28%29%3B%0A%09fill%28%22black%22%29%3B%0A%09text%28%22Lernrate%3A%22%2C%20X_CANVAS_SIZE%20%2F%202%20-%201.5%20%2a%20TEXT_SIZE%2C%20Y_CANVAS_SIZE%20%2a%201.15%29%3B%0A%09text%28slider.value%28%29.toFixed%282%29.padStart%285%2C%20%22%20%22%29%2C%20X_CANVAS_SIZE%20%2F%202%20%2B%201.5%20%2a%20TEXT_SIZE%2C%20Y_CANVAS_SIZE%20%2a%201.15%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20draw%20gradient%20vector%0A%2F%2F%0Afunction%20drawGradientVector%28xOrigin%29%20%7B%0A%09%2F%2F%20get%20gradient%20vector%20length%0A%09let%20length%20%3D%20learningrate%20%2a%20Math.abs%28deriv%28xOrigin%29%29%3B%0A%09%2F%2F%20draw%20line%0A%09stroke%28%22blue%22%29%3B%0A%09strokeWeight%282%29%3B%0A%09line%28XGetCoord%28xOrigin%29%2C%0A%09%09YGetCoord%28func%28xOrigin%29%29%2C%20XGetCoord%28xOfGrad%28xOrigin%2C%20length%29%29%2C%20YGetCoord%28grad%28xOrigin%2C%20xOfGrad%28xOrigin%2C%20length%29%29%29%29%3B%0A%09%2F%2F%20draw%20intersection%20point%0A%09stroke%28%22blue%22%29%3B%0A%09fill%28%22red%22%29%3B%0A%09circle%28XGetCoord%28xOrigin%29%2C%20YGetCoord%28func%28xOrigin%29%29%2C%206%29%3B%0A%09%2F%2F%20draw%20end%20point%0A%09fill%28%22blue%22%29%3B%0A%09circle%28XGetCoord%28xOfGrad%28xOrigin%2C%20length%29%29%2C%20YGetCoord%28grad%28xOrigin%2C%20xOfGrad%28xOrigin%2C%20length%29%29%29%2C%203%29%3B%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20adjust%20learningrate%0A%2F%2F%0Afunction%20adjustLearningrate%28%29%20%7B%0A%09learningrate%20%3D%20slider.value%28%29%3B%0A%7D%0A%0A%0A%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%2F%2F%20MAIN%20PROGRAM%0A%2F%2F%20%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%2a%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20setup%28%29%0A%2F%2F%0Afunction%20setup%28%29%20%7B%0A%09%2F%2F%20defaults%0A%09learningrate%20%3D%200.25%0A%09xPosition%20%3D%20xMIN%3B%0A%09learningStep%20%3D%200%3B%0A%0A%09%2F%2F%20create%20canvas%20%0A%09createCanvas%28X_CANVAS_SIZE%2C%201.4%20%2a%20Y_CANVAS_SIZE%29%3B%0A%0A%09%2F%2F%20set%20text%20properties%0A%09textSize%28TEXT_SIZE%29%3B%0A%09textAlign%28CENTER%2C%20CENTER%29%3B%0A%0A%09%2F%2F%20create%20Slider%0A%09slider%20%3D%20createSlider%280.1%2C%201%2C%200.25%2C%200.05%29%3B%0A%09slider.position%28X_CANVAS_SIZE%20%2a%200.15%2C%20Y_CANVAS_SIZE%20%2a%201.25%29%3B%20%2F%2F%20x%20and%20y%0A%09slider.size%28X_CANVAS_SIZE%20%2a%200.8%2C%2030%29%3B%20%2F%2F%20width%20and%20height%0A%09%2F%2F%20add%20slider%20functionality%0A%09slider.input%28adjustLearningrate%29%3B%0A%0A%7D%0A%0A%0A%2F%2F%0A%2F%2F%20p5.js%20draw%28%29%0A%2F%2F%0Afunction%20draw%28%29%20%7B%0A%0A%09%2F%2F%20clear%20everything%0A%09background%28%22white%22%29%3B%0A%0A%09%2F%2F%20get%20x%20value%20of%20mouse%20position%20in%20graph%0A%09if%20%28mouseY%20%3C%3D%20Y_CANVAS_SIZE%20%2a%200.95%29%20%7B%0A%09%09xPosition%20%3D%20getMouseXValue%28%29%3B%0A%09%7D%0A%0A%09%2F%2F%20draw%20axes%20and%20graph%0A%09drawAxes%28%29%3B%0A%09drawGraph%28%29%3B%0A%0A%09%2F%2F%2010.%20stop%20animation%20at%20w%5B5%5D%0A%09if%20%28learningStep%20%3D%3D%3D%2016%29%20%7B%0A%09%09xAnimation%20%3D%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%3B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B5%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09noStroke%28%29%3B%0A%09%09text%28%22Klicke%20auf%20%27Run%27%20f%C3%BCr%20einen%20Neustart.%22%2C%20X_CANVAS_SIZE%20%2F%202%2C%20Y_CANVAS_SIZE%20%2a%201.15%29%3B%0A%09%09frameRate%280%29%3B%0A%09%7D%0A%09%2F%2F%209.add%20new%20weight%20w%5B5%5D%0A%09if%20%28learningStep%20%3D%3D%3D%2015%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B4%5D%22%2C%20xAnimation%2C%20false%2C%20true%29%3B%0A%09%09indicateWeight%28%22w%5B5%5D%22%2C%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%2016%3B%0A%09%7D%0A%09%2F%2F%208.%20draw%20gradient%20from%20w%5B4%5D%0A%09if%20%28learningStep%20%3D%3D%3D%2014%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B4%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%2015%3B%0A%09%7D%0A%09%2F%2F%207.%20start%20animation%20at%20w%5B4%5D%0A%09if%20%28learningStep%20%3D%3D%3D%2013%29%20%7B%0A%09%09xAnimation%20%3D%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%3B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B4%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%2014%3B%0A%09%7D%09%2F%2F%209.add%20new%20weight%20w%5B4%5D%0A%09if%20%28learningStep%20%3D%3D%3D%2012%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B3%5D%22%2C%20xAnimation%2C%20false%2C%20true%29%3B%0A%09%09indicateWeight%28%22w%5B4%5D%22%2C%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%2013%3B%0A%09%7D%0A%09%2F%2F%208.%20draw%20gradient%20from%20w%5B3%5D%0A%09if%20%28learningStep%20%3D%3D%3D%2011%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B3%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%2012%3B%0A%09%7D%0A%09%2F%2F%207.%20start%20animation%20at%20w%5B3%5D%0A%09if%20%28learningStep%20%3D%3D%3D%20%2010%29%20%7B%0A%09%09xAnimation%20%3D%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%3B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B3%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%2011%3B%0A%09%7D%09%2F%2F%209.add%20new%20weight%20w%5B3%5D%0A%09if%20%28learningStep%20%3D%3D%3D%209%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B2%5D%22%2C%20xAnimation%2C%20false%2C%20true%29%3B%0A%09%09indicateWeight%28%22w%5B3%5D%22%2C%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%2010%3B%0A%09%7D%0A%09%2F%2F%208.%20draw%20gradient%20from%20w%5B2%5D%0A%09if%20%28learningStep%20%3D%3D%3D%208%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B2%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%209%3B%0A%09%7D%0A%09%2F%2F%207.%20start%20animation%20at%20w%5B2%5D%0A%09if%20%28learningStep%20%3D%3D%3D%207%29%20%7B%0A%09%09xAnimation%20%3D%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%3B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B2%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%208%3B%0A%09%7D%0A%09%2F%2F%206.add%20new%20weight%20w%5B2%5D%0A%09if%20%28learningStep%20%3D%3D%3D%206%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B1%5D%22%2C%20xAnimation%2C%20false%2C%20true%29%3B%0A%09%09indicateWeight%28%22w%5B2%5D%22%2C%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%207%3B%0A%09%7D%0A%09%2F%2F%205.%20draw%20gradient%20from%20w%5B1%5D%0A%09if%20%28learningStep%20%3D%3D%3D%205%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B1%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%206%3B%0A%09%7D%0A%09%2F%2F%204.%20start%20animation%20at%20w%5B1%5D%0A%09if%20%28learningStep%20%3D%3D%3D%204%29%20%7B%0A%09%09xAnimation%20%3D%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%3B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B1%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%205%3B%0A%09%7D%0A%09%2F%2F%203.add%20new%20weight%20w%E2%82%81%0A%09if%20%28learningStep%20%3D%3D%3D%203%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B0%5D%22%2C%20xAnimation%2C%20false%2C%20true%29%3B%0A%09%09indicateWeight%28%22w%5B1%5D%22%2C%20xOfGrad%28xAnimation%2C%20learningrate%20%2a%20Math.abs%28deriv%28xAnimation%29%29%29%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%204%3B%0A%09%7D%0A%09%2F%2F%202.%20draw%20gradient%20from%20w%5B0%5D%0A%09if%20%28learningStep%20%3D%3D%3D%202%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B0%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09drawGradientVector%28xAnimation%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%203%3B%0A%09%7D%0A%09%2F%2F%201.%20start%20animation%20at%20w%5B0%5D%0A%09if%20%28learningStep%20%3D%3D%3D%201%29%20%7B%0A%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B0%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09writeLearningrate%28%29%3B%0A%09%09learningStep%20%3D%202%3B%0A%09%7D%0A%09%2F%2F%200.%20Choose%20w%5B0%5D%0A%09if%20%28learningStep%20%3D%3D%3D%200%29%20%7B%0A%09%09frameRate%2860%29%3B%0A%09%09drawPointOnFunction%28xPosition%2C%206%29%3B%0A%09%09if%20%28mouseIsPressed%20%26%26%20mouseY%20%3C%3D%20Y_CANVAS_SIZE%20%2a%200.95%29%20%7B%0A%09%09%09xAnimation%20%3D%20xPosition%3B%0A%09%09%09drawPointOnFunction%28xAnimation%2C%206%29%3B%0A%09%09indicateWeight%28%22w%5B0%5D%22%2C%20xAnimation%2C%20true%2C%20false%29%3B%0A%09%09%09learningStep%20%3D%201%3B%0A%09%09%09fill%28%22black%22%29%3B%0A%09%09%09noStroke%28%29%3B%0A%09%09%09text%28%22Starte%20Animation.%22%2C%20X_CANVAS_SIZE%20%2F%202%2C%20Y_CANVAS_SIZE%20%2a%201.15%29%3B%0A%09%09%09frameRate%281%29%3B%0A%09%09%7D%20else%20%7B%0A%09%09%09writeLearningrate%28%29%3B%0A%09%09%7D%0A%09%7D%0A%7D&css=undefined&html=%3Cscript%20src%3D%22https%3A%2F%2Fapp.exorciser.ch%2Flib%2Fp5.js%22%3E%3C%2Fscript%3E&height=450px#Gradient2}} ++++Unsere Kommentare dazu (zum Öffnen hier klicken)| \\ a. Das Minimum auf der rechten Seite (globales Minimum) ist tiefer als das linke (lokales Minimum). Je nach Startposition endet das Verfahren im linken oder rechten Minimum. Mehrfaches Starten erhöht die Chance, das globale Minimum zu erwischen. b. In der Nähe des Maximums ist die Steigung klein und das Gradientenverfahren kommt nur langsam voran. c. Beim Maximum ist die Steigung $0$ und somit würde das Gradientenverfahren dort stecken bleiben. d. Bei tiefen Lernraten nimmt der Fehler kontinuierlich, aber nur langsam ab. Bei grösseren Lernraten nimmt der Fehler schneller ab, jedoch besteht die Gefahr, dass der Fehler wild hin und her springt. e. Das Gradientenverfahren findet einigermassen effizient Minima, sofern die Lernrate vernünftig eingestellt wurde. Es sollte jedoch mehrfach gestartet werden, um die Chance ein möglichst tiefes Minimum zu finden zu erhöhen. Es kann aber weder garantiert noch überprüft werden, ob das globale (tiefste) Minimum gefunden wird. ++++ \\ ===== - Fortsetzung folgt... ====== Du kennst die Funktionsweise des Gradientenverfahrens und hast bereits Erfahrung im Umgang damit gesammelt. Im [[:p:ki:machinelearning4|🤖 Teil 4]] erfährst du, wie genau ein neuronales Netz aufgebaut ist und wie mit dem Gradientenverfahren der Fehler eines neuronalen Netzes schrittweise minimiert werden kann. \\ === Eigene Notizen === {{gem/quill#46d9ce5ee99f3811}}