Machine learning · dalla Machine Learning Specialization di Andrew Ng · guida interattiva

Machine learning: dalla retta che impara all'agente che decide

Un algoritmo di machine learning non contiene la soluzione del problema: contiene un modello con dei parametri, una misura dell'errore e un procedimento che muove i parametri per ridurre l'errore sui dati. Questa guida segue il percorso della Machine Learning Specialization di Andrew Ng (DeepLearning.AI e Stanford Online), riscritto a modo nostro: si parte da una retta che impara a prevedere il prezzo di una casa, si passa alla classificazione, alle reti neurali e agli alberi, e si arriva a clustering, rilevamento di anomalie, sistemi di raccomandazione e apprendimento per rinforzo. Ogni idea arriva prima come intuizione, poi come meccanismo con i numeri, e quasi sempre con un laboratorio in cui muovere i parametri con le mani e vedere che cosa succede all'errore.

Parte I

Apprendimento supervisionato: imparare da esempi con la risposta

1 · Che cos'è il machine learning

Un programma che migliora con l'esperienza invece che con nuove righe di codice

Un programma di filtro antispam scritto a mano è un elenco di regole: «se contiene "vinci", è spam». Dopo la decima regola smette di funzionare. Che cosa fa di diverso un programma che impara?

Arthur Samuel, nel 1959, definì il machine learning come «il campo di studio che dà ai computer la capacità di imparare senza essere esplicitamente programmati». Il suo programma di dama giocò decine di migliaia di partite contro se stesso e, tenendo conto di quali posizioni portavano a vincere, finì per battere il suo autore. La differenza sta in chi scrive la regola. Nel programma tradizionale la scrive il programmatore.

Il ciclo di ogni algoritmo

In un programma che impara il programmatore scrive una forma di regola con dei numeri lasciati liberi (i parametri), un modo di misurare quanto la regola sbaglia sugli esempi, e un procedimento che muove i numeri per sbagliare meno. I numeri giusti li trovano i dati. Tutta la guida è lo svolgimento di questa frase: cambiano la forma del modello, la misura dell'errore e il tipo di dati, ma il ciclo è sempre quello.

dati
esempi
→ modello con parametri
f(x) = …w…
→ misura dell'errore
costo J
→ procedimento che muove i parametri
per far scendere J
↺

Supervisionato e non supervisionato: con o senza la risposta

I due grandi tipi di machine learning si distinguono per che cosa contengono i dati. Nell'apprendimento supervisionato ogni esempio è una coppia: un input x e la risposta giusta y, scritta da qualcuno. Email → spam o no; audio → trascrizione; immagine di un pezzo → difettoso o no; dati di una casa → prezzo di vendita. Il modello vede migliaia di coppie e impara a produrre y da x, così da farlo poi su x mai visti. È il tipo che produce più valore economico oggi, ed è la Parte I e II di questa guida.

Dentro il supervisionato ci sono due famiglie: la regressione, quando y è un numero tra infiniti possibili (un prezzo, una temperatura), e la classificazione, quando y è una tra poche categorie (spam/non spam, gatto/cane/cavallo, benigno/maligno).

Nell'apprendimento non supervisionato i dati hanno solo gli x: nessuno ha scritto la risposta, e il compito è trovare una struttura. Raggruppare clienti simili senza sapere in anticipo quali gruppi esistono (clustering, capitolo 11); segnalare la transazione che non somiglia a nessun'altra (rilevamento di anomalie, capitolo 12); comprimere molte variabili in poche (riduzione di dimensionalità).

Un terzo tipo, l'apprendimento per rinforzo (capitolo 14), non ha né le risposte né solo gli x: ha un agente che agisce e riceve ricompense, e deve scoprire da solo quali azioni le producono.

TipoChe cosa c'è nei datiChe cosa imparaEsempiCapitoli
Supervisionato · regressionex e un numero ya prevedere il numeroprezzo di una casa, domanda di energia2–4
Supervisionato · classificazionex e una categoria ya scegliere la categoriaspam, diagnosi, riconoscimento di oggetti5–10
Non supervisionatosolo xuna struttura nascostasegmenti di clienti, anomalie, compressione11–13
Per rinforzostati, azioni, ricompenseuna strategiarobot, giochi, atterraggi14

L'esempio che ci accompagna: il prezzo di una casa

Per tutta la Parte I useremo un dataset minuscolo, abbastanza piccolo da seguire ogni numero: la superficie di alcune case vendute, in metri quadri, e il prezzo a cui sono state vendute, in migliaia di euro. È un problema di regressione supervisionata: abbiamo x (la superficie) e y (il prezzo), e vogliamo una funzione che, data la superficie di una casa nuova, ne stimi il prezzo.

esempio isuperficie x(i) (m²)prezzo y(i) (k€)
150150
265185
380210
495265
5110290
6130350
La notazione, una volta per tutte

I dati di addestramento si chiamano training set; il loro numero è m (qui 6). Il singolo esempio è x(i), y(i), con l'indice tra parentesi (non è una potenza). La funzione che il modello produce si chiama f, oppure ŷ («y cappello»): la stima, da non confondere con il valore vero y. La variabile di ingresso x si chiama anche feature (caratteristica), quella di uscita y target (obiettivo) o etichetta.

Mappa concettuale · che cos'è il machine learning
  • Machine learning
    • si basa su un ciclo Modello, errore, procedimento
      • il modello ha parametri liberi
      • l'errore si misura con il costo J sugli esempi
      • il procedimento muove i parametri per sbagliare meno
    • con la risposta Supervisionato
      • y è un numero: regressione
      • y è una categoria: classificazione
    • senza la risposta Non supervisionato
      • serve a trovare una struttura nei dati
      • ad esempio clustering e anomalie capitoli 11–12
    • con azioni e ricompense Apprendimento per rinforzo
      • impara una strategia capitolo 14

In sintesi · capitolo 1

  • Machine learning — una forma di regola con parametri liberi, una misura dell'errore sugli esempi, un procedimento che muove i parametri; i numeri giusti li trovano i dati
  • Supervisionato — esempi con la risposta: regressione (y numero) e classificazione (y categoria)
  • Non supervisionato — solo x: clustering, anomalie, compressione · Rinforzo — azioni e ricompense
  • Notazione — m esempi (x(i), y(i)), feature x, target y, previsione ŷ = f(x)
2 · La prima retta che impara

Un modello è una forma con dei numeri liberi; il costo dice quanto sbaglia

Guardando i sei punti del dataset, un essere umano traccerebbe «a occhio» una retta che li attraversa e la userebbe per stimare il prezzo di una casa da 100 m². Come si traduce quell'«a occhio» in qualcosa che un programma può fare?

Prima si fissa la forma: una retta. Una retta è f(x) = w · x + b, dove w è la pendenza (quanti k€ in più per ogni m² in più) e b l'intercetta (il prezzo «di base» a superficie zero). w e b sono i parametri: i due numeri liberi del modello. Scegliere la retta significa scegliere w e b. Il modello si chiama regressione lineare a una variabile (o univariata), ed è il più semplice modello supervisionato: tutto ciò che impareremo dopo è una variazione di questo.

Poi serve un modo di dire quanto una retta è sbagliata, con un numero, perché solo un numero si può minimizzare. Per ogni esempio la retta stima ŷ(i) = w·x(i) + b, e il vero prezzo è y(i): la differenza ŷ(i) − y(i) è l'errore (o residuo) su quell'esempio.

Perché il quadrato, e perché 2m

Si eleva al quadrato, per due motivi: così gli errori positivi e negativi non si cancellano, e un errore grande pesa più di due piccoli (sbagliare di 40 costa quattro volte sbagliare di 20). Si sommano i quadrati su tutti gli m esempi, e si divide per 2m: dividere per m dà la media, così il costo non cresce solo perché i dati sono di più; il 2 è una comodità, perché semplifica la derivata del capitolo 3 senza cambiare dove sta il minimo.

J(w, b) = 1 / 2m · Σi=1…m ( f(x(i)) − y(i) )² La funzione di costo (o cost function) dell'errore quadratico medio. J è un numero: dipende da w e b, cioè dalla retta scelta, e vale 0 solo se la retta passa per tutti i punti. L'obiettivo del training è trovare w e b che rendono J più piccolo possibile.

Laboratorio: muovi la retta, guarda il costo

matematica reale

I sei punti sono il dataset del capitolo 1. Muovi w e b: le linee verticali sono gli errori su ogni esempio, e il costo J è la media dei loro quadrati, diviso 2. Prova a portarlo più in basso che puoi a mano.

Il minimo esatto per questi dati è w ≈ 2,50 e b ≈ 21,2, con J ≈ 19,4: nessuna retta può fare meglio, perché i punti non sono perfettamente allineati. Trovarlo a mano è faticoso già con due parametri; con mille è impossibile. Il capitolo 3 fa fare al computer esattamente quello che stai facendo tu, ma con una bussola.

Il costo come paesaggio. Per ogni coppia (w, b) c'è un valore di J: se si disegna J al variare di w e b si ottiene una superficie a forma di ciotola, con un solo punto più basso. Per la regressione lineare con l'errore quadratico è sempre così (la funzione è convessa): non ci sono avvallamenti secondari in cui restare bloccati.

Tagliando la ciotola a quote fisse si ottengono le curve di livello, ellissi concentriche attorno al minimo: le useremo nel capitolo 4 per capire perché conviene scalare le feature.

Mappa concettuale · la prima retta che impara
  • Regressione lineare
    • ha la forma f(x) = w·x + b
      • i parametri sono w pendenza e b intercetta
    • si valuta con Costo J(w, b)
      • è la media di errori al quadrato, diviso 2
      • vale 0 solo se la retta passa per tutti i punti
    • visto come paesaggio è una ciotola convessa
      • ha un solo minimo
      • tagliata a quote dà le curve di livello
    • si trova con discesa del gradiente capitolo 3

In sintesi · capitolo 2

  • Modello — f(x) = w·x + b: la forma è fissa, w e b sono i parametri da trovare
  • Costo J(w, b) — media su m esempi del quadrato dell'errore, diviso 2; un solo numero che dice quanto la retta sbaglia
  • Perché il quadrato — niente cancellazioni, gli errori grandi pesano di più, derivata semplice
  • Paesaggio — J è una ciotola convessa: un solo minimo

Autodiagnosi

  1. Se raddoppi tutti gli errori, di quanto cresce J? Perché?
  2. Che cosa significa J = 0, e perché per i nostri sei punti è impossibile?
  3. Qual è la differenza tra ŷ(3) e y(3)?
3 · Discesa del gradiente

Scendere la ciotola un passo alla volta, nella direzione più ripida

Sei in una valle nebbiosa e devi raggiungere il punto più basso. Non vedi la valle: senti solo la pendenza del terreno sotto i piedi. Che cosa fai?

Fai un passo in discesa, nella direzione in cui il terreno scende di più; ti fermi, risenti la pendenza, fai un altro passo. È la discesa del gradiente (gradient descent), il procedimento che trova i parametri in quasi tutto il machine learning, dalle rette alle reti neurali con miliardi di pesi.

La «pendenza del terreno» ha un nome matematico: la derivata del costo rispetto a un parametro, ∂J/∂w, che dice di quanto cambierebbe J se aumentassi w di pochissimo. Positiva: salendo con w il costo sale, quindi w va diminuito. Negativa: va aumentato. Grande: siamo su un pendio ripido, lontani dal fondo. Vicina a zero: siamo quasi sul fondo.

Il gradiente è l'insieme delle derivate rispetto a tutti i parametri: la direzione di massima salita, e il suo opposto è la direzione di massima discesa.

ripeti fino a convergenza:
w ← w − α · ∂J/∂w
b ← b − α · ∂J/∂b α (alfa) è il learning rate, la lunghezza del passo: un numero piccolo e positivo, per esempio 0,01. Le due righe si eseguono simultaneamente: si calcolano entrambe le derivate con i vecchi w e b, poi si aggiornano entrambi. Aggiornare w e poi usare il nuovo w per calcolare la derivata di b funziona quasi, ma non è l'algoritmo.

