Corsi di laurea › Altre materie › Machine Learning › 7. Reti neurali e deep learning
Esercizio - Backpropagation a mano su una rete 2-2-1 Segna come studiato
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 5 1. Forward pass 2. Backpropagation 3. Passo di discesa (η = 0 , 5 \eta=0{,}5 η = 0 , 5 ) 4. Verifica con la differenza finita Codice di controllo
Testo. Rete con due ingressi, due neuroni nascosti con sigmoide e un neurone di uscita con sigmoide; loss cross-entropy binaria. Pesi: W ( 1 ) = [ 0 , 5 − 0 , 5 0 , 3 0 , 8 ] W^{(1)}=\begin{bmatrix}0{,}5&-0{,}5\\0{,}3&0{,}8\end{bmatrix} W ( 1 ) = [ 0 , 5 0 , 3 − 0 , 5 0 , 8 ] , b ( 1 ) = ( 0 , 0 ) b^{(1)}=(0,0) b ( 1 ) = ( 0 , 0 ) , w ( 2 ) = ( 1 , − 1 ) w^{(2)}=(1,-1) w ( 2 ) = ( 1 , − 1 ) , b ( 2 ) = 0 , 1 b^{(2)}=0{,}1 b ( 2 ) = 0 , 1 . Un campione x = ( 1 ; 0 , 5 ) x=(1;\,0{,}5) x = ( 1 ; 0 , 5 ) con y = 1 y=1 y = 1 .
Forward pass: z ( 1 ) z^{(1)} z ( 1 ) , a ( 1 ) a^{(1)} a ( 1 ) , z ( 2 ) z^{(2)} z ( 2 ) , y ^ \hat y y ^ e la loss.
Backpropagation: tutti i gradienti.
Un passo di discesa del gradiente con η = 0 , 5 \eta=0{,}5 η = 0 , 5 e la nuova loss.
Verifica di un gradiente con la differenza finita.
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 → , Reti neurali - neuroni e funzioni di attivazioneUn neurone calcola $\hat y=g(w_0+w^\top x)$: somma pesata degli ingressi più bias, poi una funzione di attivazione $g$ non lineare (Perceptron a soglia, sigmoide, tanh, ReLU e varianti). Senza non linearità ogni rete è equivalente a un solo modello lineare. Una rete feed-forward impila strati di neuroni: $a^{(k)}=g(W^{(k)}a^{(k-1)}+b^{(k)})$; con uno strato nascosto è già un approssimatore universale, ma più strati rappresentano funzioni complesse con molti meno neuroni e imparano feature gerarchiche (bordi, parti, oggetti). Lo strato di uscita e la loss si scelgono dal compito: lineare+MSE (regressione), sigmoide+cross-entropy binaria, softmax+cross-entropy (multiclasse). Il numero di parametri di uno strato denso è $n_{in}n_{out}+n_{out}$. Nel lab (Keras, MNIST) una rete 784-512-10 ha 407 050 parametri e supera il 98% di accuratezza.Reti neurali - neuroni e funzioni di attivazione → , Regola della catena in più variabiliSe x(t) è una curva derivabile e f è differenziabile in x(t₀), allora (f∘x)'(t₀) = ∇f(x(t₀))·x'(t₀) = Σ ∂ᵢf(x(t₀)) xᵢ'(t₀): la variazione di f lungo il moto è il gradiente per la velocità. Serve per derivare composte come f(2t, t²), per ricavare il gradiente da informazioni lungo curve, per le derivate di f(g(s,t)) e per provare che il gradiente è ortogonale alle curve di livello.Regola della catena in più variabili → , Regole di derivazioneDerivate delle funzioni elementari e delle loro inverse (arcsin, arctan, settcosh...) e regole di calcolo: linearità, prodotto (Leibniz), quoziente, funzione composta (regola della catena), funzione inversa, f(x)^g(x).Regole di derivazione → .
1. Forward pass
Strato nascosto. z ( 1 ) = W ( 1 ) x + b ( 1 ) z^{(1)}=W^{(1)}x+b^{(1)} z ( 1 ) = W ( 1 ) x + b ( 1 ) :
z 1 ( 1 ) = 0 , 5 ⋅ 1 − 0 , 5 ⋅ 0 , 5 = 0 , 25 z^{(1)}_1=0{,}5\cdot1-0{,}5\cdot0{,}5=0{,}25 z 1 ( 1 ) = 0 , 5 ⋅ 1 − 0 , 5 ⋅ 0 , 5 = 0 , 25 ;
z 2 ( 1 ) = 0 , 3 ⋅ 1 + 0 , 8 ⋅ 0 , 5 = 0 , 70 z^{(1)}_2=0{,}3\cdot1+0{,}8\cdot0{,}5=0{,}70 z 2 ( 1 ) = 0 , 3 ⋅ 1 + 0 , 8 ⋅ 0 , 5 = 0 , 70 .
Attivazioni sigmoidi: a 1 = σ ( 0 , 25 ) = 0 , 5622 a_1=\sigma(0{,}25)=0{,}5622 a 1 = σ ( 0 , 25 ) = 0 , 5622 , a 2 = σ ( 0 , 70 ) = 0 , 6682 a_2=\sigma(0{,}70)=0{,}6682 a 2 = σ ( 0 , 70 ) = 0 , 6682 .
Uscita. z ( 2 ) = w ( 2 ) ⋅ a ( 1 ) + b ( 2 ) = 1 ⋅ 0 , 5622 − 1 ⋅ 0 , 6682 + 0 , 1 = − 0 , 0060 z^{(2)}=w^{(2)}\cdot a^{(1)}+b^{(2)}=1\cdot0{,}5622-1\cdot0{,}6682+0{,}1=-0{,}0060 z ( 2 ) = w ( 2 ) ⋅ a ( 1 ) + b ( 2 ) = 1 ⋅ 0 , 5622 − 1 ⋅ 0 , 6682 + 0 , 1 = − 0 , 0060 ; y ^ = σ ( − 0 , 0060 ) = 0 , 4985 \hat y=\sigma(-0{,}0060)=0{,}4985 y ^ = σ ( − 0 , 0060 ) = 0 , 4985 .
Loss. y = 1 y=1 y = 1 : L = − ln y ^ = − ln 0 , 4985 = 0 , 6962 L=-\ln\hat y=-\ln0{,}4985=0{,}6962 L = − ln y ^ = − ln 0 , 4985 = 0 , 6962 . (La rete è quasi indecisa: y ^ ≈ 0 , 5 \hat y\approx0{,}5 y ^ ≈ 0 , 5 .)
2. Backpropagation
Uscita. Con sigmoide e cross-entropy δ ( 2 ) = ∂ L / ∂ z ( 2 ) = y ^ − y = 0 , 4985 − 1 = − 0 , 5015 \delta^{(2)}=\partial L/\partial z^{(2)}=\hat y-y=0{,}4985-1=-0{,}5015 δ ( 2 ) = ∂ L / ∂ z ( 2 ) = y ^ − y = 0 , 4985 − 1 = − 0 , 5015 (la semplificazione σ ′ \sigma' σ ′ è dimostrata nella teoria).
Gradienti dell'uscita. Poiché z ( 2 ) = w 1 a 1 + w 2 a 2 + b ( 2 ) z^{(2)}=w_1a_1+w_2a_2+b^{(2)} z ( 2 ) = w 1 a 1 + w 2 a 2 + b ( 2 ) :
∂ L / ∂ w 1 = δ ( 2 ) a 1 = − 0 , 5015 ⋅ 0 , 5622 = − 0 , 2819 \partial L/\partial w_1=\delta^{(2)}a_1=-0{,}5015\cdot0{,}5622=-0{,}2819 ∂ L / ∂ w 1 = δ ( 2 ) a 1 = − 0 , 5015 ⋅ 0 , 5622 = − 0 , 2819 ;
∂ L / ∂ w 2 = δ ( 2 ) a 2 = − 0 , 5015 ⋅ 0 , 6682 = − 0 , 3351 \partial L/\partial w_2=\delta^{(2)}a_2=-0{,}5015\cdot0{,}6682=-0{,}3351 ∂ L / ∂ w 2 = δ ( 2 ) a 2 = − 0 , 5015 ⋅ 0 , 6682 = − 0 , 3351 ;
∂ L / ∂ b ( 2 ) = δ ( 2 ) = − 0 , 5015 \partial L/\partial b^{(2)}=\delta^{(2)}=-0{,}5015 ∂ L / ∂ b ( 2 ) = δ ( 2 ) = − 0 , 5015 .
Strato nascosto. Si porta indietro l'errore: ∂ L / ∂ a j = δ ( 2 ) w j \partial L/\partial a_j=\delta^{(2)}w_j ∂ L / ∂ a j = δ ( 2 ) w j , poi si moltiplica per la derivata della sigmoide a j ( 1 − a j ) a_j(1-a_j) a j ( 1 − a j ) :
δ 1 ( 1 ) = δ ( 2 ) w 1 a 1 ( 1 − a 1 ) = − 0 , 5015 ⋅ 1 ⋅ 0 , 5622 ⋅ 0 , 4378 = − 0 , 5015 ⋅ 0 , 2461 = − 0 , 1234 \delta^{(1)}_1=\delta^{(2)}\,w_1\,a_1(1-a_1)=-0{,}5015\cdot1\cdot0{,}5622\cdot0{,}4378=-0{,}5015\cdot0{,}2461=-0{,}1234 δ 1 ( 1 ) = δ ( 2 ) w 1 a 1 ( 1 − a 1 ) = − 0 , 5015 ⋅ 1 ⋅ 0 , 5622 ⋅ 0 , 4378 = − 0 , 5015 ⋅ 0 , 2461 = − 0 , 1234 ;
δ 2 ( 1 ) = δ ( 2 ) w 2 a 2 ( 1 − a 2 ) = − 0 , 5015 ⋅ ( − 1 ) ⋅ 0 , 6682 ⋅ 0 , 3318 = 0 , 5015 ⋅ 0 , 2217 = 0 , 1112 \delta^{(1)}_2=\delta^{(2)}\,w_2\,a_2(1-a_2)=-0{,}5015\cdot(-1)\cdot0{,}6682\cdot0{,}3318=0{,}5015\cdot0{,}2217=0{,}1112 δ 2 ( 1 ) = δ ( 2 ) w 2 a 2 ( 1 − a 2 ) = − 0 , 5015 ⋅ ( − 1 ) ⋅ 0 , 6682 ⋅ 0 , 3318 = 0 , 5015 ⋅ 0 , 2217 = 0 , 1112 .
Gradienti dei pesi del primo strato (∂ L / ∂ W i j ( 1 ) = δ i ( 1 ) x j \partial L/\partial W^{(1)}_{ij}=\delta^{(1)}_ix_j ∂ L / ∂ W ij ( 1 ) = δ i ( 1 ) x j , ∂ L / ∂ b i ( 1 ) = δ i ( 1 ) \partial L/\partial b^{(1)}_i=\delta^{(1)}_i ∂ L / ∂ b i ( 1 ) = δ i ( 1 ) ):
∂ L ∂ W ( 1 ) = [ − 0 , 1234 ⋅ 1 − 0 , 1234 ⋅ 0 , 5 0 , 1112 ⋅ 1 0 , 1112 ⋅ 0 , 5 ] = [ − 0 , 1234 − 0 , 0617 0 , 1112 0 , 0556 ] , ∂ L ∂ b ( 1 ) = ( − 0 , 1234 ; 0 , 1112 ) . \frac{\partial L}{\partial W^{(1)}}=\begin{bmatrix}-0{,}1234\cdot1&-0{,}1234\cdot0{,}5\\0{,}1112\cdot1&0{,}1112\cdot0{,}5\end{bmatrix}=\begin{bmatrix}-0{,}1234&-0{,}0617\\0{,}1112&0{,}0556\end{bmatrix},\qquad\frac{\partial L}{\partial b^{(1)}}=(-0{,}1234;\ 0{,}1112). ∂ W ( 1 ) ∂ L = [ − 0 , 1234 ⋅ 1 0 , 1112 ⋅ 1 − 0 , 1234 ⋅ 0 , 5 0 , 1112 ⋅ 0 , 5 ] = [ − 0 , 1234 0 , 1112 − 0 , 0617 0 , 0556 ] , ∂ b ( 1 ) ∂ L = ( − 0 , 1234 ; 0 , 1112 ) .
3. Passo di discesa (η = 0 , 5 \eta=0{,}5 η = 0 , 5 )
Ogni parametro θ ← θ − η ∂ L / ∂ θ \theta\leftarrow\theta-\eta\,\partial L/\partial\theta θ ← θ − η ∂ L / ∂ θ :
W ( 1 ) ← [ 0 , 5 + 0 , 0617 − 0 , 5 + 0 , 0309 0 , 3 − 0 , 0556 0 , 8 − 0 , 0278 ] = [ 0 , 5617 − 0 , 4691 0 , 2444 0 , 7722 ] W^{(1)}\leftarrow\begin{bmatrix}0{,}5+0{,}0617&-0{,}5+0{,}0309\\0{,}3-0{,}0556&0{,}8-0{,}0278\end{bmatrix}=\begin{bmatrix}0{,}5617&-0{,}4691\\0{,}2444&0{,}7722\end{bmatrix} W ( 1 ) ← [ 0 , 5 + 0 , 0617 0 , 3 − 0 , 0556 − 0 , 5 + 0 , 0309 0 , 8 − 0 , 0278 ] = [ 0 , 5617 0 , 2444 − 0 , 4691 0 , 7722 ] ;
b ( 1 ) ← ( 0 , 0617 ; − 0 , 0556 ) b^{(1)}\leftarrow(0{,}0617;\ -0{,}0556) b ( 1 ) ← ( 0 , 0617 ; − 0 , 0556 ) ;
w ( 2 ) ← ( 1 + 0 , 5 ⋅ 0 , 2819 ; − 1 + 0 , 5 ⋅ 0 , 3351 ) = ( 1 , 1410 ; − 0 , 8325 ) w^{(2)}\leftarrow(1+0{,}5\cdot0{,}2819;\ -1+0{,}5\cdot0{,}3351)=(1{,}1410;\ -0{,}8325) w ( 2 ) ← ( 1 + 0 , 5 ⋅ 0 , 2819 ; − 1 + 0 , 5 ⋅ 0 , 3351 ) = ( 1 , 1410 ; − 0 , 8325 ) ;
b ( 2 ) ← 0 , 1 + 0 , 5 ⋅ 0 , 5015 = 0 , 3508 b^{(2)}\leftarrow0{,}1+0{,}5\cdot0{,}5015=0{,}3508 b ( 2 ) ← 0 , 1 + 0 , 5 ⋅ 0 , 5015 = 0 , 3508 .
Nuova loss. Si rifà il forward pass con i nuovi pesi: z 1 = 0 , 5617 ⋅ 1 − 0 , 4691 ⋅ 0 , 5 + 0 , 0617 = 0 , 3888 z_1=0{,}5617\cdot1-0{,}4691\cdot0{,}5+0{,}0617=0{,}3888 z 1 = 0 , 5617 ⋅ 1 − 0 , 4691 ⋅ 0 , 5 + 0 , 0617 = 0 , 3888 , z 2 = 0 , 2444 + 0 , 7722 ⋅ 0 , 5 − 0 , 0556 = 0 , 5749 z_2=0{,}2444+0{,}7722\cdot0{,}5-0{,}0556=0{,}5749 z 2 = 0 , 2444 + 0 , 7722 ⋅ 0 , 5 − 0 , 0556 = 0 , 5749 ; a = ( σ ( 0 , 3888 ) , σ ( 0 , 5749 ) ) = ( 0 , 5960 ; 0 , 6399 ) a=(\sigma(0{,}3888),\sigma(0{,}5749))=(0{,}5960;\ 0{,}6399) a = ( σ ( 0 , 3888 ) , σ ( 0 , 5749 )) = ( 0 , 5960 ; 0 , 6399 ) ; z ( 2 ) = 1 , 1410 ⋅ 0 , 5960 − 0 , 8325 ⋅ 0 , 6399 + 0 , 3508 = 0 , 4981 z^{(2)}=1{,}1410\cdot0{,}5960-0{,}8325\cdot0{,}6399+0{,}3508=0{,}4981 z ( 2 ) = 1 , 1410 ⋅ 0 , 5960 − 0 , 8325 ⋅ 0 , 6399 + 0 , 3508 = 0 , 4981 ; y ^ = σ ( 0 , 4981 ) = 0 , 6220 \hat y=\sigma(0{,}4981)=0{,}6220 y ^ = σ ( 0 , 4981 ) = 0 , 6220 ; L = − ln 0 , 6220 = 0 , 4748 L=-\ln0{,}6220=0{,}4748 L = − ln 0 , 6220 = 0 , 4748 . La loss è scesa da 0 , 6962 0{,}6962 0 , 6962 a 0 , 4748 0{,}4748 0 , 4748 e y ^ \hat y y ^ si è avvicinato a y = 1 y=1 y = 1 .
4. Verifica con la differenza finita
Si controlla ∂ L / ∂ W 11 ( 1 ) \partial L/\partial W^{(1)}_{11} ∂ L / ∂ W 11 ( 1 ) : si somma ε = 1 0 − 6 \varepsilon=10^{-6} ε = 1 0 − 6 a W 11 ( 1 ) W^{(1)}_{11} W 11 ( 1 ) e si ricalcola la loss: ( L ( W 11 + ε ) − L ( W 11 ) ) / ε ≈ − 0 , 12344 \big(L(W_{11}+\varepsilon)-L(W_{11})\big)/\varepsilon\approx-0{,}12344 ( L ( W 11 + ε ) − L ( W 11 ) ) / ε ≈ − 0 , 12344 , uguale al valore analitico − 0 , 1234 -0{,}1234 − 0 , 1234 . Analogamente per w 1 ( 2 ) w_1^{(2)} w 1 ( 2 ) : − 0 , 28193 -0{,}28193 − 0 , 28193 contro − 0 , 2819 -0{,}2819 − 0 , 2819 . È il metodo standard (gradient checking ) per scovare errori nell'implementazione della backpropagation.
Codice di controllo
python Copia
import numpy as np
sig = lambda z: 1 / (1 + np.exp(-z))
x = np.array([1. , .5 ]); W1 = np.array([[.5 , -.5 ], [.3 , .8 ]]); b1 = np.zeros(2 ); w2 = np.array([1. , -1. ]); b2 = .1 ; y = 1.
a1 = sig(W1 @ x + b1); yh = sig(w2 @ a1 + b2)
d2 = yh - y
d1 = (w2 * d2) * a1 * (1 - a1)
print (d2, d2 * a1, np.outer(d1, x))
Precedente Esercizio - Autoencoder, anomaly detection e KL del VAE Successiva Esercizio - CNN su Fashion-MNIST e CIFAR-10 con Keras