Salta al contenuto
Note per Studenti Deep learning - reti profonde, CNN e addestramento con Keras

Deep learning - reti profonde, CNN e addestramento con Keras

In questa pagina 10
In questa pagina 6

Quattro lezioni e un laboratorio, nell'ottica del corso di IA: cosa sono le reti profonde, come si addestrano, le CNN e le architetture moderne (RNN, LSTM, autoencoder, GAN, trasformatori) e la pipeline Keras. Derivazioni, backpropagation completa e CNN in dettaglio sono nella materia Machine Learning; qui ci sono i concetti, gli esempi numerici e i rimandi. Esercizi di questa materia: Esercizio - CNN su CIFAR-10 con Keras (laboratorio 11). Metodi collegati: Apprendimento automatico nell'IA - supervisionato, SVM e valutazioneQuadro del machine learning nel corso di IA. Tre forme di apprendimento: supervisionato (coppie ingresso-uscita, classificazione se l'uscita è discreta e regressione se è un numero), non supervisionato (pattern senza feedback, per esempio clustering) e per rinforzo (ricompense). Un'ipotesi h approssima la funzione vera f e si valuta sul test set, non sul training set: un modello troppo semplice ha bias alto (underfitting), uno troppo complesso varianza alta (overfitting). Servono training, validation e test set; con pochi dati si usa la k-fold cross-validation. Alberi di decisione: si sceglie l'attributo con massimo guadagno d'informazione Gain = B(p/(p+n)) - somma (Nk/N) B(pk/Nk), si pota con il test del chi quadro (Delta > Delta*), si riduce la varianza con bagging e random forest. Perdita L1 e L2, regressione lineare e discesa del gradiente w <- w - alpha dL/dw. SVM: separatore a margine massimo, vettori di supporto, kernel trick con K(xj,xk). Pipeline scikit-learn del laboratorio 10: load_digits, train_test_split, SVC(C, kernel, gamma), fit, predict, classification_report, confusion_matrix, cross_val_score.Apprendimento automatico nell'IA - supervisionato, SVM e valutazione →.

1. Dal neurone alla rete

Definizione (unità). Un'unità (neurone) calcola la somma pesata dei suoi ingressi, inj=w0,j+∑iwi,j aiin_j=w_{0,j}+\sum_iw_{i,j}\,a_i (con w0w_0 il peso del bias, ingresso fisso +1+1), e applica una funzione di attivazione non lineare gjg_j: aj=gj(inj)a_j=g_j(in_j). Se gg fosse lineare la combinazione di più unità sarebbe ancora lineare.

Perceptron a soglia (g(z)=1g(z)=1 se z≥0z\ge0, 0 altrimenti): realizza le funzioni booleane linearmente separabili. Con pesi scelti (w0,w1,w2w_0,w_1,w_2):

  • AND: w=(−1,5; 1; 1)w=(-1{,}5;\,1;\,1): in=x1+x2−1,5≥0in=x_1+x_2-1{,}5\ge0 solo con x1=x2=1x_1=x_2=1;
  • OR: w=(−0,5; 1; 1)w=(-0{,}5;\,1;\,1);
  • NOT: w=(0,5; −1)w=(0{,}5;\,-1): in=0,5−x≥0in=0{,}5-x\ge0 per x=0x=0.

XOR non è linearmente separabile: nessuna retta separa {(0,1),(1,0)}\{(0,1),(1,0)\} da {(0,0),(1,1)}\{(0,0),(1,1)\}. Si implementa con tre neuroni su due livelli (2 nascosti e 1 di uscita). Esempio con soglia: h1=OR(x1,x2)h_1=\text{OR}(x_1,x_2) (in=x1+x2−0,5in=x_1+x_2-0{,}5), h2=AND(x1,x2)h_2=\text{AND}(x_1,x_2) (in=x1+x2−1,5in=x_1+x_2-1{,}5), uscita y=step(h1−h2−0,5)y=\text{step}(h_1-h_2-0{,}5), cioè "OR ma non AND":

x1x_1 x2x_2 h1h_1 h2h_2 yy
0 0 0 0 0
0 1 1 0 1
1 0 1 0 1
1 1 1 1 0

In teoria si potrebbero usare soglie "dure", ma la differenziabilità delle funzioni "morbide" (sigmoide) rende possibile l'addestramento con il gradiente. Con due neuroni sigmoidi nascosti si ottiene una "cresta", con quattro un "dosso": con due soli livelli si può approssimare qualunque funzione continua (teorema di approssimazione universale). Dettagli: 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 →, Halfspace e PerceptronUn halfspace (semispazio) classifica con un iperpiano: $h(x)=\operatorname{sign}(w^Tx+b)$, con $w$ normale al piano e $|w^Tx+b|/|w|$ distanza dal piano; aggiungendo una componente costante $1$ a $x$ si scrive $\operatorname{sign}(\tilde w^T\tilde x)$. Il Perceptron (Rosenblatt, 1958) è il neurone con attivazione a gradino e impara con una regola semplice: per ogni errore $y_i,w^Tx_i\le0$ si aggiorna $w\leftarrow w+y_ix_i$. Teorema di convergenza (Novikoff): se i dati sono linearmente separabili con margine $\gamma$ ($y_iw^{T}x_i\ge\gamma$, $|w^|=1$) e $|x_i|\le R$, il Perceptron fa al più $(R/\gamma)^2$ errori e si ferma. Non risolve problemi non separabili (XOR), non ha un criterio di margine ottimale (le SVM sì) e il suo analogo morbido è la regressione logistica. Programma di Telecomunicazioni: halfspace model, Perceptron.Halfspace e Perceptron →, Esercizio - Halfspace, distanza dal piano e problema XOR.

Funzioni di attivazione comuni. Sigmoide σ(z)=11+e−z\sigma(z)=\tfrac1{1+e^{-z}} (valori in (0,1)(0,1), σ(0)=0,5\sigma(0)=0{,}5); ReLU max⁡(0,z)\max(0,z); softplus ln⁡(1+ez)\ln(1+e^z) (versione liscia della ReLU); tanh (sigmoide scalata e traslata, in (−1,1)(-1,1)).

Reti. Una rete con LL livelli nascosti ha profondità legata a LL. Feedforward: i collegamenti vanno in una sola direzione (grafo diretto aciclico, senza cicli). Ricorrente (RNN): le uscite tornano agli ingressi, e la rete è un sistema dinamico con stato interno (memoria). I livelli nascosti formano rappresentazioni interne dell'ingresso.

2. Ingressi, uscite e perdita

3. Addestramento

Le reti si addestrano con varianti della discesa stocastica del gradiente (SGD a minibatch) w←w−α∇L(w)w\leftarrow w-\alpha\nabla L(w), come in Apprendimento automatico nell'IA - supervisionato, SVM e valutazioneQuadro del machine learning nel corso di IA. Tre forme di apprendimento: supervisionato (coppie ingresso-uscita, classificazione se l'uscita è discreta e regressione se è un numero), non supervisionato (pattern senza feedback, per esempio clustering) e per rinforzo (ricompense). Un'ipotesi h approssima la funzione vera f e si valuta sul test set, non sul training set: un modello troppo semplice ha bias alto (underfitting), uno troppo complesso varianza alta (overfitting). Servono training, validation e test set; con pochi dati si usa la k-fold cross-validation. Alberi di decisione: si sceglie l'attributo con massimo guadagno d'informazione Gain = B(p/(p+n)) - somma (Nk/N) B(pk/Nk), si pota con il test del chi quadro (Delta > Delta*), si riduce la varianza con bagging e random forest. Perdita L1 e L2, regressione lineare e discesa del gradiente w <- w - alpha dL/dw. SVM: separatore a margine massimo, vettori di supporto, kernel trick con K(xj,xk). Pipeline scikit-learn del laboratorio 10: load_digits, train_test_split, SVC(C, kernel, gamma), fit, predict, classification_report, confusion_matrix, cross_val_score.Apprendimento automatico nell'IA - supervisionato, SVM e valutazione →. Il gradiente si calcola con la backpropagation: un passaggio in avanti in cui ogni nodo calcola la sua funzione (prodotto, somma, attivazione) dagli ingressi, e un passaggio all'indietro in cui si propaga l'informazione sull'errore dall'uscita ai livelli nascosti. I "messaggi" sono derivate parziali della perdita LL: i messaggi in ingresso a un nodo interno si sommano e poi si moltiplicano per le derivate locali. Per un nodo prodotto h=f⋅gh=f\cdot g si ha ∂h/∂f=g\partial h/\partial f=g e ∂h/∂g=f\partial h/\partial g=f.

