[PYTHON] Ich habe versucht, vier Optimierungsmethoden für neuronale Netze zusammenzufassen

Was ist das für ein Artikel?

――Ich möchte die vier Optimierungsmethoden für neuronale Netze zusammenfassen, die ich kürzlich durch das Lesen des Buches "Neuronale Netze von Grund auf neu" gelernt habe. ――Basisch basiert es auf einem Buch, aber ** Wie können Sie es sich vorstellen? Dies ist ein Artikel, der meine persönliche Interpretation mit Schwerpunkt auf ** zusammenfasst. Daher enthält es keine genauen Formeln oder Anwendungen. ――Wenn Sie im Internet suchen, finden Sie detailliertere Erklärungen als in diesem Artikel. Andererseits gibt es einige Artikel, die fast dieselben Erklärungen wie Bücher in Qiita zusammenfassen. Daher ist es sinnvoll, Ihre eigene Interpretation zusammenzufassen. Ich dachte, es gäbe ein wenig, also kam ich, um einen Artikel zu schreiben ――Ich bin ziemlich voreingenommen gegenüber der Erklärung der Methode namens Momentum, aber bitte vergib mir. .. ――Ich bin ein Anfänger und Anfänger in Bezug auf neuronale Netze, daher würde ich mich freuen, wenn Sie Fehler oder Ratschläge kommentieren könnten.

Neuronales Netz von Grund auf neu gemacht

"Neuronales Netz" und "tiefes Lernen", dass selbst normale Menschen, die nicht auf maschinelles Lernen spezialisiert sind, nur noch ihre Namen kennen. Es gehört zum maschinellen Lernen und wird häufig zur Bilderkennung usw. verwendet (wie bei der Google-Bildsuche). Das wahrscheinlich meistgelesene Buch in Japan beim Studium dieses neuronalen Netzwerks ist "** Deep Learning from Grund **". Da es gut gelesen wird, denke ich, dass es ein sehr gutes Einführungsbuch ist. (Was ist es?)

"Lernen" beim maschinellen Lernen

Der Zweck des maschinellen Lernens besteht nicht nur in neuronalen Netzen, sondern darin, auf der Grundlage von Trainingsdaten (Lehrerdaten) zu lernen und unbekannte Daten vorherzusagen. In Bezug auf die Bilderkennung wird beispielsweise eine große Anzahl von Katzenbildern gelernt, und wenn ein neues Bild angezeigt wird, lautet die Antwort "ob dieses Bild oder eine Katze?". Beim normalen maschinellen Lernen gibt es eine Einschränkung, dass "Merkmale zum Lernen angegeben werden müssen", aber beim tiefen Lernen besteht der Vorteil, dass Merkmale aus Bildern ohne Erlaubnis während des Lernens gefunden werden können.

Was ist Optimierung?

Was genau ist Lernen? Mit anderen Worten ist es die Aufgabe, den optimalen Gewichtsparameter zu finden. Sobald die optimalen Parameter gefunden sind, kann die richtige Antwort aus unbekannten Daten vorhergesagt werden. Dies nennt man ** optimieren **. Definieren Sie zur Optimierung eine Funktion, die als Verlustfunktion (Kostenfunktion) bezeichnet wird, und suchen Sie nach dem Parameter, der sie minimiert. Der minimale quadratische Fehler und LogLoss (Schnittpunktentropiefehler) werden als Verlustfunktion verwendet. Je kleiner der Wert, desto besser die Klassifizierung (oder Regression). Wie finden Sie den kleinsten Ort für die Verlustfunktion? Nachdenken über. In diesem Buch werden die folgenden vier Optimierungsmethoden vorgestellt.

SGD Abkürzung für Gradient Stochastic Descent. Dies ist die Standardoptimierungsmethode und aktualisiert das Gewicht mit der folgenden Formel.

\boldsymbol{W} \leftarrow \boldsymbol{W} - \eta\frac{\partial{L}}{\partial{\boldsymbol{W}}}

