Salta al contenuto
Note per Studenti Esercizio - Discesa del gradiente, momento e Adam a mano

Esercizio - Discesa del gradiente, momento e Adam a mano

Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.

In questa pagina 6

Testo. Si minimizza J(w)=(w−3)2J(w)=(w-3)^2 partendo da w0=0w_0=0.

  1. Discesa del gradiente con η=0,1\eta=0{,}1: i primi quattro passi. Per quali η\eta converge?
  2. SGD con momento (ρ=0,9\rho=0{,}9, α=0,1\alpha=0{,}1): i primi quattro passi.
  3. Adam (α=0,1\alpha=0{,}1, β1=0,9\beta_1=0{,}9, β2=0,999\beta_2=0{,}999, ε≈0\varepsilon\approx0): i primi tre passi.
  4. RMSProp (decadimento 0,90{,}9, α=0,1\alpha=0{,}1) e AdaGrad (α=0,1\alpha=0{,}1): il primo e il secondo passo.
  5. Quante iterazioni per epoca fa un mini-batch da B=64B=64 su n=60 000n=60\,000 campioni?

Teoria usata: Addestramento delle reti neurali - backpropagation e ottimizzatoriAddestrare una rete significa minimizzare la loss empirica $J(W)=\frac1n\sum_i\mathcal L(f(x^{(i)};W),y^{(i)})$ con la discesa del gradiente $W\leftarrow W-\eta,\partial J/\partial W$; in pratica a mini-batch (SGD). Il gradiente di tutti i pesi si ottiene con la backpropagation, cioè la regola della catena applicata all'indietro: $\delta^{(L)}=\partial J/\partial a^{(L)}\odot g'(z^{(L)})$, $\delta^{(l)}=(W^{(l+1)\top}\delta^{(l+1)})\odot g'(z^{(l)})$, $\partial J/\partial W^{(l)}=\delta^{(l)}a^{(l-1)\top}$ (con sigmoide e cross-entropy $\delta=\hat y-y$). Per far funzionare reti profonde: attivazioni ReLU, inizializzazione di Xavier o He (varianza $2/(n_{in}+n_{out})$ e $2/n_{in}$), batch normalization, ottimizzatori con momento o adattivi (Momentum, AdaGrad, RMSProp, Adam con $\beta_1=0{,}9$, $\beta_2=0{,}999$, lr $10^{-3}$) e un learning rate che varia nel tempo (a gradini, coseno). Si addestra tenendo d'occhio la loss di training e di validazione.Addestramento delle reti neurali - backpropagation e ottimizzatori →, Gradiente e direzione di massima crescitaIl gradiente è il vettore delle derivate parziali ∇f(p) = (∂₁f(p), …, ∂ₙf(p)). Se f è C¹ (derivate parziali continue) vale la formula del gradiente D_u f(p) = ∇f(p)·u: tutte le derivate direzionali si ottengono dalle parziali e u ↦ D_u f(p) è lineare. Tra i versori, la crescita è massima lungo ∇f/|∇f| (pendenza |∇f|), minima lungo −∇f/|∇f| (pendenza −|∇f|), nulla lungo le direzioni ortogonali al gradiente. Utili: ∇|x| = x/|x|, ∇φ(|x|) = φ'(|x|) x/|x|.Gradiente e direzione di massima crescita →, Derivata - definizione e significatoLa derivata è il limite del rapporto incrementale; geometricamente è la pendenza della retta tangente. f è derivabile in x0 se e solo se f(x) = f(x0) + f'(x0)(x − x0) + o(x − x0); derivabile implica continua, non viceversa. Derivata destra e sinistra, punti angolosi, flessi a tangente verticale, cuspidi.Derivata - definizione e significato →.

Il gradiente è g(w)=J′(w)=2(w−3)g(w)=J'(w)=2(w-3).

1. Discesa del gradiente

Regola: w←w−η g(w)=w−0,1⋅2(w−3)=0,8 w+0,6w\leftarrow w-\eta\,g(w)=w-0{,}1\cdot2(w-3)=0{,}8\,w+0{,}6.

passo ww JJ
00 00 99
11 0,60{,}6 5,765{,}76
22 1,081{,}08 3,693{,}69
33 1,4641{,}464 2,362{,}36
44 1,7711{,}771 1,511{,}51

La distanza dal minimo si moltiplica per 1−2η1-2\eta a ogni passo: w−3←(1−2η)(w−3)w-3\leftarrow(1-2\eta)(w-3). Converge se ∣1−2η∣<1|1-2\eta|<1, cioè 0<η<10<\eta<1; per η=0,5\eta=0{,}5 arriva al minimo in un passo; per η>1\eta>1 la distanza cresce in modulo e il segno alterna (divergenza).

2. Momento

Regole: v←ρv+g(w)v\leftarrow\rho v+g(w), w←w−αvw\leftarrow w-\alpha v, con v0=0v_0=0.

passo gradiente gg velocità vv ww
11 −6-6 0,9⋅0−6=−60{,}9\cdot0-6=-6 0+0,6=0,60+0{,}6=0{,}6
22 2(0,6−3)=−4,82(0{,}6-3)=-4{,}8 0,9⋅(−6)−4,8=−10,20{,}9\cdot(-6)-4{,}8=-10{,}2 0,6+1,02=1,620{,}6+1{,}02=1{,}62
33 2(1,62−3)=−2,762(1{,}62-3)=-2{,}76 0,9⋅(−10,2)−2,76=−11,940{,}9\cdot(-10{,}2)-2{,}76=-11{,}94 1,62+1,194=2,8141{,}62+1{,}194=2{,}814
44 2(2,814−3)=−0,3722(2{,}814-3)=-0{,}372 0,9⋅(−11,94)−0,372=−11,1180{,}9\cdot(-11{,}94)-0{,}372=-11{,}118 2,814+1,112=3,9262{,}814+1{,}112=3{,}926

Il primo passo coincide con la discesa semplice (0,60{,}6). Poi la velocità accumulata fa superare il minimo (w4=3,926>3w_4=3{,}926>3): il momento accelera ma può oltrepassare; successivamente il gradiente cambia segno e la velocità si smorza. Nella discesa semplice w4=1,771w_4=1{,}771: il momento è molto più avanti.

3. Adam

Regole: mt=β1mt−1+(1−β1)gtm_t=\beta_1m_{t-1}+(1-\beta_1)g_t, vt=β2vt−1+(1−β2)gt2v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2, m^t=mt/(1−β1t)\hat m_t=m_t/(1-\beta_1^t), v^t=vt/(1−β2t)\hat v_t=v_t/(1-\beta_2^t), w←w−α m^t/v^tw\leftarrow w-\alpha\,\hat m_t/\sqrt{\hat v_t}.

  • Passo 1. g1=−6g_1=-6: m1=−0,6m_1=-0{,}6, v1=0,001⋅36=0,036v_1=0{,}001\cdot36=0{,}036; m^1=−0,6/0,1=−6\hat m_1=-0{,}6/0{,}1=-6, v^1=0,036/0,001=36\hat v_1=0{,}036/0{,}001=36; m^1/v^1=−6/6=−1\hat m_1/\sqrt{\hat v_1}=-6/6=-1, quindi w1=0+0,1=0,1w_1=0+0{,}1=0{,}1. Il primo passo ha ampiezza α\alpha, qualunque sia la scala del gradiente.
  • Passo 2. g2=2(0,1−3)=−5,8g_2=2(0{,}1-3)=-5{,}8: m2=0,9(−0,6)+0,1(−5,8)=−1,12m_2=0{,}9(-0{,}6)+0{,}1(-5{,}8)=-1{,}12, v2=0,999⋅0,036+0,001⋅33,64=0,06960v_2=0{,}999\cdot0{,}036+0{,}001\cdot33{,}64=0{,}06960; m^2=−1,12/(1−0,81)=−5,895\hat m_2=-1{,}12/(1-0{,}81)=-5{,}895, v^2=0,0696/(1−0,998001)=34,82\hat v_2=0{,}0696/(1-0{,}998001)=34{,}82, v^2=5,901\sqrt{\hat v_2}=5{,}901; rapporto −0,999-0{,}999, w2=0,1+0,0999=0,1999w_2=0{,}1+0{,}0999=0{,}1999.
  • Passo 3. g3=2(0,1999−3)=−5,600g_3=2(0{,}1999-3)=-5{,}600: dopo le correzioni m^3=−5,786\hat m_3=-5{,}786, v^3=33,67\hat v_3=33{,}67, rapporto −0,997-0{,}997, w3=0,2996w_3=0{,}2996.

