Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
G
gradient_descent
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ISC2
maths
gradient_descent
Commits
f3313c9a
Verified
Commit
f3313c9a
authored
11 months ago
by
iliya.saroukha
Browse files
Options
Downloads
Patches
Plain Diff
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
11 months ago
Stage: build
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
report/report.qmd
+220
-7
220 additions, 7 deletions
report/report.qmd
with
220 additions
and
7 deletions
report/report.qmd
+
220
−
7
View file @
f3313c9a
...
@@ -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]]"}
{width=80%}
{
#fig-base-high-lr
width=
"
80%
"
}
{width=
8
0%}
{
#fig-base-mid-lr
width=
"10
0%
"
}
{width=
8
0%}
{
#fig-base-low-lr
width=
"10
0%
"
}
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]"}
{#fig-gamma-01}
{#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" plu
s
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}
{#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
::::
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment