Regolarizzazione delle reti neurali
In questa pagina 7
Il problema è quello già visto per i modelli lineari (Overfitting, ridge regression e cross-validationUna buona prestazione sul training non basta: serve stimare quella su dati nuovi. La cross-validation (K-fold: $k$ parti, ciascuna a turno come test, errore medio; Monte Carlo: $k$ divisioni casuali con quota di test $q$; leave-one-out se $k=n$) evita di dipendere da una sola divisione casuale. L'errore atteso si scompone in $\text{bias}^2+\text{varianza}+\sigma^2$: i modelli semplici fanno underfitting (bias alto), quelli complessi overfitting (varianza alta). La regolarizzazione aggiunge alla perdita una penalità: la ridge regression minimizza $|y-X\beta|^2+\lambda\sum_{j\ge1}\beta_j^2$ e ha soluzione $\beta=(X^TX+\lambda\tilde I)^{-1}X^Ty$ (l'intercetta non si penalizza, le feature si standardizzano): riduce i coefficienti, rende l'inversa stabile con feature collineari, e $\lambda$ è un iperparametro scelto con la validazione (cross-validation annidata per non contaminare il test).Overfitting, ridge regression e cross-validation →, LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente →) ma amplificato: una rete con centinaia di migliaia di pesi, come i della rete MNIST di 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 →, ha capacità sufficiente per memorizzare il training set, rumore compreso.
1. Riconoscere l'overfitting
Si registrano a ogni epoca la loss (e l'accuratezza) sul training e su un insieme di validazione. All'inizio calano entrambe; a un certo punto la loss di training continua a scendere mentre quella di validazione smette di scendere e risale: da lì in poi la rete impara il rumore.
Grafico interattivo: Andamento tipico (schematico): la loss di training scende sempre, quella di validazione ha un minimo e poi risale; il minimo è il punto in cui fermarsi
Nel lab di Keras la rete senza regolarizzazione ha loss di training che scende da a in dieci epoche mentre la loss di validazione passa da a : segno chiaro di overfitting, anche se l'accuratezza di validazione resta quasi costante ().
2. Penalità sui pesi: e
Si aggiunge alla loss un termine che penalizza i pesi grandi. Una rete con pesi piccoli è meno sensibile a variazioni dell'ingresso (funzione più «liscia»).
Formula (regolarizzazione e ). Con forza della penalità:
L' è la ridge regression applicata ai pesi della rete; l' è il LASSO (nelle slide si rivede la formula ).
Grafico interattivo: Le due penalità su un singolo peso: w² (ℓ2) è piatta vicino a 0 e ripida lontano, |w| (ℓ1) ha pendenza costante e un angolo in 0
Cosa cambia nell'aggiornamento. La derivata di è , proporzionale a ; quella di è per (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 →), di modulo costante. Per il gradiente totale è , quindi
A ogni passo il peso viene prima ridotto di un fattore e poi spinto dal gradiente: per questo si parla di weight decay (decadimento dei pesi). Per il gradiente della penalità è , una riduzione di ampiezza costante verso zero indipendente da : i pesi poco utili raggiungono esattamente zero e la rete diventa sparsa. L' riduce molto i pesi grandi ma non li azzera.
Esempio. , (solo penalità), , . Con : per passo. Con : per passo, ma lo stesso passo vale per , che quindi in pochi passi arriva a .
In Keras la penalità si aggiunge strato per strato:
from tensorflow.keras import regularizers
Dense(512, activation="relu",
kernel_regularizer=regularizers.l2(0.01), # sui pesi
bias_regularizer=regularizers.l2(0.01)) # opzionale, anche sui biasScelta di . Troppo piccola: nessun effetto. Troppo grande: i pesi sono schiacciati e la rete va in underfitting. Nel lab con applicata a tutti i pesi e i bias di entrambi gli strati, l'accuratezza di test crolla a con e con (contro senza penalità): per questa rete e questo dataset è troppo. Come per ridge e LASSO, si sceglie per cross-validation/validazione, partendo da valori molto più piccoli (, ).
3. Early stopping
L'idea più semplice: fermare l'addestramento quando la loss di validazione smette di migliorare, anche se quella di training scende ancora. Si evita così la zona di overfitting senza alterare la loss.
Definizione (early stopping). Si monitora una metrica di validazione (
monitor, tipicamenteval_loss). Se non migliora perpatienceepoche consecutive l'addestramento si interrompe; conrestore_best_weights=Truesi ripristinano i pesi dell'epoca migliore.
from tensorflow.keras.callbacks import EarlyStopping
es = EarlyStopping(monitor="val_loss", patience=2, restore_best_weights=True)
model.fit(x_train, y_train, epochs=100, validation_split=0.1, callbacks=[es])La pazienza serve perché la validation loss è rumorosa e può peggiorare per un'epoca e poi migliorare. Il numero di epoche diventa un iperparametro che si sceglie da solo. Va usato un insieme di validazione distinto dal test, altrimenti il test non è più imparziale. Nel lab () l'accuratezza di test è .
4. Dropout
Definizione (dropout). Durante l'addestramento, a ogni passo e per ogni neurone di uno strato, con probabilità (la rate) l'uscita viene posta a . Gli altri neuroni sono riscalati per . In inferenza il dropout è spento e si usano tutti i neuroni.
Esempio. Attivazioni , , maschera estratta : l'uscita in training è . La riscalatura fa sì che il valore atteso (Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso →) di ogni attivazione sia lo stesso con e senza dropout (la maschera vale con probabilità e con probabilità ): . Per questo in inferenza non serve correggere nulla (versione «inverted dropout» usata da Keras e PyTorch).
Perché funziona.
- Nessun neurone può contare sempre sugli altri: si impedisce la co-adattazione delle feature (un neurone che corregge gli errori di un altro) e la rete rappresenta ogni concetto in modo ridondante.
- Equivale ad addestrare un insieme enorme di sotto-reti che condividono i pesi (a ogni passo una sotto-rete diversa) e a farne la media al test, come nel bagging (Metodi ensemble - bagging, random forest e boostingUn albero da solo ha varianza alta; un ensemble combina molti modelli deboli. Bagging: ogni albero è addestrato su un campione bootstrap (n estrazioni con rimpiazzo, circa il 63% di campioni distinti) e si vota o si fa la media: riduce la varianza, perché la media di $T$ stimatori con varianza $\sigma^2$ e correlazione $\rho$ ha varianza $\rho\sigma^2+(1-\rho)\sigma^2/T$. Random forest = bagging + a ogni split solo $\sqrt p$ feature casuali (alberi meno correlati); l'importanza di una feature è la somma delle riduzioni di Gini pesate sui nodi in cui è usata. Boosting: alberi in sequenza, ciascuno corregge gli errori dei precedenti, e si riduce il bias. Gradient boosting: $F\leftarrow F+\eta h$ con $h$ albero sui residui (gradiente negativo della perdita), $\eta$ piccolo; AdaBoost: stump e pesi sui campioni sbagliati; XGBoost: similarity score $\frac{(\sum r)^2}{N+\lambda}$, gain, potatura con $\gamma$, output $\frac{\sum r}{N+\lambda}$. Programma di Telecomunicazioni: Random Forests; boosting come approfondimento.Metodi ensemble - bagging, random forest e boosting →).
Valori tipici: sugli strati nascosti grandi (le slide), - in rete piccole come quella del lab (Dropout(0.2)). Il dropout va dopo l'attivazione di uno strato nascosto, non nell'uscita. Si accompagna di solito a più epoche, perché l'addestramento è più lento.
from tensorflow.keras.layers import Dropout
Sequential([Input((28, 28)), Flatten(), Dense(512, activation="relu"),
Dropout(0.5), Dense(10, activation="softmax")])5. Altri strumenti
- Batch normalization (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 →): ogni batch ha media e varianza leggermente diverse, il che aggiunge rumore agli strati e ha un lieve effetto regolarizzante; non è il suo scopo principale ma spesso riduce la necessità del dropout.
- Data augmentation: ingrandire il training con versioni modificate dei dati che mantengono l'etichetta. Nelle immagini: ribaltamenti, ritagli, piccole rotazioni, cambi di luminosità. Per AlexNet, ritaglio e ribaltamento portano da a immagini per campione (Reti neurali convolutive (CNN)approfondimento: non nel programma di Telecomunicazioni. Una rete convolutiva (CNN) sostituisce gli strati densi con filtri piccoli che scorrono sull'immagine: ogni neurone vede solo una patch locale (campo recettivo) e i pesi del filtro sono condivisi in tutta l'immagine, quindi i parametri non dipendono dalla dimensione dell'immagine ($K^2C_{in}C_{out}+C_{out}$ per strato) e si conserva l'informazione spaziale. Dimensione dell'uscita: $\lfloor(W-K+2P)/S\rfloor+1$. Pooling (max 2x2, stride 2) sottocampiona e dà invarianza locale; i filtri 1x1 riducono i canali; struttura tipica CONV+ReLU, POOL, ..., FLATTEN, FC, SOFTMAX, addestrata con cross-entropy e backpropagation. Tre strati 3x3 hanno il campo recettivo di un 7x7 con meno parametri e più non linearità (VGG). Architetture: LeNet, AlexNet (ReLU, dropout, data augmentation), VGG, GoogLeNet (moduli Inception), ResNet (blocchi residui $H(x)=F(x)+x$), EfficientNet. Nel lab: CNN su Fashion-MNIST (241 546 parametri) e su CIFAR-10 (122 570).Reti neurali convolutive (CNN) →).
- Meno parametri: ridurre strati e neuroni, o usare strati convoluzionali che condividono i pesi.
- Più dati e transfer learning (partire da una rete già addestrata su un dataset grande).
6. Il confronto del laboratorio (MNIST)
Stessa rete addestrata dieci epoche con Adam e batch da ( per e ; dropout ; batch norm prima e dopo lo strato nascosto; early stopping con pazienza ). Accuratezza di test:
| variante | accuratezza di test |
|---|---|
| nessuna regolarizzazione | |
| , | |
| , | |
| dropout | |
| batch normalization | |
| early stopping |
Lettura. Su MNIST con una rete così piccola l'overfitting è lieve e la rete senza regolarizzazione è già ottima: le tecniche che agiscono sui pesi con un elevato peggiorano (underfitting), dropout ed early stopping lasciano l'accuratezza invariata ma tengono la validation loss più bassa (con dropout - contro -). Una tecnica di regolarizzazione non va mai applicata alla cieca: si controlla la validazione. Esercizio: Esercizio - Confronto di tecniche di regolarizzazione su MNIST.
7. Errori tipici
- Scegliere troppo alto (underfitting) o non sceglierlo con la validazione.
- Usare il test come insieme di validazione per l'early stopping.
- Dimenticare che il dropout è attivo solo in training (in Keras
model.predicteevaluatelo spengono; in PyTorch servemodel.eval()). - Applicare il dropout allo strato di uscita.
- Aspettarsi che la regolarizzazione migliori sempre l'accuratezza: se il modello non fa overfitting non serve.
Versione ripasso
- Overfitting: la loss di training scende sempre, quella di validazione ha un minimo e poi risale. Nel lab MNIST (rete ): training , validazione , accuratezza di validazione quasi ferma (). Una rete con parametri può memorizzare il training set (Overfitting, ridge regression e cross-validationUna buona prestazione sul training non basta: serve stimare quella su dati nuovi. La cross-validation (K-fold: $k$ parti, ciascuna a turno come test, errore medio; Monte Carlo: $k$ divisioni casuali con quota di test $q$; leave-one-out se $k=n$) evita di dipendere da una sola divisione casuale. L'errore atteso si scompone in $\text{bias}^2+\text{varianza}+\sigma^2$: i modelli semplici fanno underfitting (bias alto), quelli complessi overfitting (varianza alta). La regolarizzazione aggiunge alla perdita una penalità: la ridge regression minimizza $|y-X\beta|^2+\lambda\sum_{j\ge1}\beta_j^2$ e ha soluzione $\beta=(X^TX+\lambda\tilde I)^{-1}X^Ty$ (l'intercetta non si penalizza, le feature si standardizzano): riduce i coefficienti, rende l'inversa stabile con feature collineari, e $\lambda$ è un iperparametro scelto con la validazione (cross-validation annidata per non contaminare il test).Overfitting, ridge regression e cross-validation →).
- Penalità sui pesi: (ridge), (LASSO, LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente →). Derivata: (proporzionale) contro (costante, 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 →). : (weight decay): pesi piccoli ma non nulli. : riduzione costante , pesi esattamente zero (sparsità).
- Esempio: , , , solo penalità: dà , dà ; per l' lo porta a , l' a . Keras:
kernel_regularizer=regularizers.l2(λ). - Scelta di : troppo piccola = nessun effetto; troppo grande = underfitting. Nel lab su tutti i pesi e bias: test () e () contro ; si prova da in giù, con la validazione.
- Early stopping: si ferma quando
val_lossnon migliora perpatienceepoche;restore_best_weights=Trueripristina l'epoca migliore. Serve una validazione distinta dal test. Esempio: val loss con : si ferma all'epoca e riprende i pesi dell'epoca . Lab: test . - Dropout: in training ogni neurone è azzerato con probabilità e gli altri sono moltiplicati per ; in inferenza è spento. Valore atteso invariato: (Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso →). Esempio: , maschera , : . Evita la co-adattazione e agisce come media di molte sotto-reti (come il bagging, Metodi ensemble - bagging, random forest e boostingUn albero da solo ha varianza alta; un ensemble combina molti modelli deboli. Bagging: ogni albero è addestrato su un campione bootstrap (n estrazioni con rimpiazzo, circa il 63% di campioni distinti) e si vota o si fa la media: riduce la varianza, perché la media di $T$ stimatori con varianza $\sigma^2$ e correlazione $\rho$ ha varianza $\rho\sigma^2+(1-\rho)\sigma^2/T$. Random forest = bagging + a ogni split solo $\sqrt p$ feature casuali (alberi meno correlati); l'importanza di una feature è la somma delle riduzioni di Gini pesate sui nodi in cui è usata. Boosting: alberi in sequenza, ciascuno corregge gli errori dei precedenti, e si riduce il bias. Gradient boosting: $F\leftarrow F+\eta h$ con $h$ albero sui residui (gradiente negativo della perdita), $\eta$ piccolo; AdaBoost: stump e pesi sui campioni sbagliati; XGBoost: similarity score $\frac{(\sum r)^2}{N+\lambda}$, gain, potatura con $\gamma$, output $\frac{\sum r}{N+\lambda}$. Programma di Telecomunicazioni: Random Forests; boosting come approfondimento.Metodi ensemble - bagging, random forest e boosting →). Tipico nei nascosti grandi, nelle reti piccole; mai nell'uscita; in PyTorch serve
model.eval(). - Altro: batch normalization (lieve effetto), data augmentation (flip e crop: AlexNet da a immagini per campione), meno parametri o convoluzioni, più dati, transfer learning.
- Confronto del lab (test): nessuna ; ; ; dropout (val loss -); batch norm ; early stopping . Su una rete già buona la regolarizzazione non migliora l'accuratezza: si guarda la curva di validazione.
- Errori tipici: troppo grande; test usato come validazione; dropout in inferenza o sull'uscita; aspettarsi miglioramenti senza overfitting.