Gradientenabstieg durch einen einfachen Datensatz
Verstehen Sie, wie Sie anhand eines einfachen Datensatzes einen grundlegenden Gradientenabstieg durchführen.
Der Überblick:
Hallo Welt! Bei meinem ersten beharrlichen Ausflug in die Welt der Online-Veröffentlichung von Artikeln werde ich den Gradientenabstieg beim maschinellen Lernen anhand eines einfachen Datensatzes demonstrieren. Das Wort „Gradient“ hat je nach Kontext mehrere Bedeutungen. Im Allgemeinen bedeutet es jedoch etwas, das sich allmählich ändert. Im Sprachgebrauch der Mathematik und des maschinellen Lernens wird der Gradient als „Steigung“ bezeichnet, die angibt, wie steil oder flach eine Linie (oder eine Funktion) an einem bestimmten Punkt in einer n-dimensionalen Ebene ist. Eine steile Steigung weist auf eine hohe Änderungsrate eines Faktors gegenüber einem anderen Faktor hin, während das Gegenteil für eine flache Steigung gilt.
Im Mathematikunterricht in den Schulen wurde gelehrt, dass die Geradengleichung y = mx + c lautet (Notationen können je nach Buch variieren) , wobei y der Punkt auf der y-Achse, x der Punkt auf der x-Achse und m die Steigung ist c ist der Schnittpunkt auf der y-Achse. Wenn der Achsenabschnitt auf der Y-Achse bei 0 liegt, kann c ignoriert werden. Beim maschinellen Lernen ist diese Gleichung ein grundlegendes lineares Regressionsproblem. Wenn es nur eine einzelne Linie in einer zweidimensionalen Ebene gibt, können Steigung und Achsenabschnitt durch Formeln ermittelt, m und c durch diese ersetzt und die Gleichung gelöst werden. Daher gibt es eine einzige Lösung.
In Wirklichkeit umfasst jedes Problem des maschinellen Lernens Hunderte oder Tausende von Gleichungen, die sich häufig nicht auf eine einzige Lösung einigen. Jede Gleichung ist eine „Beobachtung“ und jede Achse ist ein „Merkmal“. Wenn ein Gleichungssystem mehr Beobachtungen als Merkmale aufweist, spricht man von einem überbestimmten System. Daher handelt es sich bei den meisten Problemen des maschinellen Lernens um ein überbestimmtes System. Der Gradientenabstieg wird verwendet, um für jedes Merkmal eine Lösung (Koeffizient) zu finden, auf die sich alle Beobachtungen einigen können und die den „kollektiven Unterschied“ zwischen den beobachteten Ergebnissen und den vorhergesagten Ergebnissen minimiert. Die „kollektive Differenz“ wird mithilfe vieler „Kostenfunktionen“ berechnet. Einer davon ist der mittlere quadratische Fehler (MSE) , der im ML-Problem dieses Artikels verwendet wird.
Das Programm:
Für dieses Gradientenabstiegsproblem wird ein einfacher synthetischer Datensatz erstellt. Alle Codeblöcke sind in der Programmiersprache Python. Das Programm beginnt mit dem Import der erforderlichen Python-Pakete.
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
Definieren Sie die Gleichung in Python und generieren Sie den Datensatz.
def f(x):
return 2.3*x
x = np.arange(-20, 20, 2) #Generate feature x
Y = []
for x_i in x:
Y.append(np.round(f(x_i),2)) #Generate Observed value Y
fulldata = pd.Series(zip(x,Y))
n=len(fulldata)
Ersetzt y_bar,
Es wird eine Python-Funktion erstellt, um die Berechnung der Kosten durch Bereitstellung der erforderlichen Eingabeparameter zu erleichtern.
def costfunc(Y_i, x_i, m, n):
return (1/n)*sum(pow(Y_i-(m*x_i),2))
Aber woher wissen wir, ob die Steigung an einem bestimmten Punkt der Kostenfunktionskurve steil oder flach ist? Hier kommen Derivate ins Spiel. Derivate bieten die Möglichkeit, die Änderungsrate eines Werts gegenüber einem anderen Wert zu einem bestimmten Zeitpunkt zu verstehen. Im Fall der Kostenfunktion bieten Ableitungen die Möglichkeit, die Größe von MSE für eine Instanz von m zu bestimmen . Daher werden Ableitungen verwendet, um den Wert von m so weit abzustimmen , dass der Fehler am geringsten ist. Durch die Anwendung von Ableitungsregeln auf unsere Kostenfunktion ( MSE ) wird die Ableitungsgleichung zu:
Wenn Sie dies als Python-Funktion anwenden,
def der_costfunc(Y_i, x_i, m, n):
return (2/n)*sum(x_i*((m*x_i)-Y_i))
Wenn der Wert der Stufe zu hoch eingestellt ist, könnte der Wert der Kostenfunktion zwischen mehreren Spitzen schwanken und nie konvergieren. Dies kann auch dazu verleiten, zu glauben, dass es ein Problem mit ihrem Programm oder der abgeleiteten Formel gibt, anstatt zu erkennen, dass der Schrittwert nicht angemessen ist und dies die Konvergenz behindert. Wenn umgekehrt der Wert von „Step“ zu niedrig eingestellt ist, kann es lange dauern, bis die Kostenfunktion bei einem Minimum konvergiert.
Die andere Variable, die in Gradient Descent verwendet wird, ist die Toleranz . Da Gradient Descent versucht, die MSE durch mehrere Iterationen zu reduzieren, muss es eine Möglichkeit geben, zu bestimmen, wann die MSE akzeptabel ist, und die Iterationen zu stoppen. Eine Möglichkeit besteht darin, Toleranz zu nutzen. Es gibt mehrere Möglichkeiten, die Toleranz für ein Gradientenabstiegsproblem zu definieren. In diesem Artikel wird die MSE-Differenz zwischen aufeinanderfolgenden Iterationen ermittelt. Wenn sie unter einem bestimmten Wert liegt, werden die Iterationen gestoppt.
Schließlich wird der Anfangswert des Koeffizienten m so eingestellt, dass er in jeder Iteration angepasst werden kann, um den MSE zu reduzieren. Fügen Sie alles wie folgt in den Python-Code ein.
ms = [] #Hold the coefficients for each iteration for plotting purpose
errors = [] #Hold the MSE for each iteration for plotting purpose
m = 0 #Initial value of the coefficient
step = 0.001 #Ensure step is appropriate else costfunc will wildly swing.
tol=0.0001 #Acceptable difference in MSE between consecutive iterations to stop the Descent
1. Berechnen Sie die Kosten anhand des Anfangswerts des Koeffizienten.
2. Berechnen Sie den Ableitungswert für den Anfangswert von m mithilfe der ersten Ableitungsgleichung der Kostenfunktion. Multiplizieren Sie diesen Wert mit dem Schrittwert , um den nächsten Wert für den Koeffizienten m zu bestimmen .
3. Berechnen Sie die Kosten noch einmal mit dem neuen Wert des Koeffizienten m . Finden Sie den Unterschied zwischen dem in Schritt 1 und Schritt 3 erhaltenen MSE.
4. Wiederholen Sie die Schritte 1 bis 3, bis die Differenz zwischen den aufeinanderfolgenden Kosten innerhalb der Toleranzgrenze liegt.
Anwenden dieser Schritte als Python-Code,
prevcost = costfunc(Y, x, m, n)
for i in range(200):
der_m = der_costfunc(Y, x, m, n)
m = m - (der_m*step)
currcost = costfunc(Y, x, m, n)
ms.append(m)
errors.append(currcost)
if((prevcost-currcost) < tol):
print(f'm: {np.round(m,5)}, currcost: {currcost}, prevcost: {prevcost}')
plt.plot(ms, errors)
plt.xlabel("coefficient")
plt.ylabel("MSE")
plt.show()
break
prevcost = currcost
Den gesamten Python-Code zusammenfügen.
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
def f(x):
return 2.3*x
x = np.arange(-20, 20, 2)
Y = []
for x_i in x:
Y.append(np.round(f(x_i),2))
fulldata = pd.Series(zip(x,Y))
n=len(fulldata)
def costfunc(Y_i, x_i, m, n):
return (1/n)*sum(pow(Y_i-(m*x_i),2))
def der_costfunc(Y_i, x_i, m, n):
return (2/n)*sum(x_i*((m*x_i)-Y_i))
ms = [] #Hold the coefficients for each iteration for plotting purpose
errors = [] #Hold the MSE for each iteration for plotting purpose
m = 0 #Initial value of the coefficient
step = 0.001 #Ensure step is appropriate else costfunc will wildly swing.
tol=0.0001 #Acceptable difference in MSE between consecutive iterations to stop the Descent
prevcost = costfunc(Y, x, m, n)
for i in range(200):
der_m = der_costfunc(Y, x, m, n)
m = m - (der_m*step)
currcost = costfunc(Y, x, m, n)
ms.append(m)
errors.append(currcost)
if((prevcost-currcost) < tol):
print(f'm: {np.round(m,5)}, currcost: {currcost}, prevcost: {prevcost}')
plt.plot(ms, errors)
plt.xlabel("coefficient")
plt.ylabel("MSE")
plt.show()
break
prevcost = currcost
Ich hoffe, dass dieser Artikel hilfreich war, um dem Uneingeweihten eine grundlegende Einführung zu bieten. Bitte stellen Sie Ihre Fragen, Kommentare oder Empfehlungen zu diesem Artikel. Vielen Dank und einen schönen Tag!

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































