Pytorch, was sind die Argumente Farbverlauf
Ich bin beim Lesen durch die Dokumentation von PyTorch und fand ein Beispiel, wo Sie schreiben,
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
wo x war, einen ersten Variablen, von denen y konstruiert wurde (ein 3-Vektor). Die Frage ist, was sind die 0.1, 1.0 und 0.0001 Argumente der Gradienten-tensor ? Die Dokumentation ist nicht sehr klar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erklärung
Für neuronale Netze, verwenden wir normalerweise
loss
zu beurteilen, wie gut das Netz gelernt hat, zu klassifizieren, das input-Bild (oder andere Aufgaben). Dieloss
Begriff ist in der Regel eine skalaren Wert. Um die änderung der Parameter von dem Netzwerk, wir berechnen den Gradienten derloss
w.r.t, um die Parameter, die tatsächlichleaf node
in der computation-graph (by the way, sind diese Parameter meist das Gewicht und die Ausrichtung der verschiedenen Schichten wie Faltung, Lineare und so weiter).Laut Kettenregel, zur Berechnung der Gradienten der
loss
w.r.t zu einem Blatt-Knoten, lässt sich berechnen, Ableitung vonloss
w.r.t einige temporäre Variablen und Gradienten der Zwischengröße w.r.t-leaf-variable, machen Sie eine dot-Produkt und die Summe aller dieser bis.Den
gradient
Argumente einesVariable
'sbackward()
Methode wird verwendet, um berechnen einer gewichteten Summe der einzelnen Elemente einer Variablen w.r.t die Blatt-Variable. Diese Gewicht ist nur das Derivat der Letzteloss
w.r.t jedes element der Zwischengröße.Ein konkretes Beispiel
Nehmen wir ein konkretes und einfaches Beispiel zu verstehen.
Im obigen Beispiel wird das Ergebnis der ersten
print
istdas ist genau die Ableitung von z_1 w.r.t x.
Das Ergebnis der zweiten
print
ist :was ist die Ableitung von z_2 w.r.t x.
Nun, wenn verwenden Sie ein Gewicht, von [1, 1, 1, 1] berechnen Sie die Ableitung von z w.r.t auf x, das Ergebnis ist
1*dz_1/dx + 1*dz_2/dx + 1*dz_3/dx + 1*dz_4/dx
. Also nicht überraschend, dass die Ausgabe der 3.print
ist:Es sollte angemerkt werden, dass das Gewicht den Vektor [1, 1, 1, 1] ist genau das, Derivat von
loss
w.r.t z_1, z_2, z_3 und z_4. Die Ableitung vonloss
w.r.tx
wird wie folgt berechnet:Also die Ausgabe des 4.
print
ist der gleiche wie der 3.print
:gradient
argument besser. Danke für deine Antwort.[1, 1, 1, 1]
ist genau das, Derivat vonloss
w.r.tz_1
,z_2
,z_3
undz_4
." ich denke, diese Aussage ist wirklich der Schlüssel zu der Antwort. Bei der Betrachtung der OP-code ein großes Fragezeichen ist, wo diese beliebige (Magische) zahlen für die Steigung kommen. In Ihrem konkreten Beispiel, das ich denke, es wäre sehr hilfreich, um das Verhältnis zwischen z.B.[1, 0, 0 0]
tensor und dieloss
Funktion rechts Weg, so kann man sehen, dass die Werte nicht willkürlich in diesem Beispiel.loss
w.r.tz_1, z_2, z_3, z_4
ist[2,2,2,2]
. Und der Farbverlauf argument derbackward()
ist das Gewicht, das wird multiplizieren, um die Ableitung. Das ist, warum[2,2,2,2] * [1,1,1,1] = [2,2,2,2]
(das tensor-element-Weise Multiplikation).loss = z.sum(dim=1)
werde esloss = z_1 + z_2 + z_3 + z_4
. Wenn Sie wissen einfach das Kalkül, werden Sie wissen, dass die Ableitung vonloss
w.r.tz_1, z_2, z_3, z_4
ist[1, 1, 1, 1]
.In der Regel computational graph einer skalaren Ausgabe sagt
loss
. Dann können Sie berechnen die Gradienten vonloss
w.r.t. die GEWICHTE (w
) vonloss.backward()
. Wo das Standard-argument vonbackward()
ist1.0
.Wenn Ihr Ausgang hat mehrere Werte (z.B.
loss=[loss1, loss2, loss3]
), können Sie berechnen den Gradienten der Verlust w.r.t. die GEWICHTE vonloss.backward(torch.FloatTensor([1.0, 1.0, 1.0]))
.Darüber hinaus, wenn Sie möchten, fügen Sie GEWICHTE oder Wichtigkeiten zu verschiedenen Verluste, die Sie verwenden können
loss.backward(torch.FloatTensor([-0.1, 1.0, 0.0001]))
.Dies bedeutet, dass zur Berechnung
-0.1*d(loss1)/dw, d(loss2)/dw, 0.0001*d(loss3)/dw
gleichzeitig.grad_tensors
wird nicht Wiegen Sie unterschiedlich, aber Sie sind Farbverläufe w.r.t. jedes element der entsprechenden Tensoren.Hier wird die Ausgabe des vorwärts - (), d.h. y ist ein 3-Vektor.
Die drei Werte sind die Verläufe am Ausgang des Netzes. Sie sind in der Regel auf 1.0 gesetzt, wenn y ist die Letzte Ausgabe, können aber auch andere Werte, vor allem, wenn y ist Teil eines größeren Netzwerks.
ZB. wenn x die Eingabe, y = [y1, y2, y3] ist eine intermediate-Ausgang, die verwendet wird zum berechnen der endgültigen Ausgabe z,
Dann,
So, hier die drei Werte sind rückwärts
und dann rückwärts() berechnet dz/dx