Categoria: Capire IA

  • 04 – Imparare a memoria non basta: il problema della generalizzazione

    04 – Imparare a memoria non basta: il problema della generalizzazione

    CAPIRE L’IA · 4 di N

    Perché funzionare sui dati di addestramento non significa funzionare nel mondo reale.

    Due modelli affrontano lo stesso esercizio. Il primo commette qualche errore. Il secondo riproduce quasi perfettamente tutti gli esempi che gli abbiamo mostrato.

    Quale sceglieresti?

    La tentazione è premiare il secondo. Ma manca un’informazione decisiva: come si comportano quando gli esempi cambiano? Uno studente può ricordare le soluzioni di un eserciziario e trovarsi in difficoltà davanti a una variante. Anche un modello può adattarsi molto bene ai dati disponibili senza aver ricavato una regola utile per i casi successivi. L’analogia aiuta, purché non confondiamo il calcolo del modello con la comprensione umana.

    Nei primi articoli abbiamo visto che cosa si apprende e quali segnali guidano l’apprendimento. Ora affrontiamo la prova più importante: la generalizzazione, cioè la capacità di ottenere buoni risultati su casi nuovi pertinenti al compito.

    Un esperimento: tre modelli, gli stessi esempi

    Costruiamo un piccolo mondo di cui conosciamo le regole. Scegliamo 18 valori di ingresso, indicati con x, fra 0 e 1. Per ciascuno generiamo un risultato:

    y = 1 + 2x + ε

    La lettera greca ε, epsilon, indica un rumore casuale: una variazione che si aggiunge alla relazione lineare. Qui il rumore ha media zero e deviazione standard 0,23. Tutte le quantità dell’esperimento sono adimensionali.

    I punti non cadono esattamente su una retta. In un’applicazione, scostamenti del genere potrebbero dipendere da errori di misura o da fattori che non osserviamo. Nel nostro esperimento sono stati aggiunti deliberatamente.

    Proviamo tre modelli: una costante, che restituisce sempre lo stesso valore; una retta; e un polinomio di grado 15, una curva molto più flessibile. Tutti vengono adattati agli stessi 18 esempi minimizzando la somma degli errori al quadrato.

    Tre modelli sugli stessi 18 esempi: una costante, una retta e un polinomio di grado 15.
    Figura 1 — Esperimento riproducibile su dati simulati: y = 1 + 2x + rumore gaussiano, con deviazione standard 0,23. La linea tratteggiata è nota perché abbiamo generato noi i dati. Tutti i pannelli usano gli stessi assi; alcune oscillazioni del polinomio superano i limiti verticali mostrati.

    La costante trascura un andamento evidente: al crescere di x, i risultati tendono ad aumentare. La retta coglie quell’andamento, pur passando a una certa distanza da diversi punti. Il polinomio segue molte delle irregolarità del campione e passa quasi su ogni osservazione.

    La linea tratteggiata mostra la relazione che abbiamo usato per generare i dati. Possiamo disegnarla perché questo è un esperimento simulato. Nei problemi reali, quella linea di riferimento generalmente non la conosciamo.

    La gara cambia quando arrivano i dati nuovi

    Generiamo altri 600 esempi indipendenti, con ingressi nello stesso intervallo e lo stesso meccanismo di rumore. Nessuno dei tre modelli li ha usati per apprendere i parametri. Li impieghiamo come insieme di validazione, per confrontare le alternative.

    Misuriamo gli errori con la radice dell’errore quadratico medio, o RMSE. Si calcolano gli scarti tra previsioni e risultati osservati, li si eleva al quadrato, se ne fa la media e infine si estrae la radice. Un valore più basso indica previsioni mediamente migliori secondo questo criterio.

    Errori RMSE calcolati sui 18 esempi di training e su 600 esempi indipendenti di validazione.
    Figura 2 — Valori calcolati nell’esperimento, non prestazioni di un prodotto. La curva di grado 15 aderisce meglio al training, ma è meno accurata della retta sui casi nuovi. Il test finale resta fuori dal confronto.

    La retta ha un RMSE di circa 0,20 sul training e 0,23 sulla validazione. Il polinomio scende a circa 0,04 sul training, ma sale a 1,42 sui dati nuovi. La costante rimane poco accurata in entrambi i casi.

    Il modello che sembrava quasi impeccabile ha inseguito anche le oscillazioni casuali dei primi 18 punti. Nei nuovi esempi il rumore cambia: riprodurre le particolarità del vecchio campione non lo aiuta.

    Il punto non è che una curva flessibile sia sempre una cattiva scelta. È che il suo successo sul training non basta a giustificarla. Il confronto classico fra modelli troppo rigidi e troppo flessibili è illustrato anche nell’esempio didattico di scikit-learn; i dati e i valori mostrati qui sono stati calcolati per questo articolo.

    Underfitting e overfitting: due modi di imparare male

    Il modello costante soffre di underfitting, o sottoadattamento: non riesce a rappresentare una relazione rilevante. Gli errori restano elevati già sugli esempi di addestramento.

    Il polinomio mostra invece overfitting, o sovraadattamento: aderisce a dettagli del campione che non si trasferiscono bene ai casi nuovi. La distanza fra errore di addestramento ed errore su dati indipendenti è un segnale da osservare.

    Un divario piccolo, però, non basta a dimostrare che un modello sia buono: la costante sbaglia quasi allo stesso modo sui due insiemi. E un divario grande non identifica da solo la causa: potrebbero esserci differenze fra i dati o errori nella valutazione.

    Il titolo parla di “imparare a memoria”, ma la distinzione tecnica è più sottile. Memorizzazione e generalizzazione possono coesistere, e ottenere errore nullo sul training non impedisce necessariamente di funzionare sui dati nuovi. Le grandi reti neurali hanno mostrato quanto sia incompleto spiegare tutto contando semplicemente i parametri. Zhang e colleghi hanno studiato proprio questa tensione.

    Il ponte matematico: l’errore che vediamo e quello che ci interessa

    Indichiamo il modello con fθ, dove θ, theta, raccoglie i parametri appresi. Ogni esempio contiene un ingresso xi e un risultato yi. Una funzione di perdita ℓ misura quanto la previsione differisce dal risultato.

    Errore empirico sul training

    R̂train(θ) = (1/n) ∑i=1…n ℓ(fθ(xi), yi)

    Si legge: la media delle perdite sugli n esempi disponibili.

    Errore atteso sui casi di interesse

    RP(θ) = 𝔼(X,Y)∼P[ℓ(fθ(X), Y)]

    Si legge: la perdita media su esempi estratti dalla distribuzione P che descrive la popolazione di casi da affrontare. Il simbolo 𝔼 indica una media probabilistica, detta valore atteso.

    Nel primo caso facciamo una media su un elenco finito che possediamo. Nel secondo ci interessa il comportamento su tutti i casi che quel processo potrebbe produrre, comprese situazioni non ancora osservate.

    Ridurre la prima quantità è l’obiettivo immediato di molti metodi di addestramento. Ridurre la seconda è ciò che vorremmo ottenere nell’uso. Le due quantità sono collegate, ma non coincidono.

    Nell’esperimento abbiamo usato la perdita quadratica, ℓ = (previsione − risultato)2; il grafico riporta la radice della sua media, il RMSE. Anche conoscendo la retta generatrice rimarrebbe un errore dovuto al rumore indipendente: prevedere la tendenza non permette di anticipare ogni oscillazione casuale.

    Training, validazione e test: tre ruoli da separare

    Per sviluppare e valutare un modello distinguiamo tre ruoli. Sul training apprendiamo i parametri. Con la validazione scegliamo tra alternative, per esempio il grado del polinomio: questa scelta è un iperparametro, diverso dai coefficienti appresi. Il test finale serve a valutare la soluzione già scelta, senza guidarne ulteriori modifiche.

    Training per apprendere i parametri, validazione per scegliere il modello, test finale per valutare la soluzione scelta.
    Figura 3 — Tre ruoli distinti. Anche le scelte guidate dai risultati di validazione fanno parte dello sviluppo; il test finale deve restarne fuori.

    Se continuiamo a modificare il modello dopo ogni risultato sul test, anche quel test entra nelle nostre decisioni. Non è più una verifica finale indipendente. Nell’esperimento dell’articolo confrontiamo quindi dati di validazione: non abbiamo chiamato “test finale” il campione usato per scegliere fra le tre curve.

    Con pochi dati si può usare la validazione incrociata: si ripete il confronto alternando le parti usate per apprendere e validare. La procedura deve comunque rispettare dipendenze e ordine temporale. La documentazione di scikit-learn sulla valutazione descrive queste distinzioni.

    Separare le righe non basta

    Torniamo al centro di assistenza del terzo articolo. Un incidente può generare venti richieste quasi identiche. Se alcune finiscono nel training e altre nel test, il sistema incontra in valutazione varianti di qualcosa che ha già visto. Un punteggio alto può sovrastimare la capacità di affrontare incidenti nuovi.

    La separazione va costruita in funzione dell’uso previsto: per incidente, per cliente oppure nel tempo. Se vogliamo prevedere le richieste del mese prossimo, una verifica su un periodo successivo è spesso più pertinente di un rimescolamento casuale dell’intero archivio.

    Un’altra trappola è la fuga di informazioni, o data leakage. Immaginiamo di prevedere alla creazione del ticket se sarà risolto in ritardo, includendo però un campo compilato alla chiusura. Il modello dispone durante lo sviluppo di un’informazione che non avrà al momento della previsione.

    Anche la preparazione dei dati può introdurre contaminazioni: per esempio, scegliere le variabili guardando tutto l’archivio prima di dividerlo. Le trasformazioni apprese dai dati vanno stimate sui dati di training e poi applicate agli altri insiemi; in validazione incrociata, questo vale dentro ogni suddivisione. La guida di scikit-learn sugli errori comuni mostra perché questa disciplina conta.

    E se il mondo cambia dopo il test?

    Finora abbiamo generato dati nuovi con lo stesso meccanismo dei vecchi. È un’ipotesi favorevole: gli esempi cambiano, ma le regolarità di fondo restano valide.

    Nella pratica può cambiare anche quel meccanismo. Il centro di assistenza introduce un nuovo applicativo; un reparto cambia competenze; un diverso gruppo di utenti formula le richieste in modo diverso. La distribuzione dei casi si sposta. Parliamo di distribution shift.

    Il modello resta fisso, mentre i nuovi valori di y si spostano verso l’alto a parità di x.
    Figura 4 — Altro scenario simulato: la relazione passa da y = 1 + 2x a y = 2,5 + 2x, con rumore di deviazione standard 0,15. I nuovi ingressi sono nello stesso intervallo, ma le previsioni sottostimano sistematicamente il risultato.

    Il quarto grafico mostra un caso particolarmente istruttivo: gli ingressi restano nello stesso intervallo, ma a parità di x il risultato si sposta verso l’alto. Il modello continua a calcolare correttamente la vecchia relazione e sottostima sistematicamente i nuovi risultati.

    Questa difficoltà può emergere anche con un modello che non era sovraadattato. Generalizzare a nuovi esempi delle stesse condizioni e funzionare in condizioni diverse sono prove differenti. Il progetto di ricerca WILDS studia proprio valutazioni che includono cambiamenti di dominio e contesto osservati in applicazioni reali.

    Un test affidabile deve quindi avvicinarsi ai casi che ci interessa affrontare. La sua numerosità conta, ma non può compensare da sola una popolazione sbagliata. E dopo il rilascio occorre continuare a osservare gli errori, quando gli esiti diventano disponibili.

    Che cosa aiuta a generalizzare?

    Non esiste una manopola universale. Possiamo agire su diversi aspetti, verificando il beneficio sulla validazione:

    • Dati più pertinenti e vari. Coprire condizioni, gruppi e casi difficili dell’uso previsto; aggiungere copie quasi identiche non offre la stessa informazione.
    • Capacità del modello adeguata. Un modello troppo rigido perde relazioni utili; uno flessibile richiede un controllo coerente con dati e compito.
    • Regolarizzazione. Introdurre vincoli o penalità che orientino la soluzione; per esempio, scoraggiare coefficienti eccessivamente grandi. La forza della penalità si sceglie durante la validazione.
    • Arresto anticipato. Nei metodi iterativi si può scegliere il punto di addestramento usando la validazione, anziché continuare solo perché il training migliora.
    • Valutazione per casi e sottogruppi. Una buona media può nascondere risultati deboli proprio nelle condizioni più importanti.

    Queste scelte non sostituiscono un confronto con una soluzione semplice. Nel nostro esperimento la retta è un riferimento utile; in altri casi potrebbe esserlo una regola operativa già in uso. La complessità deve dimostrare di portare un vantaggio.

    La stessa domanda vale per gli LLM

    Un modello linguistico può riprodurre passaggi incontrati in addestramento e allo stesso tempo riuscire su richieste nuove. Per valutare una capacità, però, non basta mostrargli sempre esercizi famosi con formulazioni ricorrenti.

    Se un benchmark o le sue soluzioni sono entrati nei dati di addestramento, una parte del risultato potrebbe riflettere familiarità con quel materiale. Per mettere alla prova la capacità che ci interessa possiamo costruire varianti, cambiare vincoli e usare problemi nuovi con risposte verificabili.

    Anche qui bisogna definire il compito: generalizzare nella previsione del testo non garantisce automaticamente correttezza fattuale o affidabilità in ogni uso. La domanda resta la stessa del nostro piccolo esperimento: quale prestazione abbiamo misurato, e su quali casi nuovi?

    Tre cose da conservare

    1. Il training mostra quanto il modello si adatta agli esempi disponibili. Non dimostra, da solo, la qualità delle previsioni future.
    2. La generalizzazione richiede una verifica indipendente e pertinente. Separare i dati significa anche rispettare tempo, gruppi e informazioni realmente disponibili.
    3. Il mondo può cambiare. Un buon risultato nelle condizioni iniziali non garantisce la stessa prestazione in un altro contesto.

    Un modello quasi perfetto sul passato può essere una previsione fragile del futuro. Per questo, davanti a un numero impressionante, la prima domanda non dovrebbe essere soltanto “quanto è alto?”, ma “che cosa è rimasto davvero fuori dall’apprendimento?”

    ← Torna al percorso Capire l’IA

  • 05 – Reti neurali: la matematica dietro il nome

    05 – Reti neurali: la matematica dietro il nome

    CAPIRE L’IA · 5 di N

    Pesi, strati e funzioni: apriamo una piccola rete neurale e seguiamo ogni calcolo, senza scambiarla per un cervello artificiale.

    Entrano due numeri: 2 e 1. Esce un altro numero: 1,5.

    Nel mezzo ci sono tredici parametri e poche operazioni: moltiplicazioni, somme e una funzione che sostituisce i valori negativi con zero. È una piccola rete neurale. Possiamo seguirla interamente con carta e penna.

    Il nome suggerisce neuroni, sinapsi e cervelli. Per capire questo oggetto, però, conviene partire dai calcoli. L’ispirazione biologica fa parte della sua storia; il funzionamento della rete che costruiremo si descrive attraverso una composizione di funzioni parametrizzate.

    Negli articoli precedenti abbiamo visto come si apprende dai dati e perché la generalizzazione debba essere verificata. Qui osserviamo più da vicino la struttura che viene addestrata. Cominceremo dalle operazioni elementari; la notazione matriciale arriverà quando avremo già capito che cosa rappresenta.

    Che cosa fa un “neurone” artificiale?

    Consideriamo un’unità di uno strato denso, il tipo di rete che useremo nell’esempio. Riceve alcuni numeri, li moltiplica per altrettanti pesi, somma i risultati e aggiunge un termine chiamato bias. Infine applica una funzione di attivazione.

    Due passaggi, due formule

    z = w₁x₁ + w₂x₂ + b

    h = φ(z)

    x₁ e x₂ sono gli ingressi; w₁ e w₂ i pesi; b il bias; z la somma pesata prima dell’attivazione; φ, la lettera greca phi, la funzione di attivazione; h il valore prodotto.

    Un peso positivo fa crescere la somma z quando cresce il relativo ingresso, tenendo fissi gli altri. Un peso negativo ha l’effetto opposto. Il bias sposta la somma anche quando gli ingressi sono zero. Qui “bias” significa termine additivo: non è il pregiudizio di cui parliamo quando discutiamo discriminazioni nei sistemi di IA.

    Prendiamo x₁ = 2, x₂ = 1, w₁ = 1, w₂ = −1 e b = 0. Otteniamo z = 1 × 2 − 1 × 1 + 0 = 1. La funzione di attivazione deciderà come trasformare questo valore.

    Un neurone con ingressi 2 e 1, pesi 1 e meno 1 e bias zero produce z uguale 1 e ReLU di z uguale 1.
    Figura 1 — Un’unità della rete svolge una somma pesata e applica una funzione. I numeri sono scelti a scopo didattico.

    Per più ingressi la regola rimane la stessa: z = ∑ᵢ wᵢxᵢ + b. Il simbolo ∑ indica che dobbiamo sommare un termine per ogni ingresso. In forma vettoriale possiamo scrivere z = wᵀx + b: il prodotto scalare raccoglie tutte quelle moltiplicazioni e somme.

    Un singolo peso non è una misura universale dell’importanza di un’informazione. Il suo valore dipende anche dalla scala degli ingressi e dalle operazioni successive. Cambiare metri in centimetri cambia i coefficienti necessari, pur potendo lasciare identica la funzione calcolata.

    La funzione di attivazione: una piega nella regola

    Usiamo una funzione chiamata ReLU, abbreviazione di Rectified Linear Unit:

    ReLU(z) = max(0, z)

    Se z è negativo, restituisce zero. Se z è positivo, restituisce z. In zero restituisce zero.

    Quindi ReLU(−2) = 0, ReLU(1) = 1 e ReLU(3) = 3. Nel neurone appena calcolato, z = 1 diventa h = 1.

    Grafico ReLU: uscita zero per z negativo e uscita uguale a z per z positivo.
    Figura 2 — ReLU(z) = max(0, z). La funzione è continua e lineare a tratti; il cambio di pendenza in zero la rende non affine sull’intero dominio.

    La funzione è semplice, ma introduce qualcosa che una sola somma pesata non può fare: cambia comportamento a seconda del valore ricevuto. È lineare a tratti, con un cambio di pendenza in zero. Non è una sola trasformazione affine valida su tutto il dominio.

    ReLU è una possibile scelta. Esistono altre attivazioni, come sigmoide e tangente iperbolica, con proprietà diverse. La struttura di base di uno strato denso e il ruolo delle attivazioni sono descritti nel capitolo sui percettroni multistrato di Dive into Deep Learning.

    La parola “attivazione” indica qui il risultato di una funzione matematica. Non implica un impulso nervoso o una riproduzione della dinamica di una cellula biologica.

    Da un’unità a uno strato

    Facciamo ricevere gli stessi due ingressi a tre unità. Ciascuna possiede pesi e bias propri:

    Prima unità
    z₁ = x₁ − x₂
    h₁ = ReLU(z₁)

    Seconda unità
    z₂ = 0,5x₁ + x₂
    h₂ = ReLU(z₂)

    Terza unità
    z₃ = −x₁ + 2x₂ − 1
    h₃ = ReLU(z₃)

    Con x₁ = 2 e x₂ = 1, i valori prima dell’attivazione sono 1, 2 e −1. Dopo ReLU otteniamo h₁ = 1, h₂ = 2 e h₃ = 0.

    Abbiamo trasformato due numeri in tre nuove quantità. Questo insieme costituisce uno strato nascosto: si trova fra ingresso e uscita. “Nascosto” descrive la sua posizione; non significa che i suoi valori siano impossibili da osservare.

    Le tre attivazioni formano una rappresentazione intermedia dell’ingresso. Nel nostro esempio sono combinazioni facili da leggere. In reti grandi possono essere difficili da interpretare e non corrispondere a concetti con un nome preciso.

    Il calcolo arriva all’uscita

    Lo strato finale combina le tre attivazioni con altri pesi e un altro bias:

    ŷ = 2h₁ − 0,5h₂ + h₃ + 0,5

    Sostituendo h₁ = 1, h₂ = 2 e h₃ = 0:

    ŷ = 2 × 1 − 0,5 × 2 + 1 × 0 + 0,5 = 1,5

    Il simbolo ŷ, “y cappello”, indica il risultato previsto. Qui abbiamo scelto un’uscita affine, senza ReLU finale, adatta a produrre un numero reale. Altri compiti richiedono trasformazioni diverse: un classificatore, per esempio, può trasformare i punteggi finali in probabilità mediante una funzione apposita. Il nostro 1,5 è semplicemente un valore numerico, non una probabilità.

    Rete con due ingressi 2 e 1, tre attivazioni nascoste 1, 2 e 0 e un’uscita 1,5. I pesi in uscita sono 2, meno 0,5 e 1, con bias 0,5.
    Figura 3 — Una rete densa 2–3–1. I valori nei cerchi sono attivazioni; i numeri sui collegamenti finali sono pesi. I pesi del primo strato sono esplicitati nel testo e nella figura seguente.

    Questa è una rete feedforward: il calcolo procede dagli ingressi all’uscita senza cicli nel grafo considerato. È anche densa: ogni unità del nostro strato nascosto riceve tutti gli ingressi, e l’uscita riceve tutte le attivazioni nascoste.

    Nel disegno compaiono tre colonne, ma gli strati con parametri appresi sono due: quello nascosto e quello di uscita. Gli ingressi non aggiungono pesi. Quando si parla del numero di strati, è utile esplicitare la convenzione usata.

    La matrice è un modo compatto di scrivere gli stessi conti

    Le tre formule dello strato nascosto possono essere raccolte in una matrice W. Ogni riga contiene i pesi di un’unità; ogni colonna corrisponde a un ingresso. I tre bias formano un vettore b.

    Usando vettori colonna, scriviamo:

    z = Wx + b

    h = ReLU(z)

    ReLU viene applicata componente per componente: ognuno dei tre valori di z viene trasformato separatamente.

    W ha righe (1, meno 1), (0,5, 1), (meno 1, 2). Con x=(2,1) e b=(0,0,meno 1), z=(1,2,meno 1) e h=(1,2,0). L’uscita è 1,5.
    Figura 4 — Usiamo vettori colonna. La moltiplicazione di una matrice 3×2 per un vettore 2×1 produce tre valori. ReLU si applica separatamente a ogni componente.

    W ha tre righe e due colonne: è una matrice 3 × 2. Il vettore x contiene due componenti, quindi ha dimensione 2 × 1. Il prodotto Wx ha dimensione 3 × 1, come il vettore dei bias che aggiungiamo.

    Controllare le dimensioni è un modo concreto di controllare il ragionamento: il numero di valori ricevuti da uno strato deve coincidere con quello atteso dai suoi pesi.

    Raccogliendo i pesi finali nel vettore v e chiamando c il bias finale, tutta la rete diventa una sola espressione:

    f(x) = vᵀ ReLU(Wx + b) + c

    Prima trasformiamo x con W e b; poi applichiamo ReLU; infine combiniamo il risultato con v e c. La trasposta vᵀ permette di scrivere il prodotto scalare con il vettore delle attivazioni.

    Perché servono le non linearità?

    Facciamo un esperimento algebrico. Togliamo le attivazioni e sovrapponiamo due trasformazioni affini:

    h = W₁x + b₁

    y = W₂h + b₂

    Sostituendo la prima formula nella seconda:

    y = (W₂W₁)x + (W₂b₁ + b₂)

    Il risultato è ancora della forma Ax + d. Due trasformazioni affini consecutive si possono sostituire con una sola. Ripetere l’operazione per molti strati, senza altre trasformazioni, non cambia questa proprietà.

    Si dice spesso “strato lineare”, ma con un bias il termine matematico preciso è affine. La distinzione conta: una funzione lineare manda zero in zero, mentre un termine additivo può spostare il risultato.

    Inserendo ReLU fra gli strati, in generale non possiamo più ridurre tutto a una sola trasformazione affine. Regioni diverse dello spazio degli ingressi possono attivare unità diverse e seguire regole affini diverse. La rete costruisce così una funzione più articolata componendo operazioni semplici. Questa osservazione è sviluppata anche nelle lezioni di François Fleuret sui percettroni multistrato.

    Nel nostro esempio, la terza unità produce zero per x = (2, 1). Con x = (1, 2), invece, la sua somma diventa −1 + 4 − 1 = 2 e la sua uscita è 2. Una stessa unità può contribuire in modo diverso al variare dell’ingresso.

    Dove si trovano i tredici parametri?

    Nel primo strato abbiamo 3 × 2 = 6 pesi e 3 bias. Nell’uscita abbiamo 3 pesi e 1 bias. In totale:

    6 + 3 + 3 + 1 = 13 parametri

    In generale, uno strato denso con n ingressi e m uscite, dotato di un bias per uscita, contiene mn + m parametri.

    I parametri non sono i valori che abbiamo scritto dentro i cerchi della figura. I pesi e i bias restano fissi durante questa inferenza; le attivazioni cambiano con l’ingresso. La ReLU standard che abbiamo scelto non aggiunge parametri da apprendere.

    Per rendere leggibile l’esempio abbiamo assegnato noi tutti i coefficienti. Non abbiamo dimostrato che questa rete sappia risolvere un problema reale. Abbiamo costruito una funzione e calcolato il suo valore in un punto.

    Come entrerebbe l’apprendimento?

    Supponiamo che per l’ingresso (2, 1) il risultato atteso sia 2. La rete restituisce 1,5. Con la perdita quadratica otteniamo:

    L = (ŷ − y)² = (1,5 − 2)² = 0,25

    Possiamo ora chiedere come cambia la perdita quando cambiamo un peso. Consideriamo soltanto il primo peso di uscita, v₁ = 2, e teniamo fissi tutti gli altri parametri. Poiché ŷ contiene il termine v₁h₁, la regola di derivazione delle funzioni composte dà:

    ∂L/∂v₁ = 2(ŷ − y)h₁ = 2(1,5 − 2) × 1 = −1

    Con un passo η = 0,1:

    v₁ nuovo = v₁ − η ∂L/∂v₁ = 2 − 0,1 × (−1) = 2,1

    Il simbolo ∂ indica una derivata parziale: misuriamo l’effetto di un parametro tenendo fissi gli altri. Il segno negativo suggerisce che un piccolo aumento di v₁ riduca la perdita. Dopo questo aggiornamento isolato, l’uscita diventa 1,6 e la perdita scende a 0,16.

    Abbiamo modificato un solo peso per rendere visibile il meccanismo. Nell’addestramento ordinario si calcolano le derivate rispetto ai parametri da aggiornare e si usano molti esempi. La retropropagazione, o backpropagation, organizza efficientemente questi calcoli mediante la regola della catena. Un ottimizzatore usa poi le derivate per aggiornare i parametri: calcolare il gradiente e scegliere l’aggiornamento sono operazioni distinte.

    La retropropagazione non è una spiegazione del funzionamento del cervello. È un procedimento di calcolo. E ridurre la perdita su questo esempio non garantisce buoni risultati su altri: ritroviamo il problema della generalizzazione affrontato nell’articolo precedente.

    Che cosa significa “profonda”?

    Aggiungere strati significa comporre ulteriori trasformazioni. Indicando con h⁽⁰⁾ l’ingresso x, uno strato nascosto può essere scritto:

    h⁽ˡ⁾ = φₗ(Wₗh⁽ˡ⁻¹⁾ + bₗ)

    L’indice l identifica lo strato. Ciascuno riceve la rappresentazione prodotta dal precedente e la trasforma nella successiva.

    La profondità riguarda questa successione di trasformazioni; la larghezza riguarda quante unità ha uno strato. Non esiste una corrispondenza automatica fra uno strato e un concetto umano come “oggetto”, “significato” o “intenzione”.

    Le reti neurali comprendono architetture molto diverse. Qui abbiamo aperto una piccola rete densa feedforward. Convoluzioni, connessioni residue e meccanismi di attenzione richiedono altri elementi: il diagramma di cerchi e frecce non esaurisce tutte le reti contemporanee.

    Il nome biologico non sostituisce la spiegazione

    Un cerchio nel nostro disegno rappresenta un’operazione. Una freccia indica una dipendenza fra quantità e, nei collegamenti pesati, un coefficiente. Né il cerchio né la freccia riproducono la complessità elettrochimica di una cellula e delle sue connessioni.

    Chiamare una rete “cervello artificiale” può quindi suggerire proprietà che il modello matematico non stabilisce: coscienza, intenzioni, comprensione simile a quella umana. Le capacità effettive si valutano attraverso compiti, dati ed esperimenti, non attraverso l’immagine evocata dal nome.

    La matematica, qui, non toglie interesse alla rete. Lo rende più preciso: come può una composizione di operazioni semplici, con parametri appresi, costruire rappresentazioni utili? È una domanda più feconda che immaginare un piccolo cervello dentro ogni scatola.

    Tre cose da conservare

    1. Un’unità di uno strato denso combina ingressi, pesi e bias, poi applica una funzione. Pesi e bias sono parametri; le attivazioni sono valori calcolati.
    2. Gli strati compongono trasformazioni. Le non linearità permettono di superare ciò che può esprimere una singola trasformazione affine.
    3. Una rete neurale è un modello matematico da addestrare e verificare. Il richiamo biologico del nome non dimostra che sia un cervello artificiale.

    Siamo partiti da 2 e 1 e siamo arrivati a 1,5. Ora possiamo ricostruire ogni passaggio, contare i parametri e perfino correggerne uno. Nelle reti grandi cresce enormemente la scala; per cominciare a capirle, questo piccolo calcolo è già un punto di appoggio concreto.

    Torna alla pagina della serie Capire l’IA