Esercizio - Forward pass e conteggio dei parametri di una rete
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 4
Testo.
- Rete : strato nascosto con ReLU, uscita con softmax. Pesi , , , . Ingresso , classe vera . Si calcolino le probabilità di uscita e la cross-entropy.
- La rete del secondo appello (guasti di un macchinario) ha 7 attributi in ingresso e la struttura: Dense(, ReLU), BatchNormalization, Dropout(), Dense(, ReLU), BatchNormalization, Dense(, sigmoide). Si contino i parametri totali, addestrabili e non addestrabili.
- Quanti parametri ha la rete MNIST del laboratorio? E se si aggiunge un secondo strato nascosto da neuroni?
Teoria usata: 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 →, Operazioni tra matriciLe matrici m×n formano uno spazio vettoriale (somma e prodotto per scalare elemento per elemento); il prodotto righe per colonne corrisponde alla composizione di funzioni lineari, è associativo ma non commutativo; la trasposta scambia righe e colonne e (AB)^T = B^T A^T.Operazioni tra matrici →.
1. Forward pass
Strato nascosto. :
- primo neurone: ;
- secondo neurone: .
Quindi e, con ReLU, (il secondo neurone è spento).
Strato di uscita. :
- primo: ;
- secondo: .
Softmax. e , somma : . La somma è .
Cross-entropy con classe vera (one-hot ): . Se la classe vera fosse la la perdita sarebbe : una previsione sicura e sbagliata costa molto.
2. Parametri della rete per i guasti
Si usa la regola: Dense con ingressi e uscite ha parametri; la batch normalization su unità ha parametri: e (addestrabili, ) più media e varianza mobili (non addestrabili, ). Dropout non ha parametri.
| strato | uscita | parametri | di cui addestrabili |
|---|---|---|---|
| Dense | |||
| BatchNorm | |||
| Dropout | |||
| Dense | |||
| BatchNorm | |||
| Dense |
Totale ; addestrabili ; non addestrabili (le medie e varianze mobili: ).
3. La rete MNIST
e : parametri, come stampa model.summary() (Flatten e Dropout valgono ).
Con un secondo nascosto da : ; ; . Totale . Il secondo strato aggiunge parametri: più capacità, quindi più rischio di overfitting (Regolarizzazione delle reti neuraliUna rete con tanti parametri tende a memorizzare il training set (overfitting): la loss di training scende ma quella di validazione risale. Le tecniche di regolarizzazione limitano la capacità effettiva: penalità sui pesi ($\ell_2$: $J+\lambda|W|_2^2$, il passo diventa $W\leftarrow(1-2\eta\lambda)W-\eta\nabla J$; $\ell_1$: $J+\lambda|W|_1$, porta pesi esattamente a zero), early stopping (si ferma l'addestramento quando la validation loss smette di scendere, con pazienza e ripristino dei pesi migliori), dropout (in training si azzera a caso una frazione $p$ delle attivazioni e si riscala per $1/(1-p)$; in inferenza è spento), batch normalization (effetto collaterale) e data augmentation. Nel lab MNIST con $\lambda=0{,}01$ la penalità $\ell_1$ è troppo forte (accuratezza di test 0,844 contro 0,9815 senza regolarizzazione), mentre dropout e early stopping non peggiorano e tengono la validation loss più bassa.Regolarizzazione delle reti neurali →).
Controllo con il codice
import numpy as np
x = np.array([1., -1., 2.])
W1 = np.array([[1, 0, 1], [-1, 2, 0]]); b1 = np.array([0., 1.])
a1 = np.maximum(W1 @ x + b1, 0)
W2 = np.array([[.5, 1], [-.5, 0]]); b2 = np.array([0., .2])
z2 = W2 @ a1 + b2
p = np.exp(z2) / np.exp(z2).sum()
print(a1, z2, p, -np.log(p[0])) # [3. 0.] [ 1.5 -1.3] [0.9427 0.0573] 0.0590