Le derivate per la regressione lineare si calcolano a mano, ed è qui che il 2 nel denominatore di J ripaga:

Formula · le derivate della regressione lineare

∂J/∂w=1 m · Σ ( f(x(i)) − y(i) ) · x(i)
errore medio, pesato per x
∂J/∂b=1 m · Σ ( f(x(i)) − y(i) )
errore medio

Leggile così: la derivata rispetto a b è l'errore medio (se in media stimiamo troppo alto, b scende); quella rispetto a w è l'errore medio pesato per x (gli esempi con x grande spostano di più la pendenza). Questa versione, che a ogni passo usa tutti gli m esempi, si chiama batch gradient descent.

Il learning rate decide tutto

Troppo piccolo, e servono migliaia di passi minuscoli. Troppo grande, e il passo scavalca il fondo atterrando più in alto di prima, poi scavalca di nuovo dall'altra parte: il costo oscilla e diverge. La cosa notevole è che con α fisso il passo si accorcia da solo avvicinandosi al minimo, perché la derivata diminuisce: non serve ridurre α durante la discesa.

Il laboratorio mostra tutte e tre le situazioni sulla ciotola del nostro dataset, con b tenuto fermo al suo valore ottimo per poter disegnare J in due dimensioni.

Laboratorio: la discesa su J(w)

matematica reale

La curva è il costo del dataset al variare di w, con b fissato a 21,2. Scegli il punto di partenza, il learning rate e il numero di passi, e segui la pallina: ogni passo è w ← w − α·∂J/∂w, con la derivata calcolata davvero sui sei esempi.

Nota la scala di α: con x intorno a 100 m², la derivata ∂J/∂w contiene x² ≈ 10.000, quindi i passi sensati sono dell'ordine di 10⁻⁴. È il primo segnale di un problema che il capitolo 4 risolve con il feature scaling: la scala giusta di α dipende dalla scala dei dati.

Mappa concettuale · la discesa del gradiente
  • Discesa del gradiente
    • usa la derivata ∂J/∂w
      • dice verso e ripidità del pendio
      • l'insieme delle derivate è il gradiente
    • aggiorna con w ← w − α·∂J/∂w
      • per tutti i parametri insieme
      • si ferma quando J smette di scendere
    • dipende dal learning rate α
      • troppo piccolo: lentissima
      • troppo grande: oscilla e diverge
    • nella versione batch
      • a ogni passo usa tutti gli m esempi

In sintesi · capitolo 3

  • Derivata — di quanto cambia J se cambi un parametro di pochissimo: segno = verso, grandezza = ripidità
  • Regola — w ← w − α·∂J/∂w, per tutti i parametri insieme, finché J smette di scendere
  • Learning rate — troppo piccolo: lento; troppo grande: oscilla e diverge; fisso va bene perché la derivata si riduce da sola vicino al minimo
  • Batch — a ogni passo si usano tutti gli m esempi

Autodiagnosi

  1. Se ∂J/∂w è negativa, w deve aumentare o diminuire? Perché?
  2. Perché con α fisso la pallina rallenta avvicinandosi al minimo?
  3. Che cosa vedi nel grafico di J per iterazione se α è troppo grande?
4 · Più variabili

Il prezzo dipende da superficie, stanze, piano, età: vettori, scaling e feature

Una casa non ha solo la superficie: ha il numero di stanze, il piano, l'età. Come si estende la retta a quattro input? E perché, appena lo si fa, la discesa del gradiente comincia a comportarsi male?

La forma resta lineare: ogni feature ha il suo peso, f(x) = w₁x₁ + w₂x₂ + w₃x₃ + w₄x₄ + b. Si scrive in modo compatto raccogliendo le feature in un vettore x = [x₁, x₂, x₃, x₄] e i pesi in un vettore w: f(x) = w · x + b, dove il punto è il prodotto scalare (si moltiplicano le componenti a coppie e si sommano).

Ogni peso ha un significato leggibile: w₂ = 15 dice «ogni stanza in più vale 15 k€, a parità del resto»; un w₄ negativo dice che l'età abbassa il prezzo.

Il modello si chiama regressione lineare multipla (non «multivariata», che indica più output).

Vettorizzazione. Il prodotto scalare si può scrivere come un ciclo for su n feature, oppure come np.dot(w, x) + b. La seconda forma non è solo più corta: NumPy la esegue con istruzioni del processore che moltiplicano molte coppie in parallelo e sommano in blocco, e con n grande la differenza è di decine di volte.

La stessa idea vale per il gradiente: i Σ su tutti gli esempi diventano prodotti tra matrici, ed è così che il training di una rete neurale su GPU diventa possibile. Le derivate della discesa del gradiente restano quelle del capitolo 3, una per ogni wj: ∂J/∂wj = 1/m · Σ (f(x(i)) − y(i)) · xj(i).

Feature scaling: perché le scale diverse rallentano la discesa

La superficie va da 50 a 130, il numero di stanze da 1 a 5. Perché questo dovrebbe disturbare la discesa del gradiente?

Perché il peso di una feature grande deve essere piccolo e viceversa: se x₁ (superficie) vale 100 e x₂ (stanze) vale 3, un w₁ = 2 sposta il prezzo di 200 mentre un w₂ = 2 lo sposta di 6. La ciotola del costo diventa allora una valle stretta e lunga: ripidissima lungo w₁ (basta un filo per cambiare molto il prezzo), piattissima lungo w₂.

La discesa del gradiente, che segue la pendenza locale, rimbalza da una parete all'altra della valle stretta facendo passi minuscoli lungo l'asse lungo: serve un α piccolo per non divergere su w₁, e con quell'α lungo w₂ si impiega un'eternità.

Il rimedio è portare tutte le feature su una scala simile, tipicamente intorno a [−1, 1].

Formule · tre modi di scalare

x′=x max
Scaling per il massimo
x′=x − μ max − min
Normalizzazione per media (mean normalization): centrata sullo zero
x′=x − μ σ
Z-score, con μ media e σ deviazione standard della feature nel training set; è la più usata

La normalizzazione per media sulle case del capitolo 1. Le superfici sono 50, 65, 80, 95, 110 e 130 m². Servono tre numeri, tutti calcolati sul training set: il minimo (50), il massimo (130) e la media vera μ. Il denominatore è l'ampiezza dell'intervallo, max − min.

Calcolo · media e ampiezza delle superfici

somma=50 + 65 + 80 + 95 + 110 + 130 = 530
μ=530 6 ≈ 88,3
max − min=130 − 50 = 80
x′=x − 88,3 80

Ogni superficie diventa x′ (la colonna centrale è lo scarto x − μ, quella a destra il valore scalato x′):

superficie x (m²)scarto dalla mediavalore scalato
50−38,3−0,479
65−23,3−0,292
80−8,3−0,104
956,70,083
11021,70,271
13041,70,521

Che cosa si nota. La media delle x′ è esattamente 0: sottrarre μ sposta il centro dei dati sullo zero. I valori vanno da −0,479 a 0,521, un intervallo largo esattamente 1, perché si è diviso proprio per l'ampiezza max − min; non è quindi [−1, 1] pieno, ma un tratto largo 1 che sta dentro [−1, 1] e che è simmetrico solo se i dati lo sono.

Qui la casa più piccola è più vicina alla media di quella più grande (38 m² contro 42), e infatti −0,479 è più vicino a zero di 0,521.

Se al posto di μ si usasse il punto medio tra minimo e massimo, si otterrebbe un [−0,5, 0,5] perfetto, ma la media delle x′ non sarebbe più zero: per questo serve la media vera e non bastano minimo e massimo.

Calcolo · il punto medio al posto della media

punto medio=50 + 130 2 = 90
media delle x′=88,3 − 90 80 ≈ −0,021
non è zero
Gli stessi numeri del training set

Qualunque scaling si scelga, va applicato con gli stessi numeri del training set (μ, minimo e massimo, oppure μ e σ) anche ai dati nuovi al momento della previsione: il modello ha imparato sulle feature scalate e si aspetta quelle.

Una casa nuova di 150 m² diventa:

Calcolo · una casa nuova

x′=150 − 88,3 80 ≈ 0,771

Anche se supera il massimo del training set: non si ricalcolano minimo e massimo con la casa nuova.

Laboratorio: la valle stretta e lo scaling

matematica reale · due feature

Curve di livello del costo per un dataset con due feature, superficie (50–130) e stanze (1–5), al variare di w₁ e w₂ (b fissato). Attiva lo scaling e guarda la valle diventare una ciotola rotonda; poi confronta quanti passi servono alla discesa per arrivare al centro.

Il cursore di α è relativo: lo stesso valore viene convertito nella scala sensata per ciascun caso (nel caso grezzo i passi utili sono mille volte più piccoli), così da confrontare la forma delle due discese. Il centro è il minimo di J; i cerchi sono le curve di livello.

Controllare che la discesa funzioni, e scegliere α

