RNN: reti con memoria (e i loro limiti)

Le reti ricorrenti sono state la prima idea seria per far leggere a una macchina una sequenza tenendo conto di ciò che è venuto prima. Come funziona il loro stato interno, cosa significa "srotolarle nel tempo" e perché la loro memoria, in pratica, è più corta di quanto sembri.

Leggete questa frase parola per parola, senza tornare mai indietro. «Il», «gatto», «che», «avevo», «visto», «ieri»… A ogni parola non ricominciate da zero: portate avanti una specie di riassunto di quello che avete letto finora, e lo aggiornate. Quando arrivate a «dormiva», sapete già chi è il soggetto, perché quel riassunto lo conteneva. Le reti neurali classiche non sanno fare questo: guardano un dato alla volta, isolato, senza memoria di quello prima. Le reti neurali ricorrenti — RNN, dall’inglese recurrent neural networks — sono state la prima risposta seria a questo limite, e per un paio di decenni hanno definito come le macchine leggessero il linguaggio, il parlato, qualsiasi dato che arriva in sequenza.

Reti ricorrenti, memoria che si dissolve, LSTM e GRU con i loro cancelli: il capitolo è nel libro.

Leggi «Modelli di sequenza: da RNN ai Transformer» nel libro →

L’idea di base risale agli anni Novanta, con i lavori di Jeffrey Elman e di altri, ma è diventata centrale molto più tardi, quando la potenza di calcolo ha reso praticabile addestrarle su grandi quantità di testo. Vale la pena capirle non per nostalgia, ma perché il problema che risolvono — e quello su cui inciampano — è ancora oggi il cuore di tutto ciò che chiamiamo elaborazione del linguaggio.

Una rete che si passa un biglietto

Una rete tradizionale trasforma un input in un output e dimentica tutto. Una RNN aggiunge un ingrediente: uno stato nascosto, un vettore di numeri che rappresenta il «riassunto» di quanto visto finora. A ogni passo la rete riceve due cose — il nuovo elemento della sequenza e lo stato nascosto del passo precedente — e ne produce uno nuovo, aggiornato. Quello stato viene poi passato al passo successivo, che ripeterà l’operazione.

È come una staffetta in cui ogni corritore riceve un biglietto con gli appunti di chi l’ha preceduto, aggiunge la propria annotazione e lo consegna al successivo. Il biglietto non è mai il testo completo: è una sintesi, necessariamente compressa. Ma è abbastanza per portare avanti il filo. In formula, lo stato nuovo si ottiene combinando l’input corrente e lo stato vecchio, ciascuno moltiplicato per una matrice di pesi, e passando il risultato attraverso una funzione di attivazione che introduce la non-linearità.

Srotolata nel tempo

Disegnata così, con lo stato che rientra in sé stesso, una RNN sembra avere un cappio: un’uscita che torna a essere ingresso. Per capirla — e per addestrarla — conviene «srotolarla»: distendere quel cappio in una catena, una copia della rete per ogni istante della sequenza. Diventa allora una rete profonda ordinaria, lunga quanto la sequenza, in cui l’informazione scorre da sinistra a destra lungo la linea del tempo.

La stessa cella, srotolata nel tempo A stato input output = A A A x(t-1) x(t) x(t+1) h(t-1) h(t) h(t+1) Le tre celle «A» sono la stessa rete, con gli stessi pesi, applicata a istanti diversi.

A sinistra la cella ricorrente con il suo cappio; a destra la stessa cella srotolata su tre istanti. La freccia terracotta è lo stato nascosto che scorre nel tempo, portando il contesto da un passo al successivo.

Questa visione srotolata non è solo un disegno: è il modo in cui la rete viene addestrata. Il segnale di correzione, il gradiente, deve risalire l’intera catena all’indietro, dall’ultimo istante fino al primo, correggendo i pesi passo per passo. La tecnica si chiama backpropagation through time, retropropagazione attraverso il tempo, ed è la stessa retropropagazione delle reti ordinarie applicata a questa profondità particolare, quella temporale.

Lo stesso peso per ogni istante

C’è un dettaglio decisivo, ed è nel disegno: tutte le copie della cella nella versione srotolata sono la stessa cella. Condividono gli identici pesi. Non è che l’istante numero cinque abbia una sua rete diversa dall’istante numero venti: è sempre la medesima funzione, applicata ripetutamente, che a ogni giro riceve un input nuovo e lo stato che si porta dietro.

