Gradientenabstieg
Die Lösung: Gewicht anpassen zeigt ein iteratives Näherungsverfahren mit der Bezeichnung Gradientenabstieg. Was bedeutet das? Was haben wir da eigentlich gemacht?
Der Gradient ist ein mathematischer Begriff, der die Steigung bezeichnet (lat. gradus, eigentlich = Schritt, zu: gradi = (einher)schreiten).

10% Steigung
Wenn z.B. man auf einem Anstieg 10 Meter an Höhe gewonnen und ist die horizontale Strecke 100 Meter lang, so beträgt die Steigung:
\( \frac{10m}{100m}= 0,1 =10 \% \)
Ein Gefälle ist lediglich eine negative Steigung.

Negative Steigung (Gefälle)
\( \frac{-0,5}{1}= -0,5 \)
Kurvendiskussion
Die 1. Ableitung f'(x) einer Funktion f(x) definiert ihre Steigung (Gradient).
Wir betrachten folgende quadratische Funktion und ihre 1. Ableitung:
\( y = f(x) = {x}^2 \\
y' = f'(x)= 2 \cdot x \)
(Die Ableitungsregeln kann man z.B. hier nachschlagen: https://www.mathebibel.de/ableitungsregeln (25.09.2022)
Wertetabelle

Wertetabelle für f(x) und f'(x)
Graphen
f(x)=x2 ist eine Parabel und f'(x)=2·x ist eine Gerade.

Quadratische Funktion mit 1. Ableitung
Also z.B. der Punkt P'(-2|-4) auf der Ableitung f'(x) besagt, dass die Steigung (Gradient) im Punkt P(-2|4) der Funktion f(x) genau -4 beträgt. Die Steigung (Gradient) der Tangente in diesem Punkt ist
\( \frac{ \Delta y}{\Delta x}= \frac{ y_2 - y_1}{x_2 - x_1}= \frac{2-6}{2,5-1,5} = \frac{-4}{1} =-4\\
=\\
f'(x)=2 \cdot x = 2 \cdot (-2) = -4 \)
Außerdem gilt: die Steigung (Gradient) im Minimum einer Funktion ist 0.
Hier kann man das selbst nochmal online ausprobieren: https://www.mathebibel.de/erste-ableitung (25.09.2022)
Näherungsverfahren
Im Folgenden wird der Code aus Lösung: Gewicht anpassen etwas erweitert, um die Näherung graphisch zu veranschaulichen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
def plotTangente(e,w,d): plt.plot(w,e,'r.') factor = 0.2 # begrenzt Länge der Tangente plt.plot([w-0.5*factor, w+0.5*factor], [e-d*factor, e+d*factor], '0.3') def plotGraphs(startWeight): # plot Graphen e=[] w=[] weight = startWeight # Startwert for iteration in range(80): # Anzahl der Durchläufe strOut = "Weight:" + str(weight) w.append(weight) pred = input * weight # Voraussage delta = pred - goal_pred # Abweichung bzw. Differenz vom erwarteten Ergebnis error = delta ** 2 e.append(error) weight_delta = delta * input # Abweichung in Abhängigkeit vom Eingabewert gewichten if iteration%10 == 0: # jede 10. Iteration plotTangente(error, weight, weight_delta) # Tangente plotten plt.plot(weight,delta,'k.') # Punkt plotten f'(weight) = delta weight = weight - weight_delta * alpha # neues Gewicht einstellen = lernen mit eingestellter Lernrate strOut += " Delta:" + str(delta) + " Error:" + str(error) + " Pred:" + str(pred) print(strOut) plt.plot(w,e,'r') # Quadratischen Fehler plotten plt.plot([],[],'k.',label='delta') plt.plot([],[],'r',label='error') plotGraphs(0) # von links mit weight=0 annähern plotGraphs(1) # von rechts mit weight=0 annähern |
Vollständiges Jupyter Notebook: https://github.com/ateachment/Moodle-KI/blob/main/GradientenAbstieg.ipynb (26.9.2022)
In Codezeile 29 und 30 wird plotGraphs() aufgerufen. Damit wird die Annäherung einmal von weight=0 und weight=1 ausgeführt. Wegen der besseren Übersichtlichkeit ist das Zielgewicht dabei 0,5.
Die Funktion plotGraphs() zeichnet dabei jede 10. Iteration einen Punkt, der die Abweichung
delta = pred - goal_pred
in Abhängigkeit vom Gewichtweight aufzeigt.Es ergibt sich eine Gerade, die als 1. Ableitung der quadrierte Abweichung
error = delta ** 2
verstanden wird.
Um das zu zeigen, wird der quadratische Fehler error ebenfalls gezeichnet. Die Funktion plotTangente() zeichnet ebenfalls jede 10. Iteration die entsprechende Tangente zur Abweichung delta.

Gradientenabstieg
Mit jeder Iteration nimmt die Steigung des quadratischen Fehlers ab (Gradientenabstieg).