Il grafico da guardare sempre è J in funzione del numero di iterazioni (la curva di apprendimento): se la discesa funziona, scende a ogni passo e poi si appiattisce. Se sale, anche solo a tratti, α è troppo grande (o c'è un errore nel codice: con α abbastanza piccolo J deve scendere a ogni iterazione).

Un metodo pratico per scegliere α: provare valori distanziati di circa tre volte, 0,001, 0,003, 0,01, 0,03, 0,1…, scegliere il più grande che fa ancora scendere J in modo regolare, o poco meno. Quando J scende di meno di una soglia (per esempio 0,001) in un'iterazione si può dichiarare la convergenza, ma guardare il grafico è più affidabile di qualsiasi soglia.

Feature engineering e regressione polinomiale

Il modello è lineare nei parametri, non necessariamente nei dati: nessuno vieta di costruire nuove feature dalle vecchie. Se hai la larghezza e la profondità del lotto, la feature che conta è probabilmente l'area, larghezza × profondità: creala e dalla al modello.

Se la relazione tra superficie e prezzo non è una retta ma si piega, aggiungi x² e x³ come feature: f(x) = w₁x + w₂x² + w₃x³ + b è ancora una regressione lineare (nei w), ma disegna una curva. È la regressione polinomiale, e qui lo scaling diventa indispensabile: se x va fino a 130, x² arriva a 17.000 e x³ a due milioni.

Scegliere le feature giuste, con la conoscenza del problema, è spesso ciò che fa la differenza tra un modello mediocre e uno buono; nel capitolo 7 vedremo che le reti neurali imparano da sole feature intermedie, ed è il motivo del loro successo.

Mappa concettuale · più variabili
  • Più variabili
    • il modello è f(x) = w·x + b con vettori
      • un peso per ogni feature
      • si calcola veloce con np.dot (vettorizzazione)
    • scale diverse richiedono Feature scaling
      • evita la valle stretta e lunga
      • può essere per il massimo, per media o z-score
      • va applicato anche ai dati nuovi, con gli stessi numeri
    • si controlla con la curva di J per iterazione
      • deve scendere sempre
      • se sale α è troppo grande
    • si arricchisce con Feature engineering
      • ad esempio regressione polinomiale
      • richiede lo scaling

In sintesi · capitolo 4

  • Regressione multipla — f(x) = w·x + b, un peso per feature; vettorizzare con np.dot per velocità
  • Feature scaling — portare le feature su scale simili (z-score) trasforma la valle stretta in una ciotola rotonda: la discesa converge in pochi passi; usare gli stessi μ e σ in previsione
  • Curva J vs iterazioni — deve scendere sempre; se sale, α troppo grande; provare α a multipli di 3
  • Feature engineering — nuove feature da quelle esistenti; polinomi per le curve, sempre con lo scaling

Autodiagnosi

  1. Perché una feature con valori grandi deve avere un peso piccolo, e che forma dà questo alla ciotola del costo?
  2. Perché lo z-score va calcolato sul training set e riutilizzato sui dati nuovi?
  3. La regressione polinomiale è un modello lineare? In che senso?
5 · Classificare

Quando la risposta è sì o no: la regressione logistica

Un tumore è maligno (1) o benigno (0), e conosciamo la sua dimensione. Perché non usare la retta del capitolo 2, con una soglia a 0,5?

Perché la retta non sa che y è una categoria. Funziona finché i dati sono «comodi», ma basta aggiungere un esempio di tumore molto grande, chiaramente maligno, perché la retta si inclini per inseguirlo, sposti la soglia a destra e cominci a classificare come benigni tumori che prima classificava bene.

Inoltre produce valori sotto 0 e sopra 1, che come «probabilità di essere maligno» non significano nulla. Serve un modello che produca sempre un numero tra 0 e 1 e che non si lasci trascinare dagli esempi estremi.

La regressione logistica (che, nonostante il nome, è un algoritmo di classificazione) prende la stessa combinazione lineare z = w·x + b e la passa attraverso la funzione sigmoide, g(z) = 1 / (1 + e−z): una S che vale 0,5 per z = 0, tende a 1 per z grande e a 0 per z molto negativo. L'uscita f(x) = g(w·x + b) si legge come la probabilità che y sia 1 dato x: f = 0,7 vuol dire «70% maligno».

Per decidere si confronta con una soglia, di solito 0,5: f ≥ 0,5 equivale a z ≥ 0, cioè w·x + b ≥ 0. L'insieme dei punti in cui w·x + b = 0 è il confine di decisione (decision boundary): una retta se le feature sono due, un piano se tre; e con feature polinomiali (x₁², x₂²…) diventa un cerchio o una forma qualsiasi, come nel capitolo 4.

Il costo: perché il quadrato non va più bene e che cosa lo sostituisce

Il quadrato non va più bene

Se si usa l'errore quadratico con la sigmoide dentro, la ciotola del costo smette di essere una ciotola: diventa un terreno pieno di avvallamenti locali, e la discesa del gradiente si ferma nel primo che trova.

Serve una misura dell'errore pensata per le probabilità. Per un singolo esempio, la perdita (loss) della regressione logistica è −log(f(x)) se y = 1 e −log(1 − f(x)) se y = 0. Leggila:

Calcolo · la perdita quando il vero valore è 1

il modello dice 0,99=−log 0,99 ≈ 0,01
quasi nulla
il modello dice 0,5=−log 0,5 ≈ 0,69
il modello dice 0,01=−log 0,01 ≈ 4,6
enorme

Più il modello è sicuro della cosa sbagliata, più la perdita cresce, senza limite. Le due righe si scrivono in una sola, perché y vale 0 o 1: L = −y·log(f) − (1 − y)·log(1 − f). Il costo J è la media delle perdite sugli m esempi, e con questa scelta torna a essere convesso: un solo minimo. (Nel capitolo 2 della guida sul training degli LLM la stessa funzione, chiamata cross-entropy, è la loss con cui si addestrano i modelli linguistici.)

Il colpo di scena è nella discesa del gradiente: le derivate hanno la stessa identica forma della regressione lineare:

Formula · il gradiente della regressione logistica

∂J/∂wj=1 m · Σ ( f(x(i)) − y(i) ) · xj(i)

Cambia solo che cosa è f: w·x + b prima, g(w·x + b) ora. Tutto il resto (vettorizzazione, scaling, controllo della curva di J, scelta di α) si trasferisce senza modifiche.

Laboratorio: sigmoide, confine di decisione e perdita

matematica reale

Dieci tumori su una sola feature, la dimensione (cm): i punti in alto sono maligni (y = 1), quelli in basso benigni (y = 0). Muovi w e b: la curva è f(x) = g(w·x + b), la linea tratteggiata il confine f = 0,5, e il costo è la media delle perdite logistiche. Prova a far passare la soglia nel punto giusto, poi rendi la S più ripida.

Il confine di decisione è x = −b/w: cambiando b la S trasla, cambiando w si irrigidisce. Con dati perfettamente separabili la discesa del gradiente continuerebbe a crescere w all'infinito (una S sempre più verticale abbassa sempre un po' il costo): è uno dei motivi per cui, nel capitolo 6, si aggiunge la regolarizzazione.

Mappa concettuale · classificare
  • Regressione logistica
    • serve a classificare sì/no
      • perché la retta esce da [0, 1] e un esempio estremo sposta la soglia
    • usa la sigmoide g(z)
      • produce la probabilità che y = 1
      • si decide con una soglia, di solito 0,5
    • separa con il confine di decisione w·x + b = 0
      • diventa curvo con feature polinomiali
    • si misura con la perdita logistica
      • è convessa
      • punisce la sicurezza sbagliata
      • ha un gradiente della stessa forma della lineare

In sintesi · capitolo 5

  • Perché non la retta — esce da [0, 1] e un esempio estremo sposta la soglia
  • Regressione logistica — f(x) = g(w·x + b) con la sigmoide: la probabilità che y = 1
  • Confine di decisione — w·x + b = 0; lineare, o curvo con feature polinomiali
  • Perdita logistica — −log f se y = 1, −log(1 − f) se y = 0: convessa, punisce la sicurezza sbagliata
  • Gradiente — stessa forma della regressione lineare, cambia solo f

Autodiagnosi

  1. Che cosa significa f(x) = 0,3 per un esempio, e che cosa decide la soglia 0,5?
  2. Perché la perdita vale 4,6 quando il modello dice 0,01 e la verità è 1?
  3. Come si ottiene un confine di decisione circolare con la regressione logistica?
6 · Overfitting

Un modello che impara a memoria i dati ha smesso di imparare il problema

Un polinomio di grado 5 passa esattamente per tutti e sei i punti del dataset: costo zero. È il modello migliore?

No, e si vede appena arriva una casa nuova: la curva che si contorce per toccare ogni punto del training set stima prezzi assurdi tra un punto e l'altro. Ha imparato il rumore dei sei esempi, non la relazione tra superficie e prezzo.

Si dice che il modello ha overfit (si è sovradattato) o che ha alta varianza: cambiando di poco i dati di training, la curva cambierebbe moltissimo.

All'estremo opposto c'è l'underfit, o alto bias: una retta su dati che si piegano ha un pregiudizio (la relazione è lineare) che i dati non confermano, e sbaglia sia sul training set sia sui dati nuovi. Il modello che generalizza sta nel mezzo: va bene sui dati di training e quasi altrettanto bene su quelli mai visti. Lo stesso accade nella classificazione: un confine di decisione che si avvolge attorno a ogni singolo esempio ha overfit.

Tre rimedi, in ordine di preferenza

Più dati: con molti esempi un modello flessibile non riesce più a inseguire il rumore, perché il rumore si media; è il rimedio migliore quando si può. Meno feature: usare solo quelle che contano (feature selection), a costo di buttare informazione. Regolarizzazione: tenere tutte le feature ma impedire ai parametri di diventare grandi, che è ciò che permette alla curva di contorcersi.

Regolarizzazione: una tassa sui parametri grandi

L'idea è aggiungere al costo un termine che cresce con la grandezza dei pesi:

Formula · il costo con la regolarizzazione

J(w, b)=1 2m · Σ ( f(x(i)) − y(i) )² + λ 2m · Σj wj²

Il primo pezzo chiede di adattarsi ai dati, il secondo di tenere i w piccoli; λ (lambda, il parametro di regolarizzazione) decide il compromesso.

λ = 0: nessuna tassa, si torna all'overfitting. λ enorme: tutti i w vengono schiacciati a zero e resta f = b, una retta orizzontale, underfitting. Nel mezzo c'è il valore giusto, e il capitolo 9 spiega come sceglierlo con i dati. Per convenzione b non si regolarizza: non cambia la forma della curva, solo la sua altezza.

Nella discesa del gradiente il termine aggiunge λ/m · wj alla derivata, e la regola di aggiornamento diventa:

Formula · l'aggiornamento con la regolarizzazione

wj← wj (1 − α · λ m) − α · (derivata di prima)

A ogni passo ogni peso viene prima moltiplicato per un numero appena sotto 1 (per esempio 0,9998) e poi aggiornato come sempre. La regolarizzazione è letteralmente un restringimento continuo dei pesi, che il termine dei dati contrasta solo dove serve davvero. Per la regressione logistica è identico: stessa tassa, stesso restringimento.

Laboratorio: grado del polinomio e λ

matematica reale

Dodici case generate da una relazione curva più rumore; otto sono di training (pieni), quattro di test (vuoti), mai usate per adattare il modello. Scegli il grado del polinomio e λ: il modello è ottimizzato esattamente (con la regolarizzazione), e i due errori dicono se sta imparando il problema o il rumore.

Le feature polinomiali sono scalate con lo z-score prima dell'adattamento, come richiede il capitolo 4; il grafico mostra la curva nelle unità originali. L'errore di test è la misura che conta: è ciò che il modello farà sulle case che non ha mai visto.

Mappa concettuale · overfitting
  • Overfitting
    • significa alta varianza
      • costo basso sul training set
      • costo alto sui dati nuovi
    • all'opposto c'è underfitting (alto bias)
      • il modello è troppo rigido
      • sbaglia anche sul training set
    • l'obiettivo è generalizzare
      • andare bene sui dati mai visti
    • si cura con la regolarizzazione
      • aggiunge al costo λ/2m · Σw²
      • a ogni passo restringe i pesi
      • λ enorme porta all'underfitting
    • oppure con più dati o meno feature

In sintesi · capitolo 6

  • Overfitting (alta varianza) — costo basso sul training, alto sui dati nuovi: il modello ha imparato il rumore
  • Underfitting (alto bias) — il modello è troppo rigido per i dati: sbaglia ovunque
  • Rimedi — più dati; meno feature; regolarizzazione
  • Regolarizzazione — + λ/2m·Σw²: a ogni passo i pesi si restringono di un fattore (1 − αλ/m); λ regola il compromesso tra adattarsi e restare semplici

Autodiagnosi

  1. Perché l'errore sul training set da solo non dice se il modello è buono?
  2. Che cosa succede alla curva se λ → ∞, e perché b non viene regolarizzato?
  3. Perché «più dati» è il rimedio preferito all'overfitting?

Parte II

Modelli che imparano le feature da soli: reti neurali e alberi

7 · Reti neurali

Molte regressioni logistiche in fila, che inventano da sole le feature intermedie