Esempio della slide (perdita quadratica, peso w3,5w_{3,5} che collega l'unità 3 all'unità 5): ∂L∂w3,5=−2(y−y^) g5′(in5) a3,\frac{\partial L}{\partial w_{3,5}}=-2(y-\hat y)\,g_5'(in_5)\,a_3, dove −2(y−y^)=∂L/∂y^-2(y-\hat y)=\partial L/\partial\hat y è il primo messaggio, g5′(in5)g_5'(in_5) la derivata locale dell'attivazione e a3a_3 la derivata di in5in_5 rispetto a w3,5w_{3,5}; tutte le aia_i e le injin_j sono quelle del passaggio in avanti (per questo vanno memorizzate).

Esempio numerico: un solo neurone sigmoide. Ingresso x=2x=2, peso w=0,5w=0{,}5, bias 00, uscita voluta y=1y=1, perdita quadratica.

  • Avanti: in=0,5⋅2=1in=0{,}5\cdot2=1, y^=σ(1)=0,7311\hat y=\sigma(1)=0{,}7311, L=(1−0,7311)2=0,0723L=(1-0{,}7311)^2=0{,}0723.
  • Indietro: ∂L/∂y^=−2(1−0,7311)=−0,5379\partial L/\partial\hat y=-2(1-0{,}7311)=-0{,}5379; g′(in)=σ′(1)=y^(1−y^)=0,1966g'(in)=\sigma'(1)=\hat y(1-\hat y)=0{,}1966; ∂in/∂w=x=2\partial in/\partial w=x=2. Quindi ∂L/∂w=−0,5379⋅0,1966⋅2=−0,2115\partial L/\partial w=-0{,}5379\cdot0{,}1966\cdot2=-0{,}2115.
  • Aggiornamento con α=1\alpha=1: w=0,5+0,2115=0,7115w=0{,}5+0{,}2115=0{,}7115. Nuova uscita σ(1,4230)=0,8058\sigma(1{,}4230)=0{,}8058 e L=0,0377L=0{,}0377: la perdita è quasi dimezzata.

