X
    Categories: blog

Le reti neurali ricorrenti

In questo articolo riprendiamo la nostra esplorazione delle reti neurali, introducendo le reti ricorrenti, che ci consentiranno, nell’articolo successivo, di sviluppare un semplice OCR per testi.

Il neurone classico

Come abbiamo già visto negli articoli precedenti, un neurone classico svolge delle attività tutto sommato molto semplici:

  • riceve uno o più ingressi
  • moltiplica ognuno degli ingressi per il relativo coefficiente (o peso)
  • somma i risultati di questi prodotti
  • aggiunge al risultato un eventuale valore detto bias
  • applica al totale finale una cosiddetta funzione di attivazione
  • utilizza il risultato di questa funzione come uscita

L’intero processo è schematizzato nella seguente figura.

Abbiamo anche detto che la fase di addestramento di una rete neurale serve a trovare i valori dei singoli pesi e bias di ogni neurone tali per cui, applicando alla rete un ingresso conosciuto, si ottiene un’uscita che si avvicina il più possibile al valore desiderato.

La rete neurale feed-forward

Una rete neurale composta da neuroni come quelli descritti nel capitolo precedente viene chiamata rete neurale feed-forward (o FFNN da Feed-Forward Neural Network) ed è caratterizzata dal fatto che le connessioni tra neuroni non formano cicli, ma avanzano in una unica direzione dall’ingresso verso l’uscita della rete.

In un sistema del genere l’uscita attuale dipende solo ed esclusivamente dall’ingresso attuale, quindi in sostanza la rete non ha memoria di ingressi avvenuti in tempi precedenti. 

Tornano molto utili quando gli ingressi si susseguono senza dipendenza. Ad esempio se ho una serie di scansioni di documenti che non sono correlati gli uni agli altri e li devo classificare, posso utilizzare un modello di classificazione di immagini come quelli descritti negli articoli precedenti, i quali sono formati da reti neurali (convoluzionali o non convoluzionali) di tipo feed-forward. 

Il contesto

Ma che succede se un ingresso è correlato agli ingressi precedenti e quindi anche l’uscita della rete deve tener conto di queste correlazioni?

Ad esempio una parola può avere più  significati e noi siamo in grado di comprendere qual è quello giusto a seconda delle altre parole che formano la frase:

  • “Mangio solo pane integrale
  • “Devo calcolare l’integrale
  • “Non dare retta a quella stupida credenza
  • “Apri la credenza e prendi i bicchieri”

Anche certi comportamenti hanno significati diversi a seconda delle azioni che li hanno preceduti:

  • in un negozio una persona afferra un oggetto con una mano e poi mette la mano in tasca
  • in un negozio una persona afferra un oggetto con una mano, ripone l’oggetto e poi mette la mano in tasca

Nel primo caso potrebbe scattare un allarme anti-taccheggio, nel secondo caso no.

In tutti questi esempi si rende necessario comprendere le correlazioni che esistono tra i vari ingressi ricevuti in sequenza: le varie parole che formano la frase o i vari frame che formano il filmato.

In sostanza è necessario comprendere il contesto in cui un certo ingresso arriva al sistema. E per farlo è necessario avere memoria degli ingressi che precedono quello attuale, perchè la sequenza passata (e a volte anche quella futura) modifica il modo in cui l’ingresso attuale viene elaborato nell’uscita attuale.

Le reti neurali ricorrenti

Una rete neurale ricorrente (o RNN da Recurrent Neural Network) è una rete neurale in cui esistono cicli: i valori di uscita di un layer di livello superiore (più vicino all’uscita) vengono utilizzati come ingresso per un layer di livello inferiore (più vicino all’ingresso).

Nella figura a fianco è riportato una rete formata da un singolo neurone ricorrente: come si nota, l’uscita del neurone (in parte o in toto) torna all’ingresso del neurone stesso, in questo caso. 

Questa retroazione in sostanza fa sì che l’uscita O(t) (ovvero all’istante t) sia funzione dell’ingresso X(t) ed in parte dal valore V(t) che, per effetto del ciclo, corrisponde all’uscita precedente O(t-1). Ma l’uscita O(t-1) a sua volta dipendeva dal valore dell’ingresso X(t-1) e di V(t-1) che, sempre per effetto del ciclo, corrispondeva all’uscita ancora precedente O(t-2) e così via.

