Con questo articolo iniziamo a muovere i primi passi in un settore dell'Intelligenza Artificiale estremamente interessante denominato Deep Learning (apprendimento profondo).
Non possiamo comprendere cosa significhi fare Deep Learning senza aver compreso prima di tutto cosa sia il Machine Learning. Il Deep Learning è infatti una specializzazione del Machine Learning particolarmente attiva in settori quali la computer vision e l'elaborazione del linguaggio naturale.
L'obiettivo di questa guida è mostrare come sia possibile affrontare il Deep Learning in ambito Java utilizzando la libreria DeepLearning4j.
Machine learning
Possiamo definire con il termine Machine Learning, lo studio di algoritmi che migliorano automaticamente il loro comportamento, rispetto ad un determinato compito da svolgere, attraverso l'esperienza e senza essere esplicitamente programmati.
Questa definizione è stata formalizzata, ed accettata dalla più accreditata comunità scientifica, dall'americano Tom Michael Mitchell direttore del dipartimento Machine Learning della Carnegie Mellon University. Tom Michael Mitchell fornisce la seguente definizione di Machine Learning:
Si dice che un programma apprende dall'esperienza E con riferimento ad un compito T e con misurazione delle performance P, se le sue performance nel compito T, come misurato da P, migliorano con l'esperienza E
Quindi, nel caso di un algoritmo di Machine Learning, invece che scrivere codice di programmazione attraverso il quale diciamo al computer cosa fare, forniamo soltanto insiemi di dati che vengono elaborati dall'algoritmo stesso per apprendere come svolgere un determinato compito in autonomia con ottime capacità di generalizzazione (comportamento efficiente anche con insiemi di dati mai visti dall'algoritmo).
Vediamo un esempio di learning problem attraverso la definizione fornita: Riconoscimento di parole scritte a mano all'interno di immagini.
- Task T: Riconoscere e classificare parole all'interno di immagini.
- Misura di performance P: percentuale di parole classificate correttamente.
- Esperienza di addestramento E (Training Experience): database di immagini con parole correttamente classificate.
Apprendimento supervisionato (Supervised Learning)
Il primo step di un algoritmo di Machine Learning è quindi l'addestramento o apprendimento (training). Nell'apprendimento supervisionato l'essere umano prepara un set di dati correttamente classificati. Questi dati costituiscono l'input per la fase di training dell'algoritmo.
L'obiettivo è cercare di estrarre una funzione matematica più o meno complessa che, ricevendo in input i dati utilizzati, li classifichi con la più elevata accuratezza possibile. Questo primo risultato non è comunque sufficiente, accanto ad esso la nostra funzione deve essere anche in grado di generalizzare bene.
Generalizzare significa avere un'accuratezza elevata anche nella classificazione di dati mai visti prima. Un algoritmo che classifica bene sui dati di training, ma performa male su dati inediti è un algoritmo andato in overfitting.
L'overfitting (algoritmo che si lega troppo ai dati di addestramento) deve essere evitato applicando tecniche che variano a seconda dell'algoritmo di Machine Learning che stiamo utilizzando.
Interessanti esempi di Machine Learning con apprendimento supervisionato sono presenti nel settore della ricerca scientifica dove gli algoritmi imparano a fare previsioni sempre più accurate per la diagnosi di tumori o malattie rare. Anche i sistemi di raccomandazione (Recommender System) sfruttano il Machine Learning imparando dal comportamento e dalle preferenze degli utenti che navigano su siti Web.
Un esempio sono i sistemi impiegati su piattaforme di e-commerce come Amazon o di intrattenimento e accesso a contenuti come Netflix o Spotify.
Apprendimento non supervisionato (Unsupervised Learning)
In questa categoria di Machine Learning l'algoritmo riceve insiemi di dati senza alcuna indicazione di corretta classificazione. Lo scopo di questo secondo metodo di apprendimento, è risalire a schemi e modelli nascosti, ossia identificare nell'input una struttura logica senza che questi siano preventivamente classificati.
Apprendimento semi-supervisionato (Semi-supervised learning)
L'apprendimento semi-supervisionato è un approccio ad apprendimento automatico che combina, durante l'addestramento, una piccola quantità di dati classificati con una grande quantità di dati senza classificazione. I secondi, se usati in questo modo, possono produrre un notevole miglioramento nell'accuratezza dell'apprendimento.
L'acquisizione di dati classificati per un problema di apprendimento richiede spesso un essere umano esperto e il costo associato al processo di classificazione può quindi rendere
impossibili insiemi di addestramento di grandi dimensioni e completamente classificati, mentre l'acquisizione di dati non classificati è relativamente poco costosa.
In tali situazioni l'apprendimento semi-supervisionato può essere di grande valore pratico.
Machine Learning con apprendimento per rinforzo (Reinforcement Learning)
Nell'apprendimento con rinforzo l'algoritmo deve interagire con un ambiente dinamico, dal quale riceve degli input, al fine di raggiungere un determinato obiettivo. Durante la fase di apprendimento il sistema che esegue l'algoritmo agisce sull'ambiente circostante attraverso delle azioni. Dopo ogni azione ricevuta, l'ambiente risponde con una penalità o ricompensa a seconda della bontà dell'azione stessa per quanto riguarda il raggiungimento dell'obiettivo.
Scopo dell'algoritmo è quello di identificare una politica di azione (policy) che massimizzi le ricompense ottenute sul lungo periodo. Ad esempio, immaginiamo una situazione nella quale abbiamo un robot che deve uscire da un labirinto compiendo le azioni classiche avanti, indietro, sinistra, destra. Potremmo avere una risposta dall'ambiente del tipo ricompensa ogni volta che il movimento del robot non porta ad una collisione con il muro e la distanza in linea d'aria dal punto che si raggiunge al punto di uscita non è inferiore a quella calcolata in precedenza.
La policy prodotta dall'algoritmo sarà quindi una sequenza di azioni che porterà il robot a comprendere come uscire dal labirinto. I sistemi che si basano sull'apprendimento con rinforzo, sono alla base dello sviluppo delle auto a guida autonoma che imparano a riconoscere l'ambiente circostante e ad adattare il loro comportamento in base alle situazioni che devono affrontare.
Deep Learning
Il Deep learning è una tipologia di Machine Learning nella quale un algoritmo impara task di classificazione direttamente da immagini, testi, o suoni. Il Deep
learning è solitamente implementato utilizzando architetture basate su reti neurali.
Il termine Deep si riferisce al numero di layer utilizzati nella rete. Le tradizionali reti neurali feed-forward hanno 2 o 3 layer, mentre una deep neural network ne può avere anche un centinaio.
Il Deep learning è particolarmente utilizzato per tecniche di face-recognition, text translation, voice recognition e molto altro. Una deep neural network di esempio potrebbe essere rappresentata da un sistema ATM che rigetta bancomat contraffatti, oppure un'applicazione in grado di rilevare oggetti e persone in un sistema di guida automatica assistita.