Pro e contro. Il costo del calcolo del gradiente è lineare nel numero di nodi del grafo, e le derivate delle attivazioni si possono preparare in anticipo. Ma servono i valori intermedi del passaggio in avanti (memoria) e c'è il gradiente che svanisce (vanishing gradient): se g′(⋅)≪1g'(\cdot)\ll1 (molto probabile con sigmoide e tanh) l'errore retropropagato incide poco sui pesi dei primi livelli. Per la sigmoide σ′≤0,25\sigma'\le0{,}25: dopo 10 livelli il fattore è al più 0,2510≈10−60{,}25^{10}\approx10^{-6}. Dettagli, esempio completo su una rete 22-22-11 e ottimizzatori: 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 →, Esercizio - Backpropagation a mano su una rete 2-2-1.

Generalizzazione. Per ingressi ad alta dimensione (immagini, video, voce) le reti profonde sono migliori di ogni altro approccio di ML puro; a parità di pesi, reti più profonde di solito generalizzano meglio. Ma possono fallire con esempi avversari (rumore aggiunto a un'immagine che produce un'uscita del tutto inattesa) e un buon errore di training non garantisce buone prestazioni reali. Il dropout disattiva casualmente alcune unità durante l'addestramento (per esempio dopo ogni minibatch): rende più difficile adattarsi al training set, rende il modello robusto al rumore e approssima un grande insieme di reti più piccole. Vedi 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 →.

4. Reti convolutive

Una CNN ha livelli convolutivi, con collegamenti spazialmente locali: ogni unità è collegata a una sotto-regione dell'ingresso, il suo campo recettivo, piccolo nei primi livelli e sempre più grande in profondità (idea ispirata alla corteccia visiva). Segue spesso il pooling e poi una rete di classificazione.

Convoluzione. Un kernel kk (un vettore di pesi, appreso) di dimensione ll si applica all'ingresso xx: ziz_i è il prodotto scalare tra kk e il tratto di xx centrato in xix_i. Il risultato passa per una funzione di attivazione. Il passo (stride) ss è la distanza tra i centri successivi del kernel; il padding aggiunge pixel al bordo, così il kernel si applica esattamente ⌈n/s⌉\lceil n/s\rceil volte.

Esempio 1D. x=(1,3,2,5,4)x=(1,3,2,5,4), kernel k=(+1,−1,+1)k=(+1,-1,+1), senza padding. Posizioni (stride 1): z1=1−3+2=0z_1=1-3+2=0, z2=3−2+5=6z_2=3-2+5=6, z3=2−5+4=1z_3=2-5+4=1, quindi z=(0,6,1)z=(0,6,1). Con stride 2 si tengono la prima e la terza posizione: z=(0,1)z=(0,1). La dimensione dell'uscita è ⌊(n+2p−l)/s⌋+1\lfloor(n+2p-l)/s\rfloor+1: con n=5n=5, l=3l=3, p=0p=0 è 33 per s=1s=1 e 22 per s=2s=2.

Tensori. Un tensore è un array multidimensionale; tenere traccia della forma dei dati livello per livello permette ai pacchetti di generare codice ottimizzato per GPU o TPU. Esempio della slide: 64 immagini RGB 256×256×3256\times256\times3; 96 kernel 5×5×35\times5\times3 con stride s=2s=2 solo su xx-yy e padding 2: l'uscita per un kernel e un'immagine è ⌊(256+4−5)/2⌋+1=128\lfloor(256+4-5)/2\rfloor+1=128, quindi 128×128128\times128; l'uscita complessiva ha forma 128×128×96×64128\times128\times96\times64 (una feature map a 96 canali). I parametri del livello sono 96⋅(5⋅5⋅3+1)=7 29696\cdot(5\cdot5\cdot3+1)=7\,296 (un bias per kernel).

Pooling. Riassume un gruppo di unità adiacenti con un solo valore: max-pooling (massimo) o average-pooling (media); è una convoluzione con pesi fissi, non appresi. Si usa per ridurre la dimensione dei livelli nascosti. Dettagli e architetture: 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) →, Esercizio - Convoluzione 2D a mano, Esercizio - Dimensioni e parametri di una CNN.

5. Reti ricorrenti e LSTM

Una RNN ha cicli nel grafo di calcolo (ogni ciclo con un ritardo): un'unità può usare un valore calcolato dalla propria uscita a un passo precedente. Ha stato interno (memoria), con ipotesi di Markov zt=fw(zt−1,xt)z_t=f_w(z_{t-1},x_t): ztz_t riassume tutto il passato. Per l'addestramento si "srotola" nel tempo e si usa la backpropagation attraverso il tempo (BPTT), in cui il contributo del gradiente al passo tt si calcola da quello al passo t−1t-1, con costo lineare nella dimensione della rete. Ma se wz,z<1w_{z,z}<1 il gradiente svanisce, se wz,z>1w_{z,z}>1 esplode. Esempio: dopo 20 passi con fattore 0,90{,}9 resta 0,920=0,120{,}9^{20}=0{,}12; con fattore 1,11{,}1 vale 1,120=6,71{,}1^{20}=6{,}7.

