Deep Learning: una overview delle tecniche e dei problemi
Per parlare di deep learning, osserviamo dapprima il contesto generale dell’Intelligenza artificiale. Esso raggruppa tante sotto aree, fra cui quella del machine learning (o apprendimento automatico). Come sotto area del machine learning troviamo proprio il deep learning.
Ma cos’è davvero il machine learning? Si tratta dell’apprendimento della risoluzione di un task attraverso la conoscenza dei dati: un algoritmo è in grado di apprendere quando è in grado di migliorare la sua performance P nel task T a fronte di un incremento di esperienza E.
Cita infatti la definizione di Tony Mitchell (Machine Learning, p. 2, 1997):
“ A computer program is said to learn from Experience E, with respect to some class of task T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E”.
Il machine learning è dunque un sotto-campo dell’intelligenza artificiale, dove la conoscenza deriva dall’esperienza tramite un processo di induzione. Il problema è che se la realtà che osservo non è sufficientemente rappresentativa della realtà da cui voglio imparare, l’induzione fallisce. La programmazione tradizionale vede in input al computer i dati e il programma, laddove il machine learning vede in input i dati e il risultato atteso, consentendo di avere come output il programma: è in questo caso la macchina che assume il ruolo dello sviluppatore software che genera il programma che risolve il problema, una volta noto il risultato da ottenere.
Dal punto di vista delle tecniche utilizzate, il machine learning si suddivide in tre categorie:
- supervised learning (learn the model) – dai dati di ingresso il sistema elabora la previsione in uscita: questo è utilizzato per esempio nel riconoscimento di immagini o nella predizione del valore di un asset finanziario o, ancora, nei filtri anti-spam. Classificazione e regressione sono i due problemi principalmente trattati;
- unsupervised learning (learn the representation) – dai dati di ingresso il sistema elabora la rappresentazione della loro struttura, utile per ragionamenti successivi. Un esempio di applicazione sono i motori di ricerca. Molto spesso, in questi ultimi anni, vengono applicati i cosiddetti autoencoders, che sono tecniche per comprimere l’informazione utile, ad esempio, ancora, nel caso di immagini;
- reinforcement learning (learn to control) – processata l’informazione, il sistema identifica la decisione migliore da prendere, in maniera simile all’apprendimento umano. Un campo di applicazione è quello per esempio della guida autonoma. Probabilmente il RL sarà un tema caldo fra alcuni anni (nei suoi approcci value-based, policy-based, actor-critic). Una rete di RL ha battuto un campione di Alpha-Go 4-1 nel 2016 (quando la previsione di sconfitta era invece per il 2100)
NIPS (Conference on Neural Information Processing Systems) è la più prestigiosa conferenza al mondo sul machine learning: se consideriamo il numero di articoli ad essa sottoposti, il deep learning si colloca subito dopo gli algoritmi e subito prima delle applicazioni. Peraltro, il totale degli articoli sottoposti alla conferenza é quintuplicato negli ultimi dieci anni: l’interesse per il machine learning è dunque fortemente aumentato ed in particolare, appunto, quello per il deep learning.
In effetti si può ormai parlare di una vera e propria “machine learning revolution”: per la prima volta, nel 2012, sono stati utilizzati metodi di deep learning per classificare le immagini, aumentando enormemente l’accuratezza dei risultati, superando nel 2015 le prestazioni degli esseri umani.
Il deep learning ha naturalmente a che fare con le reti neurali artificiali. Le reti neurali biologiche, che restano estremamente più complesse, in generale hanno, per ogni neurone, assoni di collegamento con altri neuroni che trasferiscono informazioni attraverso dendriti e sinapsi. In analogia, nella rete neurale artificiale, all’ingresso di un neurone arrivano varie informazioni che sono sommate e pesate (con pesi sinapsici) a seconda dell’importanza accordata. Una volta che gli ingressi siano pesati linearmente, vengono passati ad una funzione f tipicamente non lineare. Il risultato viene trasmesso ad altri neuroni e così via, fino a costituire una vera e propria rete neurale.
In generale, i neuroni si considerano in strati: uno strato di input, uno detto nascosto (hidden) ed uno di output. I neuroni dello strato nascosto sono fondamentali per estrarre informazioni dall’input: la chiave per migliorare la prestazione della rete consiste infatti nell’aumentare i neuroni nello strato nascosto. Quando parliamo di deep learning, nello specifico, abbiamo una serie di strati nascosti impilati l’uno sull’altro. Ogni strato aumenta il livello di astrazione della rete, rendendo via via più complessa l’analisi a partire dall’ingresso, di basso livello, con lo scopo generare informazione di sempre maggior livello. Deep è un termine che indica proprio l’esistenza di tanti strati fra ingresso ed uscita e si parla anche di “profondità della rete neuronale”.
Nel machine learning tradizionale troviamo la seguente catena operativa: input -> feature extraction (cioè estrazione dai dati delle caratteristiche importanti, effettuata da un umano mediante scrittura di codice) -> classificazione (effettuata da un algoritmo tradizionale di machine learning che combina in modo appropriato le features) -> output
Nel deep learning, l’estrazione delle feature è invece anch’essa automatizzata e fatta eseguire dalla rete neurale assieme alla classificazione. Questo si è rivelato molto efficace, ma, per contro, affinché l’algoritmo sia in grado di estrarre le feature, occorre fornirgli una grande mole di dati (cioè un gran numero di esempi per l’addestramento). Ciò richiede anche tanta potenza computazionale.
Ma servono davvero tanti strati nascosti? Sembra proprio di sì, se consideriamo per esempio che, per il riconoscimento di immagini, nel 2012 vennero usati 8 strati (con un tasso di errore del 16,4%) e nel 2015 ben 152 strati, registrando un tasso di errore di appena il 3,57%. Avere reti neurali profonde è dunque di aiuto per risolvere problemi complessi. Per contro, con tanti strati il numero di pesi sinapsici da addestrare è molto elevato e servono dunque tanti dati a disposizione e, come si è detto, elevata potenza di calcolo.
Il deep learning in realtà esiste da tanto tempo. La prima rete neurale è stata infatti sviluppata attorno agli anni ’50. Quelle prime reti non avevano strati nascosti e perciò non era possibile rappresentare funzioni complesse. In realtà si era compresa la necessità di strati nascosti, ma allora non esisteva una algoritmo efficace per addestrarli. La delusione per i risultati ottenuti ha dato luogo al cosiddetto “primo inverno dell’intelligenza artificiale”. Solo negli anni ’80, grazie all’introduzione dell’algoritmo di back propagation, si è iniziato ad addestrare strati nascosti. Mancavano però dati e potenza di calcolo, quindi vi fu un nuovo "inverno". Fra l’altro, a metà degli anni ’90, si imposero le Support-vector machine (SVM), cioé tecniche di deep learning che funzionavano con pochi dati e avevano grande robustezza. Questo lasciò in disparte, nuovamente, le reti neurali. Negli anni 2000 invece la situazione cambiò: finalmente si ebbe disponibilità di tanti dati, di grande capienza di storage e di elevata potenza di calcolo. Tornarono quindi in auge le reti neurali, stavolta con tanti strati nascosti e con tutti gli elementi per poter funzionare al meglio. Oggi siamo nella cosiddetta "era d’oro del deep learning" grazie appunto ad un combinazione di vari fattori:
- disponibilità di CPU multiple cores (che parallelizzano la computazione);
- disponibilità di big data;
- disponibilità di tecniche migliori, come ad esempio: le activation functions (funzioni di attivazione all’interno di ogni neurone, che negli anni ‘80-‘90 erano la sigmoid o la tangente iperbolica, mentre oggi abbiamo la rectified linear unit ReLU, che consente all’algoritmo di back propagation di apprendere più velocemente), i regularization methods (che impediscono all’algoritmo di imparare eccessivamente dai dati di addestramento, cosa che comporterebbe poi una limitata capacità di generalizzazione in presenza di dati nuovi), gli optimization methods;
- disponibilità di numerose ed efficienti librerie, in buona parte open source, che consentono implementazioni veloci senza dover conoscere troppo approfonditamente i metodi utilizzati.
Le applicazioni del deep learning sono svariate: in particolare ben si adatta a tutti quegli ambiti con dati fortemente strutturati (cioé che presentano delle regolarità), come audio e immagini. Alcuni esempi sono i:
- Internet & Cloud: classificazione di immagini, riconoscimento vocale, traduzione linguistica, sentiment analysis, reccomendations;
- Medicina & biologia: individuazione di cellule cancerogene, diabetic grading, drug discovery;
- Media & entertainment: video captioning, ricerca di video, real time translation;
- Security & defense: face detection, video surveillance, satellite imagery;
- Autonomoud machines: pedestrian detection, lane tracking, recognize traffic sign
Quando si implementa deep learning, bisogna tenere in conto molti aspetti, come per esempio:
- che tipo di loss function utilizzare (Mean Squared Error, cross entropy, ecc.)
- che rappresentazione di rete neurale adottare (feedforward networks, convolution networks, che danno i migliori risultati per le immagini perché invarianti rispetto alle traslazioni, oppure recurrent networks, utili per analisi di video/audio/comportamenti, quando si vuole che la rete abbia memoria e a tale scopo si costruiscono anelli fra neuroni anche di strati diversi o verso loro stessi: queste reti sono difficili da addestrare e richiedono molto tempo. Sono usate anche nello speech-to-text)
- che algoritmo di ottimizzazione usare (gradient stocastico, backpropagation, ecc.)
I problemi principali del deep learning sono quelli anche delle reti neurali:
- overfitting (quando la rete si adatta troppo ai dati di addestramento)
- minimi locali (addestrare una rete neurale significa risolvere un problema di minimizzazione dell’errore, ma i minimi locali non sono il vero minimo assoluto della funzione e possono falsare il risultato)
- plateau (per esempio vi possono sono grandi regioni dello spazio in cui la funzione è all’incirca piatta e in tali zone l’apprendimento è lento)
- vanishing/exploding gradients
- long-term dependencies (problema che si riscontra quando si vuole che la rete abbia anche memoria )
Tante sono le possibili tecniche per l’ottimizzazione:
- gradient descent (batch vs stochastic vs Mini-batch, quest’ultimo oggi più usato perché permette di sfruttare al meglio l’architettura parallela)
- advanced optimization (second order vs Momentum (RMSprop, Adam, Adagrad) vs Bayesan)
- data preprocessing (input normalization vs Batch normalization)
- regularization (weight-decay vs Early stopping vs Dropout)
- learning rate (constant vs step decay vs inverse decay vs exponential decay)
- weight initializazion (i pesi vengono in genere inizializzati come piccoli e possibilmente randomici)
Quando usare il deep learning? Essenzialmente quando sono in gioco grandi quantità di dati strutturati, altrimenti esistono altri algoritmi di machine learning più efficaci.
Con pochi dati, oppure quando si ha bisogno di avere chiarezza sul ragionamento fatto dalla rete neurale, oppure ancora quando si ha disposizione una grande conoscenza del dominio, non è opportuno utilizzare il deep learning. Come pure quando si ha bisogno di avere garanzie teoriche riguardo al risultato: il deep learning è per sua natura un campo empirico.