Wie können Optimierungsfehler behoben und vermieden werden?
Zusammenfassung: Wenn bei dem Modell Optimierungsprobleme auftreten, ist es wichtig, diese zu beheben, bevor Sie andere Schritte ausführen. Die Diagnose und Behebung von Trainingsfehlern ist ein aktiver Forschungsbereich.
![Diagramm mit einem Vergleich von Standard WideResNet mit Stride 1x1 WideResNet
Die y-Achse ist die Testfehlerrate und die x-Achse ist die Basislernrate.
Beim Standard-WideResNet-System nimmt die TestErrorRate mit zunehmender Basislernrate allmählich ab. Im Gegensatz dazu kommt es bei Stride WideResNet zu wilden Schwankungen, wenn die Basislernrate steigt.](https://developers.google.cn/static/machine-learning/guides/deep-learning-tuning-playbook/images/stride_instability.png?authuser=6&hl=de)
Beachten Sie in Abbildung 4 Folgendes:
- Durch das Ändern der Schritte wird die Leistung bei niedrigen Lernraten nicht beeinträchtigt.
- Hohe Lernraten werden aufgrund der Instabilität nicht mehr gut trainiert.
- Das Anwenden von 1.000 Schritten der Lernratenaufwärmung behebt diesen speziellen Instabilitätsfall und ermöglicht ein stabiles Training mit einer maximalen Lernrate von 0, 1.
Instabile Arbeitslasten identifizieren
Jede Arbeitslast wird instabil, wenn die Lernrate zu hoch ist. Instabilität ist nur dann ein Problem, wenn sie Sie zwingt, eine zu niedrige Lernrate zu verwenden. Es lohnt sich, mindestens zwei Arten von Trainingsinstabilität zu unterscheiden:
- Instabilität bei der Initialisierung oder zu Beginn des Trainings.
- Plötzliche Instabilität mitten im Training.
Sie können einen systematischen Ansatz verfolgen, um Stabilitätsprobleme in Ihrer Arbeitslast zu identifizieren. Gehen Sie dazu so vor:
- Führen Sie einen Lernraten-Sweep durch und ermitteln Sie die beste Lernrate lr*.
- Stellen Sie Kurven zu Trainingsverlusten für die Lernraten etwas über lr* ein.
- Wenn die Lernraten > lr* auf eine Verlustinstabilität hinweisen (der Verlust steigt nicht während des Trainings ab), verbessert die Behebung der Instabilität in der Regel das Training.
Loggen Sie die L2-Norm des vollständigen Verlustgefälles während des Trainings, da Ausreißerwerte mitten im Training zu einer falschen Instabilität führen können. Dies kann Aufschluss darüber geben, wie aggressiv Sie Gradienten oder Gewichtsaktualisierungen begrenzen.
HINWEIS: Einige Modelle weisen sehr früh Instabilität auf, gefolgt von einer Wiederherstellung, die zu einem langsamen, aber stabilen Training führt. Bei häufigen Bewertungsplänen können diese Probleme übersehen werden, da sie nicht häufig genug ausgewertet werden.
Um dies zu prüfen, können Sie mit lr = 2 * current best
für eine verkürzte Ausführung von nur etwa 500 Schritten trainieren, aber jeden Schritt bewerten.
![Zwei Grafiken: Die X-Achse bei beiden Diagrammen ist „Global Step“, die Y-Achse bei beiden Diagrammen „Train Loss“. In beiden Diagrammen wird ein Conversion-Schritt von (2,2) mit einem Conversion-Schritt von (1,1) verglichen. Das erste Diagramm zeigt Bewertungen alle 1.000 Schritte. In diesem ersten Diagramm zeigen beide Conversion-Versuche einen allmählichen stabilen Abfall mit mehr globalen Schritten. Das zweite Diagramm zeigt häufige Bewertungen in den ersten 25 Schritten. In dieser zweiten Grafik zeigt der Conv.-Schritt von (2, 2) wilde Schwankungen bei Train-Verlust in den ersten globalen Schritten,bevor er bei 20 globalen Schritten immer niedriger wird. Der Conv.-Schritt von (1,1) zeigt selbst nach dem ersten globalen Schritt einen konstant niedrigen Zugverlust.](https://developers.google.cn/static/machine-learning/guides/deep-learning-tuning-playbook/images/more_frequent_evals.png?authuser=6&hl=de)
Mögliche Korrekturen für häufige Instabilitätsmuster
Sehen Sie sich die folgenden möglichen Lösungen für häufige Instabilitätsmuster an:
- Lernrate-Aufwärmphase anwenden. Dies eignet sich am besten für frühe Trainingsinstabilität.
- Farbverlaufs-Clipping anwenden Dies wirkt sich positiv auf die Instabilität am Anfang und in der Mitte des Trainings aus und kann einige fehlerhafte Initialisierungen beheben, die beim Aufwärmvorgang nicht möglich sind.
- Neuen Optimierungstool ausprobieren Manchmal hat Adam Instabilitäten zu bewältigen, die Momentum nicht kann. Dies ist ein aktiver Forschungsbereich.
- Verwenden Sie für Ihre Modellarchitektur unbedingt Best Practices und die besten Initialisierungen (Beispiele folgen). Fügen Sie Restverbindungen und Normalisierung hinzu, wenn das Modell diese noch nicht enthält.
- Als letzte Operation vor der Residuen normalisieren. Beispiel:
x + Norm(f(x))
. Beachte, dassNorm(x + f(x))
Probleme verursachen kann. - Versuchen Sie, Restverzweigungen auf 0 zu initialisieren. Weitere Informationen finden Sie unter ReZero is All You Need: Fast Convergence at Large Deepth.
- Verringern Sie die Lernrate. Dies ist das letzte Mittel.
Lernrate Aufwärmphase
![Zwei Grafiken, die denselben Test zeigen. Im ersten Diagramm ist die x-Achse „Global Step“ und die y-Achse „Train Loss“ (Zugverlust). Aufgrund der niedrigen Lernraten-Aufwärmzahlen war der Train-Verlust extrem instabil.
Mit höheren Aufwärmzahlen für die Lernrate war der Train-Verlust viel stabiler.](https://developers.google.cn/static/machine-learning/guides/deep-learning-tuning-playbook/images/instability_during_warmup.png?authuser=6&hl=de)
Wann soll die Aufwärmphase für die Lernrate angewendet werden?
![Diagramm des Kreuzentropieverlusts auf dem Validierungs-Dataset (y-Achse) im Vergleich zur Basislernrate (x-Achse). Das Diagramm zeigt sechs durchführbare Tests, die alle eine relativ niedrige Lernrate (Basis) haben. Der Validierungsverlust sinkt mit zunehmender Basislernrate und erreicht dann einen Tiefstpunkt, bevor er erhöht wird. Die Grafik zeigt auch vier nicht durchführbare Tests, die alle eine relativ hohe Basislernrate haben.](https://developers.google.cn/static/machine-learning/guides/deep-learning-tuning-playbook/images/axis_model_with_instability.png?authuser=6&hl=de)
![Diagramm des Kreuzentropieverlusts auf dem Trainings-Dataset (y-Achse) im Vergleich zum globalen Schritt (x-Achse). Die Verluste sinken in den ersten globalen Schritten sehr schnell. Dann steigt der Verlust bei etwa 10.000 Schritten dramatisch an. Dann sinkt der Verlust allmählich um etwa 15.000 Schritte.](https://developers.google.cn/static/machine-learning/guides/deep-learning-tuning-playbook/images/loss_model_with_instability.png?authuser=6&hl=de)
Abbildung 7a zeigt ein Hyperparameter-Achsendiagramm, das anzeigt, dass ein Modell Optimierungsinstabilitäten aufweist, da sich die beste Lernrate am Rand der Instabilität befindet.
Abbildung 7b zeigt, wie dies überprüft werden kann, indem der Trainingsverlust eines Modells untersucht wird, das mit einer Lernrate trainiert wurde, die entweder 5-mal oder 10-mal größer als dieser Spitzenwert ist. Wenn dieses Diagramm nach einem stetigen Rückgang einen plötzlichen Anstieg des Verlusts zeigt (z. B. bei Schritt 10.000 in der Abbildung oben), leidet das Modell wahrscheinlich unter Optimierungsinstabilität.
So wenden Sie die Aufwärmphase für die Lernrate an
![Ein Diagramm des Validierungsverlusts in Schritt 76619 (y-Achse) im Vergleich zur Basislernrate (x-Achse). Das Diagramm vergleicht die Ergebnisse von vier verschiedenen Situationen bei einem LayerNorm-Transformator auf WMT14 EN-De. Durch die Aufwärmphase der Lernrate wurde der Validierungsverlust bei niedrigeren Lernraten reduziert.](https://developers.google.cn/static/machine-learning/guides/deep-learning-tuning-playbook/images/beneficial_effect_warmup.png?authuser=6&hl=de)
Lassen Sie unstable_base_learning_rate
die Lernrate sein, bei der das Modell instabil wird.
Das Aufwärmen beinhaltet das Voranstellen eines Lernratenplans, der die Lernrate von 0 auf einen stabilen base_learning_rate
erhöht, der mindestens eine Größenordnung größer als unstable_base_learning_rate
ist.
Standardmäßig wird ein base_learning_rate
verwendet, der 10 × unstable_base_learning_rate
groß ist. Allerdings wäre es möglich, die gesamte Prozedur noch einmal für etwa 100x unstable_base_learning_rate
auszuführen. Der genaue Zeitplan sieht so aus:
- Steigen Sie über „warmup_steps“ von 0 auf „base_learning_rate“ hoch.
- Trainieren Sie für post_warmup_steps mit konstanter Geschwindigkeit.
Ihr Ziel ist es, die kürzeste Anzahl von warmup_steps
zu finden, mit der Sie auf maximale Lernraten zugreifen können, die viel höher als unstable_base_learning_rate
sind.
Sie müssen also für jeden base_learning_rate
warmup_steps
und post_warmup_steps
abstimmen. In der Regel können Sie für post_warmup_steps
den Wert 2*warmup_steps
festlegen.
Das Aufwärmprogramm kann unabhängig von einem vorhandenen Abklingplan abgestimmt werden. warmup_steps
sollten in verschiedenen Größenordnungen erwidert werden. In einer Beispielstudie könnte z. B. [10, 1000, 10,000, 100,000]
verwendet werden. Der größte zulässige Punkt sollte nicht mehr als 10% von max_train_steps
betragen.
Sobald eine warmup_steps
eingerichtet wurde, die das Training bei base_learning_rate
nicht vertieft, sollte sie auf das Basismodell angewendet werden.
Stellen Sie diesen Zeitplan dem vorhandenen Zeitplan voran und verwenden Sie die oben beschriebene optimale Prüfpunktauswahl, um diesen Test mit der Referenz zu vergleichen. Wenn wir beispielsweise ursprünglich 10.000 max_train_steps
hatten und warmup_steps
für 1.000 Schritte ausgeführt haben, sollte das neue Trainingsverfahren für insgesamt 11.000 Schritte ausgeführt werden.
Wenn für das stabile Training lange warmup_steps
erforderlich sind (> 5% von max_train_steps
), müssen Sie max_train_steps
möglicherweise erhöhen, um dies zu berücksichtigen.
Es gibt keinen „typischen“ Wert für die gesamte Bandbreite von Arbeitslasten. Einige Modelle benötigen nur 100 Schritte, während andere (besonders Transformatoren) möglicherweise mehr als 40.000 Schritte benötigen.
Farbverlaufsüberschneidung
![Grafik der Norm Grad 12 (y-Achse) im Vergleich zum globalen Schritt (x-Achse). Das „typische“ Gradientennormalisierungstraining war in den ersten globalen Schritten sehr instabil. Ein zu aggressive Clip-Schwellenwert verringert die Lernrate und verlangsamt das Training. Durch einen besseren Clipgrenzwert (etwas über der typischen Gradientennorm) konnte das frühe Training stabilisiert werden.](https://developers.google.cn/static/machine-learning/guides/deep-learning-tuning-playbook/images/gradient_clipping.png?authuser=6&hl=de)
Das Überschneiden des Farbverlaufs ist am nützlichsten, wenn große oder Ausreißerprobleme bei Farbverläufen auftreten. Die folgenden Probleme können durch die Farbverlauf-Clipping-Funktion behoben werden:
- Frühe Trainingsinstabilität (frühe Norm mit großem Gradienten)
- Instabilitäten mitten im Training (plötzlicher Gradient steigt während des Trainings an).
Manchmal können durch längere Aufwärmphasen Instabilitäten korrigiert werden, die durch Clipping nicht behoben werden können. Weitere Informationen finden Sie unter Aufwärmphase der Lernrate.
🤖 Was ist mit Clipping während des Aufwärmens?
Die idealen Clipgrenzwerte liegen direkt über der „typischen“ Gradientennorm.
Hier ist ein Beispiel dafür, wie ein Gradienten-Clipping durchgeführt werden kann:
- Wenn die Norm des Farbverlaufs $\left | g\right |$ größer ist als der Grenzwert für die Gradientenbeschränkung $\lambda$, dann Folgendes ausführen: ${g}'= \lambda \times \frac{g}{\left | g\right |}$, wobei ${g}'$ der neue Farbverlauf ist.
Protokolliert die nicht begrenzte Gradientennorm während des Trainings. Generieren Sie standardmäßig Folgendes:
- Diagramm mit Gradientennormen und -schritten
- Ein Histogramm der über alle Schritte aggregierten Gradientennormen
Wählen Sie einen Grenzwert für die Gradientenbegrenzung basierend auf dem 90. Perzentil der Gradientennormen aus. Der Schwellenwert hängt von der Arbeitslast ab, aber 90% sind ein guter Ausgangspunkt. Wenn 90% nicht funktionieren, können Sie diesen Grenzwert anpassen.
🤖 Was ist mit einer Art adaptiver Strategie?
Wenn Sie das Gradienten-Clipping ausprobieren und die Instabilitätsprobleme weiterhin bestehen, können Sie es noch weiter versuchen und den Grenzwert verringern.
Extrem aggressive Gradienten-Clippings (d. h. mehr als 50% der Aktualisierungen werden abgeschnitten) sind im Wesentlichen eine seltsame Methode, die Lernrate zu reduzieren. Wenn Sie extrem aggressives Clipping verwenden, sollten Sie stattdessen wahrscheinlich einfach die Lernrate senken.
Warum werden die Hyperparameter für die Lernrate und andere Optimierungsparameter genannt? Sie sind keine Parameter früherer Verteilungen.
Der Begriff „Hyperparameter“ hat im Bayesschen maschinellen Lernen eine genaue Bedeutung. Daher ist die Bezeichnung der Lernrate und der meisten anderen einstellbaren Deep-Learning-Parameter als „Hyperparameter“ zu betrachten, ist wohl ein Terminologiemissbrauch. Wir verwenden den Begriff "Metaparameter" lieber für Lernraten, Architekturparameter und alle anderen einstellbaren Elemente von Deep Learning. Das liegt daran, dass bei einem Metaparameter Verwirrung durch den Missbrauch des Wortes „Hyperparameter“ entstehen kann. Diese Verwirrung ist besonders wahrscheinlich, wenn es um die Bayes'sche Optimierung geht, bei der die probabilistischen Antwortoberflächenmodelle ihre eigenen echten Hyperparameter haben.
Leider ist der Begriff "Hyperparameter" in der Deep-Learning-Community sehr verbreitet, obwohl er möglicherweise verwirrend ist. Daher haben wir uns für dieses Dokument, das für eine breite Zielgruppe mit vielen Personen bestimmt, denen diese Technik wahrscheinlich nicht bewusst ist, beschlossen, zu einer Ursache für Verwirrung auf diesem Gebiet beizutragen, um eine andere zu vermeiden. Allerdings könnten wir bei der Veröffentlichung einer Forschungsarbeit eine andere Entscheidung treffen und andere ermutigen, in den meisten Kontexten stattdessen „Metaparameter“ zu verwenden.
Warum sollte die Batchgröße nicht angepasst werden, um die Leistung des Validierungssatzes direkt zu verbessern?
Wenn Sie die Batchgröße ändern, ohne weitere Details der Trainingspipeline zu ändern, wirkt sich das häufig auf die Leistung des Validierungssatzes aus. Der Unterschied in der Leistung des Validierungssatzes zwischen zwei Batchgrößen verschwindet jedoch in der Regel, wenn die Trainingspipeline für jede Batchgröße unabhängig optimiert wird.
Die Hyperparameter, die am stärksten mit der Batchgröße interagieren und daher am wichtigsten für jede Batchgröße separat abgestimmt werden müssen, sind die Hyperparameter der Optimierung (z. B. Lernrate, Momentum) und die Regularisierungs-Hyperparameter. Kleinere Batchgrößen führen aufgrund der Stichprobenvarianz zu mehr Rauschen im Trainingsalgorithmus. Dieses Rauschen kann einen Regularisierungseffekt haben. Daher können größere Batchgrößen anfälliger für eine Überanpassung sein und möglicherweise eine stärkere Regularisierung und/oder zusätzliche Regularisierungstechniken erfordern. Darüber hinaus müssen Sie möglicherweise die Anzahl der Trainingsschritte anpassen, wenn Sie die Batchgröße ändern.
Sobald all diese Auswirkungen berücksichtigt sind, gibt es keine überzeugenden Beweise dafür, dass die Batchgröße die maximal erreichbare Validierungsleistung beeinflusst. Weitere Informationen finden Sie in Shallue et al. 2018.
Wie lauten die Aktualisierungsregeln für alle beliebten Optimierungsalgorithmen?
Dieser Abschnitt enthält Aktualisierungsregeln für verschiedene beliebte Optimierungsalgorithmen.
Stochastisches Gradientenverfahren (SGD)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
Dabei ist $\eta_t$ die Lernrate in Schritt $t$.
Erfolge
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
Dabei ist $\eta_t$ die Lernrate bei Schritt $t$ und $\gamma$ der Impulskoeffizient.
Nesterov
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]
Dabei ist $\eta_t$ die Lernrate bei Schritt $t$ und $\gamma$ der Impulskoeffizient.
RMSProp
\[v_0 = 1 \text{, } m_0 = 0\]
\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]
\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - m_{t+1}\]
ADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]
Nadam
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]