Comment déboguer et limiter les échecs d'optimisation ?
Résumé: Si le modèle rencontre des problèmes d'optimisation, il est important de les corriger avant d'essayer d'autres choses. Le diagnostic et la correction des échecs d'entraînement sont un domaine de recherche actif.
Notez les points suivants concernant la figure 4:
- Changer les progrès ne se répercute pas sur les performances avec de faibles taux d'apprentissage.
- Les taux d'apprentissage élevés ne sont plus adaptés à l'entraînement en raison de l'instabilité.
- Appliquer 1 000 pas de préchauffage du taux d'apprentissage résout cette instance d'instabilité, permettant ainsi un entraînement stable avec un taux d'apprentissage maximal de 0,1.
Identifier les charges de travail instables
Toute charge de travail devient instable si le taux d'apprentissage est trop élevé. L'instabilité n'est un problème que lorsqu'elle vous oblige à utiliser un taux d'apprentissage trop faible. Il convient de distinguer au moins deux types d'instabilité de l'entraînement:
- Instabilité lors de l'initialisation ou au début de l'entraînement.
- Instabilité soudaine au cours de l'entraînement.
Vous pouvez adopter une approche systématique pour identifier les problèmes de stabilité de votre charge de travail en procédant comme suit:
- Effectuez un balayage du taux d'apprentissage pour trouver le meilleur taux d'apprentissage lr*.
- Représenter les courbes de fonction de perte d'entraînement pour les taux d'apprentissage juste au-dessus de lr*.
- Si les taux d'apprentissage > lr* montrent une instabilité de la perte (la perte ne diminue pas pendant les périodes d'entraînement), corriger l'instabilité améliore généralement l'entraînement.
Consignez la norme L2 du gradient de perte complète pendant l'entraînement, car les valeurs aberrantes peuvent entraîner de fausses instabilités en cours d'entraînement. Cela peut déterminer l'agressivité du rognage des gradients ou des mises à jour des pondérations.
REMARQUE: Certains modèles présentent une instabilité très précoce, suivie d'une récupération qui entraîne un entraînement lent, mais stable. Les calendriers d'évaluation courants peuvent passer à côté de ces problèmes en n'évaluant pas assez souvent !
Pour vérifier cela, vous pouvez vous entraîner pour une exécution abrégée d'environ 500 pas à l'aide de lr = 2 * current best
, mais évaluer chaque étape.
Solutions potentielles pour les schémas d'instabilité courants
Voici quelques solutions possibles pour les modèles d'instabilité courants:
- Appliquer le préchauffage du taux d'apprentissage. Cette approche est conseillée en cas d'instabilité de l'entraînement précoce.
- Appliquer le rognage de dégradé. Cette approche est adaptée à l'instabilité précoce et au milieu de l'entraînement, et peut corriger des erreurs d'initialisation impossibles à préchauffer.
- Essayez un nouvel optimiseur. Parfois, Adam peut gérer des instabilités que Momentum ne peut pas gérer. Il s'agit d'un domaine de recherche actif.
- Veillez à suivre les bonnes pratiques et les bonnes initialisations pour l'architecture de votre modèle (exemples à suivre). Ajoutez des connexions résiduelles et une normalisation si le modèle ne les contient pas déjà.
- Normaliser comme la dernière opération avant les résidus Exemple :
x + Norm(f(x))
. Notez queNorm(x + f(x))
peut causer des problèmes. - Essayez d'initialiser les branches résiduelles sur 0. (voir ReZero est tout ce dont vous avez besoin: convergence rapide à grande profondeur).
- Diminuez le taux d'apprentissage. Il s'agit d'un dernier recours.
Échauffement du taux d'apprentissage
Quand appliquer le préchauffage du taux d'apprentissage ?
La figure 7a illustre un tracé de l'axe des hyperparamètres qui indique qu'un modèle connaît des instabilités en matière d'optimisation, car le meilleur taux d'apprentissage se situe au bord de l'instabilité.
La figure 7b montre comment vérifier cela en examinant la perte d'entraînement d'un modèle entraîné avec un taux d'apprentissage cinq ou dix fois supérieur à ce pic. Si ce graphique montre une augmentation soudaine de la perte après une baisse régulière (par exemple, à l'étape ~10 000 dans la figure ci-dessus), le modèle souffre probablement d'une instabilité de l'optimisation.
Appliquer le préchauffage du taux d'apprentissage
Soit unstable_base_learning_rate
, le taux d'apprentissage auquel le modèle devient instable selon la procédure précédente.
Le préchauffage implique de précéder une programmation du taux d'apprentissage qui augmente le taux d'apprentissage de 0 à une base_learning_rate
stable d'au moins un ordre de grandeur supérieur à unstable_base_learning_rate
.
La valeur par défaut consiste à essayer un base_learning_rate
x10 x unstable_base_learning_rate
. Notez qu'il serait possible d'exécuter à nouveau toute cette procédure pour une résolution de 100 x unstable_base_learning_rate
, par exemple. Le calendrier spécifique est le:
- Montée en puissance de 0 à base_learning_rate au-dessus du préchauffage_steps.
- Entraînez votre modèle à une fréquence constante pour post_warmup_steps.
Votre objectif est de trouver le plus petit nombre d'warmup_steps
qui vous permette d'accéder à des taux d'apprentissage de pointe beaucoup plus élevés que unstable_base_learning_rate
.
Ainsi, pour chaque base_learning_rate
, vous devez régler warmup_steps
et post_warmup_steps
. Il est généralement acceptable de définir post_warmup_steps
sur 2*warmup_steps
.
L'échauffement peut être réglé indépendamment d'un calendrier de dépréciation existant. warmup_steps
doit être balayé de plusieurs ordres de grandeur. Par exemple, un exemple d'étude peut essayer [10, 1000, 10,000, 100,000]
. Le plus grand point réalisable ne doit pas dépasser 10% de max_train_steps
.
Une fois qu'une warmup_steps
qui n'explose pas l'entraînement à base_learning_rate
, elle doit être appliquée au modèle de référence.
Pour simplifier, ajoutez cette programmation à la programmation existante et utilisez la sélection de points de contrôle optimale décrite ci-dessus pour comparer ce test à la référence. Par exemple, si nous avions initialement 10 000 max_train_steps
et que nous exécutions warmup_steps
pour 1 000 pas, la nouvelle procédure d'entraînement devrait s'exécuter pour 11 000 pas au total.
Si des warmup_steps
longs sont nécessaires pour un entraînement stable (> 5% de max_train_steps
), vous devrez peut-être augmenter max_train_steps
en conséquence.
Il n'existe pas vraiment de valeur "typique" pour l'ensemble des charges de travail. Certains modèles ne nécessitent que 100 étapes, tandis que d'autres (en particulier les transformateurs) peuvent nécessiter plus de 40 000 pas.
Dégradé
Le rognage du gradient est particulièrement utile en cas de problèmes de gradient de grande taille ou d'anomalies. Le rognage de gradient peut résoudre l'un des problèmes suivants:
- Instabilité de l'entraînement précoce (norme de gradient élevée à un stade précoce)
- Instabilités en cours d'entraînement (pics soudains de gradient au cours de l'entraînement)
Parfois, des périodes de préchauffage plus longues peuvent corriger des instabilités que le bornement ne résout pas. Pour en savoir plus, consultez la section Préchauffage du taux d'apprentissage.
👀 Qu'en est-il des bornements pendant l'échauffement ?
Les seuils de bornement idéaux sont juste au-dessus de la norme de gradient "typique".
Voici un exemple de rognage de gradient:
- Si la norme du dégradé $\left | g \right |$ est supérieure au seuil de rognage du dégradé $\lambda$, exécutez ${g}'= \lambda \times \frac{g}{\left | gight |}$ où ${g}'$ est le nouveau dégradé.
Consigner la norme de gradient non rognée pendant l'entraînement. Par défaut, générez:
- Représentation graphique de la norme de gradient par rapport au pas
- Un histogramme des normes de gradients agrégées pour l'ensemble des étapes
Choisissez un seuil d'écrêtage de gradient basé sur le 90e centile des normes de gradient. Le seuil dépend de la charge de travail, mais 90% est un bon point de départ. Si 90% ne fonctionne pas, vous pouvez ajuster ce seuil.
⚡ Qu'en est-il d'une sorte de stratégie adaptative ?
Si vous essayez le bornement de la norme du gradient et que les problèmes d'instabilité persistent, vous pouvez essayer de résoudre le problème en réduisant le seuil.
Le rognage de gradient extrêmement agressif (c'est-à-dire que plus de 50% des mises à jour sont rognées) est, en substance, un moyen étrange de réduire le taux d'apprentissage. Si vous utilisez un rognage extrêmement agressif, réduisez plutôt le taux d'apprentissage.
Pourquoi désignez-vous le taux d'apprentissage et les autres hyperparamètres ? Ce ne sont des paramètres d'aucune distribution antérieure.
Le terme "hyperparamètre" a une signification précise dans le machine learning bayésien. Par conséquent, faire référence au taux d'apprentissage et à la plupart des autres paramètres de deep learning ajustables en tant qu'"hyperparamètres" constitue probablement un abus de terminologie. Nous préférons utiliser le terme "métaparamètre" pour désigner les taux d'apprentissage, les paramètres architecturaux et tous les autres éléments ajustables liés au deep learning. En effet, le métaparamètre permet d'éviter les confusions résultant d'un usage abusif du mot "hyperparamètre". Cette confusion est particulièrement probable lorsqu'on évoque l'optimisation bayésienne, où les modèles de surface de réponse probabilistes possèdent leurs propres hyperparamètres réels.
Malheureusement, bien qu'il puisse prêter à confusion, le terme "hyperparamètre" est devenu extrêmement courant dans la communauté du deep learning. Par conséquent, pour ce document, destiné à un large public comprenant de nombreuses personnes peu susceptibles d'être au courant de ce fonctionnement technique, nous avons fait le choix de contribuer à une source de confusion dans le domaine afin d'en éviter une autre. Cela dit, nous pouvons faire un choix différent lors de la publication d'un article de recherche et nous encourageons d'autres personnes à utiliser un "métaparamètre" dans la plupart des cas.
Pourquoi la taille de lot ne devrait-elle pas être ajustée pour améliorer directement les performances de l'ensemble de validation ?
Modifier la taille de lot sans modifier aucun autre détail du pipeline d'entraînement affecte souvent les performances de l'ensemble de validation. Toutefois, la différence de performances de l'ensemble de validation entre deux tailles de lot disparaît généralement si le pipeline d'entraînement est optimisé indépendamment pour chaque taille de lot.
Les hyperparamètres qui interagissent le plus avec la taille de lot, et qui sont donc les plus importants à régler séparément pour chaque taille de lot, sont les hyperparamètres de l'optimiseur (par exemple, le taux d'apprentissage, le Momentum) et les hyperparamètres de la régularisation. Des tailles de lot plus petites introduisent plus de bruit dans l'algorithme d'entraînement en raison de la variance de l'échantillon. Ce bruit peut avoir un effet de régularisation. Ainsi, des lots de grande taille peuvent être plus sujets au surapprentissage et nécessiter des techniques de régularisation et/ou des techniques de régularisation supplémentaires. En outre, vous devrez peut-être ajuster le nombre d'étapes d'entraînement en cas de modification de la taille de lot.
Une fois tous ces effets pris en compte, il n'existe aucune preuve convaincante indiquant que la taille de lot affecte les performances de validation maximales réalisables. Pour en savoir plus, consultez Shallue et al. 2018.
Quelles sont les règles de mise à jour de tous les algorithmes d'optimisation courants ?
Cette section fournit les règles de mise à jour pour plusieurs algorithmes d'optimisation courants.
Descente de gradient stochastique (SGD)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
Où $\eta_t$ est le taux d'apprentissage à l'étape $t$.
Momentum
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
Où $\eta_t$ est le taux d'apprentissage à l'étape $t$, et $\gamma$ le coefficient de Momentum.
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}) )\]
Où $\eta_t$ est le taux d'apprentissage à l'étape $t$, et $\gamma$ le coefficient de Momentum.
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}\]