| Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |
| p:ki:machinelearning3 [2026/07/11 10:39] – [👉 Das Minimum direkt mit der Steigung berechnen oder doch nicht?] Ralf Kretzschmar | p:ki:machinelearning3 [2026/07/11 12:51] (aktuell) – [3. Schrittweise dem Ziel entgegen] Ralf Kretzschmar |
|---|
| |
| ++++Falls du genauer wissen willst, warum das so ist, hier klicken!| | ++++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.\\ \\ | \\ Eigentlich ist $J(w)$ eine Abkürzung. Die Gewichte $w$ sind Teil der Stellvertreter-Funktion $y = f_{ML}(x)$. Somit hängt der Ausgang $y$ vom Eingang $x$ und von den Gewichten $w$ ab, d. h. $y = f_{ML}(w,x)$. Der Fehler $e$ wird mit der Fehlerfunktion $J$ aus dem Ausgang $y$ und im Falle eines Supervised Learnings (was wir in diesem Teil voraussetzen) dem Desired Output $d$ berechnet. Somit hängt $e$ von $y$ und von $d$ ab, d. h. $e = J(d, y)$. Alles miteinander kombiniert ergibt das $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 ergeben sich meist Gleichungen, welche nicht mehr mit vernünftigem Aufwand exakt berechnet werden können, 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.++++ | |
| |
| \\ | \\ |
| \\ Abb.2: (Negativer) Gradient((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP> | \\ Abb.2: (Negativer) Gradient((eigene Darstellung, [[https://creativecommons.org/publicdomain/zero/1.0/deed.de|CC0 1.0]])).</WRAP> |
| |
| ⚠️ 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). | ⚠️ Für die folgenden Überlegungen tun wir so, als würde unsere Fehlerfunktion $J(w)$ so aussehen: ᑌ (Funktion mit einem eindeutigen Minimum). |
| |
| ; Gradient | ; 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.\\ \\ | : 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(\hat{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). | : 💡 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). |
| |
| 👉 Hier untersuchst du die Grundidee des Gradientenverfahrens. | 👉 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. | ⚠️ 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, d. h. $w[1] = w[0] - \mu \cdot \nabla$. |
| |
| - 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 | - 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 |
| {{gem/plain?0=N4XyA#bb1993deecc6bf61}} | {{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}} | {{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%20%2a%201.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%20%2a%201.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%22Negativer%20Gradient%20-%E2%88%87%22%2C%20XGetCoord%280%29%2C%202%20%2a%20TEXT_SIZE%20%2F%204%29%3B%0A%09text%28%28-1.0%20%2a%20deriv%28xOrigin%29%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%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%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)| | ++++Unsere Kommentare dazu (zum Öffnen hier klicken)| |
| \\ | \\ |
| |
| c. Unten in Minimum ist die Steigung $0$ und somit ist auch die Länge des blauen Pfeils $0$. | c. Unten in Minimum ist die Steigung $0$ und somit ist auch die Länge des blauen Pfeils $0$. |
| | |
| | d. Ist der negative Gradient positiv, wird $w$ erhöht, ist der negative Gradient negativ, wird $w$ vermindert. |
| ++++ | ++++ |
| </WRAP> | </WRAP> |
| ===== - Schrittweise dem Ziel entgegen ===== | ===== - 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. | 💡 Bisher hatten wir den Gradienten der Fehlerfunktion $J(w)$ kurz als $\nabla$ bezeichnet. Im Folgenden werden wir den Gradienten der Fehlerfunktion $J(w)$ wie in der Literatur üblich als $\nabla J(w)$ schreiben, wobei $\nabla J(\hat{w})$ bedeutet, dass der Gradient im "Punkt" $\hat{w}$ berechnet wird. |
| |
| ; Gradientenverfahren II | ; Gradientenverfahren II |
| ++++Falls du den Beweis sehen willst, hier klicken!| | ++++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)$ . | 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[k])$ . |
| |
| **Behauptung** | **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. | 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** | **Beweis** |
| ++++Unsere Kommentare dazu (zum Öffnen hier klicken)| | ++++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. | 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 (von zufälligen Startpositionen aus) 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. | b. In der Nähe des Maximums ist die Steigung klein und das Gradientenverfahren kommt nur langsam voran. |
| 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. | 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. | 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 dabei das globale (tiefste) Minimum gefunden wurde. |
| ++++ | ++++ |
| </WRAP> | </WRAP> |