La LSTM aggiunge uno stato di memoria a lungo termine ctc_t, copiato da un passo al successivo invece di essere moltiplicato (e questo evita i problemi del gradiente), controllato da porte (vettori con valori in [0,1][0,1], uscite sigmoidi) usate per moltiplicare elemento per elemento: forget (cosa si ricorda di cc), input (cosa si aggiorna in modo additivo), output (cosa passa alla memoria a breve termine). Applicazioni: elaborazione del linguaggio, serie temporali, riconoscimento del parlato, didascalie di immagini, gesti, rilevamento di anomalie, scrittura a mano. Panoramica: Cenni a reinforcement learning e reti per sequenzeapprofondimento: non nel programma di Telecomunicazioni, solo cenni (ultima lezione del corso). Reinforcement learning: un agente in uno stato $S_t$ sceglie azioni, l'ambiente restituisce ricompense; l'obiettivo non è minimizzare una loss ma massimizzare il ritorno $G_t=\sum_{k\ge0}\gamma^kR_{t+k+1}$ (fattore di sconto $\gamma\in[0,1)$) trovando la politica ottima $\pi^*=\arg\max G$. Apprendimento di sequenze: servono lunghezze variabili, dipendenze a lungo termine, ordine, parametri condivisi nel tempo; una rete ricorrente aggiorna uno stato $h_t=f_W(h_{t-1},x_t)$; le reti convolutive temporali (TCN) usano convoluzioni causali e dilatate con campo recettivo $1+(k-1)\sum d_\ell$. Chiude con i modelli generativi (VAE, GAN) già visti in Autoencoder.Cenni a reinforcement learning e reti per sequenze →.

6. Apprendimento non supervisionato: autoencoder, VAE, GAN

Nel non supervisionato si hanno solo esempi xx senza uscite yy: si evita l'annotazione di grandi dataset e si costringe il modello a "spiegare" ingressi ad alta dimensione. Due usi: imparare rappresentazioni (utili per un classificatore) e imparare modelli generativi (∼P(x)\sim P(x) per generare nuovi esempi).

  • Autoencoder: un encoder ff porta l'ingresso xx in una rappresentazione compressa z^\hat z (bottleneck, embedding) e un decoder gg lo ricostruisce, g(f(x))≈xg(f(x))\approx x. Usi: compressione e riduzione di dimensione, eliminazione del rumore, ricostruzione di parti mancanti, rilevamento di anomalie (differenza tra ingresso e uscita).
  • VAE (variational autoencoder): versione probabilistica che codifica un ingresso in una distribuzione (per esempio gaussiana) P(z∣x)P(z\mid x) e non in un punto: il decoder viene addestrato su punti casuali dello spazio latente e può generare dati nuovi da rumore; un AE deterministico no.
  • GAN: un generatore trasforma zz in campioni falsi e un discriminatore classifica gli ingressi come veri o falsi; si addestrano insieme (il generatore cerca di ingannare il discriminatore). Sono modelli impliciti (si generano campioni, ma la probabilità non è disponibile). Problemi: mode collapse (il generatore copre solo alcuni picchi della distribuzione) e mode hopping.

Dettagli in Autoencoderapprofondimento: non nel programma di Telecomunicazioni. Un autoencoder è una rete non supervisionata che impara a ricostruire il proprio ingresso passando per un collo di bottiglia: encoder $z=e(x)$ (dimensione bassa), decoder $\hat x=d(z)$, loss $|x-d(e(x))|^2$. Con attivazioni lineari equivale alla PCA; con non linearità impara rappresentazioni latenti più ricche (ipotesi del manifold). Varianti: sparse (penalità $\ell_1$ sulle attivazioni), denoising (ingresso corrotto, bersaglio pulito), convolutivi (inpainting). Anomaly detection: si addestra su dati normali e si segnala come anomalo ciò che ha errore di ricostruzione sopra una soglia. VAE: l'encoder produce media e deviazione standard di una gaussiana, il campione si ottiene con il trucco di riparametrizzazione $z=\mu+\sigma\odot\zeta$, $\zeta\sim\mathcal N(0,I)$, e la loss è errore di ricostruzione più KL verso $\mathcal N(0,I)$, con $KL=\frac12\sum(\mu^2+\sigma^2-1-\ln\sigma^2)$; il $\beta$-VAE pesa il KL con $\beta>1$ per rappresentazioni disaccoppiate. Cenno ai GAN.Autoencoder →.

7. Transfer learning, modelli linguistici e trasformatori

Transfer learning. L'esperienza su un compito AA aiuta un compito BB: si copiano i pesi appresi per AA in una rete da addestrare per BB e si aggiornano con i dati di BB. In pratica si congelano i primi livelli del modello pre-addestrato (che sono rilevatori di caratteristiche) e si modificano solo i livelli alti (le caratteristiche specifiche e la classificazione), partendo da un modello diffuso (per esempio ResNet-50) e facendo fine-tuning con esempi del dominio.

Modelli linguistici. Un modello linguistico è un modello probabilistico del linguaggio naturale; un LLM è una rete neurale con comprensione e generazione generali (IA generativa): preso un testo, predice ripetutamente la parola successiva. Parole o parti di parole sono token (numeri; anche spazi e punteggiatura); l'insieme dei token è il vocabolario (circa 50 000 per GPT-2). Il word embedding va oltre la semplice codifica: raggruppa parole simili in uno spazio di dimensione minore. Dato un prompt, il modello restituisce le probabilità di tutti i token del vocabolario; si sceglie in modo greedy (il più probabile) oppure a caso secondo la distribuzione (più varietà). La generazione di una frase è un ciclo: frase == prompt; token ←\leftarrow predizione; frase ←\leftarrow frase più token; si ferma al punto.