Quanto appena descritto è schematizzato nella figura seguente, dove il ciclo di retroazione viene dispiegato lungo la sequenza temporale, evidenziando così le correlazioni tra i valori futuri e quelli passati.

Quindi un semplice ciclo consente ai neuroni di una rete ricorrente di avere memoria degli ingressi passati e quindi di gestire in maniera corretta situazioni simili a quelle descritte in precedenza, dove serve mantenere un contesto per elaborare correttamente le informazioni.

Vanishing o Exploding Gradient

Non è tutt’oro ciò che luccica. Un problema tipico delle reti ricorrenti è quello del cosiddetto vanishing o exploding gradient.

Come abbiamo accennato negli articoli precedenti, durante la fase di addestramento delle reti neurali, viene utilizzato il metodo della backpropagation, la quale aggiorna i vari parametri dei neuroni (pesi e bias) in modo proporzionale alla derivata parziale della loss-function rispetto al parametro stesso. 

Il problema in questo caso sono le funzioni di attivazione:

  • Se vengono utilizzate funzioni del tipo sigmoidale o tangente iperbolica, i valori dei loro gradienti restano nell’intervallo 0..1. Visto che l’algoritmo di backpropagation prevede che i gradienti vengano moltiplicati in catena lungo i layer, è chiaro che il prodotto di un elevato numero di valori compresi tra 0 ed 1 porta il valore complessivo a diminuire velocemente lungo la catena di neuroni (vanishing gradient).
  • Se al contrario vengono utilizzate funzioni lineari come la ReLU o la lineare pura, i valori dei gradienti possono essere anche superiori ad 1 e quindi il valore complessivo può crescere enormemente lungo la catena di neuroni (exploding gradient).

Per limitare l’effetto di vanishing/exploding gradient, si può agire in diversi modi, ad esempio utilizzando neuroni ricorrenti più complessi di quello descritto in precedenza. Due tipologie molto comuni sono i neuroni LSTM (da Long-Short Term Memory) ed i GRU (da Gatered Recurrent Unit).

Neurone LSTM

Come si vede dalla figura schematica qui sopra, il neurone LSTM è sensibilmente più complesso del semplice neurone ricorrente.

Mentre quest’ultimo gestisce semplicemente un’uscita supplementare h(t) per lo stato attuale ed un ingresso h(t-1) per lo stato precedente, oltre che due funzioni di attivazione differenti per lo stato h e l’uscita z, il neurone LSTM ha internamente diverse porte (o gate) che gli consentono di decidere in autonomia (durante la fase di addestramento) cosa vale la pena memorizzare o dimenticare, se e come combinare l’ingresso con lo stato interno, se e come restituire l’uscita.

  • Il forget gate decide se l’informazione in ingresso deve essere buttata o mantenuta. A lui arrivano le informazioni dell’input corrente x(t) e dell’uscita precedente in retroazione h(t-1). A queste informazioni è applicata una funzione di attivazione sigmoidale che restituirà una uscita compresa tra 0 ed 1. Questa uscita verrà moltiplicata al valore dello stato precedente c(t-1). Quindi se la sigmoidale restituisce un valore prossimo a 0, lo stato precedente tenderà ad azzerarsi (venire dimenticato), mentre se restituisce un valore prossimo ad 1, lo stato precedente tenderà a restare uguale (venire memorizzato).
  • L’input gate in modo analogo decide se i valori in ingresso x(t) e h(t-1) possono essere elaborati insieme allo stato precedente c(t-1) (o quello che ne rimane dopo il passaggio attraverso il forget gate). 
  • L’elaborazione degli ingressi e dello stato attuale (o quanto meno i valori che il forget e l’input gate lasciano passare) diventano lo stato attuale del neurone, c(t).
  • Infine l’output gate, in maniera analoga agli altri due gate, sfruttando sempre i valori in ingresso x(t) e h(t-1) decide se lo stato attuale c(t) può essere presentato in uscita e diventare l’uscita z(t) che corrisponde anche al prossimo ingresso in retroazione h(t).

Come intuibile, quindi, l’addestramento di una rete ricorrente fatta di neuroni LSTM risulta essere ben più complessa in quanto i parametri in gioco sono numerosi. 

