Backpropagation-Algorithmus


19

Ich habe eine leichte Verwirrung über den Backpropagation- Algorithmus, der in Multilayer Perceptron (MLP) verwendet wird.

Der Fehler wird durch die Kostenfunktion korrigiert. Bei der Backpropagation versuchen wir, das Gewicht der ausgeblendeten Ebenen anzupassen. Den Ausgabefehler kann ich nachvollziehen, also e = d - y[ohne die Indizes].

Die Fragen sind:

  1. Wie bekommt man den Fehler der versteckten Ebene? Wie berechnet man das?
  2. Wenn ich es zurückpropagiere, sollte ich es als eine Kostenfunktion eines adaptiven Filters verwenden oder sollte ich einen Zeiger (in C / C ++) verwenden, um das Gewicht zu aktualisieren?

NN ist eher eine veraltete Technologie, daher werden Sie

@mbq: Ich zweifle nicht an deinen Worten, aber wie kommst du zu dem Schluss, dass NN "veraltete Technologie" sind?
Steffen

1
@steffen Durch Beobachtung; Ich meine, es ist offensichtlich, dass niemand aus der NN-Community herauskommt und sagt: "Hey Leute, lasst uns unser Lebenswerk fallen lassen und mit etwas Besserem spielen!", Aber wir haben Werkzeuge, die ohne all diese Ambivalenz und niemals die gleiche oder eine bessere Genauigkeit erreichen ausbildung. Und die Leute lassen NN zugunsten von ihnen fallen.

5
Dies hatte etwas Wahres, als Sie es sagten, @mbq, aber nicht mehr.
Jerad

1
@jerad Ziemlich einfach - ich habe einfach noch keinen fairen Vergleich mit anderen Methoden gesehen (Kaggle ist kein fairer Vergleich, da es an Konfidenzintervallen für Genauigkeiten mangelt - besonders wenn die Ergebnisse aller Teams mit hoher Punktzahl so nah beieinander liegen wie im Merck-Wettbewerb), auch keine Analyse der Robustheit der Parameteroptimierung - was viel schlimmer ist.

Antworten:


27

Ich dachte, ich würde hier einen in sich geschlossenen Beitrag für jeden beantworten, der interessiert ist. Hierfür wird die hier beschriebene Notation verwendet .

Einführung

Die Idee hinter Backpropagation ist es, eine Reihe von "Trainingsbeispielen" zu haben, mit denen wir unser Netzwerk trainieren. Jeder von diesen hat eine bekannte Antwort, so dass wir sie in das neuronale Netzwerk einstecken und herausfinden können, wie sehr es falsch war.

Bei der Handschrifterkennung würden Sie beispielsweise viele handgeschriebene Zeichen neben den tatsächlichen Zeichen haben. Dann kann das neuronale Netzwerk durch Backpropagation trainiert werden, um zu "lernen", wie jedes Symbol erkannt wird, und wenn es später mit einem unbekannten handgeschriebenen Zeichen versehen wird, kann es identifizieren, was es richtig ist.

Insbesondere geben wir einige Trainingsbeispiele in das neuronale Netzwerk ein, sehen, wie gut es war, und "rinnen" dann rückwärts, um herauszufinden, wie viel wir die Gewichte und die Vorspannung jedes Knotens ändern können, um ein besseres Ergebnis zu erzielen, und passen sie dann entsprechend an. Dabei "lernt" das Netzwerk.

Es gibt auch andere Schritte, die in den Trainingsprozess einbezogen werden können (z. B. Abbruch), aber ich werde mich hauptsächlich auf die Rückübertragung konzentrieren, da es darum ging, worum es in dieser Frage ging.

Teilweise Ableitungen

Eine partielle Ableitung ist eine Ableitung vonfin Bezug auf eine Variablex.fxfx

Zum Beispiel, wenn , ff(x,y)=x2+y2, weily2einfach eine Konstante in Bezug aufx ist. Ebenso istffx=2xy2x, weilx2einfach eine Konstante in Bezug aufy ist.fy=2yx2y

Ein mit bezeichneter Gradient einer Funktion ist eine Funktion, die die partielle Ableitung für jede Variable in f enthält. Speziell:f

,

f(v1,v2,...,vn)=fv1e1++fvnen

