Frage

Ich arbeite derzeit an der Implementierung stochastischer Gradientenabstiegungen, SGD, für neuronale Netze, die mit der Back-Propagation verwendet werden, und obwohl ich seinen Zweck verstehe, habe ich einige Fragen zur Auswahl von Werten für die Lernrate.

  • Ist die Lernrate mit der Form des Fehlergradienten zusammen, wie sie die Abstammungsrate diktiert?
  • Wenn ja, wie verwenden Sie diese Informationen, um Ihre Entscheidung über einen Wert zu informieren?
  • Wenn es nicht ist, welche Werte sollte ich wählen, und wie soll ich sie wählen?
  • Es scheint, als würden Sie kleine Werte möchten, um das Überschwingen zu vermeiden, aber wie wählen Sie eine aus, so dass Sie nicht in lokalen Minima stecken bleiben oder bis zum Abstieg dauern?
  • Ist es sinnvoll, eine konstante Lernrate zu haben, oder sollte ich einen Metrik verwenden, um seinen Wert zu ändern, da ich im Gradienten ein Minimum näher bin?

Kurz gesagt: Wie wähle ich die Lernrate für SGD aus?

War es hilfreich?

Lösung

  • Ist die Lernrate mit der Form des Fehlergradienten zusammen, wie sie die Abstammungsrate diktiert?

    • In einfacher SGD lautet die Antwort nein. Es wird eine globale Lernrate verwendet, die dem Fehlergradienten gleichgültig ist. Die Intuition, bei der Sie sich erhalten, hat jedoch verschiedene Modifikationen der SGD -Update -Regel inspiriert.
  • Wenn ja, wie verwenden Sie diese Informationen, um Ihre Entscheidung über einen Wert zu informieren?

    • Adagrad ist der bekannteste von diesen und skaliert eine globale Lernrate η auf jeder Dimension basierend auf der L2 -Norm der Geschichte des Fehlergradienten gt auf jeder Dimension:

      enter image description here

    • Adadelta ist ein weiterer solcher Trainingsalgorithmus, der sowohl die Fehlergradientenhistorie wie ADAGRAD als auch die Gewichts -Update -Geschichte verwendet und den Vorteil hat Ich muss überhaupt keine Lernrate festlegen.

  • Wenn es nicht ist, welche Werte sollte ich wählen, und wie soll ich sie wählen?

    • Das Festlegen der Lernraten für einfache SGD in neuronalen Netzen ist normalerweise ein Prozess, mit einem gesunden Wert wie 0,01 und dann eine Kreuzvalidierung durchzuführen, um einen optimalen Wert zu finden. Typische Werte reichen über einige Größenordnungen von 0,0001 bis 1.
  • Es scheint, als würden Sie kleine Werte möchten, um das Überschwingen zu vermeiden, aber wie wählen Sie eine aus, so dass Sie nicht in der lokalen Minima stecken bleiben oder zu lange dauern, um abzusteigen? Ist es sinnvoll, eine konstante Lernrate zu haben, oder sollte ich einen Metrik verwenden, um seinen Wert zu ändern, da ich im Gradienten ein Minimum näher bin?

    • Normalerweise ist der Wert, der am besten ist, nahezu die höchste stabile Lernrate und die Lernrate zerfällt/Glühen (entweder linear oder exponentiell) im Verlauf des Trainings. Der Grund dafür ist, dass es früh ein klares Lernsignal gibt, sodass aggressive Updates die Erkundung fördern, während die kleineren Lernraten später eine empfindlichere Ausbeutung der lokalen Fehleroberfläche ermöglichen.

Andere Tipps

Unten finden Sie eine sehr gute Note (Seite 12) zur Lernrate in neuronalen Netzen (Rückverbreitung) von Andrew Ng. Sie finden Details in Bezug auf die Lernrate.

http://web.stanford.edu/class/cs294a/sparseautoencoder_2011New.pdf

Für Ihren 4. Punkt haben Sie Recht, dass man normalerweise eine "ausgewogene" Lernrate wählen muss, die weder überschwingen noch zu langsam konvergieren sollte. Man kann die Lernrate der Abfahrt der Kostenfunktion für die Diagnose/Feinstimmung darstellen. In der Praxis verwendet Andrew normalerweise den L-BFGS-Algorithmus (erwähnt auf Seite 12), um eine "gut genug" Lernrate zu erhalten.

Die Auswahl einer Lernrate ist ein Beispiel für ein "Meta-Problem", das als bekannt ist Hyperparameteroptimierung. Die beste Lernrate hängt von dem vorliegenden Problem sowie von der Architektur des zu optimierten Modells und sogar vom Zustand des Modells im aktuellen Optimierungsprozess ab! Es gibt sogar Softwarepakete, die der Hyperparameteroptimierung gewidmet sind, wie z. Spearinzente und Hyperopt (Nur ein paar Beispiele, es gibt viele andere!).

Abgesehen von der umfassenden Hyperparameteroptimierung wollte ich eine Technik erwähnen, die bei der Auswahl der bisher nicht erwähnten Lernraten häufig vorkommt. Simuliertes Glühen ist eine Technik zur Optimierung eines Modells, bei dem man mit einer großen Lernrate beginnt und die Lernrate im Laufe der Optimierung schrittweise verringert. Im Allgemeinen optimieren Sie Ihr Modell mit einer großen Lernrate (0,1 oder so) und reduzieren diese Rate dann zunehmend um eine Größenordnung (also auf 0,01, dann 0,001, 0,0001 usw.).

