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. Implementiert ohne Verwendung einer Bibliothek für maschinelles Lernen.
Im vorherigen Artikel habe ich die Auswirkungen des Lernens in neuronalen Netzen, die Verlustfunktion, die zur Verbesserung der Genauigkeit des Modells erforderlich ist, und das Konzept der Differenzierung zusammengefasst. https://qiita.com/Fumio-eisan/items/c4b5b7da5b5976d09504 Dieses Mal möchte ich die zweite Hälfte der Implementierung für das neuronale Netzwerk zusammenfassen.
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.
Im vorherigen Artikel haben wir bestätigt, dass es notwendig ist, die Verlustfunktion zu minimieren, um das Modell zu optimieren. Wir haben auch gezeigt, dass die Differenzierung von Funktionen das Mittel ist, um sie zu minimieren. Lassen Sie uns nun über die Optimierung der Parameter des Modells nachdenken, indem wir tatsächlich die Differenzierung dieser Funktion verwenden.
Durch Differenzieren einer Funktion können Sie die Richtung ermitteln, in die der Wert dieser Funktion abnimmt. Das Gradientenverfahren rückt einen bestimmten Abstand in der Gradientenrichtung vom aktuellen Ort vor. Und es bedeutet, den gleichen Gradienten am Ziel zu finden und in Richtung des Gradienten vorzugehen. ** Das Erreichen des Minimalwerts wird als Gradientenabstiegsmethode und das Erreichen des Maximalwerts als Gradientenanstiegsmethode bezeichnet. ** ** **
Das Obige ist ein mathematischer Ausdruck der Gradientenmethode. η stellt die Anzahl der Aktualisierungen dar und wird als ** Lernrate ** bezeichnet. Zeigt an, wie viele Parameter in einem Lernprogramm aktualisiert werden. Wenn diese Lernrate zu gering ist, dauert es einige Zeit, bis der Mindestwert erreicht ist. Im Gegenteil, wenn die Lernrate groß ist, kann der Mindestwert überschritten werden. Daher müssen Sie für jedes Modell den richtigen Wert finden. Ich werde es tatsächlich implementieren. Die Funktion ist die in der ersten Hälfte verwendete.
Ich möchte den Mindestwert dieser Funktion finden.
nn.ipynb
def gradient_descent(f,init_x, lr=0.01, step_num=100):
x = init_x
for i in range(step_num):
grad = numerical_gradient(f,x)
x -= lr*grad
return x
def function_2(x):
return x[0]**2+x[1]**2
Lassen Sie nun den Anfangswert (x0, x1) = (-3,4) sein und verwenden Sie die Gradientenmethode, um den Minimalwert zu finden. Der wahre Mindestwert wird genommen, wenn (0,0).
nn.ipynb
init_x = np.array([-3.0,4.0])
gradient_descent(function_2, init_x = init_x, lr =0.1, step_num=100)
array([-6.11110793e-10, 8.14814391e-10])
Wenn die Lernrate lr 0,1 beträgt, wird das obige Ergebnis erhalten und es wird gefunden, dass der Wert fast (0,0) ist. In diesem Fall kann gesagt werden, dass das Lernen erfolgreich war.
nn.ipynb
init_x = np.array([-3.0,4.0])
gradient_descent(function_2, init_x = init_x, lr =10, step_num=100)
array([-2.58983747e+13, -1.29524862e+12])
Als nächstes ist hier der Fall, in dem die Lernrate auf 10 eingestellt ist. Der Wert ist abgewichen. Sie können sehen, dass dies keine gute Lernerfahrung ist. Diese Studie zeigt, dass für jedes Modell die optimale Lernrate festgelegt werden muss.
Wenden Sie die Methode zum Ermitteln des Gradienten auf ein neuronales Netzwerk an. Im neuronalen Netzwerk wird es auf den Gradienten der Verlustfunktion angewendet. Sei L die Verlustfunktion und nimm eine Struktur, die sich teilweise vom Gewicht w unterscheidet.
Ich möchte ein neuronales Netzwerk implementieren, das das folgende Verfahren ausführt.
Mini-Charge Einige Daten werden zufällig aus den Trainingsdaten extrahiert (Mini-Batch). Der Zweck besteht darin, die Verlustfunktion in dieser Mini-Charge zu minimieren.
Gradientenberechnung Ermitteln Sie den Gradienten des Gewichtsparameters, um die Verlustfunktion der Mini-Charge zu verringern.
Parameteraktualisierung Aktualisiert den Gewichtsparameter in negativer Gradientenrichtung um einen kleinen Betrag.
Wiederholen Wiederholen Sie die Schritte 1 bis 3 so oft Sie möchten.
Jetzt möchte ich ein zweischichtiges neuronales Netzwerk implementieren, das tatsächlich eine Lernfunktion hat. Das Komponentendiagramm des diesmal implementierten Modells ist wie folgt.
Bei der Einstellung der Parameter wird hauptsächlich von nn.ipynb entschieden. Da wir diesmal den MNIST-Datensatz verwenden, wird er auch von der ursprünglichen URL von Herrn Yann et al. Die vom tatsächlichen neuronalen Netzwerk durchgeführte Berechnung wird auf two_layer_net.py beschrieben. Das Netzwerk ist wie in der folgenden Abbildung dargestellt.
Da es sich bei MNIST ursprünglich um 28 × 28-Pixel-Bilddaten handelt, tritt ein 28 × 28 = 784-dimensionaler numerischer Wert in die erste Eingabeschicht ein. Dieses Mal ist die verborgene Ebene auf 100 und die endgültige Ausgabeebene auf 10 Dimensionen festgelegt, um sie als 10 Arten von Zahlen auszuspucken. Bei der Durchführung dieser Berechnung werden die Sigmoidfunktion, bei der es sich um die Aktivierungsfunktion handelt, und die Softmax-Funktion, bei der die endgültige Wahrscheinlichkeit ermittelt wird, durch Lesen der in einer weiteren Funktion.py beschriebenen Funktionen berechnet. Setzen Sie den dort erhaltenen Ausgabewert und den korrekten Index der Lehrerdaten in die Verlustfunktion ein. Berechnen Sie dann mit der in gradient.py beschriebenen Methode numerisch_Garadient, um den Gradienten des Gewichtsparameters zu ermitteln. Um den erhaltenen Gradienten auf den nächsten Gewichtungsparameter zu aktualisieren, wird beschrieben, dass der ursprüngliche nn.ipynb aktualisiert wird. Die Reihe von Operationen wird so oft wiederholt.
Selbst wenn Sie nur ein zweischichtiges neuronales Netzwerk berechnen und trainieren, müssen Sie so viele Methoden lesen und berechnen. Sie können sehen, dass es nicht die Menge ist, die von Menschen getan werden kann. Sie werden auch feststellen, dass Sie die Struktur des Programms einschließlich der Klassen und Methoden verstehen müssen.
Schauen wir uns nun die aktualisierten Teile der Gewichtsparameter und der Abweichung an.
nn.ipynb
#Aktualisieren Sie die Gewichtsparameter und die Vorspannung
for key in ('W1', 'b1', 'W2', 'b2'):
network.params[key] -= learning_rate * grad[key] #Der Punkt ist, dass dieses Vorzeichen negativ ist
loss = network.loss(x_batch, t_batch)
train_loss_list.append(loss)
Der Punkt ist, ** den Wert zu subtrahieren, der durch Multiplizieren des Gewichtsparameters und der Vorspannung W1, W2, b1 und b2 mit dem Gradienten (grad [Taste]) bzw. der Lernrate erhalten wird. Wenn der durch Differenzierung erhaltene Gradient ein positiver Wert ist, bedeutet eine Bewegung in die negative Richtung, dass er vom Minimalwert subtrahiert wird. Was passiert, wenn Sie versuchen, dieses Vorzeichen umzukehren und positiv zu machen?
Die horizontale Achse ist die Anzahl der Berechnungen und die vertikale Achse ist der Wert der Verlustfunktion. Sie sehen sofort, dass der Wert gestiegen ist. Wenn Sie das Zeichen als Minus schreiben, wird es so sein.
Sie können sehen, dass der Wert richtig sinkt. Jetzt können Sie ein zweischichtiges neuronales Netzwerk aufbauen, ohne die vorhandene Bibliothek für maschinelles Lernen zu verwenden.
Dieses Mal haben wir die Berechnung und das Lernen des neuronalen Netzwerks ohne Verwendung der Bibliothek für maschinelles Lernen modelliert. Beim Erlernen des Modells habe ich verstanden, dass die Idee der Verlustfunktion und der Gradient (= Differenzierung der Funktion) die Punkte sind. Ich musste auch Klassen und Module kombinieren, um Berechnungen durchzuführen, was für Python selbst eine Lernerfahrung war.
Das vollständige Programm ist hier gespeichert. https://github.com/Fumio-eisan/nn2layer_20200321
Recommended Posts