Skip to content
Snippets Groups Projects
Verified Commit f3313c9a authored by iliya.saroukha's avatar iliya.saroukha :first_quarter_moon:
Browse files

feat: Adam method done + trying out new functions + problems TODO

parent b6ec1040
No related branches found
No related tags found
No related merge requests found
Pipeline #32434 failed
...@@ -88,7 +88,8 @@ $$ {#eq-func-bol} ...@@ -88,7 +88,8 @@ $$ {#eq-func-bol}
$\text{n.b.}$ : Le gradient $\nabla$ de la fonction ci-dessus est accentué dans $\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 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 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 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)$. ...@@ -97,16 +98,16 @@ situant en $(x, y) = (0, 0)$.
:::: {#fig-basegd-lr layout="[[1], [1, 1]]"} :::: {#fig-basegd-lr layout="[[1], [1, 1]]"}
![$\lambda = 1 \cdot 10^{-1}$, $\text{iter} = 73$](./figs/f/lr_1e-1.svg){width=80%} ![$\lambda = 1 \cdot 10^{-1}$, $\text{iter} = 73$](./figs/f/lr_1e-1.svg){#fig-base-high-lr width="80%"}
![$\lambda = 1 \cdot 10^{-2}$, $\text{iter} = 798$](./figs/f/lr_1e-2.svg){width=80%} ![$\lambda = 1 \cdot 10^{-2}$, $\text{iter} = 798$](./figs/f/lr_1e-2.svg){#fig-base-mid-lr width="100%"}
![$\lambda = 1 \cdot 10^{-3}$, $\text{iter} = 8051$](./figs/f/lr_1e-3.svg){width=80%} ![$\lambda = 1 \cdot 10^{-3}$, $\text{iter} = 8051$](./figs/f/lr_1e-3.svg){#fig-base-low-lr width="100%"}
Variation de $\lambda$ lors de la descente simple 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 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 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 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 ...@@ -142,7 +143,7 @@ pas précédents. En effet si $\gamma = 0$, alors on aboutit à une descente de
gradient simple. gradient simple.
::: :::
:::: {#fig-momentum-gamma layout="[1,1]"} :::: {#fig-momentum-gamma layout="[1, 1]"}
![$\gamma = 0.1$](./figs/f/momentum_gamma_1e-1.svg){#fig-gamma-01} ![$\gamma = 0.1$](./figs/f/momentum_gamma_1e-1.svg){#fig-gamma-01}
...@@ -189,5 +190,217 @@ prochaine itération), **Nesterov** pré-calcule $\nabla{f}(\vec{x}_{k + 1})$ po ...@@ -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 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 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'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). 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}
![$\lambda = 0.01$, $\text{iter} = 2440$](./figs/f/adam_lr_1e-2.svg){#fig-adam-lr-low}
![$\lambda = 0.1$, $\text{iter} = 321$](./figs/f/adam_lr_1e-1.svg){#fig-adam-lr-mid}
![$\lambda = 0.7$, $\text{iter} = 307$](./figs/f/adamLR_7e-1.svg){#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]"}
![Graphes des descentes](./figs/f/graph.svg){#fig-graph-all-methods}
![Chemins empruntés par les diverses méthodes](./figs/f/topology.svg){#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]]"}
![Faible $\beta_{1}$ et $\beta_{2}$, $\text{iter} = 99'999$](./figs/f/adam_low_beta1_low_beta2.svg){#fig-adam-low-b1-low-b2}
![Faible $\beta_{1}$, $\beta_{2}$ normal, $\text{iter} = 46$](./figs/f/adam_low_beta1_standard_beta2.svg){#fig-adam-low-b1-standard-b2}
![$\beta_{1}$ normal, faible $\beta_{2}$, $\text{iter} = 99'999$](./figs/f/adam_standard_beta1_low_beta2.svg){#fig-standard-b1-low-b2}
![$\beta_{1}$ et $\beta_{2}$ conseillé](./figs/f/adam_standard_betas.svg){#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]"}
![Graphique de la fonction "puit"](./figs/puit/graph.svg){#fig-well-graph}
![Méthodes de descentes](./figs/puit/topology.svg){#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.
![Évolution de la valeur de la fonciton de coût](./figs/puit/cost_function.svg){#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]"}
![Graphique de la fonction Rosenbrock](./figs/rosenbrock/graph.svg){#fig-rosenbrock-graph width="80%"}
![Méthodes de descentes](./figs/rosenbrock/topology.svg){#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
![Graphique de la fonction Ackley](./figs/ackley/titlepage.svg){#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]]"}
![Descentes sur la fonction d'Ackley](./figs/ackley/graph.svg){#fig-ackley-graph-descent}
![Vue macroscopique des trajectoires](./figs/ackley/topology_macro.svg){#fig-ackley-topology-macro}
![Vue microscopique des trajectoires](./figs/ackley/topology_micro.svg){#fig-ackley-topology-micro width="80%"}
Descentes sur la fonction Ackley
::::
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment