―― Je voudrais résumer les quatre méthodes d'optimisation des réseaux de neurones que j'ai récemment apprises en lisant le livre "Neural networks made from scratch". «Fondamentalement, il est basé sur un livre, mais ** Comment pouvez-vous l'imaginer? Cet article résume mon interprétation personnelle en mettant l'accent sur **. Par conséquent, il n'inclut pas les formules ou applications exactes. ――Si vous effectuez une recherche sur le net, vous trouverez des explications plus détaillées que cet article, mais d'un autre côté, certains articles résument presque les mêmes explications que les livres de Qiita, il est donc utile de résumer votre propre interprétation. Je pensais qu'il y en avait un peu, alors je suis venu écrire un article «Je suis assez partisan de l'explication de la méthode appelée Momentum, mais pardonnez-moi s'il vous plaît. .. Je suis un débutant et un débutant sur les réseaux de neurones, donc je serais heureux si vous pouviez commenter des erreurs ou des conseils.
«Réseau neuronal» et «apprentissage en profondeur» que même les gens ordinaires qui ne sont pas spécialisés dans l'apprentissage automatique ne connaissent plus que leurs noms. Il fait partie de l'apprentissage automatique, et il est souvent utilisé pour la reconnaissance d'images, etc. (comme la recherche d'images Google) Le livre le plus lu au Japon lors de l'étude de ce réseau neuronal est probablement "** Deep Learning from scratch **". Comme il est bien lu, je pense que c'est un très bon livre d'introduction. (Qu'Est-ce que c'est?)
Non limité aux réseaux de neurones, le but de l'apprentissage automatique est d'apprendre sur la base de données de formation (données de l'enseignant) et de prédire des données inconnues. Par exemple, en termes de reconnaissance d'image, une grande quantité d'images de chat est apprise, et lorsqu'une nouvelle image est affichée, la réponse est «si cette image ou un chat? Dans l'apprentissage automatique normal, il existe une restriction selon laquelle «les fonctionnalités doivent être spécifiées pour l'apprentissage», mais dans l'apprentissage en profondeur, il existe un avantage en ce que les fonctionnalités peuvent être trouvées à partir d'images sans autorisation pendant l'apprentissage.
Qu'est-ce que l'apprentissage exactement? En d'autres termes, c'est la tâche de trouver le paramètre de poids optimal. Une fois les paramètres optimaux trouvés, la réponse correcte peut être prédite à partir de données inconnues. Cela s'appelle ** optimiser **. Pour l'optimisation, définissez une fonction appelée fonction de perte (fonction de coût) et recherchez le paramètre qui la minimise. L'erreur quadratique minimale et LogLoss (erreur d'entropie d'intersection) sont utilisées comme fonction de perte, et plus la valeur est petite, meilleure est la classification (ou la régression). Alors, comment trouvez-vous le plus petit emplacement pour la fonction de perte? Penser à. Ce livre présente les quatre méthodes d'optimisation suivantes.
--SGD (méthode de descente de gradient)
SGD Abréviation de Gradient Stochastic Descent. Il s'agit de la méthode d'optimisation la plus standard et met à jour le poids avec la formule suivante.
\boldsymbol{W} \leftarrow \boldsymbol{W} - \eta\frac{\partial{L}}{\partial{\boldsymbol{W}}}
Calculez la pente de la fonction de perte et mettez-la à jour pour que la fonction de perte devienne plus petite. L'idée est: «Si vous descendez la pente, vous finirez par atteindre le point le plus bas». $ \ Eta $ s'appelle le taux d'apprentissage, et s'il est trop petit, il sera difficile de l'atteindre, et s'il est trop grand, il se déplacera trop à la fois et volera dans une direction ridicule. Vous devez donc d'abord définir la valeur appropriée. Personnellement, je pense que c'est comme le golf, et si vous le frappez avec seulement un peu de force, vous n'atteindrez jamais le trou, mais si vous le frappez trop fort, vous passerez par le trou et irez dans une direction ridicule. Je vais finir. C'est SGD, mais cela ne fonctionne pas toujours. Par exemple, considérons une fonction telle que $ f (x, y) = \ frac {1} {20} x ^ {2} + y ^ {2} $. Il ressemble à un bol en forme étiré dans la direction de l'axe x. Le résultat de l'essai de SGD avec cette fonction est le suivant.
Puisque la pente dans la direction verticale est raide, vous pouvez voir qu'elle se dirige vers l'origine (le point où la fonction de perte est la plus petite) tout en étant dentelée verticalement. C'est une décision assez inefficace. Il y a trois façons d'améliorer cela.
Momentum L'élan est la quantité d'exercice qui apparaît en physique. Examinons d'abord la formule de mise à jour du poids.
\boldsymbol{v} \leftarrow \alpha\boldsymbol{v} - \eta\frac{\partial{L}}{\partial{\boldsymbol{W}}}\\
\boldsymbol{W} \leftarrow \boldsymbol{W} +\boldsymbol{v}
Si vous regardez simplement la formule, il se peut qu'elle ne vous vienne pas, alors regardons d'abord le résultat appliqué à la fonction précédente.
C'est un mouvement fluide. D'une manière ou d'une autre, il trace une trajectoire comme une balle qui roule dans un bol, ce qui est naturel. Pourquoi se déroule-t-il en douceur? J'ai écrit un schéma conceptuel simple ci-dessous.
Prenons un exemple. Supposons que ① représente le premier apprentissage et ② le deuxième apprentissage. Supposons que le résultat du premier calcul de $ \ frac {\ partial {L}} {\ partial {\ boldsymbol {W}}} $ est un vecteur ascendant comme indiqué dans ①. Supposons que vous vous déplaciez selon cette direction en multipliant la taille de $ \ eta $. Pensez maintenant à mettre à jour le poids de ②. À la suite du calcul de la différenciation de L à nouveau, supposons que la direction de la pente descendante a changé vers la droite au lieu du sommet. Dans le cas de SGD, tout comme ①, cette fois allez à droite avec ②. En conséquence, il se déplace vers la droite à angle droit. C'est la cause du cliquetis de SGD, et la contre-nature est en orbite. Vérifions la formule Momentum ici. Il y a une section $ \ alpha \ {v} $ dans la formule de mise à jour. Cela correspond à $ \ frac {\ partial {L}} {\ partial {\ boldsymbol {W}}} $ au moment de ①. Disons $ \ alpha = 1 $ pour plus de simplicité. Ensuite, vous pouvez voir que la partie $ \ alpha \ boldsymbol {v} - \ eta \ frac {\ partial {L}} {\ partial {\ boldsymbol {W}}} $ est la somme des vecteurs ① et ②. Je vais. Ensuite, la direction de ② ira vers le coin supérieur droit à un angle de 45 degrés au lieu de la droite. De cette façon, ** En reflétant l'inclinaison au moment de la mise à jour précédente du poids dans la prochaine mise à jour du poids, le mouvement sera fluide. ** ** α est un paramètre de la mesure dans laquelle l'inclinaison au moment de la dernière mise à jour est affectée. Si α vaut 0, l'inclinaison au moment de la mise à jour précédente du poids n'est pas du tout reflétée, c'est donc la même chose que SGD dans la bonne direction.Ensuite, considérez pourquoi cette technique s'appelle Momentum. En physique (mécanique newtonienne), l'impulsion est le produit de la masse (m) et du vecteur vitesse ($ \ boldsymbol {v}
m\boldsymbol{v_{before}}+F\Delta{t} = m\boldsymbol{v_{after}}
Pensons-y aussi
Il montre comment le mouvement d'un objet qui se déplace vers le haut avec un élan de $ m \ boldsymbol {v_ {avant}} $ change lorsqu'il reçoit un produit de force dans la bonne direction. Si la magnitude du produit de force est la même que l'élan initial, l'objet sera retourné vers le coin supérieur droit à un angle de 45 degrés, et si la magnitude du produit de force est plus grande que cela, l'objet sera retourné vers la droite. Vous pouvez voir que cela est très similaire au diagramme conceptuel ci-dessus. La trajectoire dessinée par Momentum a été décrite plus tôt comme ** comme une balle qui roule dans un bol **, mais comme elle a une formule similaire à la loi physique de la dynamique réelle, une telle trajectoire Tu peux voir ça L'image est ** Même si une force est soudainement appliquée vers la droite là où vous vous déplacez, vous ne pourrez pas tourner brusquement à angle droit! Avez-vous l'impression d'avoir appliqué ** à la mise à jour du poids?
AdaGrad L'explication de Momentum est devenue très longue, mais je voudrais expliquer brièvement les méthodes restantes. En expliquant SGD, j'ai comparé la mise à jour du poids au golf. SGD met à jour avec le même taux d'apprentissage pour chaque apprentissage. En d'autres termes, au golf, vous frappez la balle avec la même force à chaque fois. Cependant, dans le cas du golf, vous frappez fort le premier coup pour allonger la distance de vol, et lorsque le trou approche, vous le frappez plus faible et l'ajustez, non? La même chose peut être appliquée aux réseaux de neurones. En d'autres termes, le poids est fortement mis à jour au moment du premier apprentissage, et la taille à mettre à jour est progressivement réduite. Cette technique s'appelle AdaGrad. Regardons la formule suivante.
\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}}}
Vous le divisez par $ \ sqrt {\ boldsymbol {h}} $ dans la formule ci-dessous. Cela signifie que chaque fois que vous mettez à jour le poids, la taille de la mise à jour diminuera. Dans la formule ci-dessus, $ \ left (\ frac {\ partial {L}} {\ partial {\ boldsymbol {W}}} \ right) ^ {2} $ signifie le carré de tous les éléments de la matrice. .. (Parce que ce n'est pas un produit intérieur, il ne devient pas un scalaire) En d'autres termes, plus la pente est raide, plus le poids est mis à jour, et plus il est petit. Cela a beaucoup de sens. Ce qui suit est l'application réelle de ceci à la fonction précédente.
Cet exemple semble très bien fonctionner.
Adam Enfin, je voudrais vous présenter Adam. Adam est simplement une bonne partie de Momentum et Ada Grad. Je n'entrerai pas dans les détails ici, y compris les formules. Comme d'habitude, lorsqu'il est appliqué à une fonction, la figure ci-dessous est obtenue.
C'est aussi une bonne sensation par rapport à SGD, et vous pouvez atteindre la valeur minimale.--Le code utilisé pour tracer la figure cette fois est publié dans le git suivant
Recommended Posts