In Anlehnung ans das Video "The Absolutely Simplest Neural Network Backpropagation Example" von Mikael Laine 1, ist hier eine Erklärung, wie die Backpropergation in einem sehr einfachen neuronalen Netz funktioniert. Zuerst wird gezeigt, wie es mit zwei Knoten funktioniert und dann wird der Backpropergation-Algorithmus auf ein Mehrlagenlayer-Netz ausgeweitet.
Im ersten Fall besteht das neuronale Netz nur aus einem Input-Layer Knoten (i) und einen Output-Layer Knoten (a).
Wir wollen nun zeigen, wie das Netz, durch anpassen der Gewichte, trainiert wird, um einen bestimmeten Ausgangswert zu erreichen.
Ziel ist es, den Wert vom Knoten (a) auf 0,5 zu tranieren, wenn der Eingangswert bei 1,5 ist.
Das Gewicht (w) wird mit einem Zufallswert initialiersiert. z.B. 0,8
input (x) | Gewünschter Output | output ( |
---|---|---|
1,5 | 0,5 | 1,2 |
Als Fehlerfunktion (Lossfunktion) L am Ausgang wird der quadratische Fehler genommen:
Einschub: Kettenregel
Dieses Bild kann als folgende Funktion geschrieben werden:
Anwendung der Kettenregel:
Angewendet auf unser Netzwerk:
Um sich langsam an den Wert für das Gewicht anzunähern, wird eine Lernrate
mit
und
ergibt sich:
Jetzt können wir das Gewicht so lange anpassen, bis das Gewicht sich auf einen Wert angenähert hat.
Beispiel in Python
#Random Values
a= 0.1
w= 0.1
#Input = 1.5
x= 1.5
#Lernrate
r = 0.1
#Zielwert y = 0.5
y=0.5
for x in range (0,15):
a=w * x
w=w-r*x*2*(a-y)
Output
W0 = 0.2050 Fehler = -0.1925
W0 = 0.2628 Fehler = -0.1059
W0 = 0.2945 Fehler = -0.0582
W0 = 0.3120 Fehler = -0.0320
W0 = 0.3216 Fehler = -0.0176
W0 = 0.3269 Fehler = -0.0097
W0 = 0.3298 Fehler = -0.0053
W0 = 0.3314 Fehler = -0.0029
W0 = 0.3323 Fehler = -0.0016
W0 = 0.3327 Fehler = -0.0009
W0 = 0.3330 Fehler = -0.0005
W0 = 0.3332 Fehler = -0.0003
W0 = 0.3332 Fehler = -0.0001
W0 = 0.3333 Fehler = -0.0001
W0 = 0.3333 Fehler = -0.0000
Durch das schrittweise Anpassen, wird das Gewicht "gelernt".
Neuronales Netz mit mehreren Schichten
Jetzt sehen wir uns ein Netz mit drei Schichten an:
daraus ergibt sich für y die folgende Funktion:
y=
Für die Backpropergation ergibt sich unter Einbeziehung der Kettenregel folgende partielle Differentailgleichung
somit ergibt sich für
wobei
#learing rate
r = 0.1
#Input
a2=1.5
#Random Values
w0 = 0.1
w1 = 0.1
a0 = 0.1
a1 = 0.1
#Zielwert y = 0.5
y=0.5
for x in range (0,35):
a0=a1*w0
w0=w0-r*a1*2*(a0-y)
a1 = w1*a2
w1=w1-r * a2*w0*2*(a0-y)
Output
W0 = 0.1098 W1 = 0.1161 Fehler = -0.4900
W0 = 0.1243 W1 = 0.1342 Fehler = -0.4835
W0 = 0.1410 W1 = 0.1544 Fehler = -0.4783
W0 = 0.1600 W1 = 0.1770 Fehler = -0.4716
W0 = 0.1814 W1 = 0.2022 Fehler = -0.4630
W0 = 0.2054 W1 = 0.2301 Fehler = -0.4518
W0 = 0.2320 W1 = 0.2605 Fehler = -0.4377
W0 = 0.2609 W1 = 0.2934 Fehler = -0.4200
.
.
.
W0 = 0.5544 W1 = 0.6005 Fehler = -0.0014
W0 = 0.5545 W1 = 0.6006 Fehler = -0.0009
W0 = 0.5546 W1 = 0.6007 Fehler = -0.0005
W0 = 0.5547 W1 = 0.6008 Fehler = -0.0003
W0 = 0.5547 W1 = 0.6008 Fehler = -0.0002
W0 = 0.5547 W1 = 0.6008 Fehler = -0.0001
W0 = 0.5547 W1 = 0.6008 Fehler = -0.0001
W0 = 0.5547 W1 = 0.6009 Fehler = -0.0000
Check 0.499
Jetzt kann es für weitere Schichten einfach erweitert werden
somit ergibt sich:
#learing rate
r = 0.1
#Input
a4=1.5
#Random Values
w0 = 0.1
w1 = 0.1
w2 = 0.1
w3 = 0.1
a0 = 0.1
a1 = 0.1
a2 = 0.1
a3 = 0.1
#Zielwert y = 0.5
y=0.5
for x in range (0,400):
#Vorwaertspfad
a0 = w0 * a1
a1 = w1 * a2
a2 = w2 * a3
a3 = w3 * a4
#Berechnung der Gewichte
w0=w0-r*a1*2*(a0-y)
w1=w1-r*a2*w0*2*(a0-y)
w2=w2-r*a3*w1*w0*2*(a0-y)
w3=w3-r*a4*w2*w1*w0*2*(a0-y)
Output
W0 = 0.1010 W1 = 0.1001 W2 = 0.1001 W3 = 0.1001 Fehler = -0.4900
W0 = 0.1011 W1 = 0.1003 W2 = 0.1003 W3 = 0.1003 Fehler = -0.4990
W0 = 0.1012 W1 = 0.1004 W2 = 0.1004 W3 = 0.1004 Fehler = -0.4999
.
.
.
W0 = 0.7251 W1 = 0.7546 W2 = 0.7546 W3 = 0.7546 Fehler = 0.0004
W0 = 0.7251 W1 = 0.7546 W2 = 0.7546 W3 = 0.7546 Fehler = 0.0002
W0 = 0.7251 W1 = 0.7546 W2 = 0.7546 W3 = 0.7546 Fehler = 0.0001
W0 = 0.7251 W1 = 0.7546 W2 = 0.7546 W3 = 0.7546 Fehler = -0.0000
Check 0.4999999979013684