Nel capitolo 4 le feature utili (l'area del lotto, x²) le abbiamo costruite noi. Per riconoscere un volto in una foto di un milione di pixel, quali feature costruiresti a mano? E se fosse il modello a inventarle?

Un esempio: la maglietta best seller

Prendi il problema di prevedere se una maglietta sarà un best seller a partire da prezzo, costo di spedizione, spesa in marketing e qualità del tessuto. Un esperto ragionerebbe per passi intermedi: prezzo e spedizione determinano quanto è conveniente; il marketing quanto è conosciuta; prezzo e tessuto la qualità percepita; e da queste tre si decide.

Una rete neurale fa esattamente questo, con una differenza: le tre grandezze intermedie non le definisce nessuno. Il modello ha tre «unità» che ricevono tutte e quattro le feature e imparano, durante il training, quali combinazioni calcolare perché la previsione finale funzioni. Noi, dopo, possiamo guardarle e dar loro un nome; la rete non ne ha bisogno.

Ogni unità, o neurone, è una regressione logistica del capitolo 5: prende i suoi input, calcola z = w·x + b, applica una funzione di attivazione g (per ora la sigmoide) e produce un numero a, l'attivazione.

Un gruppo di neuroni che ricevono gli stessi input è uno strato (layer); l'uscita di uno strato è l'input del successivo. Lo strato finale produce la previsione; quelli in mezzo si chiamano nascosti (hidden), perché il training set non dice che cosa debbano calcolare: contiene solo gli x e le y, e i valori intermedi li decide la rete.

In una rete per il riconoscimento dei volti, i neuroni dei primi strati finiscono per reagire a bordi e linee corte, quelli successivi a occhi e nasi, gli ultimi a forme di volto intere: una gerarchia di feature che nessuno ha programmato.

x
prezzo, spedizione, marketing, tessuto
→ strato 1 · 3 neuroni
a[1] = g(W[1]x + b[1])
→ strato 2 · 1 neurone
a[2] = g(W[2]a[1] + b[2])
→ P(best seller)
soglia 0,5

Forward propagation: il calcolo da sinistra a destra

La notazione mette tra parentesi quadre l'indice dello strato: a[1] è il vettore delle attivazioni dello strato 1, a2[1] quella del suo secondo neurone, W[1] e b[1] i suoi parametri; l'input x si può chiamare a[0]. Lo strato l calcola, per ciascun neurone j:

Formula · un neurone di uno strato

aj[l]=g( wj[l] · a[l−1] + bj[l] )

Fare questo calcolo strato dopo strato, dall'input all'uscita, si chiama forward propagation (propagazione in avanti) ed è ciò che la rete fa in inferenza, quando è già addestrata e deve rispondere. Tutti i neuroni di uno strato si calcolano insieme con un prodotto tra matrici:

Formula · un intero strato, in un colpo solo

Z=A[l−1] W + b
A=g(Z)

È la vettorizzazione del capitolo 4, ed è il motivo per cui le reti girano bene su GPU.

Perché gli strati nascosti servono davvero

Un solo neurone logistico traccia un confine di decisione lineare. Due strati possono tracciare confini curvi, chiusi, a pezzi: ogni neurone nascosto divide il piano con la sua retta, e il neurone di uscita combina le regioni.

Il laboratorio allena davvero una rete piccola su dati che nessuna retta può separare; guarda nascere il confine e le rette dei singoli neuroni nascosti.

Laboratorio: una rete che impara un confine curvo

matematica reale · training nel browser

Sessanta punti in due classi, i positivi in mezzo: nessuna retta li separa. La rete ha 2 input, uno strato nascosto (scegli quanti neuroni, con attivazione ReLU) e un neurone di uscita sigmoide; viene addestrata con la discesa del gradiente sulla perdita logistica, con le derivate calcolate dalla regola della catena (backpropagation). Le linee sottili sono i confini dei neuroni nascosti (dove la loro z vale 0); lo sfondo è la probabilità prevista.

Con 1 neurone nascosto la rete può al massimo tracciare una retta; con 2 chiude una striscia; con 4 o più circonda i positivi. Ogni «Nuovi pesi casuali» parte da un'inizializzazione diversa: a volte la discesa si ferma in una soluzione peggiore, perché con gli strati nascosti il costo non è più una ciotola convessa. Il training vero usa le stesse formule, con milioni di parametri e la libreria (TensorFlow, PyTorch) che calcola le derivate al posto nostro.

Mappa concettuale · reti neurali
  • Rete neurale
    • è fatta di neuroni
      • ciascuno è una regressione logistica
      • produce un'attivazione a
    • organizzati in strati
      • quelli in mezzo sono gli strati nascosti
      • calcolano feature intermedie
    • si calcola con forward propagation
      • va da x all'uscita
      • si vettorizza con prodotti tra matrici
    • permette confini curvi
      • ogni neurone nascosto traccia una retta
      • l'uscita combina le regioni
    • si addestra con backpropagation capitolo 8

In sintesi · capitolo 7

  • Neurone — una regressione logistica: a = g(w·x + b) · Strato — neuroni con gli stessi input · Rete — strati in fila
  • Strati nascosti — calcolano feature intermedie che nessuno ha definito: è il motivo del successo delle reti
  • Forward propagation — da x all'uscita, strato per strato, con prodotti tra matrici
  • Confini curvi — ogni neurone nascosto traccia una retta, l'uscita combina le regioni

Autodiagnosi

  1. Che cosa calcola a2[1], e chi decide che cosa «significa»?
  2. Perché una rete con un solo neurone nascosto non separa i punti del laboratorio?
  3. Che cos'è la forward propagation e quando si usa?
8 · Addestrare una rete

Le stesse tre mosse di sempre: modello, costo, discesa

In TensorFlow addestrare una rete sono tre righe: model = Sequential([...]), model.compile(loss=...), model.fit(X, Y, epochs=100). Che cosa fanno davvero quelle tre righe?

Sono le tre mosse della regressione logistica. La prima definisce il modello: quanti strati, quanti neuroni, quali attivazioni, cioè la funzione f(x) con i suoi parametri. La seconda sceglie il costo: per una classificazione binaria la binary cross-entropy, che è esattamente la perdita logistica del capitolo 5 (−y log f − (1−y) log(1−f)) mediata sugli esempi; per una regressione l'errore quadratico. La terza minimizza il costo con la discesa del gradiente per il numero di epoche indicato (un'epoca = un passaggio su tutto il training set).

La libreria calcola le derivate rispetto a tutti i parametri con la backpropagation, la regola della catena applicata all'indietro strato per strato; è la stessa cosa che il laboratorio del capitolo 7 fa a mano per una rete piccola, e la guida sul training degli LLM la spiega passo per passo.

Quando il gradiente non c'è, perché l'unico segnale è un punteggio che arriva alla fine di una prova e non è derivabile rispetto ai pesi, si può farne a meno: la guida Neural Network Driving allena una rete piccola come quella del capitolo 7 per evoluzione, facendo competere molte copie e ricombinando i pesi delle migliori.

Python · TensorFlow, le tre mosse
# 1 · il modello: la forma di f(x) e i suoi parametri
model = Sequential([Dense(units=25, activation='relu'),
                    Dense(units=15, activation='relu'),
                    Dense(units=1,  activation='sigmoid')])
# 2 · il costo: la perdita logistica, qui chiamata binary cross-entropy
model.compile(loss=BinaryCrossentropy(), optimizer=Adam(learning_rate=1e-3))
# 3 · la discesa: 100 passaggi sul training set
model.fit(X, Y, epochs=100)

Le funzioni di attivazione: perché non la sigmoide ovunque

Tre attivazioni coprono quasi tutto. La sigmoide, tra 0 e 1, va bene quando l'uscita è una probabilità: il neurone finale di una classificazione binaria. La lineare (g(z) = z, cioè nessuna attivazione) serve quando l'uscita è un numero qualsiasi, positivo o negativo: una regressione.

La ReLU (Rectified Linear Unit, g(z) = max(0, z)) è la scelta di default per gli strati nascosti, per due ragioni: è più veloce da calcolare, e soprattutto non si «appiattisce» a destra come la sigmoide, che per z grande ha derivata quasi zero e rende la discesa del gradiente lentissima. Per uscite che devono essere non negative (un prezzo) va bene la ReLU anche in uscita.

Perché serve una non linearità

Se tutti i neuroni avessero attivazione lineare, la rete intera, per quanti strati abbia, calcolerebbe una funzione lineare di x: una combinazione lineare di combinazioni lineari è ancora una combinazione lineare, e si torna alla regressione del capitolo 4. Gli strati nascosti valgono qualcosa solo con una g che piega: è la ReLU a permettere al laboratorio del capitolo 7 di tracciare confini curvi, a pezzi di retta.

Più di due classi: softmax

Riconoscere le cifre scritte a mano ha dieci risposte possibili, non due. Come si generalizza la sigmoide?

Con la softmax. Lo strato di uscita ha un neurone per classe, ciascuno con la sua zj = wj·a + bj; la softmax trasforma le N z in probabilità che sommano a 1:

Formula · softmax

aj=ezj Σk ezk
con N = 2 coincide con la sigmoide

La perdita è la cross-entropy: −log ay, il logaritmo negativo della probabilità data alla classe vera; se la classe vera era la 3 e il modello le dà:

Calcolo · la cross-entropy se la classe vera era la 3

il modello le dà 0,9=−log 0,9 ≈ 0,1
il modello le dà 0,1=−log 0,1 ≈ 2,3

A differenza delle altre attivazioni, qui ogni uscita dipende da tutte le z: alzare una abbassa le altre.

Un dettaglio pratico che conta: calcolare ez per z grandi e poi il logaritmo produce errori di arrotondamento. Le librerie permettono di far uscire dalla rete le z grezze (attivazione lineare) e di dire alla loss di applicare la softmax internamente (from_logits=True), riorganizzando i conti in modo più stabile. Il risultato è lo stesso, i numeri sono più precisi.

Multi-class non è multi-label

Da non confondere con la classificazione multi-label: se una foto può contenere insieme un'auto, un pedone e un autobus, le risposte sono tre sì/no indipendenti, e si usano tre sigmoidi, non una softmax.

Laboratorio: softmax e cross-entropy su quattro classi

matematica reale

Quattro cifre possibili, quattro z in uscita dalla rete. Muovi le z e scegli quale cifra era quella vera: le barre sono la softmax, il numero in basso la perdita.

Adam e gli strati convoluzionali

Adam (Adaptive Moment Estimation) è la discesa del gradiente con un learning rate per parametro, che si adatta da solo: se un parametro continua a muoversi nella stessa direzione passo dopo passo, il suo α cresce (si può andare più in fretta); se oscilla avanti e indietro, il suo α si riduce. In pratica è più robusto della discesa semplice alla scelta di α iniziale ed è l'ottimizzatore di default per quasi tutto; si parte di solito da 10⁻³.

Negli strati convoluzionali, infine, ogni neurone guarda solo una finestra dell'input (un pezzo di immagine, un tratto di segnale) invece che tutto: meno parametri, meno overfitting, e la capacità di riconoscere un motivo ovunque compaia. Sono il mattone delle reti per immagini (CNN, Convolutional Neural Network); qui basta sapere che esistono e perché.

Mappa concettuale · addestrare una rete
  • Addestrare una rete
    • si fa in tre mosse modello, costo, discesa
      • il costo è la binary cross-entropy
      • le derivate le calcola la backpropagation
    • le attivazioni sono sigmoide, lineare, ReLU
      • la ReLU va negli strati nascosti
      • senza non linearità la rete è un modello lineare
    • per più classi serve la softmax
      • produce probabilità che sommano a 1
      • si misura con la cross-entropy −log ay
      • più etichette insieme: tante sigmoidi
    • l'ottimizzatore è Adam
      • adatta il learning rate per parametro
    • per le immagini strati convoluzionali
      • guardano una finestra dell'input

In sintesi · capitolo 8

  • Tre mosse — definire il modello, scegliere il costo (binary cross-entropy = perdita logistica), minimizzare con la discesa del gradiente; le derivate le calcola la backpropagation
  • Attivazioni — sigmoide per probabilità in uscita, lineare per regressione, ReLU negli strati nascosti; senza non linearità la rete collassa in un modello lineare
  • Softmax — N classi, probabilità che sommano a 1; cross-entropy −log ay; from_logits per la stabilità numerica; multi-label = più sigmoidi
  • Adam — learning rate adattivo per parametro · Convoluzioni — neuroni che guardano una finestra

Autodiagnosi

  1. Perché una rete con sole attivazioni lineari equivale a una regressione lineare?
  2. Quanto vale la cross-entropy se la softmax dà 0,25 alla classe vera? E 1,0?
  3. Multi-class e multi-label: quale usa la softmax e perché?
9 · Far funzionare un modello

Quando il modello sbaglia, la diagnosi vale più di qualsiasi tentativo a caso

Il modello della casa sbaglia di 60 k€ su case nuove. Potresti raccogliere più dati, aggiungere feature, toglierne, cambiare λ, cambiare rete. Ciascuna scelta costa settimane: quale fare?

