# Apprendimento profondo

L'apprendimento profondo (in inglese deep learning) è quel campo di ricerca dell'apprendimento automatico (in inglese machine learning) e dell'intelligenza artificiale che si basa su diversi livelli di rappresentazione, corrispondenti a gerarchie di caratteristiche di fattori o concetti, dove i concetti di alto livello sono definiti sulla base di quelli di basso.
In altre parole, per apprendimento profondo si intende un insieme di tecniche basate su reti neurali artificiali organizzate in diversi strati, dove ogni strato calcola i valori per quello successivo affinché l'informazione venga elaborata in maniera sempre più completa.
Tra le architetture di apprendimento profondo si annoverano le reti neurali profonde, la convoluzione di reti neurali profonde, le deep belief network, e reti neurali ricorsive, che sono state applicate nella visione artificiale, nel riconoscimento automatico del discorso, nell'elaborazione del linguaggio naturale, nel riconoscimento audio e nella bioinformatica. "Apprendimento profondo" è un'espressione oggi famosa che ridà lustro al concetto di rete neurale.

## Introduzione
### Definizioni

L'apprendimento profondo è definito come una classe di algoritmi di apprendimento automatico che:
* usano vari livelli di unità non lineari a cascata per svolgere compiti di estrazione di caratteristiche e di trasformazione. Ciascun livello successivo utilizza l'uscita del livello precedente come input. Gli algoritmi possono essere sia di tipo supervisionato sia non supervisionato e le applicazioni includono l'analisi di pattern (apprendimento non supervisionato) e classificazione (apprendimento supervisionato).
* sono basati sull'apprendimento non supervisionato di livelli gerarchici multipli di caratteristiche (e di rappresentazioni) dei dati. Le caratteristiche di più alto livello vengono derivate da quelle di livello più basso per creare una rappresentazione gerarchica.
* fanno parte della più ampia classe di algoritmi di apprendimento della rappresentazione dei dati all'interno dell'apprendimento automatico.
* apprendono multipli livelli di rappresentazione che corrispondono a differenti livelli di astrazione; questi livelli formano una gerarchia di concetti.
Ciò che queste definizioni hanno in comune sono i livelli multipli di unità non lineari e l'apprendimento (supervisionato o non supervisionato) in ogni livello della rappresentazione di caratteristiche, in cui i livelli formano una gerarchia delle caratteristiche stesse. La composizione di ciascun livello di unità non lineari usata in un algoritmo di apprendimento profondo dipende dal problema che deve essere risolto. Nell'apprendimento profondo possono venire usati livelli nascosti di una rete neurale artificiale e insiemi di formule proposizionali.

## Storia dell'apprendimento profondo

I primi studi sulle reti neurali multistrato sono stati prodotti dallo scienziato giapponese Kunihiko Fukushima che, con il modello del cognitrone nel 1975, e del neo-cognitrone poi, ha introdotto l'idea di area di connessione per i neuroni che si è sviluppata nelle reti neurali convoluzionali.
Lo studio delle reti neurali artificiali multistrato si è sviluppato già negli anni ottanta, ma solo nell'ultimo decennio si sta dimostrando la loro utilità in un'ampia gamma di settori e applicazioni. Più nel dettaglio, il recente successo dell'apprendimento profondo è dovuto al superamento di alcuni ostacoli che in passato hanno impedito il raggiungimento dei risultati attesi, come la mancanza di dati o di un'adeguata capacità computazionale. Infatti, oggi sono incrementati i dati a disposizione, sono stati sviluppati sistemi di calcolo parallelo basati su GPU e, soprattutto, sono stati ottimizzati i metodi di addestramento delle reti neurali, che oggi possono trovare soluzioni a problemi che in passato hanno impedito ai ricercatori di ottenere risultati soddisfacenti.
Oggi i sistemi di apprendimento profondo, fra altre utilità, permettono di identificare oggetti nelle immagini e nei video, trascrivere il parlato in testo, e individuare e interpretare gli interessi degli utenti online, mostrando i risultati più pertinenti per la loro ricerca.
Grazie a queste e altre soluzioni, l'apprendimento profondo sta vivendo anni di rapido progresso, arrivando anche, in molti casi, a superare le prestazioni degli esseri umani. Basta pensare all'applicazione degli algoritmi di apprendimento profondo nell’ambito dei problemi decisionali sequenziali, all’interno dell'apprendimento per rinforzo: un caso esemplare è stato lo sviluppo di AlphaGo, un software che nel 2016 ha battuto il campione mondiale di Go, diversi anni in anticipo rispetto alle previsioni degli esperti.

## Architetture
### Reti neurali convoluzionali