Adam avanza circa α=0,1\alpha=0{,}1 per passo (il rapporto m^/v^≈±1\hat m/\sqrt{\hat v}\approx\pm1 quando il gradiente ha segno costante), a prescindere dalla grandezza del gradiente. Con α=0,1\alpha=0{,}1 servono circa 3030 passi per arrivare a w≈3w\approx3, più lento qui della discesa semplice (che lo fa in meno passi su questo problema comodo), ma robusto su problemi con scale di gradiente molto diverse tra i parametri.

4. RMSProp e AdaGrad

RMSProp. s←0,9 s+0,1 g2s\leftarrow0{,}9\,s+0{,}1\,g^2, w←w−α g/sw\leftarrow w-\alpha\,g/\sqrt s.

  • Passo 1: g=−6g=-6, s=0,1⋅36=3,6s=0{,}1\cdot36=3{,}6, s=1,897\sqrt s=1{,}897; w1=0+0,1⋅6/1,897=0,316w_1=0+0{,}1\cdot6/1{,}897=0{,}316.
  • Passo 2: g=2(0,316−3)=−5,367g=2(0{,}316-3)=-5{,}367; s=0,9⋅3,6+0,1⋅28,81=6,121s=0{,}9\cdot3{,}6+0{,}1\cdot28{,}81=6{,}121, s=2,474\sqrt s=2{,}474; w2=0,316+0,1⋅5,367/2,474=0,533w_2=0{,}316+0{,}1\cdot5{,}367/2{,}474=0{,}533.

AdaGrad. s←s+g2s\leftarrow s+g^2, w←w−α g/sw\leftarrow w-\alpha\,g/\sqrt s.

  • Passo 1: s=36s=36, w1=0+0,1⋅6/6=0,1w_1=0+0{,}1\cdot6/6=0{,}1.
  • Passo 2: g=−5,8g=-5{,}8, s=36+33,64=69,64s=36+33{,}64=69{,}64, s=8,345\sqrt s=8{,}345; w2=0,1+0,1⋅5,8/8,345=0,1695w_2=0{,}1+0{,}1\cdot5{,}8/8{,}345=0{,}1695.

AdaGrad accumula ss senza dimenticare: il passo si rimpicciolisce a ogni iterazione (0,1; 0,0695; 0,0560{,}1;\,0{,}0695;\,0{,}056), che a lungo andare lo ferma. RMSProp, con la media mobile, tiene ss limitato e passi più grandi.

5. Iterazioni per epoca

⌈60 000/64⌉=⌈937,5⌉=938\lceil60\,000/64\rceil=\lceil937{,}5\rceil=938 iterazioni (l'ultimo batch ha 3232 campioni). Con B=32B=32 sarebbero 1 8751\,875.

Controllo con il codice

python
import numpy as np
g = lambda w: 2 * (w - 3)
w, m, v = 0., 0., 0.
for t in range(1, 4):                                  # Adam
    gr = g(w); m = .9*m + .1*gr; v = .999*v + .001*gr**2
    w -= .1 * (m/(1-.9**t)) / (np.sqrt(v/(1-.999**t)) + 1e-8)
    print(t, round(w, 4))                              # 0.1  0.1999  0.2996

Lezioni in cui compare

Teoria collegata