Attenzione e trasformatori. I modelli sequence-to-sequence con LSTM tendono a dimenticare le informazioni vecchie. Con le unità di attenzione il modello impara a selezionare le parti dell'ingresso più utili al contesto; nella self-attention gli stati nascosti guardano se stessi, catturando il contesto vicino e lontano. I trasformatori implementano la self-attention e sono il cuore di GPT (Generative Pre-trained Transformer): un blocco di ingresso (embedding del token e della posizione), una colonna di 12-96 blocchi, una testa che produce le probabilità dei token. Ogni blocco contiene LayerNorm, attenzione multi-testa, un altro LayerNorm e una rete feedforward a due livelli con connessioni residue. Il numero di colonne è l'ampiezza del contesto (fino a circa 128 000 token), il numero di blocchi in verticale la profondità (livello di astrazione). L'uscita usa la trasposta della matrice di embedding e un softmax; l'addestramento minimizza l'entropia incrociata mediata sulla sequenza.

8. Keras: la pipeline del laboratorio 11

Il laboratorio classifica cani e gatti (23 410 immagini; alcune sono corrotte e vanno filtrate) con la Sequential API di Keras, adatta a una pila di livelli con un solo ingresso e una sola uscita (per grafi più complessi esistono la functional API e la sottoclasse). Il codice delle slide:

python
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models

image_size = (180, 180); batch_size = 128
train_ds, val_ds = tf.keras.utils.image_dataset_from_directory(
    "PetImages", validation_split=0.2, subset="both", seed=1337,
    image_size=image_size, batch_size=batch_size)          # 18728 immagini di training, 4682 di validazione
train_ds = train_ds.map(lambda x, y: (x / 255, y))         # standardizzazione: da [0, 255] a [0, 1]
val_ds = val_ds.map(lambda x, y: (x / 255, y))

data_augmentation = keras.Sequential([layers.RandomFlip("horizontal"), layers.RandomRotation(0.1)])
train_ds = train_ds.map(lambda img, label: (data_augmentation(img), label),
                        num_parallel_calls=tf.data.AUTOTUNE).prefetch(tf.data.AUTOTUNE)
val_ds = val_ds.prefetch(tf.data.AUTOTUNE)