wobei ein Einheitsvektor ist, der in die Richtung der Variablen v 1 zeigt .eiv1

Nun, wenn wir die berechnete haben für eine Funktion f , wenn wir in der Position sind ( v 1 , v 2 , . . . , V n ) , können wir "nach unten rutschen" f durch in Richtung gehen - f ( v 1 , v 2 , . . . , v n ) .ff(v1,v2,...,vn)ff(v1,v2,...,vn)

In unserem Beispiel von sind die Einheitsvektoren e 1 = ( 1 , 0 ) und e 2 = ( 0 , 1 ) , weil v 1 = x und v 2 = y , und diese Vektoren zeigen in die Richtung der x- und y- Achse. Also ist f ( x , yf(x,y)=x2+y2e1=(1,0)e2=(0,1)v1=xv2=yxy .f(x,y)=2x(1,0)+2y(0,1)

Um nun unsere Funktion "herunterzuschieben" , nehmen wir an, wir befinden uns an einem Punkt ( - 2 , 4 ) . Dann müssten wir in Richtung bewegen , - f ( - 2 , - 4 ) = - ( 2 - 2 ( 1 , 0 ) + 2 4 ( 0 , 1 ) ) = - ( ( - 4 , 0 ) +f(2,4) .f(2,4)=(22(1,0)+24(0,1))=((4,0)+(0,8))=(4,8)

Die Größe dieses Vektors gibt an, wie steil der Hügel ist (höhere Werte bedeuten, dass der Hügel steiler ist). In diesem Fall haben wir .42+(8)28.944

Gradient Descent

Hadamard-Produkt

Das Hadamard-Produkt zweier Matrizen , ist wie die Matrixaddition, außer dass wir die Matrizen nicht elementweise addieren, sondern sie elementweise multiplizieren.A,BRn×m

Formal ist dabei Matrixaddition , wobei C R n × m ist, so dassA+B=CCRn×m

,

Cji=Aji+Bji

Das Hadamard-Produkt , wobei C R n × m ist, so dassAB=CCRn×m

Cji=AjiBji

Berechnung der Farbverläufe

(Der größte Teil dieses Abschnitts stammt aus Neilsens Buch ).

Wir haben eine Reihe von Trainingsmustern , wobei S r ein einzelnes Eingabe-Trainingsmuster ist und E r der erwartete Ausgabewert dieses Trainingsmusters ist. Wir haben auch unser neuronales Netzwerk, das aus den Verzerrungen W und den Gewichten B besteht . r wird verwendet, um Verwechslungen mit i , j und k zu vermeiden , die bei der Definition eines Feedforward-Netzwerks verwendet werden.(S,E)SrErWBrijk

Als nächstes definieren wir eine Kostenfunktion , die in unserem neuronalen Netz und ein einziges Trainingsbeispiel nimmt und gibt , wie gut es tat.C(W,B,Sr,Er)

Normalerweise werden quadratische Kosten verwendet, die durch definiert werden

C(W,B,Sr,Er)=0.5j(ajLEjr)2

wobei ist der Ausgang unseres neuronales Netz, gegebenen Eingangsabtastwert S raLSr

Dann wollen wir undCCwji für jeden Knoten in unserem neuronalen Feedforward-Netzwerk.Cbji

Wir können diesen den Gradienten nennen an jedem Neuron , weil wir als S r und E r als Konstanten, da wir sie nicht ändern können , wenn wir versuchen zu lernen. Und das ist sinnvoll - wir möchten uns in eine Richtung relativ zu W und B bewegen , die die Kosten minimiert, und eine Bewegung in die negative Richtung des Gradienten in Bezug auf W und B wird dies tun.CSrErWBWB

Dazu definieren wir als Fehler des Neuronsjin Schichti.δji=Czjiji

Wir beginnen mit der Berechnung durch Aufstecken S r in unser neuronales Netz.aLSr

Dann berechnen wir den Fehler unserer Ausgangsschicht überδL

.

δjL=CajLσ(zjL)

Welches kann auch als geschrieben werden

.

δL=aCσ(zL)

Als nächstes finden wir den Fehler in Bezug auf den Fehler in der nächsten Schicht & dgr; i + 1 überδiδi+1

δi=((Wi+1)Tδi+1)σ(zi)

Da wir nun den Fehler jedes Knotens in unserem neuronalen Netzwerk haben, ist die Berechnung des Gradienten in Bezug auf unsere Gewichte und Vorspannungen einfach:

Cwjki=δjiaki1=δi(ai1)T

Cbji=δji

Beachten Sie, dass die Gleichung für den Fehler der Ausgabeebene die einzige Gleichung ist, die von der Kostenfunktion abhängt, sodass die letzten drei Gleichungen unabhängig von der Kostenfunktion identisch sind.

Als Beispiel erhalten wir mit quadratischen Kosten

δL=(aLEr)σ(zL)

L1th

δL1=((WL)TδL)σ(zL1)
=((WL)T((aLEr)σ(zL)))σ(zL1)

which we can repeat this process to find the error of any layer with respect to C, which then allows us to compute the gradient of any node's weights and bias with respect to C.

I could write up an explanation and proof of these equations if desired, though one can also find proofs of them here. I'd encourage anyone that is reading this to prove these themselves though, beginning with the definition δji=Czji and applying the chain rule liberally.

For some more examples, I made a list of some cost functions alongside their gradients here.

Gradient Descent

Now that we have these gradients, we need to use them learn. In the previous section, we found how to move to "slide down" the curve with respect to some point. In this case, because it's a gradient of some node with respect to weights and a bias of that node, our "coordinate" is the current weights and bias of that node. Since we've already found the gradients with respect to those coordinates, those values are already how much we need to change.

We don't want to slide down the slope at a very fast speed, otherwise we risk sliding past the minimum. To prevent this, we want some "step size" η.

Then, find the how much we should modify each weight and bias by, because we have already computed the gradient with respect to the current we have

Δwjki=ηCwjki

Δbji=ηCbji

Thus, our new weights and biases are

wjki=wjki+Δwjki
bji=bji+Δbji

Using this process on a neural network with only an input layer and an output layer is called the Delta Rule.

Stochastic Gradient Descent

Now that we know how to perform backpropagation for a single sample, we need some way of using this process to "learn" our entire training set.

One option is simply performing backpropagation for each sample in our training data, one at a time. This is pretty inefficient though.

A better approach is Stochastic Gradient Descent. Instead of performing backpropagation for each sample, we pick a small random sample (called a batch) of our training set, then perform backpropagation for each sample in that batch. The hope is that by doing this, we capture the "intent" of the data set, without having to compute the gradient of every sample.

For example, if we had 1000 samples, we could pick a batch of size 50, then run backpropagation for each sample in this batch. The hope is that we were given a large enough training set that it represents the distribution of the actual data we are trying to learn well enough that picking a small random sample is sufficient to capture this information.

However, doing backpropagation for each training example in our mini-batch isn't ideal, because we can end up "wiggling around" where training samples modify weights and biases in such a way that they cancel each other out and prevent them from getting to the minimum we are trying to get to.

To prevent this, we want to go to the "average minimum," because the hope is that, on average, the samples' gradients are pointing down the slope. So, after choosing our batch randomly, we create a mini-batch which is a small random sample of our batch. Then, given a mini-batch with n training samples, and only update the weights and biases after averaging the gradients of each sample in the mini-batch.

Formally, we do

Δwjki=1nrΔwjkri

and

Δbji=1nrΔbjri

where Δwjkri is the computed change in weight for sample r, and Δbjri is the computed change in bias for sample r.

Then, like before, we can update the weights and biases via:

wjki=wjki+Δwjki
bji=bji+Δbji

This gives us some flexibility in how we want to perform gradient descent. If we have a function we are trying to learn with lots of local minima, this "wiggling around" behavior is actually desirable, because it means that we're much less likely to get "stuck" in one local minima, and more likely to "jump out" of one local minima and hopefully fall in another that is closer to the global minima. Thus we want small mini-batches.

On the other hand, if we know that there are very few local minima, and generally gradient descent goes towards the global minima, we want larger mini-batches, because this "wiggling around" behavior will prevent us from going down the slope as fast as we would like. See here.

One option is to pick the largest mini-batch possible, considering the entire batch as one mini-batch. This is called Batch Gradient Descent, since we are simply averaging the gradients of the batch. This is almost never used in practice, however, because it is very inefficient.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.