[PYTHON] J'ai essayé de résumer quatre méthodes d'optimisation de réseau neuronal

De quel genre d'article s'agit-il?

―― 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 fait de zéro

«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?)

"Apprentissage" dans l'apprentissage automatique

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'optimisation?

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. スクリーンショット 2020-03-16 21.38.18.png

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.

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

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.

スクリーンショット 2020-03-18 21.19.32.png 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} ). L'expression relationnelle suivante, qui est la relation entre l'élan et le produit de force ( F \ Delta {t} $), est valable.

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

Pensons-y aussi

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

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.

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

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.

スクリーンショット 2020-03-16 21.38.50.png C'est aussi une bonne sensation par rapport à SGD, et vous pouvez atteindre la valeur minimale.

Résumé

Remarques

--Le code utilisé pour tracer la figure cette fois est publié dans le git suivant

Recommended Posts

J'ai essayé de résumer quatre méthodes d'optimisation de réseau neuronal
J'ai essayé de résumer SparseMatrix
J'ai essayé de classer la musique en majeur / mineur sur Neural Network
J'ai essayé de résumer la commande umask
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé de résumer la modélisation graphique.
J'ai essayé de résumer les modules d'Ansible - l'édition Linux
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé de déboguer.
J'ai essayé l'optimisation bayésienne!
J'ai essayé de résumer comment utiliser matplotlib de python
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé de passer par l'optimisation bayésienne. (Avec des exemples)
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé d'apprendre PredNet
J'ai essayé d'implémenter PCANet
Introduction à l'optimisation non linéaire (I)
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé de résumer les commandes souvent utilisées en entreprise
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de résumer brièvement SQLAlchemy (il y a aussi des CONSEILS)
J'ai essayé de résumer comment utiliser à nouveau le référentiel EPEL
J'ai essayé de prédire le genre de musique à partir du titre de la chanson sur le réseau neuronal récurrent
J'ai essayé d'implémenter Deep VQE
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé de créer l'API Quip
J'ai essayé de toucher Python (installation)
J'ai créé mon propre réseau de neurones à propagation directe à 3 couches et j'ai essayé de comprendre le calcul en profondeur.
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé l'authentification vocale Watson (Speech to Text)
J'ai essayé de mettre en œuvre un réseau de neurones à deux couches
J'ai essayé de résumer ce qui était sorti avec Qiita avec Word cloud
J'ai touché l'API de Tesla
J'ai essayé de résumer les commandes utilisées par les ingénieurs débutants aujourd'hui
J'ai essayé de résumer les remarques de tout le monde sur le slack avec wordcloud (Python)
J'ai essayé de m'organiser à propos de MCMC.
J'ai essayé de résoudre le problème de planification des équipes par diverses méthodes
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'implémenter Realness GAN
J'ai essayé de déplacer le ballon
[Classification des phrases] J'ai essayé différentes méthodes de mise en commun des réseaux de neurones convolutifs
J'ai essayé d'estimer la section.
J'ai essayé de résumer les méthodes qui sont souvent utilisées lors de l'implémentation d'algo de base dans Quantx Factory
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (deuxième moitié)
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
J'ai essayé de résumer jusqu'à ce que je quitte la banque et devienne ingénieur
J'ai essayé de résumer moi-même le flux général jusqu'à la création de services.
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
J'ai essayé de résumer la manière logique de penser l'orientation objet.