model = models.Sequential()
model.add(layers.Conv2D(16, (3, 3), 1, activation="relu", input_shape=(180, 180, 3)))   # 16 filtri 3x3, stride 1
model.add(layers.MaxPooling2D((2, 2)))                      # massimo su regioni 2x2
model.add(layers.Conv2D(16, (3, 3), activation="relu"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())                                 # da tensore 3D a vettore 1D
model.add(layers.Dense(64, activation="relu"))
model.add(layers.Dense(1, activation="sigmoid"))            # una sola uscita: 0 gatto, 1 cane
model.summary()

model.compile(optimizer=keras.optimizers.Adam(1e-3), loss="binary_crossentropy", metrics=["accuracy"])
hist = model.fit(train_ds, epochs=5, validation_data=val_ds)

I passi, con i numeri:

  • Dati: image_dataset_from_directory legge le sottocartelle come classi (etichetta 0 gatto, 1 cane) e rimescola; ogni batch ha forma (128,180,180,3)(128,180,180,3): 128 immagini, 180×180180\times180 pixel, 3 canali RGB.
  • Data augmentation (solo sul training): rovesciamenti orizzontali casuali e piccole rotazioni, per esporre il modello ad aspetti diversi dei dati e rallentare l'overfitting.
  • Standardizzazione: i valori RGB sono in [0,255][0,255], non ideali per una rete (in generale gli ingressi vanno tenuti piccoli); si portano in [0,1][0,1] dividendo per 255 con una map sui due dataset (il testo delle slide parla di un livello Rescaling all'inizio del modello, ma il codice mostrato usa la map: sono due modi equivalenti di fare la stessa cosa). In predizione l'immagine va divisa per 255 allo stesso modo.
  • Architettura (model.summary() riportato dal corso), verificata a mano con ⌊(n+2p−k)/s⌋+1\lfloor(n+2p-k)/s\rfloor+1 e conteggio dei parametri (khkwCin+1)Cout(k_hk_wC_{in}+1)C_{out}:
livello forma di uscita parametri
Conv2D 16 filtri 3×33\times3 (178,178,16)(178,178,16) 3⋅3⋅3⋅16+16=4483\cdot3\cdot3\cdot16+16=448
MaxPooling 2×22\times2 (89,89,16)(89,89,16) 0
Conv2D 16 filtri 3×33\times3 (87,87,16)(87,87,16) 3⋅3⋅16⋅16+16=2 3203\cdot3\cdot16\cdot16+16=2\,320
MaxPooling 2×22\times2 (43,43,16)(43,43,16) 0
Flatten (29 584)(29\,584), cioè 43⋅43⋅1643\cdot43\cdot16 0
Dense 64 (64)(64) 29 584⋅64+64=1 893 44029\,584\cdot64+64=1\,893\,440
Dense 1 (1)(1) 64+1=6564+1=65

Totale parametri addestrabili: 448+2 320+1 893 440+65=1 896 273448+2\,320+1\,893\,440+65=1\,896\,273, come nel riepilogo del corso. Il 178/2=89178/2=89 è il pooling 2×22\times2; 87/287/2 si arrotonda per difetto a 4343.

  • Compilazione: si definiscono ottimizzatore (Adam con passo 10−310^{-3}), perdita (entropia incrociata binaria, adatta a una sigmoide) e metriche; con fit si addestra. Output del corso (5 epoche, 147 passi per epoca): accuratezza di training da 0,54810{,}5481 a 0,74990{,}7499, perdita da 0,76530{,}7653 a 0,50580{,}5058; accuratezza di validazione da 0,65910{,}6591 a 0,76660{,}7666, perdita di validazione da 0,61590{,}6159 a 0,48340{,}4834. La perdita deve scendere e l'accuratezza salire a ogni epoca.
  • Test su immagini nuove: model.predict(np.expand_dims(resize/255, 0)) dà un numero in [0,1][0,1]; se >0,5>0{,}5 la classe è Cane, altrimenti Gatto (per esempio 0,387→0{,}387\to Gatto).
  • Salvataggio: model.save("models/imageclassifier.h5") e load_model(...) (formato HDF5).

Un secondo esercizio con CIFAR-10 (10 classi, softmax) è Esercizio - CNN su CIFAR-10 con Keras (laboratorio 11); un'altra CNN in Keras, su Fashion-MNIST e CIFAR-10, è in Esercizio - CNN su Fashion-MNIST e CIFAR-10 con Keras.

Errori tipici

  • Usare una attivazione lineare nei livelli nascosti: la rete resterebbe lineare.
  • Codificare un attributo categorico con interi invece che in one-hot.
  • Dimenticare di dividere per 255 le immagini in predizione, se il modello è stato addestrato su valori in [0,1][0,1].
  • Applicare la data augmentation anche al validation set.
  • Contare i parametri di un livello convolutivo senza i bias, o senza moltiplicare per i canali di ingresso.
  • Pensare che len(train_ds) sia il numero di immagini: è il numero di batch (147 batch da 128, circa 18 700 immagini).
  • Aspettarsi che sigmoide e tanh funzionino bene in reti molto profonde (gradiente che svanisce).

Domande d'esame

  1. Perché lo XOR richiede almeno due livelli? Perché non è linearmente separabile: un singolo neurone a soglia produce un confine lineare. Servono 3 neuroni (2 nascosti, per esempio OR e AND, e uno di uscita "OR e non AND").
  2. Un softmax riceve (5,2,0,−2)(5,2,0,-2). Che cosa restituisce? ez=(148,41; 7,39; 1; 0,135)e^z=(148{,}41;\,7{,}39;\,1;\,0{,}135), somma 156,93156{,}93, uscita (0,946; 0,047; 0,006; 0,001)(0{,}946;\,0{,}047;\,0{,}006;\,0{,}001).
  3. Un livello convolutivo ha 96 kernel 5×5×35\times5\times3, stride 2, padding 2, su immagini 256×256×3256\times256\times3. Dimensione dell'uscita e numero di parametri? ⌊(256+4−5)/2⌋+1=128\lfloor(256+4-5)/2\rfloor+1=128: uscita 128×128×96128\times128\times96; parametri 96⋅(75+1)=7 29696\cdot(75+1)=7\,296.
  4. Cosa risolvono le LSTM rispetto alle RNN semplici? Il gradiente che svanisce o esplode: la memoria ctc_t è copiata tra i passi e controllata da porte (forget, input, output) in [0,1][0,1].

Versione ripasso

Neurone e rete

Unità. inj=w0,j+∑iwi,jaiin_j=w_{0,j}+\sum_iw_{i,j}a_i, aj=gj(inj)a_j=g_j(in_j) con gg non lineare. Perceptron a soglia: AND w=(−1,5;1;1)w=(-1{,}5;1;1), OR w=(−0,5;1;1)w=(-0{,}5;1;1), NOT w=(0,5;−1)w=(0{,}5;-1). XOR non linearmente separabile: 3 neuroni su 2 livelli, h1=ORh_1=\text{OR}, h2=ANDh_2=\text{AND}, y=step(h1−h2−0,5)y=\text{step}(h_1-h_2-0{,}5) (Halfspace e PerceptronUn halfspace (semispazio) classifica con un iperpiano: $h(x)=\operatorname{sign}(w^Tx+b)$, con $w$ normale al piano e $|w^Tx+b|/|w|$ distanza dal piano; aggiungendo una componente costante $1$ a $x$ si scrive $\operatorname{sign}(\tilde w^T\tilde x)$. Il Perceptron (Rosenblatt, 1958) è il neurone con attivazione a gradino e impara con una regola semplice: per ogni errore $y_i,w^Tx_i\le0$ si aggiorna $w\leftarrow w+y_ix_i$. Teorema di convergenza (Novikoff): se i dati sono linearmente separabili con margine $\gamma$ ($y_iw^{T}x_i\ge\gamma$, $|w^|=1$) e $|x_i|\le R$, il Perceptron fa al più $(R/\gamma)^2$ errori e si ferma. Non risolve problemi non separabili (XOR), non ha un criterio di margine ottimale (le SVM sì) e il suo analogo morbido è la regressione logistica. Programma di Telecomunicazioni: halfspace model, Perceptron.Halfspace e Perceptron →). Due livelli approssimano ogni funzione continua. Le attivazioni morbide (sigmoide) rendono possibile il gradiente.

Attivazioni: sigmoide 11+e−z\tfrac1{1+e^{-z}}, ReLU max⁡(0,z)\max(0,z), softplus, tanh (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 →). Rete feedforward (grafo aciclico) o ricorrente (stato interno).

Ingressi e uscite. Categorici in one-hot (mai interi); regressione: uscita lineare; due classi: sigmoide; più classi: softmax eink∑jeinj\tfrac{e^{in_k}}{\sum_je^{in_j}}, per esempio (5,2,0,−2)→(0,946; 0,047; 0,006; 0,001)(5,2,0,-2)\to(0{,}946;\,0{,}047;\,0{,}006;\,0{,}001). Perdita: entropia incrociata, cioè log-verosimiglianza negativa (Regressione logistica e softmaxLa regressione lineare non è adatta alla classificazione (valori fuori da [0,1], retta tirata dai punti lontani). La regressione logistica passa il predittore lineare dalla sigmoide $\sigma(z)=1/(1+e^{-z})$ e interpreta $\hat y=\sigma(x^T\beta)$ come $P(y=1\mid x)$: si predice la classe 1 se $\hat y\ge0{,}5$, cioè $x^T\beta\ge0$ (bordo lineare). L'errore quadratico dà una funzione non convessa; si usa la log-verosimiglianza negativa $-\sum[y\log\hat y+(1-y)\log(1-\hat y)]$, convessa, con gradiente $X^T(\hat y-y)$ e nessuna formula chiusa (discesa del gradiente). Per più classi: one-vs-one ($C(C-1)/2$ classificatori, voto), one-vs-all ($C$ classificatori, massima probabilità), o la softmax $p_c=e^{z_c}/\sum_ke^{z_k}$ con cross-entropia. Si può regolarizzare (ridge, LASSO, Elastic Net) e la cross-validation si fa stratificata. Approfondimento: non nel programma di Telecomunicazioni.Regressione logistica e softmax →).

Addestramento

Backpropagation. SGD a minibatch w←w−α∇Lw\leftarrow w-\alpha\nabla L. Passaggio avanti (si memorizzano aia_i, injin_j) e indietro (messaggi ∂L/∂⋅\partial L/\partial\cdot: si sommano gli ingressi di un nodo e si moltiplicano per le derivate locali). Esempio: ∂L∂w3,5=−2(y−y^) g5′(in5) a3\dfrac{\partial L}{\partial w_{3,5}}=-2(y-\hat y)\,g_5'(in_5)\,a_3 (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 →).

Neurone sigmoide: x=2x=2, w=0,5w=0{,}5, y=1y=1: in=1in=1, y^=0,7311\hat y=0{,}7311, L=0,0723L=0{,}0723; ∂L/∂w=−0,5379⋅0,1966⋅2=−0,2115\partial L/\partial w=-0{,}5379\cdot0{,}1966\cdot2=-0{,}2115; con α=1\alpha=1 si ha w=0,7115w=0{,}7115, y^=0,8058\hat y=0{,}8058, L=0,0377L=0{,}0377.

Contro: memoria per i valori intermedi; gradiente che svanisce (σ′≤0,25\sigma'\le0{,}25, dopo 10 livelli ≲10−6\lesssim10^{-6}). Dropout: disattiva unità a caso, robustezza al rumore, approssima un insieme di reti (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 →). Esempi avversari: il rumore può rovesciare l'uscita.

CNN

Convoluzione. Kernel appreso kk di dimensione ll; zi=k⋅(tratto di x in i)z_i=k\cdot(\text{tratto di }x\text{ in }i); stride ss, padding pp; uscita ⌊(n+2p−l)/s⌋+1\lfloor(n+2p-l)/s\rfloor+1. Campo recettivo crescente con la profondità. Pooling (max o media) = convoluzione con pesi fissi per ridurre la dimensione (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) →).

1D: x=(1,3,2,5,4)x=(1,3,2,5,4), k=(1,−1,1)k=(1,-1,1): z=(0,6,1)z=(0,6,1) con stride 1, z=(0,1)z=(0,1) con stride 2. Slide: 256×256×3256\times256\times3, 96 kernel 5×5×35\times5\times3, stride 2, padding 2 ⇒128×128×96\Rightarrow128\times128\times96, 96⋅76=7 29696\cdot76=7\,296 parametri.

RNN, LSTM, non supervisionato

RNN: zt=fw(zt−1,xt)z_t=f_w(z_{t-1},x_t), BPTT; gradiente che svanisce se wz,z<1w_{z,z}<1, che esplode se >1>1. LSTM: memoria ctc_t copiata (non moltiplicata) con porte forget, input, output in [0,1][0,1]. Autoencoder: encoder ff, decoder gg, bottleneck (compressione, denoising, anomalie). VAE: codifica una distribuzione P(z∣x)P(z\mid x) e genera dati nuovi. GAN: generatore contro discriminatore; mode collapse (Autoencoderapprofondimento: non nel programma di Telecomunicazioni. Un autoencoder è una rete non supervisionata che impara a ricostruire il proprio ingresso passando per un collo di bottiglia: encoder $z=e(x)$ (dimensione bassa), decoder $\hat x=d(z)$, loss $|x-d(e(x))|^2$. Con attivazioni lineari equivale alla PCA; con non linearità impara rappresentazioni latenti più ricche (ipotesi del manifold). Varianti: sparse (penalità $\ell_1$ sulle attivazioni), denoising (ingresso corrotto, bersaglio pulito), convolutivi (inpainting). Anomaly detection: si addestra su dati normali e si segnala come anomalo ciò che ha errore di ricostruzione sopra una soglia. VAE: l'encoder produce media e deviazione standard di una gaussiana, il campione si ottiene con il trucco di riparametrizzazione $z=\mu+\sigma\odot\zeta$, $\zeta\sim\mathcal N(0,I)$, e la loss è errore di ricostruzione più KL verso $\mathcal N(0,I)$, con $KL=\frac12\sum(\mu^2+\sigma^2-1-\ln\sigma^2)$; il $\beta$-VAE pesa il KL con $\beta>1$ per rappresentazioni disaccoppiate. Cenno ai GAN.Autoencoder →).

Transfer learning, LLM, trasformatori

Transfer learning: si copiano i pesi, si congelano i primi livelli e si fa fine-tuning dei livelli alti. LLM: predice il token successivo (greedy o a campione); token, vocabolario, embedding. Attenzione e self-attention: selezionano le parti utili del contesto. Trasformatore: embedding di token e posizione, 12-96 blocchi (LayerNorm, attenzione multi-testa, feedforward, residui), testa softmax; perdita entropia incrociata (Cenni a reinforcement learning e reti per sequenzeapprofondimento: non nel programma di Telecomunicazioni, solo cenni (ultima lezione del corso). Reinforcement learning: un agente in uno stato $S_t$ sceglie azioni, l'ambiente restituisce ricompense; l'obiettivo non è minimizzare una loss ma massimizzare il ritorno $G_t=\sum_{k\ge0}\gamma^kR_{t+k+1}$ (fattore di sconto $\gamma\in[0,1)$) trovando la politica ottima $\pi^*=\arg\max G$. Apprendimento di sequenze: servono lunghezze variabili, dipendenze a lungo termine, ordine, parametri condivisi nel tempo; una rete ricorrente aggiorna uno stato $h_t=f_W(h_{t-1},x_t)$; le reti convolutive temporali (TCN) usano convoluzioni causali e dilatate con campo recettivo $1+(k-1)\sum d_\ell$. Chiude con i modelli generativi (VAE, GAN) già visti in Autoencoder.Cenni a reinforcement learning e reti per sequenze →).

Keras (laboratorio 11)

python
model = models.Sequential()
model.add(layers.Conv2D(16, (3, 3), 1, activation="relu", input_shape=(180, 180, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(16, (3, 3), activation="relu"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten()); model.add(layers.Dense(64, activation="relu")); model.add(layers.Dense(1, activation="sigmoid"))
model.compile(optimizer=keras.optimizers.Adam(1e-3), loss="binary_crossentropy", metrics=["accuracy"])
hist = model.fit(train_ds, epochs=5, validation_data=val_ds)

Forme: (178,178,16)→(89,89,16)→(87,87,16)→(43,43,16)→29 584(178,178,16)\to(89,89,16)\to(87,87,16)\to(43,43,16)\to29\,584; parametri 448+2 320+1 893 440+65=1 896 273448+2\,320+1\,893\,440+65=1\,896\,273. Standardizzare in [0,1][0,1] (map(lambda x, y: (x / 255, y)), in predizione dividere per 255); augmentation (rovesciamento, rotazione) solo sul training. Dopo 5 epoche: accuratezza di validazione 0,76660{,}7666. Predizione >0,5>0{,}5: Cane. Salvare con model.save(...h5).

Tabella dei livelli (uscita e parametri (k2Cin+1)Cout(k^2C_{in}+1)C_{out} o (nin+1)nout(n_{in}+1)n_{out}):

livello uscita parametri
Conv2D 16, 3×33\times3 (178,178,16)(178,178,16) 448448
MaxPool 2×22\times2 (89,89,16)(89,89,16) 0
Conv2D 16, 3×33\times3 (87,87,16)(87,87,16) 2 3202\,320
MaxPool 2×22\times2 (43,43,16)(43,43,16) 0
Flatten 29 58429\,584 0
Dense 64 6464 1 893 4401\,893\,440
Dense 1 11 6565

Dati del laboratorio. image_dataset_from_directory: 23 410 immagini, 18 728 di training e 4 682 di validazione (validation_split=0.2), batch da 128 di forma (128,180,180,3)(128,180,180,3); etichetta 0 gatto, 1 cane; len(train_ds)=147 è il numero di batch. Compilazione: Adam 10−310^{-3}, entropia incrociata binaria (una sigmoide in uscita). Esito dopo 5 epoche: accuratezza di training da 0,54810{,}5481 a 0,74990{,}7499, di validazione da 0,65910{,}6591 a 0,76660{,}7666.

Transfer learning e fine-tuning: si congelano i primi livelli (rilevatori di caratteristiche) e si addestrano solo i livelli alti. Esempi avversari: un rumore piccolo può cambiare l'uscita; il dropout aumenta la robustezza. XOR: per (0,0),(0,1),(1,0),(1,1)(0,0),(0,1),(1,0),(1,1) si ha h1=0,1,1,1h_1=0,1,1,1, h2=0,0,0,1h_2=0,0,0,1, y=0,1,1,0y=0,1,1,0.

Errori tipici: attivazione lineare nei nascosti; categorici come interi; dimenticare di dividere per 255 in predizione; augmentation sul validation; contare i parametri senza bias; credere che len(train_ds) sia il numero di immagini.

Esercizi su questo argomento

Teoria collegata