La risposta sbagliata è «proviamole tutte». Quella giusta è misurare due numeri che dicono di che male soffre il modello, perché i rimedi per i due mali sono opposti. Per misurarli servono dati che il modello non ha usato per imparare: si divide il dataset in training set (per esempio il 60%), con cui si trovano i parametri, cross-validation set (20%, detto anche validation o dev set), con cui si scelgono grado del polinomio, λ, architettura della rete, e test set (20%), toccato una volta sola alla fine per stimare quanto il modello finale sbaglierà nel mondo.

Il test set non si usa per scegliere

Il test set non si usa per nessuna scelta: nel momento in cui lo si usa per scegliere, la sua stima diventa ottimista, perché si è scelto per fare bene su di lui.

Bias e varianza, letti da Jtrain e Jcv

Il capitolo 6 ha dato i nomi: alto bias (underfitting) e alta varianza (overfitting). Due numeri li distinguono. Jtrain alto significa che il modello non riesce nemmeno a imparare gli esempi che vede: alto bias. Jtrain basso ma Jcv molto più alto significa che li ha imparati ma non generalizza: alta varianza. Possono anche coesistere, in parti diverse dello spazio: Jtrain alto e Jcv ancora più alto.

«Alto» rispetto a che cosa? Rispetto a una baseline: le prestazioni umane sullo stesso compito, un modello concorrente, o una stima di quanto il rumore dei dati renda impossibile scendere.

Un esempio con la baseline

Se un umano trascrive l'audio con il 10,6% di errore, un Jtrain del 10,8% non è alto bias: è vicino al limite.

Da qui la tabella delle decisioni, che è il cuore pratico di tutto il corso. Alta varianza: più dati di training, meno feature, λ più grande. Alto bias: più feature o feature polinomiali, λ più piccolo, un modello più grande.

Più dati non cura l'alto bias

Notare che più dati non cura l'alto bias: se la retta non riesce a seguire i dati che ha, dargliene altri non la fa piegare.

SintomoDiagnosiRimedi che aiutanoRimedi inutili
Jtrain alto (rispetto alla baseline), Jcv ≈ JtrainAlto biasfeature in più o polinomiali · λ più piccolo · rete più grandepiù dati
Jtrain basso, Jcv ≫ JtrainAlta varianzapiù dati · meno feature · λ più grandeun modello ancora più grande (senza regolarizzazione)
Jtrain alto e Jcv ancora più altoentrambiprima il bias (modello più capace), poi la varianza (dati, λ)—

Le curve di apprendimento rendono la diagnosi visiva: Jtrain e Jcv in funzione del numero di esempi m. Con pochi esempi Jtrain è quasi zero (facile adattarsi a due punti) e Jcv altissimo; crescendo m, Jtrain sale e Jcv scende.

Con alto bias le due curve si avvicinano presto e si appiattiscono alte: aggiungere dati non serve. Con alta varianza resta un divario largo tra le due che si chiude lentamente: qui i dati servono eccome. Il laboratorio le calcola davvero, adattando un polinomio a dataset sempre più grandi.

Laboratorio: curve di apprendimento

matematica reale

Dati generati da una relazione curva più rumore. Per ogni m da 3 a 60 si adatta il modello scelto ai primi m esempi (media su più estrazioni) e si misurano Jtrain e Jcv su 200 esempi mai visti. La linea tratteggiata è il rumore irriducibile, la baseline.

Reti neurali, bias e varianza: una ricetta

Con le reti neurali il compromesso tra bias e varianza si allenta. Una rete grande, con una regolarizzazione scelta bene, fa almeno bene quanto una piccola: il costo è solo computazionale.

Da qui una ricetta: se Jtrain è alto rispetto alla baseline, rete più grande (più strati o più neuroni), finché Jtrain non scende; poi, se Jcv è alto, più dati, e si ricomincia. La regolarizzazione in una rete è la stessa tassa λ·Σw² del capitolo 6, applicata ai pesi di ogni strato (kernel_regularizer=L2(0.01) in TensorFlow).

Il ciclo di sviluppo e l'analisi degli errori

Un progetto reale gira in un ciclo: si sceglie l'architettura (modello, dati, iperparametri), si addestra, si fanno le diagnosi (bias/varianza e analisi degli errori), si decide che cosa cambiare, e si ricomincia. L'analisi degli errori è il complemento umano della diagnosi numerica: si prendono 100 esempi del cross-validation set sbagliati dal modello, si leggono uno per uno e si contano per categoria.

Un esempio di analisi degli errori

Se su 100 spam non riconosciuti 21 sono farmaci, 18 sono email con errori di ortografia voluti, 7 phishing e 3 hanno il testo dentro un'immagine, è chiaro dove investire (farmaci, ortografia) e dove no (immagini: anche risolvendolo del tutto si guadagna il 3%).

Se gli errori sono migliaia se ne campiona un centinaio: l'analisi manuale è lenta ma è lo strumento che evita mesi di lavoro su problemi irrilevanti.

Aggiungere dati con criterio. Non «più dati di tutto», ma più dati del tipo che l'analisi degli errori indica.

Due strumenti: la data augmentation, cioè creare esempi nuovi trasformando quelli esistenti in modo realistico (ruotare, ingrandire, distorcere una lettera scritta a mano; aggiungere rumore di fondo a un audio: distorsioni che il modello incontrerà davvero, non rumore casuale sui pixel), e la sintesi, cioè generare dati artificiali da zero (testo reso con font diversi su sfondi fotografati, per il riconoscimento di scritte).

Negli ultimi anni l'attenzione si è spostata dal modello ai dati (data-centric AI): spesso il miglioramento più grande viene da dati migliori, non da un algoritmo diverso.

Transfer learning. Se di dati ne hai pochi, puoi partire da una rete addestrata da altri su un compito vicino con milioni di esempi (riconoscere oggetti generici) e riaddestrare solo l'ultimo strato sui tuoi dati, o tutta la rete con un learning rate piccolo (fine-tuning).

Funziona perché i primi strati hanno imparato feature generali (bordi, forme) che servono anche a te; richiede che l'input sia dello stesso tipo (immagini con immagini, audio con audio). È il modo in cui, su scala enorme, si addestrano gli assistenti linguistici a partire da un modello pre-addestrato.

Dati sbilanciati: precisione, recall e la soglia

Una malattia rara colpisce lo 0,5% dei pazienti. Un «modello» che dice sempre «sano» ha il 99,5% di accuratezza. Come si smaschera?

Con due misure che l'accuratezza nasconde. Dividendo le previsioni in veri positivi (TP), falsi positivi (FP), falsi negativi (FN) e veri negativi (TN), la precisione è TP/(TP+FP): di quelli che ho detto malati, quanti lo erano; il recall è TP/(TP+FN): dei malati veri, quanti ne ho trovati. Il modello «sempre sano» ha recall zero, e il trucco è scoperto.

Le due misure tirano in direzioni opposte, e la leva è la soglia sulla probabilità: alzarla sopra 0,5 (dire «malato» solo se molto sicuri) aumenta la precisione e abbassa il recall; abbassarla fa il contrario. La scelta dipende dai costi: una malattia curabile con un trattamento pesante chiede alta precisione; una malattia grave da non lasciar passare chiede alto recall.

Per confrontare modelli con un solo numero si usa l'F1, la media armonica di precisione e recall, che punisce i valori sbilanciati:

Calcolo · F1 con precisione 0,02 e recall 1

F1=2PR P + R
F1 con P = 0,02 e R = 1=2 · 0,02 · 1 0,02 + 1 ≈ 0,04
non 0,51 come la media semplice
media semplice=0,02 + 1 2 ≈ 0,51

Laboratorio: la soglia tra precisione e recall

matematica reale

Duecento pazienti, dieci malati; per ciascuno il modello ha dato una probabilità. Muovi la soglia e guarda la matrice di confusione, precisione, recall e F1 ricalcolati sui dati.

Le probabilità dei pazienti sono fisse (generate con un seme): i malati tendono ad avere punteggi alti ma non tutti, e qualche sano ha punteggi alti. È la situazione reale: nessuna soglia è perfetta, e l'accuratezza da sola (riportata per confronto) resta alta anche con scelte pessime.

Mappa concettuale · far funzionare un modello
  • Far funzionare un modello
    • si misura su tre insiemi
      • training set per i parametri
      • cross-validation set per le scelte
      • test set una volta sola, alla fine
    • si diagnostica con bias e varianza
      • Jtrain alto: alto bias
      • Jcv ≫ Jtrain: alta varianza
      • si confronta con una baseline
      • si legge nelle curve di apprendimento
    • si migliora con l'analisi degli errori
      • poi data augmentation e sintesi
      • oppure transfer learning
    • con dati sbilanciati servono precisione e recall
      • la soglia li scambia
      • li riassume F1

In sintesi · capitolo 9

  • Tre insiemi — training per i parametri, cross-validation per le scelte, test una volta sola alla fine
  • Diagnosi — Jtrain alto vs baseline: bias; Jcv ≫ Jtrain: varianza; rimedi opposti, e più dati non cura il bias
  • Curve di apprendimento — alto bias: curve vicine e alte; alta varianza: divario che si chiude con i dati
  • Reti — più grande + regolarizzata fa almeno bene quanto piccola: prima il bias, poi i dati
  • Error analysis, augmentation, transfer learning — investire dove gli errori sono; dati realistici; partire da reti pre-addestrate
  • Sbilanciamento — precisione e recall al posto dell'accuratezza; la soglia li scambia; F1 li riassume

Autodiagnosi

  1. Perché il test set non va usato per scegliere λ?
  2. Jtrain = 15%, Jcv = 16%, baseline umana 14,5%: che cosa faresti?
  3. Che cosa succede a precisione e recall alzando la soglia a 0,9, e quando è la scelta giusta?
10 · Alberi di decisione

Una sequenza di domande sì/no, scelte in modo da fare ordine il più in fretta possibile

Devi riconoscere se un animale è un gatto da tre indizi: forma delle orecchie, forma del muso, presenza dei baffi. Quale domanda fai per prima?

Un albero di decisione è esattamente questo: un nodo radice con una domanda su una feature, rami per le risposte, altri nodi con altre domande, e in fondo le foglie con la previsione. Per classificare un esempio nuovo si parte dalla radice e si seguono le risposte.