Berechnen Sie die Steigung der Verlustfunktion und aktualisieren Sie sie so, dass die Verlustfunktion kleiner wird. Die Idee ist, dass Sie, wenn Sie den Hang hinuntergehen, schließlich den tiefsten Punkt erreichen. $ \ Eta $ heißt Lernrate, und wenn es zu klein ist, ist es schwer zu erreichen, und wenn es zu groß ist, bewegt es sich zu viel auf einmal und fliegt in eine lächerliche Richtung. Sie müssen also zuerst den entsprechenden Wert festlegen. Persönlich denke ich, dass es wie Golf ist, und wenn Sie es mit nur wenig Kraft schlagen, werden Sie das Loch nie erreichen, aber wenn Sie es zu hart schlagen, werden Sie durch das Loch gehen und in eine lächerliche Richtung gehen. Ich werde am Ende. Das ist SGD, aber es funktioniert nicht immer. Betrachten Sie beispielsweise eine Funktion wie $ f (x, y) = \ frac {1} {20} x ^ {2} + y ^ {2} $. Es sieht aus wie eine Schale, die in Richtung der x-Achse ausgestreckt ist. Das Ergebnis des Versuchs von SGD mit dieser Funktion ist wie folgt. スクリーンショット 2020-03-16 21.38.18.png

Da die Neigung in vertikaler Richtung steil ist, können Sie sehen, dass sie in Richtung des Ursprungs (dem Punkt, an dem die Verlustfunktion am kleinsten ist) geht, während sie vertikal gezackt ist. Es ist ein ziemlich ineffizienter Schritt. Es gibt drei Möglichkeiten, dies zu verbessern.

Momentum Momentum ist die Menge an Bewegung, die in der Physik auftritt. Schauen wir uns zunächst die Gewichtsaktualisierungsformel an.

 \boldsymbol{v} \leftarrow \alpha\boldsymbol{v} - \eta\frac{\partial{L}}{\partial{\boldsymbol{W}}}\\
\boldsymbol{W} \leftarrow \boldsymbol{W} +\boldsymbol{v}

Wenn Sie sich nur die Formel ansehen, kommt sie möglicherweise nicht zu Ihnen. Schauen wir uns also zunächst das Ergebnis an, das auf die vorherige Funktion angewendet wurde.

スクリーンショット 2020-03-16 21.38.29.png

Es ist eine sanfte Bewegung. Irgendwie zeichnet es eine Flugbahn wie ein Ball, der in einer Schüssel rollt, was natürlich ist. Warum läuft es reibungslos? Ich habe unten ein einfaches konzeptionelles Diagramm geschrieben.

スクリーンショット 2020-03-18 21.19.32.png Betrachten Sie ein Beispiel. Angenommen, ① repräsentiert das erste Lernen und ② repräsentiert das zweite Lernen. Angenommen, das Ergebnis der ersten Berechnung von $ \ frac {\ Partial {L}} {\ Partial {\ Boldsymbol {W}}} $ ist ein Aufwärtsvektor, wie in ① gezeigt. Angenommen, Sie bewegen sich in diese Richtung, indem Sie die Größe von $ \ eta $ multiplizieren. Erwägen Sie nun, das Gewicht von ② zu aktualisieren. Als Ergebnis der erneuten Berechnung der Differenzierung von L nehmen wir an, dass sich die Richtung der Abfahrt nach rechts anstatt nach oben geändert hat. Im Fall von SGD gehen Sie diesmal mit ② auf die gleiche Weise wie mit ① nach rechts. Infolgedessen bewegt es sich im rechten Winkel nach rechts. Dies ist die Ursache für das Rasseln von SGD, und die Unnatürlichkeit befindet sich im Orbit. Lassen Sie uns hier die Momentum-Formel überprüfen. Die Aktualisierungsformel enthält einen Abschnitt $ \ alpha \ {v} $. Dies entspricht $ \ frac {\ partiell {L}} {\ partiell {\ boldsymbol {W}}} $ zum Zeitpunkt von ①. Nehmen wir zur Vereinfachung $ \ alpha = 1 $ an. Dann können Sie sehen, dass der Teil $ \ alpha \ boldsymbol {v} - \ eta \ frac {\ Partial {L}} {\ Partial {\ Boldsymbol {W}}} $ die Summe der Vektoren ① und ② ist. Ich werde. Dann geht die Richtung von ② in einem Winkel von 45 Grad nach rechts statt nach rechts. Auf diese Weise ** wird die Bewegung glatt, indem die Neigung der vorherigen Gewichtsaktualisierung in der nächsten Gewichtsaktualisierung berücksichtigt wird. ** **. α ist ein Parameter dafür, wie stark die Neigung zum Zeitpunkt der letzten Aktualisierung beeinflusst wird. Wenn α 0 ist, wird die Neigung zum Zeitpunkt der vorherigen Gewichtsaktualisierung überhaupt nicht wiedergegeben, sodass sie der SGD in die richtige Richtung entspricht.