Dies kann mit früh aufhalten Um das Modell mit einer Lernrate zu optimieren, solange der Fortschritt erzielt wird, wechseln Sie dann zu einer kleineren Lernrate, sobald der Fortschritt langsam zu sein scheint. Die größeren Lernraten scheinen das Modell zu helfen, Regionen allgemeiner groß angelegter Optima zu lokalisieren, während kleinere Raten das Modell dabei helfen, sich auf ein bestimmtes lokales Optimum zu konzentrieren.

Kopieren von Meine Masterarbeit:

  • Wenn der Verlust bei mehreren Epochen nicht abnimmt, kann die Lernrate zu niedrig sein. Der Optimierungsprozess kann auch auf lokalem Minimum stecken bleiben.
  • Der Verlust, dass NAN auf zu hohe Lernraten zurückzuführen ist. Ein weiterer Grund ist die Aufteilung von Null oder die Einnahme des Logarithmus von Null.
  • Gewichts-Update-Tracking: Andrej Karpathy vorgeschlagen in der 5. Vorlesung von CS231N, um Gewichtsaktualisierungen zu verfolgen, um zu prüfen, ob die Lernrate gut ausgewählt ist. Er schlägt vor, dass das Gewichtsaktualisierung in der Reihenfolge von 10–3 liegen sollte. Wenn das Gewichtsaktualisierung zu hoch ist, muss die Lernrate verringert werden. Wenn das Gewichtsaktualisierung zu niedrig ist, muss die Lernrate erhöht werden.
  • Typische Lernraten sind in [0,1, 0,00001

Die Lernrate, die während unseres Iterationsprozesses als "Schrittgröße" verändert wird, ist seit Jahren ein heißes Problem und wird weitergehen.

Es gibt drei Optionen für die Schrittgröße in meinem besorgten:

  • Man ist mit "verwandt"Zeit", und jede Dimension muss die gleiche Schrittgröße teilen. Möglicherweise haben Sie so etwas bemerkt

$ it riesig bf frac { alpha} { sqrt {t}} $

Während T die aktuelle Iterationszahl demonstriert, ist Alpha Hyperparameter

  • Der nächste ist mit verbunden mit Gradient und jede Dimension hat ihre eigene Schrittgröße. Sie haben vielleicht so etwas bemerkt

$ it riesig frac {1} { frac { alpha} { beta + sqrt { sum_ {s = 1}^{t - 1} {g_ {s} { alpha} { beta + sqrt { sum_ {s = 1}^{t} {g_ {s}^2}}}} $

Während Alpha und Beta Hyperparameter sind, zeigt G Gradient

  • Der letzte ist der Kombination aus Zeit und Gradient und es sollte so sein wie

$ it riesig frac {1} { frac { alpha} { beta + sqrt { sum_ {s = 1}^{t - 1} {g_ {s} oder

oder

$ it riesig frac {1} { frac { alpha} { beta + sqrt { sum_ {s = 1}^{t - 1} {g_ {s} oder

Hofft, dass dies Ihnen helfen wird, viel Glück -)

Neuronale Netze werden oft durch Gradientenabstieg auf die Gewichte geschult. Dies bedeutet, dass wir bei jeder Iteration eine Backpropagation verwenden, um die Ableitung der Verlustfunktion in Bezug auf jedes Gewicht zu berechnen und von diesem Gewicht zu subtrahieren. Wenn Sie dies jedoch tatsächlich versuchen, ändern sich die Gewichte in jeder Iteration viel zu stark, was sie zu „überkorrigieren“ macht und der Verlust tatsächlich zunimmt/abweicht. In der Praxis multiplizieren Menschen normalerweise jedes Derivat mit einem kleinen Wert, der als „Lernrate“ bezeichnet wird, bevor sie sie von ihrem entsprechenden Gewicht abziehen.

Sie können sich auch eine Verlustfunktion für neuronale Netze als Oberfläche vorstellen, in der sich jede Richtung, in der Sie sich bewegen können, den Wert eines Gewichts darstellt. Gradientenabstieg ist wie Sprünge in die aktuelle Richtung der Steigung, und die Lernrate ist wie die Länge des Sprung, den Sie machen.

Zu Davids Antwort fand ich in Fastai das Konzept, die beste Lernrate für diese Daten zu finden, indem ich eine bestimmte Architektur verwendete.

Aber dieses Ding existiert nur auf Fastai/Pytorch. Kürzlich hat jemand einen Keras gemacht Implementierung.

Was wiederum auf diesen Papieren basiert:

Hoffe das hilft.

Lassen Sie mich eine kurze Einführung in einen anderen Ansatz zur Auswahl der Lernrate geben, basierend auf Jeremy Howards Tiefes Lernen Kurs 1. Wenn Sie tiefer graben möchten, siehe Dieser Blogpost.

Die im Kurs von Jeremy Howard vorgeschlagene Lernrate basiert auf einer systematischen Art, unterschiedliche Lernraten auszuprobieren und diejenige auszuwählen, die die Verlustfunktion am meisten sinkt. Dies geschieht durch die Fütterung vieler Chargen mit der Mini-Batch-Gradientenabstiegsmethode und der Erhöhung der Lernrate jede neue Charge, die Sie der Methode füttern. Wenn die Lernrate sehr gering ist, nimmt die Verlustfunktion sehr langsam ab. Wenn die Lernrate sehr groß ist, steigt die Verlustfunktion. Zwischen diesen beiden Regimen gibt es eine optimale Lernrate, für die die Verlustfunktion um die schnellste abnimmt. Dies ist in der folgenden Abbildung zu sehen:

enter image description here

Wir sehen, dass der Verlust sehr schnell abnimmt, wenn die Lernrate bei etwa 10 $^{-3} $ liegt. Mit diesem Ansatz haben wir eine allgemeine Möglichkeit, eine Näherung für die beste konstante Lernrate für unser Netowork zu wählen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top