Neurone GRU

Un neurone GRU rappresenta una semplificazione dell’LSTM. Esso gestisce infatti solo due gate: l’update gate (che riunisce insieme il funzionamento del forget e dell’input gate) ed il reset gate che concorre anche lui nel decidere se e come l’informazione passata deve essere dimenticata.

Effetti sul vanishing gradient

L’uso dei neuroni LSTM e GRU tende a limitare l’effetto del vanishing/exploding gradient e consente quindi di poter lavorare su sequenze di ingresso più lunghe.

Nell’animazione seguente è riportata visivamente l’effetto del vanishing gradient per una rete con neuroni ricorrenti semplici e LSTM. L’immagine rappresenta i valori dei gradienti per la matrice dei pesi in ingresso, durante la fase di retro-propagazione dell’errore (dallo step 128 allo 0). Come si vede, con i neuroni ricorrenti semplici il gradiente si appiattisce velocemente ad un colore grigio, corrispondente allo 0, mentre con i neuroni LSTM, l’appiattimento arriva dopo diverse altre iterazioni.

Esempi d’uso delle reti ricorrenti

La natura delle reti ricorrenti fa sì che si prestino bene a tutti i casi d’uso in cui esiste una forte dipendenza temporale nella sequenza di ingressi:

  • Time Series Forecasting: le serie temporali rappresentano banche dati storiche di eventi di varia natura. Ad esempio i titoli di borsa, la temperatura di un ambiente, il flusso del traffico su una strada, eccetera. E’ possibile addestrare reti ricorrenti usando queste time series in modo tale che, presentando agli ingressi del modello la sequenza di dati nota fino al tempo t, il modello sia in grado di predire quali saranno i prossimi valori al tempo t+1t+2, eccetera. Queste previsioni possono servire ad anticipare specifici eventi (ad esempio quando è il momento giusto di comprare o vendere azioni in borsa), ma anche a rilevare anomalie in determinati andamenti (ad esempio se la temperatura di un macchinario varia sensibilmente rispetto a quanto ci si aspetta, evidenziando un potenziale problema al macchinario stesso).
  • Natural Language Processing: le frasi sono parole scritte in sequenze precise determinate dalla sintassi e grammatica della lingua in uso e, come abbiamo accennato in precedenza, determinano un contesto che può variare drasticamente il significato di una parola. Per questo motivo le reti ricorrenti si prestano molto bene ai task di NLP, come la text classification, la machine translation, la question answering, eccetera.
  • Speech-Recognition: quanto detto per le frasi scritte vale ovviamente anche per le frasi pronunciate a voce: una frase è composta da parole in sequenza, ogni parola è composta da lettere in sequenza, ogni lettera corrisponde ad un suono. Quindi il parlato è una sequenza di suoni emessi in ordine tale da formare parole e frasi. Anche in questo caso le reti ricorrenti tornano utili per decodificare le sequenze di suoni in sequenze di lettere, quindi parole e frasi.
  • Optical Character Recognition: come abbiamo visto negli articoli precedenti, con reti convoluzionali è possibile creare modelli che consentono di riconoscere le lettere in base a delle immagini. Ma se invece di leggere le lettere singolarmente, le leggiamo in sequenza e ne comprendiamo il contesto, riusciremo a leggere intere parole o frasi in una volta sola. Non solo: il fatto che alcune sequenze di lettere non hanno significato, consente di escludere potenziali letture errate, aumentando di conseguenza l’accuratezza complessiva del sistema. 

See you soon!

Nel prossimo articolo metteremo a frutto le nozioni apprese in questo articolo ed in quelli precedenti, andando a sviluppare un semplice OCR.

Bye!

Cristiano Casadei: Lavoro in Maggioli dal ’96 e ho contribuito a diversi prodotti dell’Azienda: da Concilia a TradeWin, ai prodotti per i Demografici. Dal 2016 entro a far parte a tempo pieno del team dei Progetti Speciali, ora R&D. In questo team ho contribuito allo sviluppo di Revisal, Scacco2 e ora mi occupo di studiare e sperimentare soluzioni che fanno uso di Intelligenza Artificiale. Come si può intuire dalla foto, amo la montagna.
Related Post