Salta al contenuto
Note per Studenti Esercizio - Backpropagation a mano su una rete 2-2-1

Esercizio - Backpropagation a mano su una rete 2-2-1

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

In questa pagina 5

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,50,30,8]W^{(1)}=\begin{bmatrix}0{,}5&-0{,}5\\0{,}3&0{,}8\end{bmatrix}, b(1)=(0,0)b^{(1)}=(0,0), w(2)=(1,−1)w^{(2)}=(1,-1), b(2)=0,1b^{(2)}=0{,}1. Un campione x=(1; 0,5)x=(1;\,0{,}5) con y=1y=1.

  1. Forward pass: z(1)z^{(1)}, a(1)a^{(1)}, z(2)z^{(2)}, y^\hat y e la loss.
  2. Backpropagation: tutti i gradienti.
  3. Un passo di discesa del gradiente con η=0,5\eta=0{,}5 e la nuova loss.
  4. 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)}:

  • z1(1)=0,5⋅1−0,5⋅0,5=0,25z^{(1)}_1=0{,}5\cdot1-0{,}5\cdot0{,}5=0{,}25;
  • z2(1)=0,3⋅1+0,8⋅0,5=0,70z^{(1)}_2=0{,}3\cdot1+0{,}8\cdot0{,}5=0{,}70.

Attivazioni sigmoidi: a1=σ(0,25)=0,5622a_1=\sigma(0{,}25)=0{,}5622, a2=σ(0,70)=0,6682a_2=\sigma(0{,}70)=0{,}6682.

Uscita. z(2)=w(2)⋅a(1)+b(2)=1⋅0,5622−1⋅0,6682+0,1=−0,0060z^{(2)}=w^{(2)}\cdot a^{(1)}+b^{(2)}=1\cdot0{,}5622-1\cdot0{,}6682+0{,}1=-0{,}0060; y^=σ(−0,0060)=0,4985\hat y=\sigma(-0{,}0060)=0{,}4985.

Loss. y=1y=1: L=−ln⁡y^=−ln⁡0,4985=0,6962L=-\ln\hat y=-\ln0{,}4985=0{,}6962. (La rete è quasi indecisa: y^≈0,5\hat y\approx0{,}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 (la semplificazione σ′\sigma' è dimostrata nella teoria).

Gradienti dell'uscita. Poiché z(2)=w1a1+w2a2+b(2)z^{(2)}=w_1a_1+w_2a_2+b^{(2)}:

  • ∂L/∂w1=δ(2)a1=−0,5015⋅0,5622=−0,2819\partial L/\partial w_1=\delta^{(2)}a_1=-0{,}5015\cdot0{,}5622=-0{,}2819;
  • ∂L/∂w2=δ(2)a2=−0,5015⋅0,6682=−0,3351\partial L/\partial w_2=\delta^{(2)}a_2=-0{,}5015\cdot0{,}6682=-0{,}3351;
  • ∂L/∂b(2)=δ(2)=−0,5015\partial L/\partial b^{(2)}=\delta^{(2)}=-0{,}5015.

Strato nascosto. Si porta indietro l'errore: ∂L/∂aj=δ(2)wj\partial L/\partial a_j=\delta^{(2)}w_j, poi si moltiplica per la derivata della sigmoide aj(1−aj)a_j(1-a_j):

  • δ1(1)=δ(2) w1 a1(1−a1)=−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;
  • δ2(1)=δ(2) w2 a2(1−a2)=−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.

Gradienti dei pesi del primo strato (∂L/∂Wij(1)=δi(1)xj\partial L/\partial W^{(1)}_{ij}=\delta^{(1)}_ix_j, ∂L/∂bi(1)=δi(1)\partial L/\partial b^{(1)}_i=\delta^{(1)}_i):

∂L∂W(1)=[−0,1234⋅1−0,1234⋅0,50,1112⋅10,1112⋅0,5]=[−0,1234−0,06170,11120,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).

3. Passo di discesa (η=0,5\eta=0{,}5)

Ogni parametro θ←θ−η ∂L/∂θ\theta\leftarrow\theta-\eta\,\partial L/\partial\theta:

  • W(1)←[0,5+0,0617−0,5+0,03090,3−0,05560,8−0,0278]=[0,5617−0,46910,24440,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};
  • b(1)←(0,0617; −0,0556)b^{(1)}\leftarrow(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);
  • b(2)←0,1+0,5⋅0,5015=0,3508b^{(2)}\leftarrow0{,}1+0{,}5\cdot0{,}5015=0{,}3508.

Nuova loss. Si rifà il forward pass con i nuovi pesi: z1=0,5617⋅1−0,4691⋅0,5+0,0617=0,3888z_1=0{,}5617\cdot1-0{,}4691\cdot0{,}5+0{,}0617=0{,}3888, z2=0,2444+0,7722⋅0,5−0,0556=0,5749z_2=0{,}2444+0{,}7722\cdot0{,}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); z(2)=1,1410⋅0,5960−0,8325⋅0,6399+0,3508=0,4981z^{(2)}=1{,}1410\cdot0{,}5960-0{,}8325\cdot0{,}6399+0{,}3508=0{,}4981; y^=σ(0,4981)=0,6220\hat y=\sigma(0{,}4981)=0{,}6220; L=−ln⁡0,6220=0,4748L=-\ln0{,}6220=0{,}4748. La loss è scesa da 0,69620{,}6962 a 0,47480{,}4748 e y^\hat y si è avvicinato a y=1y=1.

4. Verifica con la differenza finita

Si controlla ∂L/∂W11(1)\partial L/\partial W^{(1)}_{11}: si somma ε=10−6\varepsilon=10^{-6} a W11(1)W^{(1)}_{11} e si ricalcola la loss: (L(W11+ε)−L(W11))/ε≈−0,12344\big(L(W_{11}+\varepsilon)-L(W_{11})\big)/\varepsilon\approx-0{,}12344, uguale al valore analitico −0,1234-0{,}1234. Analogamente per w1(2)w_1^{(2)}: −0,28193-0{,}28193 contro −0,2819-0{,}2819. È il metodo standard (gradient checking) per scovare errori nell'implementazione della backpropagation.

Codice di controllo

python
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))     # -0.5015  [-0.2819 -0.3351]  [[-0.1234 -0.0617] [ 0.1112  0.0556]]

Lezioni in cui compare

Teoria collegata