Lernen ist eine Funktion im neuronalen Netzwerk (Deep Learning). Ich habe versucht, die Berechnungen im Modell, die durchgeführt werden, um den Vorhersagewert des Vorhersagemodells zu erhöhen, von Grund auf zu verstehen.
Auch diesmal bezog ich mich auf O'Reillys Lehrbuch für tiefes Lernen. Es ist sehr leicht zu verstehen. https://www.oreilly.co.jp/books/9784873117584/
Der Umriss ist wie folgt.
Das Lernen in einem Modell besteht darin, den vorhergesagten Wert näher an die richtige Antwort zu bringen oder die richtige Antwortrate zu erhöhen. Nehmen Sie als Beispiel die Bilderkennung. MNIST, ein bekanntes Nummernerkennungssystem, unterscheidet handschriftliche Nummern.
In diesem Bild kann jeder Mensch 5 sehen (das Gehirn lernt und erkennt). Als nächstes überlegen wir, was notwendig ist, um einen Algorithmus zu erstellen, mit dem der Computer diese erkennen kann 5. Um 5 aus dem "Bild" von 5 zu erkennen, ist es notwendig, eine "Merkmalsmenge" zu finden, die aus dem Bild als 5 identifiziert werden kann. Die Feature-Menge wird in englischer Sprache als Feature-Auswahl geschrieben. Wörtlich übersetzt bedeutet es "ein Merkmal wählen". Wenn Sie es durch das Bild 5 ersetzen, verfügt es über Funktionen wie "erster horizontaler Balken", "vertikale Linie" und "Bogen bei etwa 270 Grad bei geöffneter linker Seite". Der Fluss des Extrahierens dieser Merkmalsgrößen und des Lernens der extrahierten Merkmale ist der Algorithmus, der 5 vom Computer erkennen lässt. Die Funktion zum Finden (= Extrahieren) von Merkmalen wird als Konverter bezeichnet. Zu diesen bekannten Konvertern gehören SIFT, SURF und HOG. Weitere Informationen finden Sie unter der folgenden URL. Diese URL ist das Material für 2011 und scheint eine Technologie zu sein, die seit den 2000er Jahren entwickelt wurde.
https://www.slideshare.net/lawmn/siftsurf
Als nächstes kann die Merkmalsgröße verwendet werden, um die Bilddaten in einen Vektor umzuwandeln, und der Vektor kann durch eine Funktion trainiert werden, die als Diskriminator bezeichnet wird und beim maschinellen Lernen verwendet wird. Bekannte Diskriminatoren sind die Support Vector Machine (SVM) und die K Proximity Method (KNN).
Hier ist es notwendig, den Konverter entsprechend den Merkmalen entsprechend nach "Personen" zu beurteilen und auszuwählen. Andererseits umfasst der vom neuronalen Netz abgedeckte Bereich auch diesen Konverter. Mit anderen Worten, der Konverter selbst, der nach Merkmalen sucht, ist auch ein Algorithmus, der trainiert werden kann.
Das Konzept ist oben dargestellt. Durch Vergrößern des Bereichs, den der Computer beurteilt, interpretiert das neuronale Netzwerk die gegebenen Daten so wie sie sind und versucht, das Muster des Problems zu finden. Es kann verstanden werden, dass es sich um einen Algorithmus mit einem größeren Sinn für künstliche Intelligenz handelt.
Als nächstes werde ich die Idee der Unterscheidung zwischen konkret vorhergesagten Daten und korrekten Daten zusammenfassen. Wir führen eine Funktion namens Verlustfunktion ein, um anzuzeigen, ob sie der richtigen Antwort nahe kommt.
Die bekannteste Verlustfunktion ist der mittlere quadratische Fehler. Es wird durch die unten gezeigte Formel ausgedrückt.
yk gibt die Ausgabe des neuronalen Netzwerks an, tk gibt die Lehrerdaten an (korrekte Antwortdaten) und k gibt die Anzahl der Dimensionen (Anzahl) der Daten an. Aus der Formel können wir ersehen, dass dieser Wert umso kleiner ist, je korrekter die Antworten sind. Ich würde es gerne einfach in ein Programm schreiben.
nn.ipynb
import numpy as np
def mean_squared_error(y,t):
return 0.5*np.sum((y-t)**2)
t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1,0.1,0.6,0.1,0.1,0,0,0,0,0]
y1 = [0.1,0.1,0.1,0.1,0.6,0,0,0,0,0]
print(mean_squared_error(np.array(y),np.array(t)))
print(mean_squared_error(np.array(y1),np.array(t)))
0.10000000000000003
0.6000000000000001
Die Elemente dieses Arrays entsprechen den Zahlen "0", "1" und "2" in der Reihenfolge vom ersten Index. Wobei y die Ausgabe des neuronalen Netzwerks ist. Der von der Softmax-Funktion konvertierte Wert repräsentiert die Wahrscheinlichkeit. Es wird gesagt, dass die Wahrscheinlichkeit, festzustellen, dass es sich um die Zahl 2 handelt, 0,6 beträgt. Außerdem sind t die Lehrerdaten. Mit anderen Worten, die richtige Antwort ist die Nummer 2. Als die Summe der Quadratfehler für jedes von y und y1 berechnet wurde, war y näher. Es ist ersichtlich, dass der von y ausgegebene Wert richtig ausdrücken kann, dass das Element mit der Zahl 2 die höchste Wahrscheinlichkeit hat.
Eine weitere Fehlerfunktion ist der Kreuzentropiefehler.
log basiert auf natürlichem Logarithmus. Da tk das richtige Antwortetikett ist, wird 1 nur ausgegeben, wenn die Antwort korrekt ist. Daher wird diese Funktion berechnet, um den natürlichen Logarithmus auszugeben, der dem korrekten Antwortetikett von 1 entspricht. Hier ist das Ergebnis der tatsächlichen Implementierung.
nn.ipynb
def cross_entropy_error(y,t):
delta = 1e-7
return -np.sum(t*np.log(y+delta))
print(cross_entropy_error(np.array(y),np.array(t)))
print(cross_entropy_error(np.array(y1),np.array(t)))
0.510825457099338
2.302584092994546
Hier wird ein Minutenwert (0,0000001) zur Berechnung im Protokoll hinzugefügt. Dies wird hinzugefügt, um zu verhindern, dass die Berechnung hängen bleibt, da sie bei log (0) gegen minus unendlich abweicht. Wenn Sie das Ergebnis betrachten, ist die y-Ausgabe des richtigen Etiketts klein und beträgt 2,3. Wenn die y-Ausgabe jedoch hoch ist, beträgt sie 0,5.
Die Verlustfunktion kann durch Minimieren des erhaltenen Wertes in ein Modell mit hoher Vorhersagegenauigkeit umgewandelt werden. Daher ist es notwendig, einen Parameter zu finden, der die Verlustfunktion reduziert. Zu diesem Zeitpunkt wird der Parameter unter Verwendung des differenzierten Werts dieses Parameters als Hinweis aktualisiert. Durch Differenzierung können Sie den Gradienten der Funktion kennen. Die grundlegenden Inhalte der Differenzierung werden hier weggelassen.
Wenn der Wert dieses Gradienten positiv ist, bewegen Sie den Parameter (a in der Abbildung) in die negative Richtung, um sich dem Minimalwert anzunähern. Im Gegenteil, wenn der Gradientenwert negativ ist, können Sie sich vorstellen, den Parameter in die positive Richtung zu bewegen, um sich dem Minimalwert anzunähern.
Nun möchte ich über die Differenzierung von Funktionen nachdenken. Es gibt zwei Ansätze zur Unterscheidung einer Funktion: (1) analytisches Lösen und (2) diskretes Lösen (Differenz nehmen). Wenn Sie Ihre Hand bewegen und von einem Menschen ausführen, tun Sie dies in (1), aber wenn Sie es programmgesteuert lösen, ist (2) praktisch. Dieses Mal werden wir das in der folgenden Abbildung gezeigte Konzept der zentralen Differenz implementieren.
Dieses Mal möchte ich den diskret differenzierten Wert dieser Funktion finden.
nn.ipynb
import numpy as np
import matplotlib.pyplot as plt
def numerical_diff(f,x):
h =1e-4 #0.0001
return (f(x+h)-f(x-h))/(2*h)
def function_1(x):
return 0.01*x**2 + 0.1*x
numerical_diff(function_1,5)
0.1999999999990898
Die angehängte Kurve ist die ursprüngliche Funktion, und die gerade Linie ist der Gradient bei x = 5.
Als nächstes sollten Sie eine teilweise Differenzierung der unten gezeigten Funktion mit zwei Variablen in Betracht ziehen.
Wenn Sie die ursprüngliche Funktion zeichnen, handelt es sich um ein dreidimensionales Diagramm, wie unten gezeigt.
nn.ipynb
def function_2(x):
return x[0]**2 + x[1]**2
Teilweise Differenzierung bezieht sich auf die Bestimmung der zu differenzierenden Variablen und die Behandlung anderer numerischer Werte als Konstanten zur Durchführung der Differenzierung. Unterscheide x0 teilweise und finde den Wert, wenn x0 = 3, x1 = 4.
nn.ipynb
def function_tmp1(x0):
return x0*x0 +4.0**2.0
numerical_diff(function_tmp1,3.0)
6.00000000000378
Wir definieren es als eine Funktion mit nur einer Variablen und unterscheiden diese Funktion. In diesem Fall ist es jedoch erforderlich, eine Verarbeitung durchzuführen, z. B. andere Werte als die Werte zuzuweisen, die nacheinander als Variablen verwendet werden. Bedenken Sie, dass Sie x0 und x1 zusammen unterscheiden möchten. Dies kann wie folgt implementiert werden:
nn.ipynb
def numerical_gradient(f,x):
h =1e-4
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_val =x[idx]
x[idx] =tmp_val + h
fxh1 = f(x)
x[idx] = tmp_val -h
fxh2 = f(x)
grad[idx] = (fxh1-fxh2)/(2*h)
x[idx] = tmp_val
return grad
numerical_gradient(function_2,np.array([3.0,4.0]))
array([6., 8.])
Ich habe zuvor erklärt, dass dieser differenzierte Wert den Gradienten der ursprünglichen Funktion angibt. Betrachten Sie außerdem das Zeichnen dieses differenzierten Werts als Vektor. Der Einfachheit halber wird es unten mit einem Minus angezeigt.
Sie können sehen, dass der Pfeil auf (x0, x1) = (0,0) zeigt. Dies führt zu einer Verbesserung der Genauigkeit des Modells, indem der Mindestwert in der Diskussion der Verlustfunktion ermittelt wird. ** Es stellt sich heraus, dass diese Differentialoperation den Minimalwert der Verlustfunktion finden kann, was zur Modelloptimierung führt! ** ** **
Dieses Mal bin ich so weit fortgeschritten, dass ich verstehe, dass diese Differentialoperation zu einer Verbesserung der Genauigkeit des Modells führt. Durch das Betrachten der Lerninhalte, die das Herz des neuronalen Netzwerks bilden, vertiefte ich mein Verständnis. In der nächsten und zweiten Hälfte des Artikels möchte ich das Lernen sorgfältig verstehen, indem ich tatsächlich mit der Implementierung im neuronalen Netzwerk fortfahre.
Die zweite Hälfte ist da. https://qiita.com/Fumio-eisan/items/7507d8687ca651ab301d
Recommended Posts