Il problema dell'apprendimento è costruire l'albero dai dati: quale feature mettere in ogni nodo, e quando fermarsi. Il criterio è la purezza: la domanda migliore è quella che divide gli esempi in gruppi il più possibile omogenei (tutti gatti da una parte, nessun gatto dall'altra). Per misurarla serve un numero.

Entropia e guadagno di informazione

L'entropia misura il disordine di un gruppo. Se p₁ è la frazione di gatti nel gruppo:

Formula · entropia di un gruppo

H(p1)=−p1 log2 p1 − (1 − p1) log2 (1 − p1)

Vale 0 se il gruppo è tutto gatti o tutto non-gatti (ordine perfetto), vale 1 (il massimo) se è metà e metà.

Calcolo · entropia di un gruppo di 6 esempi

H(3 gatti su 6)=1
H(5 gatti su 6)≈0,65
H(6 gatti su 6)=0
per convenzione 0·log 0 = 0

Il logaritmo in base 2 fa sì che l'entropia si misuri in bit, ma la base non cambia quale split è migliore.

Una domanda divide il gruppo in due sottogruppi, sinistro e destro, ciascuno con la sua entropia. Il guadagno di informazione (information gain) è di quanto l'entropia scende grazie alla domanda:

Formula · guadagno di informazione

guadagno=H(radice) − [ wsx · H(sx) + wdx · H(dx) ]
dove wsx e wdx sono le frazioni di esempi finite a sinistra e a destra

La media è pesata perché un sottogruppo purissimo ma con un solo esempio conta poco. L'algoritmo calcola il guadagno per ogni feature disponibile, sceglie la più alta, e ripete ricorsivamente su ciascun ramo con gli esempi che vi sono finiti, finché un criterio di arresto non lo ferma: il nodo è puro, l'albero ha raggiunto la profondità massima, il guadagno è sotto una soglia, o gli esempi nel nodo sono troppo pochi.

Questi criteri sono il controllo dell'overfitting: un albero lasciato crescere fino a foglie con un esempio ciascuna ha imparato il training set a memoria.

Laboratorio: quale domanda fare per prima

matematica reale

Dieci animali, tre feature binarie, cinque gatti. Scegli la feature per il nodo radice: vedi come si dividono gli esempi, le entropie dei due rami e il guadagno. Poi guarda quale avrebbe scelto l'algoritmo.

Feature con più valori, numeri, e alberi per la regressione

Se una feature ha tre valori (orecchie a punta, flosce, ovali) si può aprire un nodo a tre rami, oppure, più comodo per gli algoritmi che vogliono domande sì/no, trasformarla in tre feature binarie con il one-hot encoding: «a punta?», «flosce?», «ovali?», di cui una sola vale 1. Lo stesso trucco serve alle reti neurali, che vogliono numeri in ingresso.

Una feature continua (il peso dell'animale) diventa una domanda con soglia, «peso ≤ 9 kg?»: l'algoritmo prova come soglia tutti i punti a metà tra due valori consecutivi presenti nei dati e tiene quella con il guadagno più alto.

Infine un albero di regressione prevede un numero: le foglie contengono la media dei y degli esempi finiti lì, e al posto dell'entropia si usa la varianza dei y, scegliendo lo split che la riduce di più, con la stessa media pesata.

Dalle foreste al boosting: tanti alberi sono meglio di uno

Un albero singolo è fragile: basta cambiare un esempio del training set perché la domanda alla radice cambi e con lei l'intero albero. Come lo si rende stabile?

Allenandone tanti, diversi, e facendoli votare: un ensemble. La diversità si ottiene con il campionamento con reinserimento: da m esempi se ne estraggono m a caso, rimettendo ogni volta l'estratto nell'urna, così alcuni compaiono due o tre volte e altri mai; ogni albero è allenato su un campione diverso. Con B alberi (64, 100, 128: oltre il guadagno si appiattisce) si ha il bagged decision tree.

La random forest aggiunge un secondo elemento di diversità: a ogni nodo l'albero può scegliere solo tra un sottoinsieme casuale di k feature, tipicamente k ≈ √n, così gli alberi non finiscono tutti per usare la stessa feature forte alla radice. Il voto di molti alberi un po' diversi riduce la varianza senza aumentare il bias.

Il boosting cambia il modo di scegliere i campioni: invece che a caso, dopo ogni albero si guardano gli esempi che l'ensemble sbaglia ancora e si rende più probabile estrarli per l'albero successivo, che quindi si concentra sui casi difficili, come uno studente che ripassa solo gli esercizi sbagliati.

XGBoost (eXtreme Gradient Boosting) è l'implementazione che domina le competizioni su dati tabellari: veloce, con regolarizzazione e criteri di arresto buoni per default, e un'interfaccia di due righe (XGBClassifier().fit(X, y)).

Alberi o reti neurali?

Gli alberi (e XGBoost in particolare) vincono sui dati tabellari, quelli che stanno in una tabella con colonne eterogenee: sono veloci da addestrare, poco sensibili alla scala delle feature, e un albero piccolo si può leggere. Le reti vincono sui dati non strutturati (immagini, audio, testo), dove le feature vanno inventate dal modello, si combinano bene tra loro e con il transfer learning, ma sono lente da addestrare e difficili da interpretare. Nel dubbio su una tabella, prima XGBoost.

Mappa concettuale · alberi di decisione
  • Albero di decisione
    • è fatto di nodi con domande e foglie
      • si segue dalla radice alle foglie
    • si costruisce col guadagno di informazione
      • si misura con l'entropia
      • è H(radice) − media pesata dei rami
      • si ferma con i criteri di arresto
    • gestisce le feature con one-hot e soglie
      • per i numeri una domanda con soglia
      • per la regressione la varianza
    • da solo è fragile, si cura con l'ensemble
      • campioni con reinserimento: random forest
      • esempi difficili: boosting (XGBoost)
    • è la scelta per i dati tabellari
      • le reti per immagini, audio, testo

In sintesi · capitolo 10

  • Albero — domande sì/no in sequenza; si costruisce scegliendo a ogni nodo la feature che fa più ordine
  • Entropia — H(p) = −p log₂ p − (1−p) log₂(1−p): 0 puro, 1 metà e metà · Guadagno — H(radice) − media pesata delle H dei rami
  • Arresto — purezza, profondità, guadagno minimo, pochi esempi: è il controllo dell'overfitting
  • Feature — one-hot per i valori multipli, soglie per i numeri, varianza per la regressione
  • Ensemble — campionamento con reinserimento, random forest (k ≈ √n feature per nodo), boosting/XGBoost; alberi per le tabelle, reti per immagini, audio, testo

Autodiagnosi

  1. Quanto vale l'entropia di un nodo con 2 gatti e 6 non-gatti? (p = 0,25)
  2. Perché la media delle entropie dei rami è pesata?
  3. Che cosa cambia tra random forest e boosting nel modo di scegliere gli esempi di ogni albero?

Parte III

Senza la risposta: raggruppare, trovare l'anomalia, raccomandare, decidere

11 · Raggruppare

k-means: trovare i gruppi quando nessuno ha scritto le etichette

Hai le misure di mille clienti (quanto spendono, quanto spesso) e vuoi dividerli in tre gruppi per tre campagne. Nessuno ti ha detto quali sono i gruppi: come li trovi?

Con il primo algoritmo non supervisionato della guida, k-means. L'idea è di una semplicità disarmante, e si capisce guardandola girare. Si scelgono K punti a caso, i centroidi, uno per gruppo.

Poi si ripetono due mosse. Assegna: ogni esempio viene assegnato al centroide più vicino. Sposta: ogni centroide si trasferisce nel baricentro (la media) degli esempi che gli sono stati assegnati. Si ripete finché i centroidi smettono di muoversi.

Dopo poche iterazioni i centroidi si sono sistemati nel mezzo dei gruppi, anche se all'inizio erano in posizioni assurde; e funziona anche quando i gruppi non sono ben separati (le taglie di una maglietta su un continuo di altezze e pesi: S, M, L sono un k-means con K = 3).

Dietro le due mosse c'è una funzione di costo, come sempre: la distorsione, la media delle distanze al quadrato tra ogni esempio e il centroide a cui è assegnato:

Formula · la distorsione

J=1 m · Σ ‖ x(i) − μc(i) ‖²

La mossa «assegna» la minimizza rispetto alle assegnazioni tenendo fermi i centroidi; la mossa «sposta» la minimizza rispetto ai centroidi tenendo ferme le assegnazioni. Per questo J non può mai salire da un'iterazione all'altra, e se sale c'è un errore nel codice. Se un centroide resta senza punti, lo si elimina o lo si reinizializza.

Inizializzazione e scelta di K

Il risultato dipende da dove partono i centroidi: inizializzazioni diverse portano a minimi locali diversi, alcuni chiaramente peggiori (due centroidi che si dividono un gruppo e un terzo che ne copre due). La pratica standard: scegliere i centroidi iniziali tra gli esempi stessi (K punti a caso del dataset), eseguire k-means 50–1.000 volte con inizializzazioni diverse, e tenere la soluzione con la distorsione J più bassa. Costa poco e toglie quasi sempre i minimi cattivi.

Quanti gruppi?

Non c'è una risposta «giusta» dai dati: i dati non dicono quanti cluster hanno, e J scende sempre aumentando K (con K = m ogni punto è il proprio centroide e J = 0), quindi minimizzare J su K non ha senso.

Il metodo del gomito disegna J in funzione di K e cerca il punto in cui smette di scendere in fretta; spesso il gomito non c'è. Il criterio migliore è lo scopo a valle: tre taglie o cinque? Dipende da quanto costa produrne cinque e quanto meglio vestono. K si sceglie per come verranno usati i cluster, non per una statistica.

Laboratorio: k-means passo per passo

matematica reale

Novanta punti in tre gruppi (non etichettati). Scegli K, poi alterna «Assegna» e «Sposta» e guarda i centroidi (le croci) trovare i gruppi; la distorsione J non sale mai. «Nuova partenza» pesca altri centroidi iniziali: a volte si finisce in un minimo peggiore.

Mappa concettuale · raggruppare
  • k-means
    • parte da K centroidi
      • scelti tra gli esempi stessi
      • si ripete 50–1.000 volte, tenendo la J minima
    • alterna due mosse assegna e sposta
      • assegna ogni punto al centroide più vicino
      • sposta il centroide nella media dei suoi punti
    • minimizza la distorsione J
      • non può mai salire
      • è la media delle distanze al quadrato
    • K si sceglie con lo scopo a valle
      • il gomito dove J smette di scendere in fretta
      • non si sceglie minimizzando J

In sintesi · capitolo 11

  • k-means — K centroidi; ripeti: assegna ogni punto al centroide più vicino, sposta ogni centroide nella media dei suoi punti
  • Distorsione — media delle distanze² dal proprio centroide; ogni mossa la abbassa, non può salire
  • Inizializzazione — centroidi scelti tra i punti; molte ripartenze, tieni la J minima
  • K — non lo dicono i dati: gomito se c'è, altrimenti lo scopo a valle

Autodiagnosi

  1. Perché la distorsione non può aumentare tra un'iterazione e la successiva?
  2. Perché non si sceglie K minimizzando J?
  3. Che cosa fa k-means su dati senza gruppi netti, come altezze e pesi?
12 · Trovare l'anomalia

Imparare com'è fatto il normale, per riconoscere ciò che non lo è

Hai i dati di mille motori d'aereo appena prodotti: vibrazione, temperatura, consumo. Quasi tutti sono buoni; non sai quali no, e i difettosi sono pochi e tutti diversi. Come li segnali?

Non con la classificazione: per addestrare un classificatore servirebbero molti esempi di difetti, e di ogni tipo di difetto, mentre i difetti futuri saranno diversi da quelli passati.

Il rilevamento di anomalie rovescia il problema: impara com'è fatto un motore normale, con un modello di probabilità p(x) stimato sugli esempi, e segnala come anomalo tutto ciò che il modello ritiene molto improbabile, p(x) < ε. Non serve sapere che forma avrà il prossimo difetto: basta che non somigli al normale.

Lo stesso schema vale per le frodi (comportamenti anomali di un account), il monitoraggio dei server, i controlli di qualità.

La gaussiana e il prodotto delle probabilità

Il modello più semplice per «com'è fatto il normale» è la distribuzione gaussiana (o normale), la campana: ha un centro μ (la media) e una larghezza σ (la deviazione standard), e la probabilità di un valore x decresce con il quadrato della sua distanza dal centro, misurata in σ:

Formula · la gaussiana

p(x)=1 √(2π) · σ · e−(x−μ)²/(2σ²)

Stimare μ e σ dai dati è un calcolo diretto: μ è la media dei valori, σ² la media dei quadrati degli scarti. Con n feature si stima una gaussiana per ciascuna e si moltiplicano:

Formula · più feature

p(x)=p(x1) · p(x2) · … · p(xn)

È un'ipotesi di indipendenza che quasi mai è vera, e che in pratica funziona lo stesso: un motore con vibrazione un po' alta e temperatura un po' alta ha una p piccola per effetto del prodotto, anche se nessuna delle due da sola sarebbe anomala.

Scegliere ε, e valutare. Anche se il training è non supervisionato (solo esempi normali), per scegliere la soglia servono alcuni esempi anomali etichettati, pochi: si mettono nel cross-validation set insieme a molti normali, si prova una gamma di ε e si tiene quello con la F1 migliore (le anomalie sono rare: precisione e recall, non accuratezza, come nel capitolo 9). Il test set, se i difetti bastano, funziona uguale.

Anomalie o classificazione?

Una regola di massima sulla scelta tra anomalie e classificazione: con pochissimi positivi (0–20) e difetti di tipo sempre nuovo, rilevamento di anomalie; con molti positivi e difetti che si ripetono, un classificatore supervisionato.

Le feature contano più dell'algoritmo. Se una feature ha una distribuzione molto lontana dalla campana (una coda lunga a destra), una trasformazione la rende più gaussiana: log(x), log(x + c), √x, x1/3; si prova a occhio con l'istogramma.

E quando un'anomalia sfugge perché le sue feature prese una per una sono normali, si costruisce una feature che la cattura: un server con CPU normale e traffico normale ma CPU/traffico altissimo (un processo bloccato in un ciclo) si vede solo con il rapporto. È lo stesso lavoro del capitolo 4, con lo stesso effetto decisivo.

Laboratorio: la soglia su una gaussiana

matematica reale

Trecento misure di vibrazione di motori buoni, più sette motori etichettati come difettosi (in rosso) usati solo per scegliere la soglia. La campana è stimata dai dati; sposta ε e guarda quali punti finiscono sotto la soglia, e come cambiano precisione e recall sui sette difettosi.

Mappa concettuale · trovare l'anomalia
  • Rilevamento di anomalie
    • impara com'è fatto il normale
      • con un modello di probabilità p(x)
      • senza bisogno di esempi di difetti
    • il modello è la gaussiana
      • stimata con μ e σ dai dati
      • con più feature il prodotto delle p
    • segnala p(x) < ε
      • ε si sceglie sul cross-validation set
      • massimizzando F1 capitolo 9
    • si preferisce al classificatore se i positivi sono pochissimi e sempre nuovi
    • migliora con le feature giuste
      • trasformazioni log e radice
      • feature costruite per le anomalie che sfuggono

In sintesi · capitolo 12

  • Idea — modella il normale con p(x), segnala p(x) < ε; serve quando i positivi sono pochissimi e sempre diversi
  • Gaussiana — μ e σ stimati dai dati; con più feature il prodotto delle p
  • ε — scelto sul cross-validation set con poche anomalie etichettate, massimizzando F1
  • Feature — trasformazioni (log, radice) verso la campana; feature costruite per le anomalie che sfuggono

Autodiagnosi

  1. Perché il rilevamento di anomalie si preferisce a un classificatore quando i difetti sono di tipo sempre nuovo?
  2. Che cosa succede a precisione e recall abbassando ε?
  3. Perché si trasforma una feature con il logaritmo prima di stimare la gaussiana?
13 · Raccomandare

Prevedere il voto che un utente darebbe a un film che non ha visto

Hai una tabella utenti × film con i voti da 0 a 5, piena di buchi. Come riempi i buchi, cioè come prevedi quanto piacerebbe a Alice un film che non ha mai visto?

Se dei film conoscessi delle feature (quanto è romantico, quanto è d'azione), il problema sarebbe una regressione lineare per ogni utente: i parametri w(j), b(j) di Alice si imparano dai voti che ha dato, e il voto previsto per il film i è w(j)·x(i) + b(j). Il costo è l'errore quadratico sui soli voti esistenti (r(i,j) = 1), con la regolarizzazione.

Ma le feature dei film, nella realtà, nessuno le ha scritte. E qui c'è un'idea bella: se conoscessi i gusti degli utenti (i loro w), potresti dedurre le feature di ogni film dai voti ricevuti, con la stessa regressione al contrario.

Non conosciamo né gli uni né le altre: il filtro collaborativo (collaborative filtering) li impara insieme, minimizzando un unico costo rispetto a tutti i w(j), b(j) e x(i) contemporaneamente, con la discesa del gradiente. Funziona perché gli utenti collaborano senza saperlo: i voti di molti su un film lo descrivono, e i voti di uno su molti film lo descrivono.

J(w, b, x) = ½ Σ(i,j) con voto ( w(j)·x(i) + b(j) − y(i,j) )² + λ/2 Σ‖w(j)‖² + λ/2 Σ‖x(i)‖² La somma è sulle sole celle con un voto. Le feature x dei film non hanno un nome: sono numeri che il training sistema perché i voti tornino. Nessuno saprà mai se x₁ «significa» romantico; ma due film con x simili piacciono alle stesse persone, e questo basta per raccomandare «film simili» (quelli con ‖x(k) − x(i)‖ piccola).

Voti binari. Spesso non ci sono stelle ma segnali sì/no: ha cliccato, ha comprato, ha guardato fino in fondo. Lo stesso modello passa da regressione a classificazione come nel capitolo 5: la previsione diventa g(w·x + b) con la sigmoide e il costo diventa la perdita logistica.

Normalizzazione per media

Un utente nuovo, senza voti, finirebbe con w = 0 e previsioni tutte a zero stelle; sottraendo da ogni film la sua media dei voti prima del training, e risommandola dopo, le previsioni per chi non ha votato nulla diventano «la media degli altri», che è ragionevole, e la discesa del gradiente converge meglio.

In TensorFlow il costo si scrive in poche righe e le derivate le calcola tf.GradientTape: è la discesa del gradiente «a mano», senza strati Dense, perché il modello non è una rete.

Filtri basati sul contenuto e il sistema a due torri

Il filtro collaborativo usa solo i voti. Ma di utenti e film si sa altro: età, paese, genere; anno, attori, durata. Il filtro basato sul contenuto usa due reti neurali: una trasforma le feature dell'utente in un vettore vu, l'altra le feature del film in un vettore vm della stessa lunghezza, e il voto previsto è il prodotto scalare vu·vm. Le due reti si addestrano insieme sui voti esistenti: è la stessa architettura «a due torri» che si usa per il retrieval nei sistemi di ricerca.

Il vantaggio sul collaborativo è che funziona anche per un film nuovo senza voti (ha pure lui le feature) e per un utente nuovo.

Con milioni di film non si calcola il prodotto per tutti a ogni richiesta: si fa retrieval e ranking, prima si pescano poche centinaia di candidati plausibili (i film simili agli ultimi visti, i più popolari nel genere preferito, con i vm precalcolati), poi si ordinano solo quelli con il modello completo.

Un'avvertenza che fa parte del corso

Un sistema di raccomandazione ottimizza ciò che gli si chiede: se gli si chiede «massimizza il tempo di permanenza» imparerà a proporre contenuti che arrabbiano o danno dipendenza; se «massimizza il profitto per l'azienda» proporrà i prodotti con il margine più alto, non i migliori per l'utente. Decidere la funzione obiettivo è una scelta che riguarda le persone che useranno il sistema, e va dichiarata.

PCA, per guardare i dati. Chiude il capitolo l'analisi delle componenti principali (Principal Component Analysis): dato un dataset con 50 feature, trova i pochi assi (2 o 3) lungo i quali i dati variano di più e li proietta su quelli, perdendo meno informazione possibile. Serve soprattutto per visualizzare: un grafico a due dimensioni di dati che ne avevano cinquanta.

Non è un passo di pre-elaborazione raccomandato per il training (le reti e gli alberi gestiscono bene molte feature), ma è lo strumento per vedere se i cluster del capitolo 11 esistono davvero.

Laboratorio: filtro collaborativo su una tabella con i buchi

matematica reale · training nel browser

Quattro utenti, cinque film, voti da 0 a 5 con i buchi (—). Il modello impara insieme i gusti w(j) di ogni utente e le feature x(i) di ogni film (due numeri per film) con la discesa del gradiente sul costo qui sopra. Premi «Allena» e guarda i buchi riempirsi; i voti esistenti vengono ricostruiti, quelli mancanti previsti.

Con così pochi voti il modello ha molta libertà: la regolarizzazione (λ = 0,1) lo tiene a bada. Le feature dei film imparate sono due numeri senza nome: guarda nella tabella quali film finiscono con feature simili, e confrontalo con chi li ha votati allo stesso modo.

Mappa concettuale · raccomandare
  • Raccomandare
    • deve riempire i buchi
      • della tabella utenti × film con i voti
    • filtro collaborativo: impara insieme
      • i gusti w e b di ogni utente
      • le feature x di ogni film
      • il costo somma sui soli voti esistenti
    • varianti voti binari e media
      • voti binari: sigmoide e perdita logistica
      • utente nuovo: la media degli altri
    • filtro basato sul contenuto: due torri
      • due reti per utente e film
      • il voto è il prodotto scalare vu·vm
      • su larga scala: retrieval e ranking
    • a fine capitolo PCA
      • serve a visualizzare dati ad alta dimensione

In sintesi · capitolo 13

  • Filtro collaborativo — impara insieme i gusti degli utenti w(j) e le feature dei film x(i) dai soli voti; film simili = x vicini
  • Varianti — voti binari con la sigmoide; normalizzazione per media per gli utenti nuovi
  • Basato sul contenuto — due reti (utente, film) → vettori, voto = prodotto scalare; funziona sui nuovi; retrieval poi ranking su larga scala
  • Etica e PCA — l'obiettivo va dichiarato; PCA per vedere dati ad alta dimensione

Autodiagnosi

  1. Perché il costo del filtro collaborativo somma solo sulle celle con un voto?
  2. Che cosa prevede il modello per un utente senza voti, con e senza normalizzazione per media?
  3. Quale dei due filtri può raccomandare un film appena uscito, e perché?
14 · Decidere

Apprendimento per rinforzo: nessuno dice l'azione giusta, solo quanto è andata bene

Devi far atterrare un elicottero autonomo. Non esiste un dataset di «stato → comando giusto»: nessuno sa scriverlo. Che cosa si può dare al programma, allora?

Una ricompensa (reward): un numero che dice quanto bene sta andando. Vola bene, +1; si schianta, −1000.

Un'analogia

È come addestrare un cane: non gli si spiega il movimento, gli si dice «bravo» o «no», e lui scopre che cosa fare.

Nell'apprendimento per rinforzo (reinforcement learning, RL) un agente si trova in uno stato s, sceglie un'azione a, finisce in un nuovo stato s′ e riceve una ricompensa R; il compito è imparare una policy π, una regola che a ogni stato associa l'azione da fare, tale da massimizzare la ricompensa accumulata.

La definizione si applica a tutto: robot, giochi (le partite a scacchi e Go dei programmi campioni), controllo industriale, trading, e, su scala enorme, l'ultima fase di addestramento degli assistenti linguistici.

Il rover su Marte, il ritorno e il fattore di sconto

L'esempio del corso è un rover su una striscia di sei caselle. Nella casella 1 c'è una roccia molto interessante (ricompensa 100), nella 6 una meno interessante (40), nelle altre nulla; il rover parte dalla 4 e a ogni passo può andare a sinistra o a destra; raggiunta una delle due estremità la missione finisce (stato terminale). Che cosa deve fare? La roccia da 100 è lontana tre passi, quella da 40 due.

Per rispondere serve il ritorno (return): la somma delle ricompense future, ma con le più lontane che valgono meno:

Formula · il ritorno

G=R1 + γR2 + γ2R3 + …

Dove γ (gamma) è il fattore di sconto, un numero appena sotto 1 (0,9, 0,99). Il ritorno dice che un euro domani vale meno di un euro oggi, e rende l'agente un po' impaziente:

Calcolo · il rover dalla casella 4, con sconto 0,5

andare a sinistra=0 + 0,5 · 0 + 0,25 · 0 + 0,125 · 100 = 12,5
caselle 4, 3, 2, 1: un termine per casella, e la roccia, al terzo passo, pesa γ³ = 0,125
andare a destra=0 + 0,5 · 0 + 0,25 · 40 = 10
caselle 4, 5, 6: la roccia, al secondo passo, pesa γ² = 0,25

Conviene la roccia grande. Con γ più piccolo vince la roccia vicina. Lo sconto serve anche a far convergere la somma quando il compito non ha fine, e con ricompense negative spinge a rimandare il male il più possibile.

La funzione Q e l'equazione di Bellman

Lo strumento centrale è la funzione stato-azione Q(s, a): il ritorno che si ottiene partendo dallo stato s, facendo una volta l'azione a, e poi comportandosi nel modo migliore possibile. Se conosci Q, la policy ottima è immediata: in ogni stato scegli l'azione con Q più alta, π(s) = argmaxa Q(s, a). Nel rover, Q(4, sinistra) = 12,5 e Q(4, destra) = 10 → sinistra.

Come si calcola Q senza enumerare tutti i futuri? Con l'equazione di Bellman, che è una definizione ricorsiva:

Formula · l'equazione di Bellman

Q(s, a)=R(s) + γ · maxa′ Q(s′, a′)
il ritorno di «fai a in s» è la ricompensa immediata più il meglio che puoi fare dallo stato in cui arrivi, scontato di un passo

Negli stati terminali Q(s, a) = R(s). L'equazione lega il valore di ogni stato a quello dei suoi vicini; applicarla ripetutamente (si parte da Q = 0 e si aggiorna ogni cella con la formula finché i valori non cambiano più) fa convergere Q al valore vero. Il laboratorio lo fa sotto i tuoi occhi.

Ambienti stocastici. Il rover reale, comandato «sinistra», va a sinistra con probabilità 0,9 e scivola a destra con 0,1. Allora la ricompensa accumulata è casuale, l'obiettivo diventa il ritorno atteso (la media su tanti tentativi) e Bellman prende una media sui possibili s′:

Formula · Bellman con la media

Q(s, a)=R(s) + γ · E[ maxa′ Q(s′, a′) ]

Il resto non cambia.

Laboratorio: il rover e l'equazione di Bellman

matematica reale

Sei caselle, ricompense 100 a sinistra e 40 a destra. Ogni pressione di «Un passo di Bellman» ricalcola Q(s, sinistra) e Q(s, destra) per tutte le caselle con l'equazione; le frecce indicano la policy ottima corrente (argmax). Cambia γ e guarda dove cambia la decisione del rover.

Stati continui: dal rover al lander, con una rete che stima Q

Un modulo lunare non ha sei caselle: ha posizione, velocità, angolo, velocità angolare, tutti numeri reali. Dove si mette la tabella Q?

Da nessuna parte: si sostituisce con una rete neurale che, dato lo stato s (il vettore dei numeri) e un'azione, stima Q(s, a); in pratica la rete riceve s e produce quattro uscite, una per azione (niente, sinistra, motore principale, destra). È il Deep Q-Network (DQN).

L'addestramento usa Bellman come fonte di esempi: si fa agire il lander (anche male), si registrano le quadruple (s, a, R, s′), e per ciascuna si costruisce un esempio di training con input s e target y = R + γ·maxa′ Q(s′, a′), dove Q sul lato destro è calcolata dalla rete attuale. Si addestra la rete su questi esempi con l'errore quadratico, si aggiorna, si ripete. È una regressione in cui i target cambiano man mano che la rete migliora, e converge verso la Q vera.

Tre accorgimenti rendono la ricetta stabile. L'ε-greedy: durante la raccolta, con probabilità 1 − ε si fa l'azione che la rete attuale ritiene migliore, con probabilità ε (per esempio 0,05, o alta all'inizio e decrescente) un'azione a caso, altrimenti la rete non scopre mai che un'azione che oggi stima male è in realtà buona (è l'esplorazione, lo stesso dilemma degli assistenti linguistici addestrati con RL).

Il replay buffer con i mini-batch: si tengono le ultime 10.000 quadruple e a ogni passo si addestra su un campione di 1.000, non su tutto, per velocità.

Gli aggiornamenti morbidi (soft update): invece di sostituire la rete di colpo con quella appena addestrata, la si muove di poco verso di essa:

Formula · aggiornamento morbido

Q←0,01 · Qnuova + 0,99 · Q

Così i target non saltano a ogni passo.

Il realismo

L'RL è l'area più promettente e meno matura del corso: funziona benissimo nei simulatori e nei giochi, molto meno nel mondo fisico (robot veri, con sensori rumorosi e conseguenze costose), e il divario simulazione-realtà è un problema di ricerca aperto. Nelle applicazioni industriali di oggi l'apprendimento supervisionato e quello non supervisionato pesano molto di più. Ma le idee, ritorno, policy, esplorazione, sono quelle che oggi insegnano ai modelli linguistici a ragionare.

Mappa concettuale · decidere
  • Apprendimento per rinforzo
    • ha un agente
      • sta in uno stato s
      • sceglie un'azione a
      • riceve una ricompensa R
    • impara una policy π
      • che massimizza la ricompensa accumulata
    • misura il successo con il ritorno
      • è la somma delle ricompense scontate
      • lo sconto è γ
    • la funzione Q(s, a)
      • soddisfa l'equazione di Bellman
      • la policy ottima è argmax Q
    • su stati continui Deep Q-Network
      • una rete stima Q
      • esempi da Bellman
      • tre accorgimenti: ε-greedy, replay buffer, soft update

In sintesi · capitolo 14

  • RL — stato, azione, ricompensa, policy: nessuno dice l'azione giusta, solo quanto è andata bene
  • Ritorno — somma scontata delle ricompense, γ < 1: il futuro vale meno
  • Q(s, a) — ritorno facendo a in s e poi il meglio; policy ottima = argmax; Bellman: Q(s,a) = R(s) + γ·max Q(s′,a′), con la media se l'ambiente è stocastico
  • DQN — una rete stima Q su stati continui; esempi da Bellman; ε-greedy, replay buffer e mini-batch, soft update

Autodiagnosi

  1. Perché con γ = 0,3 il rover nella casella 4 preferisce la roccia da 40?
  2. Che cosa dice l'equazione di Bellman, a parole?
  3. Perché senza esplorazione (ε = 0) il lander può non imparare mai certe manovre?
Riepilogo

Tutti gli algoritmi, letti con la stessa griglia

Ogni algoritmo della guida risponde alle stesse tre domande: che cosa c'è nei dati, che forma ha il modello e che cosa minimizza. Le tre colonne centrali della tabella sono il motivo per cui, imparata la regressione lineare, il resto si riconosce.

AlgoritmoDatiModelloCosto / criterioCome si ottimizzaQuando usarlo
Regressione linearex, y numerow·x + berrore quadratico mediodiscesa del gradienteprevedere una quantità
Regressione logisticax, y ∈ {0,1}g(w·x + b)perdita logisticadiscesa del gradientesì/no, con probabilità
Rete neuralex, ystrati di neuroni, ReLU, softmaxcross-entropy / quadraticobackpropagation + Adamimmagini, audio, testo; feature da imparare
Alberi, random forest, XGBoostx tabellari, ydomande sì/no in sequenza, votateentropia / varianzascelta greedy dello splitdati tabellari
k-meanssolo xK centroididistorsioneassegna / spostasegmentare, raggruppare
Rilevamento di anomaliex normali (+ poche anomalie per ε)gaussiana per featurep(x) < ε, F1 per εstima di μ, σdifetti rari e sempre nuovi
Filtro collaborativovoti utente × item con buchiw(j)·x(i) + b(j)quadratico sui voti presenti + λdiscesa del gradiente su w e x insiemeraccomandare
Apprendimento per rinforzostati, azioni, ricompenseQ(s, a), tabella o reteBellman: R + γ·max Qiterazione di Bellman / DQNdecidere in sequenza

Il corso si chiude con un consiglio che vale più degli algoritmi: la maggior parte dei progetti fallisce non perché manca il modello giusto ma perché manca la diagnosi (capitolo 9). Prima di cambiare algoritmo, misura dove sbagli e perché.

Glossario

Feature
Una delle variabili d'ingresso xj di un esempio (superficie, numero di stanze, pixel). «Feature engineering» è inventarne di nuove combinando quelle esistenti.
Parametri (w, b)
I numeri che il training sistema: pesi w e intercetta b. In una rete sono le matrici di ogni strato; in un albero il ruolo è preso dalle domande scelte.
Funzione costo J
Un numero che misura quanto il modello sbaglia su tutto il training set. L'apprendimento è trovare i parametri che la rendono minima.
Discesa del gradiente
Ripetere w ← w − α·∂J/∂w: muovere ogni parametro contro la pendenza del costo. α è il learning rate (tasso di apprendimento).
Learning rate α
La lunghezza del passo della discesa. Troppo grande: diverge; troppo piccolo: lentissima. Adam lo adatta parametro per parametro.
Epoca
Un passaggio completo del training sull'intero training set. Le reti si addestrano per decine o centinaia di epoche.
Overfitting
Il modello segue il rumore del training set: errore di training basso, errore su dati nuovi alto. Si cura con più dati, meno feature o regolarizzazione. L'opposto è l'underfitting.
Regolarizzazione λ
Un termine λ/(2m)·Σw² aggiunto al costo che tiene piccoli i parametri e quindi semplice il modello. λ grande → underfitting; λ zero → rischio di overfitting.
Train / cross-validation / test
Tre partizioni dei dati: per imparare i parametri, per scegliere tra modelli (grado, λ, architettura) e per misurare una volta sola la prestazione finale.
Bias / varianza
Bias alto: il modello è troppo semplice, sbaglia anche sul training. Varianza alta: troppo flessibile, sbaglia sui dati nuovi. La diagnosi si fa confrontando Jtrain e Jcv.
Precisione / recall
Tra i positivi previsti, quanti lo sono davvero (precisione); tra i positivi veri, quanti sono stati trovati (recall). F1 è la loro media armonica.
Funzione di attivazione
La funzione non lineare applicata all'uscita di ogni neurone: ReLU negli strati nascosti, sigmoide o lineare in uscita, softmax per più classi.
Softmax
Trasforma N numeri qualsiasi in N probabilità che sommano a 1, esaltando il più grande: ezk / Σ ezj.
Backpropagation
L'algoritmo che calcola le derivate del costo rispetto a tutti i parametri di una rete, dall'uscita verso l'ingresso, riusando i conti già fatti.
Entropia
Misura dell'impurità di un gruppo di esempi: 0 se sono tutti della stessa classe, 1 bit se metà e metà. L'albero sceglie la domanda che la riduce di più (information gain).
Ensemble
Molti alberi che votano: random forest (alberi indipendenti su campioni diversi) o boosting come XGBoost (ogni albero corregge gli errori dei precedenti).
Centroide
Il punto medio di un cluster in k-means. L'algoritmo alterna: assegna ogni punto al centroide più vicino, sposta ogni centroide sulla media dei suoi punti.
Distorsione
Il costo di k-means: distanza quadratica media tra ogni punto e il suo centroide. Scende a ogni passo; il «gomito» del suo grafico in funzione di K suggerisce quanti cluster usare.
Soglia ε
Nel rilevamento di anomalie, il valore sotto il quale la densità p(x) fa dichiarare un esempio anomalo. Si sceglie sul cross-validation set massimizzando F1.
Filtro collaborativo
Sistema di raccomandazione che impara dai soli voti, insieme, i gusti degli utenti e le feature degli oggetti; prevede le celle vuote della tabella utenti × oggetti.
Ricompensa e ritorno
La ricompensa R è il numero che l'ambiente dà a ogni passo; il ritorno G = R₁ + γR₂ + γ²R₃ + … è la somma scontata di quelle future. γ è il fattore di sconto.
Funzione Q(s, a)
Il ritorno ottenuto facendo l'azione a nello stato s e poi agendo al meglio. Soddisfa l'equazione di Bellman Q(s, a) = R(s) + γ·maxa′ Q(s′, a′); la policy ottima è argmaxa Q.
Policy
La regola che dice quale azione fare in ogni stato. Nel DQN (Deep Q-Network) la si ricava da una rete che approssima Q.
ε-greedy
Strategia di esplorazione: con probabilità 1 − ε fai l'azione migliore secondo Q, con probabilità ε una a caso. ε si abbassa durante il training.