Als nächstes überlegen Sie, warum diese Technik als Momentum bezeichnet wird. In der Physik (Newtonsche Mechanik) ist der Impuls das Produkt aus Masse (m) und Geschwindigkeitsvektor ($ \ boldsymbol {v} ). Der folgende relationale Ausdruck, der die Beziehung zwischen Impuls und Kraftprodukt ( F \ Delta {t} $) darstellt, gilt.

 m\boldsymbol{v_{before}}+F\Delta{t} = m\boldsymbol{v_{after}}

Lassen Sie uns auch darüber nachdenken

スクリーンショット 2020-03-18 21.42.43.png

Es zeigt, wie sich die Bewegung eines Objekts, das sich mit einem Impuls von $ m \ boldsymbol {v_ {before}} $ nach oben bewegt, ändert, wenn rechts ein Kraftprodukt angewendet wird. Wenn die Größe des Kraftprodukts mit dem anfänglichen Impuls übereinstimmt, wird das Objekt in einem Winkel von 45 Grad nach rechts oben gedreht, und wenn die Größe des Kraftprodukts größer ist, wird das Objekt nach rechts gedreht. Sie können sehen, dass dies dem obigen konzeptionellen Diagramm sehr ähnlich ist. Die von Momentum gezeichnete Flugbahn wurde früher als ** wie ein in einer Schüssel rollender Ball ** beschrieben, aber da sie eine Formel hat, die dem physikalischen Gesetz der tatsächlichen Dynamik ähnlich ist, ist eine solche Flugbahn Sie können sehen, dass Das Bild ist ** Selbst wenn plötzlich eine Kraft auf die rechte Seite ausgeübt wird, wo Sie sich nach oben bewegen, können Sie sich nicht plötzlich im rechten Winkel drehen! Fühlt es sich so an, als hätten Sie ** auf das Gewichtsupdate angewendet?

AdaGrad Die Erklärung von Momentum ist sehr lang geworden, aber ich möchte die verbleibenden Methoden kurz erläutern. Als ich SGD erklärte, verglich ich das Gewichtsupdate mit Golf. SGD-Updates mit der gleichen Lernrate für jedes Lernen. Mit anderen Worten, beim Golf schlagen Sie den Ball jedes Mal mit der gleichen Stärke. Beim Golf haben Sie jedoch den ersten Schlag hart getroffen, um die Flugstrecke zu verlängern, und wenn sich das Loch nähert, haben Sie ihn schwächer getroffen und fein abgestimmt, oder? Gleiches kann auf neuronale Netze angewendet werden. Mit anderen Worten, das Gewicht wird zum Zeitpunkt des ersten Lernens stark aktualisiert, und die zu aktualisierende Größe wird allmählich verringert. Diese Technik heißt AdaGrad. Schauen wir uns die folgende Formel an.

 \boldsymbol{h} \leftarrow \boldsymbol{h} + \left(\frac{\partial{L}}{\partial{\boldsymbol{W}}}\right)^{2}\\
\boldsymbol{W} \leftarrow \boldsymbol{W} -\frac{1}{\sqrt{\boldsymbol{h}}}\eta\frac{\partial{L}}{\partial{\boldsymbol{W}}}

