diff --git a/report/report.qmd b/report/report.qmd index c151c2b8962b9326a77804f24edad0371156bb1a..3847259831202725fd3f87593abb995b8033180d 100644 --- a/report/report.qmd +++ b/report/report.qmd @@ -88,7 +88,8 @@ $$ {#eq-func-bol} $\text{n.b.}$ : Le gradient $\nabla$ de la fonction ci-dessus est accentué dans la direction de l'axe $y$ à l'aide du facteur $k = 5$. Ceci aura son importance -pour la visualisation de la méthode d'**Adam**. +pour lors de l'explication de la problématique des ravines ainsi que de la +visualisation de la méthode d'**Adam**. Sur les figures ci-dessous nous pouvons voir l'effet du _learning rate_ sur le nombre d'itérations de l'algorithme avant qu'on n'atteigne le minimum se @@ -97,16 +98,16 @@ situant en $(x, y) = (0, 0)$. :::: {#fig-basegd-lr layout="[[1], [1, 1]]"} -{width=80%} +{#fig-base-high-lr width="80%"} -{width=80%} +{#fig-base-mid-lr width="100%"} -{width=80%} +{#fig-base-low-lr width="100%"} Variation de $\lambda$ lors de la descente simple :::: -Dans le cas de la première figure, nous pouvons voir que suite aux grands pas +Dans le cas de la @fig-base-high-lr, nous pouvons voir que suite aux grands pas effectués à chaque itération, la trajectoire est saccadée même si le minimum est tout de même atteint. Le problème qui peut survenir suite à un $\lambda$ si grand est le fait de potentiellement passer au-delà d'un fossé qui puisse contenir @@ -142,7 +143,7 @@ pas précédents. En effet si $\gamma = 0$, alors on aboutit à une descente de gradient simple. ::: -:::: {#fig-momentum-gamma layout="[1,1]"} +:::: {#fig-momentum-gamma layout="[1, 1]"} {#fig-gamma-01} @@ -189,5 +190,217 @@ prochaine itération), **Nesterov** pré-calcule $\nabla{f}(\vec{x}_{k + 1})$ po corriger le grand pas effectuer par **Momentum** de sorte à pousser la trajectoire un peu plutôt dans la bonne direction vers le minimum. La @fig-nesterov l'illustre très bien, les deux trajectoires ont les mêmes tendances sauf que -l'orange (Nesterov) se "redresse" plutôt et atteint le minimum plus rapidement +l'orange (Nesterov) se "redresse" plus tôt et atteint le minimum plus rapidement que Momentum (205 contre 317 itérations). + +## Méthode d'Adam + +Finalement, nous pouvons introduire la dernière des quatres méthodes nommée +**Adam** (_Adapative Momentum_). Les avantages principaux de cette méthode sont +bien résumés dans son nom. Essayons donc de le décortiquer : + +- **_Adaptive_** $\rightarrow$ le principe "adaptatif" (ou dynamique) consiste à +tenter d'adapter le taux d'apprentissage par rapport aux spécificités de chaque +composantes / dimensions. En d'autres termes, le but est de diminuer le taux +d'apprentissage pour les dimensions ayant un fort gradient et inversément, +accentuer ce taux pour les dimensions ayant une faible variation. Ceci permet +notamment de palier à certaines problématiques qui peuvent survenir lors d'une +descente de gradient sur une fonction _non-isotropique_ (possédant des +asymétries au niveau des taux de variation de chaque dimension). + +- **_Momentum_** $\rightarrow$ cet aspect, contrairement à celui énoncé +précédemment, nous est à présent familier. En bref, il permet d'introduire un +phénomène d'_inertie_ en réduisant la fréquences des _pas_ (en faisant des plus +grands) lorsque le gradient présente une forte variation de sorte à accélerer +la convergence vers un minimum. + +### Variation du taux d'apprentissage $\lambda$ -- Adam + +:::: {#fig-adam-lr layout="[[1, 1], [1]]" width=80} + +{#fig-adam-lr-low} + +{#fig-adam-lr-mid} + +{#fig-adam-lr-high width="50%"} + +Variation du taux d'apprentissage -- Adam +:::: + +Grâce à la @fig-adam-lr, nous pouvons observer l'effet du _learning rate_ +$\lambda$ sur la vitesse de convergence de cette méthode. Ce à quoi il est +nécéssaire de prêter attention est le fait que la valeur de $0.01$ utilisée +pour ce paramètre par les méthodes précédentes s'avère être beaucoup trop +faible dans le cas d'Adam. Le minimum n'est atteint qu'au bout de $2440$ +itérations ce qui est approximativement trois fois plus que pour la méthode +simple. + +Ceci nous a donc pousser à augmenter cette valeur jusqu'à $\lambda = 0.7$. Cette +valeur pour le taux d'apprentissage s'est avéré être assez haute pour éviter +des itérations inutiles mais en même temps pas trop grande non plus afin de ne +pas rendre l'algorithme instable. + +### Comparaisons des descentes entre les quatres méthodes + +Les deux graphiques ci-dessous permettent à présent de servir de résumé sur +les diverses méthodes abordés à travers la visualisation des trajectoires +différentes qu'elles tracent. + +La méthode qui se distingue le plus reste quand même celle d'**Adam**, suite +au fait qu'elle prend en compte l'isotropie présente dans la fonction. En +l'occurrence, le gradient dans la direction de l'axe $y$ est beaucoup plus +prononcé que celui de l'axe $x$, or la trajectoire tracée par **Adam** ne +priorise pas forcément la dimension ayant la plus grande variation du gradient. +Cela lui permet donc de ne pas être "influencer" par une dimension en +particulier. Ceci est important car dans le cas d'une vraie fonction de coût, +il est possible que la dimension ayant en général une faible variation du +gradient possède à un moment un minimum plus important que les autres directions. + +:::: {#fig-all-methods layout="[1, 1]"} + +{#fig-graph-all-methods} + +{#fig-topology-all-methods} + +Comparaisons des méthodes de descente de gradient +:::: + +### Paramètres spécifiques + +**Adam** introduit deux nouveaux paramètres, $\beta_{1}$ et $\beta_{2}$, qui +permettent de modéliser ces notions de taux d'apprentissage adaptatif et +d'inertie. Nous allons à présent tenter de les faire varier même si les valeurs +conseillées dans le papier scientifique ["_Adam: A Method for Stochastic Optimization_"](https://arxiv.org/pdf/1412.6980) +sont respectivement $0.9$ et $0.999$. + +:::: {#fig-adam-betas layout="[[1, 1], [1, 1]]"} + +{#fig-adam-low-b1-low-b2} + +{#fig-adam-low-b1-standard-b2} + +{#fig-standard-b1-low-b2} + +{#fig-standard-b1-standard-b2} + +Influence des paramètres $\beta_{1}$ et $\beta_{2}$ sur la méthode d'Adam +:::: + +# Pièges + +Après avoir passer en revue les particularités de chaque algorithme de descente, +nous allons à présent parler de certains pièges auxquelles ces méthodes peuvent +faire face. Nous présenterons les problématiques des ravines, des plateaux ainsi +que des minimaux locaux. + +## Ravines + +Le problèmes des ravines auxquelles nous avons fait référence précédemment est +illustré à l'aide la @fig-base-high-lr. Suite au fait que la fonction +$f(x, y) = x^2 + 5y^2$ présente une non-isotropie (en d'autres termes le +gradient n'est pas uniforme dans toutes les dimensions), nous pouvons voir que +l'algorithme de descente simple avec un taux d'apprentissage de $\lambda = 0.1$ +arrive très rapidement à descendre dans la "vallée", au bout d'une **seule +itération** suite au fait que le gradient est très prononcé dans la direction +de l'axe $y$. Cependant pour pouvoir par la suite converger vers le minimum, +72 itérations supplémentaires sont nécessaires car le gradient dans la direction +de l'axe $x$ est comparativement très faible. + +## Plateaux + +## Minimums locaux + +# Descentes sur diverses fonctions + +Après avoir pu discuter de manière détaillée des diverses méthodes de descente +ainsi que de leurs implications sur la vitesse de convergence et les +trajectoires tracées, nous pouvons à présent un peu nous amuser en essayant de +trouver les minimums de fonctions non-triviales à l'aide des méthodes de +descente étudiées. + +## Le "puit" + +Ou plus communément connu sous le nom de : + +$$ +f(x, y) = 1 - \exp(-10x^2 - y^2) +$$ {#eq-func-well} + +:::: {#fig-well layout="[1,1]"} + +{#fig-well-graph} + +{#fig-well-topology} + +Descentes sur la fonction "puit" -- $f(x, y) = 1 - \exp(-10x^2 - y^2)$ +:::: + +### Valeur de la fonction de coût + +Le graphique ci-dessous permet d'illustrer clairement l'évolution de la valeur +de la fonction de coût $f$ par rapport au nombre d'itérations effectuées par +chaque méthode. Nous pouvons voir qu'**Adam** ait atteint le minimum en premier, +au bout de seulement $275$ itérations. **Momentum** et **Nesterov** sont tous deux +très similaires, $\sim 2'000$ itérations. Puis finalement la méthode de base qui +nécessité $17'452$ itérations pour y parvenir. + +{#fig-well-cost-function width="80%"} + +## Rosenbrock + +$$ +\text{Rosenbrock}(x, y) = (1 - x)^2 + (y - x^2)^2 +$$ {#eq-func-rosenbrock} + +:::: {#fig-rosenbrock layout="[1,1]"} + +{#fig-rosenbrock-graph width="80%"} + +{#fig-rosenbrock-topology width="80%"} + +Descentes sur la fonction Rosenbrock +:::: + +## Ackley + +Pour terminer en beauté, nous allons effectuer notre dernière descente sur une +fonction complexe, celle d'[Ackley](https://en.wikipedia.org/wiki/Ackley_function). +Cette fonction fut nommée après David Ackley, la personne l'ayant proposée dans +thèse de doctorat. + +$$ +\text{Ackley}(x, y) = -20\exp\left[-0.2\sqrt{0.5(x^2 + y^2)}\right] - \exp\left[0.5(\cos 2\pi x + \cos 2\pi y)\right] + e + 20 +$$ {#eq-func-ackley} + +::: {.callout-note} +La fonction d'Ackley est souvent utilisé comme outil de test pour les +algorithmes d'optimisation car elle permet d'illustrer le piège créé par la +présence d'une grande quantité de minimums locaux. Le but à atteindre est son +minimum global en $(0, 0)$. +::: + +### Graphique de la fonction + +{#fig-ackley-graph} + +### Descente sur la fonction d'Ackley + +Les graphiques ci-dessous permettent d'illustrer le comportement des divers +algorithmes lors de la descente sur la fonction d'Ackley. Sur la @fig-ackley-topology-micro +nous pouvons très clairement voir que les descentes simple, Momentum et Nesterov +sont toutes restées coincées dans un minimum local. La seule méthode qui a su +passer au-delà de ce minimum est **Adam**. Après $1 \cdot 10^{5}$ itérations, +le minimum global n'a tout de même pas pu être atteint cependant, Adam s'est +retrouvé dans le fossé global. Avec plus d'itérations, il est très probable +qu'Adam aurait convergé sur le minimum en $(0, 0)$. + +:::: {#fig-ackley layout="[[1, 1], [1]]"} + +{#fig-ackley-graph-descent} + +{#fig-ackley-topology-macro} + +{#fig-ackley-topology-micro width="80%"} + +Descentes sur la fonction Ackley +::::