Salta al contenuto
Note per Studenti Esercizio - Confronto di tecniche di regolarizzazione su MNIST

Esercizio - Confronto di tecniche di regolarizzazione su MNIST

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

In questa pagina 5

Testo (laboratorio sulle reti neurali, regolarizzazione). La rete 784→512→10784\to512\to10 con ReLU e softmax viene addestrata per dieci epoche (Adam, batch 3232, validation_split=0.1) in sei varianti: nessuna regolarizzazione, ℓ1\ell_1 (λ=0,01\lambda=0{,}01 su pesi e bias di entrambi gli strati), ℓ2\ell_2 (λ=0,01\lambda=0{,}01), dropout 0,50{,}5, batch normalization (dopo il flatten e dopo lo strato nascosto), early stopping (monitor="val_loss", patience=2). Accuratezze di test ottenute:

variante accuratezza di test
nessuna 0,98150{,}9815
ℓ1\ell_1 0,84380{,}8438
ℓ2\ell_2 0,91730{,}9173
dropout 0,98110{,}9811
batch normalization 0,97720{,}9772
early stopping 0,98000{,}9800
  1. Perché ℓ1\ell_1 e ℓ2\ell_2 peggiorano così tanto? Cosa si prova per rimediare?
  2. Con una validation loss per epoca 0,30; 0,18; 0,12; 0,10; 0,095; 0,097; 0,101; 0,1080{,}30;\,0{,}18;\,0{,}12;\,0{,}10;\,0{,}095;\,0{,}097;\,0{,}101;\,0{,}108 e patience=2, in che epoca si ferma l'addestramento e quali pesi si ripristinano?
  3. Un peso w=2w=2 riceve solo la penalità. Con η=0,1\eta=0{,}1, λ=0,01\lambda=0{,}01, quanto vale dopo un passo con ℓ2\ell_2 e con ℓ1\ell_1? E per w=0,001w=0{,}001?
  4. Dropout con p=0,5p=0{,}5 su a=(0,8; 1,2; 0,5; 2,0)a=(0{,}8;\,1{,}2;\,0{,}5;\,2{,}0) e maschera (1,0,1,0)(1,0,1,0): uscita in training e perché non serve correggere in inferenza.

Teoria usata: 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 →, 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 →.

1. Perché ℓ1\ell_1 e ℓ2\ell_2 peggiorano

Il λ=0,01\lambda=0{,}01 è applicato a tutti i pesi e i bias, in una rete con 407 050407\,050 parametri. Nella loss totale J+λ∑∣w∣J+\lambda\sum|w| (o ∑w2\sum w^2) la penalità è la somma di centinaia di migliaia di termini: con ℓ1\ell_1 la penalità iniziale vale 0,01⋅∑∣w∣0{,}01\cdot\sum|w|; per pesi inizializzati con valori assoluti tipici di 0,030{,}03-0,050{,}05 (401 920401\,920 pesi nel solo primo strato) la somma ∑∣w∣\sum|w| è dell'ordine di 1,21{,}2-2⋅1042\cdot10^4 e la penalità di 100100-200200, contro una cross-entropy iniziale di circa 2,32{,}3 (ln⁡10\ln10), quindi il gradiente è dominato dalla penalità: la rete riduce i pesi quasi a zero e non impara (underfitting). Con ℓ1\ell_1 il rimpicciolimento è costante in valore assoluto e spinge molti pesi esattamente a zero, per questo l'accuratezza (0,8440{,}844) è la più bassa; ℓ2\ell_2 riduce in proporzione ai pesi ed è più dolce (0,9170{,}917), ma anche qui λ\lambda è troppo grande.

Rimedi. Provare valori molto più piccoli (10−410^{-4}, 10−510^{-5}), scelti per validazione, o penalizzare solo i pesi (non i bias) e solo lo strato più grande. L'overfitting di questa rete è lieve, quindi la regolarizzazione non è obbligatoria.

Dropout ed early stopping non cambiano l'accuratezza (0,98110{,}9811 e 0,98000{,}9800 contro 0,98150{,}9815) ma, a dieci epoche, dropout 0,50{,}5 tiene la validation loss tra 0,0750{,}075 e 0,0840{,}084 mentre senza regolarizzazione sale da 0,0940{,}094 a 0,1270{,}127: il vantaggio si vede nella curva, non nel test.

2. Early stopping

Epoche e validation loss: 1:0,301:0{,}30, 2:0,182:0{,}18, 3:0,123:0{,}12, 4:0,104:0{,}10, 5:0,0955:0{,}095 (minimo), 6:0,0976:0{,}097, 7:0,1017:0{,}101, 8:0,1088:0{,}108. Dopo il minimo all'epoca 55 ci sono due epoche consecutive senza miglioramento (66 e 77): con patience=2 l'addestramento si ferma alla fine dell'epoca 77. Con restore_best_weights=True si ripristinano i pesi dell'epoca 55 (loss 0,0950{,}095); senza quell'opzione si terrebbero quelli dell'epoca 77 (peggiori).

3. Weight decay

Regola ℓ2\ell_2: w←(1−2ηλ)w=(1−0,002)⋅2=1,996w\leftarrow(1-2\eta\lambda)w=(1-0{,}002)\cdot2=1{,}996. Regola ℓ1\ell_1: w←w−ηλsign⁡(w)=2−0,001=1,999w\leftarrow w-\eta\lambda\operatorname{sign}(w)=2-0{,}001=1{,}999.

Per w=0,001w=0{,}001: con ℓ2\ell_2 diventa 0,001⋅0,998=0,0009980{,}001\cdot0{,}998=0{,}000998 (la riduzione è proporzionale: quasi nulla); con ℓ1\ell_1 si sottrae ancora 0,0010{,}001 e il peso arriva a 00 (nella pratica oscilla attorno a zero perché il passo è pari al valore). Lo stesso passo costante dell'ℓ1\ell_1 è ciò che azzera i pesi piccoli e dà modelli sparsi.

4. Dropout

Uscita in training: gli elementi con maschera 00 vanno a zero e gli altri si dividono per 1−p=0,51-p=0{,}5, cioè si moltiplicano per 22: (1,6; 0; 1,0; 0)(1{,}6;\ 0;\ 1{,}0;\ 0). Perché in inferenza non serve correggere: il valore atteso di una attivazione è (1−p)⋅a1−p+p⋅0=a(1-p)\cdot\frac{a}{1-p}+p\cdot0=a, uguale al valore senza dropout; quindi in test si usa la rete completa senza alcuna scala.

Codice

python
from tensorflow.keras import regularizers
from tensorflow.keras.callbacks import EarlyStopping
modelli = {
  "l2": Sequential([Input((28,28)), Flatten(),
                    Dense(512, activation="relu", kernel_regularizer=regularizers.l2(1e-4)),
                    Dense(10, activation="softmax")]),
  "dropout": Sequential([Input((28,28)), Flatten(), Dense(512, activation="relu"),
                         Dropout(0.5), Dense(10, activation="softmax")]),
}
es = EarlyStopping(monitor="val_loss", patience=2, restore_best_weights=True)

Lezioni in cui compare

Teoria collegata