Sie teilen es durch $ \ sqrt {\ boldsymbol {h}} $ in der folgenden Formel. Dies bedeutet, dass jedes Mal, wenn Sie das Gewicht aktualisieren, die Größe des Updates abnimmt. In der obigen Formel bedeutet $ \ left (\ frac {\ partielle {L}} {\ partielle {\ boldsymbol {W}}} \ right) ^ {2} $ das Quadrat aller Elemente der Matrix. .. (Da es kein inneres Produkt ist, wird es kein Skalar) Mit anderen Worten, je steiler die Steigung ist, desto größer ist das aktualisierte Gewicht und desto kleiner ist es. Das macht sehr viel Sinn. Das Folgende ist die tatsächliche Anwendung auf die vorherige Funktion.

スクリーンショット 2020-03-16 21.38.41.png

Dieses Beispiel scheint sehr gut zu funktionieren.

Adam Abschließend möchte ich Adam vorstellen. Adam ist einfach eine Menge Momentum und Ada Grad. Ich werde hier nicht ins Detail gehen, einschließlich der Formeln. Wie üblich wird bei Anwendung auf eine Funktion die folgende Abbildung erhalten.

スクリーンショット 2020-03-16 21.38.50.png Dies ist auch ein gutes Gefühl im Vergleich zu SGD, und Sie können den Mindestwert erreichen.

Zusammenfassung

Bemerkungen

Recommended Posts

Ich habe versucht, vier Optimierungsmethoden für neuronale Netze zusammenzufassen
Ich habe versucht, SparseMatrix zusammenzufassen
Ich habe versucht, Musik im Neural Network in Dur / Moll zu klassifizieren
Ich habe versucht, den Befehl umask zusammenzufassen
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, Ansibles Module-Linux-Edition zusammenzufassen
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht zu debuggen.
Ich habe die Bayes'sche Optimierung ausprobiert!
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
Ich habe versucht, die Bayes'sche Optimierung zu durchlaufen. (Mit Beispielen)
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, PCANet zu implementieren
Einführung in die nichtlineare Optimierung (I)
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
[Erste COTOHA-API] Ich habe versucht, die alte Geschichte zusammenzufassen
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, SQLAlchemy kurz zusammenzufassen (es gibt auch TIPPS)
Ich habe versucht zusammenzufassen, wie das EPEL-Repository erneut verwendet wird
Ich habe versucht, das Musikgenre anhand des Songtitels im Recurrent Neural Network vorherzusagen
Ich habe versucht, Deep VQE zu implementieren
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, Python zu berühren (Installation)
Ich habe mein eigenes neuronales 3-Layer-Forward-Propagation-Netzwerk erstellt und versucht, die Berechnung genau zu verstehen.
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe Watson Voice Authentication (Speech to Text) ausprobiert.
Ich habe versucht, ein zweischichtiges neuronales Netzwerk zu implementieren
Ich habe versucht zusammenzufassen, was mit Qiita mit Word Cloud ausgegeben wurde
Ich habe Teslas API berührt
Ich habe versucht, die Befehle zusammenzufassen, die Anfängeringenieure heute verwenden
Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
Ich habe versucht, mich über MCMC zu organisieren.
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, Realness GAN zu implementieren
Ich habe versucht, den Ball zu bewegen
[Satzklassifikation] Ich habe verschiedene Pooling-Methoden von Convolutional Neural Networks ausprobiert
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, die Methoden zusammenzufassen, die häufig bei der grundlegenden Algo-Implementierung in Quantx Factory verwendet werden
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (zweite Hälfte).
[Python] Ich habe versucht, den kollektiven Typ (Satz) auf leicht verständliche Weise zusammenzufassen.
Ich versuchte zusammenzufassen, bis ich die Bank verließ und Ingenieur wurde
Ich habe versucht, den allgemeinen Ablauf bis zur Erstellung von Diensten selbst zusammenzufassen.
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe versucht, die logische Denkweise über Objektorientierung zusammenzufassen.