Der Zweck hier ist, zu interpretieren, was ich nicht verstehen konnte, indem ich ein Buch las, während ich Deep Learning studierte, und mich reibungslos daran zu erinnern, wenn ich später darauf zurückblicke. Ich werde den Inhalt des Codes so sorgfältig wie möglich erklären und hoffe, dass er hilfreich ist.
Um die Leistung beim Lernen eines neuronalen Netzwerks zu verbessern, ist es notwendig, sich dem optimalen Gewichtsparameter zu nähern. Verwenden Sie diese Verlustfunktion als Hinweis auf Ihre Suche. Zunächst einmal, was von der Verlustfunktion ausgegeben wird 0.6094374124342252 0.4750000000000001 Es ist ein numerischer Wert wie. Dieser Wert ist klein, wenn die Leistung gut ist, und groß, wenn die Leistung schlecht ist. In diesem Beispiel ist der folgende Wert kleiner, sodass gesagt werden kann, dass die Leistung höher ist. Der Wert der Ausgabe der Verlustfunktion wird als Hinweis verwendet, um auf die Richtung und Größe der Aktualisierung des Gewichtsparameters Bezug zu nehmen.
Es gibt verschiedene Verlustfunktionen, aber hier erklären wir die Summe aus Quadratfehler und Kreuzentropiefehler.
Die Summe der Fehlerquadrate wird nach der folgenden Formel berechnet.
E = \frac{1}{N}\sum_{i=1}^{N}(y_i -t_i)^2
Kann vertreten werden durch. Um die Formel zu erklären, wird die Differenz zwischen den Ausgabewertdaten (y i) und den korrekten Wertdaten (t i) quadriert und durch N Stücke gemittelt. Das Quadrat soll den Fehler zu einem positiven Wert machen. Wenn Sie einen positiven Wert wünschen, nehmen Sie den absoluten Wert
E = \frac{1}{N}\sum_{i=1}^{N}|y_i -t_i|
Ist es okay das zu tun? Ich dachte, aber anscheinend ist es einfacher, bei der Berechnung des Differentials zu quadrieren. Ich verstehe! Es gibt Fälle, in denen der absolute Wert differenziert ist ... Wenn differenziert, kommt außerdem 2 vorne heraus, also addiere 1/2
E = \frac{1}{2}*\frac{1}{N}\sum_{i=1}^{N}(y_i -t_i)^2
Es scheint, dass es sein kann.
Dieses Mal definieren wir die Funktion mit N in der obigen Formel als 1 und sehen das Ergebnis. y ist das Ausgabeergebnis der Softmax-Funktion.
import numpy as np
#Richtige Antwortdaten(one-hot-label)
t = [0,0,1,0,0]
#Definieren Sie eine Funktion der Summe der Fehlerquadrate
def mean_squared_error(y,t):
return 0.5 * np.sum((y-t)**2)
#Muster 1(Nahe an korrekten Antwortdaten)
y1 = [0.01,0.02,0.9,0.05,0.02]
#Muster 2(Weit entfernt von korrekten Daten)
y2 = [0.5,0.1,0.2,0.2,0.1]
out1 = mean_squared_error(np.array(y1),np.array(t))
out2 = mean_squared_error(np.array(y2),np.array(t))
Jedes Ergebnis ist
print(out1) >>> 0.006699999999999998
print(out2) >>> 0.4750000000000001
Der Fehler war klein, wenn er nahe an den richtigen Antwortdaten lag, und groß, wenn er weit davon entfernt war.
Daher zeigt in diesem Fall die Summe der Fehlerquadrate an, dass das Ausgabeergebnis von Muster 1 für die Lehrerdaten besser geeignet ist.
Der Kreuzentropiefehler wird nach der folgenden Formel berechnet.
E = -\sum_{k}t_klog_e{y_k}
Kann vertreten werden durch.
Der Unterschied zur Summe der Fehlerquadrate besteht darin, dass die Ausgabedaten und die richtigen Antwortdaten multipliziert werden. Um zu erklären, was die Vorteile davon sind Die richtigen Antwortdaten sind ein One-Hot-Ausdruck, und nur das richtige Antwortetikett ist 1 und die anderen sind 0. Wenn also auf die obige Formel angewendet, ist der Wert von E.
** Nur die korrekte Bezeichnung -log y k </ sub> </ sub> ** Sonst 0
Weißt du, dass Infolgedessen wird der Kreuzentropiefehler durch das Ausgabeergebnis der korrekten Bezeichnung bestimmt. Wenn das Ausgabeetikett, das dem richtigen Antwortetikett entspricht, ** klein ** ist, ist der Wert von E groß, was darauf hinweist, dass der Fehler groß ist.
Wir werden die Funktion auf die gleiche Weise definieren wie für die Summe der Fehlerquadrate. Vorher werde ich das im Code definierte Delta erläutern.
Wie Sie aus dem Diagramm von y = logx sehen können, wird lim y ** negativ ∞ **, wenn x-> 0 ist. Wenn das Ausgabeetikett, das dem richtigen Antwortetikett entspricht, ** 0 ** ist, kann der Schnittpunktentropiefehler nicht numerisch ausgedrückt werden und die Berechnung kann nicht fortgesetzt werden.
Um dies zu vermeiden, wird ein Minutenwertdelta (10 -7 </ sup> im Code) eingefügt, um zu verhindern, dass der Protokollinhalt 0 wird.
import numpy as np
#Richtige Antwortdaten(one-hot-label)
t = [0,0,1,0,0]
#Definieren Sie eine Funktion des Kreuzentropiefehlers
def cross_entropy_error(y,t):
#Delta definieren(Achten Sie darauf, den Raum nicht zu öffnen!)
delta = 1e-7
return -np.sum(t * np.log(y + delta))
#Muster 1(Nahe an korrekten Antwortdaten)
y1 = [0.01,0.02,0.9,0.05,0.02]
#Muster 2(Weit entfernt von korrekten Daten)
y2 = [0.5,0.1,0.2,0.2,0.1]
out1 = cross_entropy_error(np.array(y1),np.array(t))
out2 = cross_entropy_error(np.array(y2),np.array(t))
Jedes Ergebnis ist
print(out1) >>> 0.1053604045467214
print(out2) >>> 1.6094374124342252
Wussten Sie, dass der Wert umso kleiner ist, je näher an den richtigen Antwortdaten liegt, wie im Fall der Summe der Fehlerquadrate?
[Deep Learning von Grund auf neu und Theorie des mit Python (Japanisch) erlernten Deep Learning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81] % 8B% E3% 82% 89% E4% BD% 9C% E3% 82% 8BTiefenlernen-% E2% 80% 95Python% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% A3% E3% 83% BC% E3% 83% 97% E3% 83% A9% E3% 83% BC% E3% 83% 8B% E3% 83% B3% E3% 82% B0% E3% 81% AE% E7% 90% 86% E8% AB% 96% E3% 81% A8% E5% AE% 9F% E8% A3% 85-% E6% 96% 8E% E8% 97% A4 -% E5% BA% B7% E6% AF% 85 / dp / 4873117585 / ref = sr_1_1? __Mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & crid = W6DVSLVW0BUS & dchild = 1 & keywords =% E3% 82% BC% E3% 83% AD% E3% 81% 8B% E3% 82% 89% E4% BD% 9C% E3% 82% 8Bdeep + learning & qid = 1597943190 & sprefix =% E3% 82% BC % E3% 83% AD% E3% 81% 8B% E3% 82% 89% 2Caps% 2C285 & sr = 8-1)]
Recommended Posts