La rete neurale convoluzionale (Convolution Neural Network, CNN) è un metodo di scelta per elaborare dati visuali e dati di tipo 2D. Una CNN è composta da uno più strati convoluzionali con strati completamente connessi verso l'alto. Usa anche pesi e strati comuni (pooling layer). In particolare il "max-pooling" è spesso usato nell'architettura convoluzionale di Fukushima. Quest'architettura permette alle CNN di avere dei vantaggi dalle strutture 2D di ingresso. Sono particolarmente efficaci nell'area delle immagini e di riconoscimento del discorso. Possono essere allenate anche con la backpropagation standard. Sono inoltre facili da allenare rispetto ad altre reti neurali profonde o feed-forward ed hanno molti meno parametri da stimare. Un programma di CNN è il DeepDream di Google.

### Reti neurali ricorsive

Le reti neurali ricorsive (Recurrent Neural Networks, RNN) nascono con il tentativo di rendere le reti neurali Turing complete aggiungendo una componente di memoria. Le reti neurali feed-forward rispondono in modo costante agli stessi input, senza però poter fare collegamenti tra input diversi, come potrebbe essere utile nell'ambito della semantica. Le reti neurali ricorsive invece pesano ogni input in base allo stato precedente e lo stesso input potrebbe dare output diversi a seconda del contesto in cui è inserito. Nonostante questo le RNN, a meno che non vengano inseriti elementi casuali, restano reti deterministiche in quanto la stessa sequenza di input porterà sempre alla stessa sequenza di output. Lo stato di una RNN è implementato aggiungendo a un layer dei neuroni ricorsivi che avranno come valore ad ogni istante di tempo il valore all'istante precedente sommato a una variazione data dagli input dei neuroni feed-forward.
Le reti neurali di questo tipo diventano impossibili da allenare per retropropagazione dell'errore, quindi viene utilizzato come stratagemma quello di svolgere le ricorsività considerando il loro funzionamento per ogni singolo istante di tempo.
Mentre nel caso di percorsi a ritroso molto brevi questo funziona, per i casi in cui bisogna percorrere diversi step a ritroso si incorre nel problema del Vanishing Gradient o dell'Exploding Gradient nel caso la funzione di costo abbia derivata sempre minore di uno (ad esempio sigmoide e tanh) o sempre maggiore di uno. Questo infatti porta a una convergenza a zero esponenziale nel primo caso e a un'esplosione esponenziale del gradiente nel secondo. In nessun caso il gradiente è più computabile anche solo dopo pochi passi. Per risolvere questo problema si fa in modo di utilizzare una funzione rettificatore.

### Reti deep-q

Questa è una classe di modelli d'apprendimento profondi usando il Q-learning, una forma di apprendimento per rinforzo, del Google DeepMind. Risultati preliminari sono stati presentati nel 2014 con un articolo pubblicato su Nature nel febbraio 2015. L'applicazione a cui si fa riferimento è un gioco dell'Atari 2600.

### Hashing semantico

L'hashing semantico tratta la strutturazione di valori crittografati sulla base di un imprevisto del sistema neurale iniziale e trattiene invece informazioni fondamentali sulla base semantica del vocabolario.

### Diagnostica

Nel 2018, l'azienda britannica DeepMind, il Moorfields Eye Hospital e l'University College di Londra hanno lanciato un software che promette di riconoscere l'anatomia dell'occhio, la patologia e suggerire ai medici un trattamento sanitario adeguato. L'occhio del paziente viene esaminato mediante una tomografia ottica a coerenza di fase che acquisisce immagini a colori in alta definizione, a loro volta elaborate da un algoritmo che le confronta con la base di conoscenza clinica, in modo tale da identificare la diagnosi e la soluzione terapeutica ottimale per il caso specifico.

## Applicazioni

* Riconoscimento automatico del discorso
* Riconoscimento di immagini
* Elaborazione del linguaggio naturale
* Scoperta di farmaci e tossicologia
* Gestione delle relazioni con i clienti
* Sistema di raccomandazione
* Bioinformatica
* Guida autonoma
* Identificazione delle frodi
* Diagnosi mediche

## Librerie software

* Torch — Libreria software open source di apprendimento automatico in Lua
* Theano — Libreria open source di machine learning in Python.
* Deeplearning4j — Libreria open source di deep learning in Java. Fornisce parallelizzazione di CPU e GPU.
* OpenNN — Libreria open source in C++ che implementa reti neurali profonde e fornisce parallelizzazioni con CPU.
* Gensim — Libreria di elaborazione del linguaggio naturale in Python.
* Apache Singa — Una piattaforma per l'apprendimento profondo sviluppata per massimizzare adattabilità, usabilità e estendibilità.
* TensorFlow — Libreria open source di machine learning in C++ e Python con API per entrambe le versioni di Google. Fornisce parallelizzazione con CPU e GPU.
* Microsoft Cognitive Toolkit — Framework per l'apprendimento profondo sviluppato da Microsoft.
* Keras — Framework per l'apprendimento profondo in Python. Basato sia su Theano che TensorFlow. Supporto per CPU e GPU e multi-GPU