Questa condivisione dei pesi ha due conseguenze pratiche importanti. La prima è l’economia: una RNN ha lo stesso numero di parametri che la sequenza sia lunga cinque elementi o cinquecento, perché la cella è una sola. La seconda è la flessibilità: la stessa rete può elaborare sequenze di lunghezza qualunque, cosa impossibile per una rete tradizionale che si aspetta un input di dimensione fissa. È come un impiegato allo sportello che applica la stessa procedura a ogni pratica in coda, senza sapere in anticipo quante ne arriveranno: la regola è una, i casi infiniti.

Una rete ricorrente non ha una memoria grande: ha una memoria che ricomincia a ogni istante, e deve decidere in fretta cosa vale la pena trascinare avanti.

Il difetto di fabbrica: la memoria corta

Qui arriva il problema che ha definito la storia delle RNN. In teoria lo stato nascosto può trasportare informazione per un numero illimitato di passi. In pratica, quasi mai. Il motivo sta nell’addestramento. Quando il gradiente risale la catena srotolata, a ogni passo viene moltiplicato per gli stessi pesi. Se quei fattori sono in media minori di uno, il segnale si contrae a ogni moltiplicazione e dopo una decina di passi è praticamente svanito: è il vanishing gradient, il gradiente che evapora. Se sono maggiori di uno, succede il contrario, il segnale esplode e l’addestramento diventa instabile.

La conseguenza è che una RNN semplice fatica a collegare eventi lontani nella sequenza. Riesce a capire che «dormiva» si riferisce al «gatto» se le due parole sono vicine, ma se in mezzo ci sono venti parole il legame si perde, perché durante l’addestramento il segnale che avrebbe dovuto insegnare quel collegamento non è mai arrivato fino all’inizio. È l’effetto della fotocopia di una fotocopia: dopo pochi passaggi, il contenuto originale è illeggibile. La memoria teorica è lunga; quella effettiva è corta.

Da questo limite è nata la generazione successiva di architetture ricorrenti — LSTM e GRU — che aggiungono alla cella dei «cancelli» capaci di proteggere l’informazione importante dall’erosione, lasciandola scorrere quasi intatta anche per centinaia di passi. Sono la risposta diretta al vanishing gradient, e per anni hanno dominato la traduzione automatica, il riconoscimento vocale, la generazione di testo.

Cosa è rimasto delle RNN

Nel 2017 l’architettura Transformer ha cambiato il baricentro. Invece di far scorrere l’informazione passo per passo lungo una catena, il meccanismo di attention permette a ogni elemento della sequenza di guardare direttamente tutti gli altri, vicini o lontani, senza la staffetta intermedia. Questo elimina alla radice il problema della memoria corta e, cosa altrettanto importante, consente di elaborare l’intera sequenza in parallelo invece che un istante alla volta — un enorme vantaggio pratico per addestrare su hardware moderno. È il motivo per cui i modelli linguistici di oggi sono quasi tutti Transformer, non RNN.

Sarebbe però un errore archiviare le reti ricorrenti come un vicolo cieco. L’elaborazione sequenziale, un elemento alla volta con uno stato che si aggiorna, resta la scelta naturale per i flussi in tempo reale e per i dispositivi con poca memoria, dove tenere in testa l’intera sequenza è impossibile. E la ricerca recente sui cosiddetti state space models ha riportato in auge idee profondamente ricorrenti, cercando di combinare la memoria compatta e il costo lineare delle RNN con la capacità di catturare dipendenze lunghe dei Transformer. Il cappio, insomma, non è mai davvero scomparso.

Perché ti riguarda

Le RNN sono il posto migliore per capire un’idea che attraversa tutta l’AI applicata alle sequenze: elaborare qualcosa che arriva nel tempo significa portarsi dietro un riassunto di ciò che è già passato, e ogni riassunto è una scommessa su cosa sia importante ricordare. Comprimere è inevitabile; il difficile è comprimere le cose giuste. Il vanishing gradient non è una curiosità matematica, è la forma tecnica di un limite intuitivo: più è lontano un ricordo, più è facile che vada perso.

Quando oggi un assistente perde il filo di una conversazione lunga, o un modello «dimentica» un’istruzione data molte righe prima, state osservando una versione più sofisticata dello stesso problema che le RNN hanno reso visibile trent’anni fa. Capire da dove nasce quel limite — e perché servano meccanismi espliciti per aggirarlo — è il modo migliore per non stupirsi quando ricompare, sotto un’altra forma, nella tecnologia che usiamo ogni giorno.

I commenti sono riservati agli iscritti.

Accedi per commentare