Come discusso in un altro topic, apro questa discussione per cercare di fare il punto su tutti gli strumenti software per il deep learning che sono proliferati negli ultimi due anni, soprattutto nel caso si vogliano fornire delle linee guida per la loro scelta da parte di PA o altro. Sicuramente questi strumenti sono stati uno dei fattori abilitanti nella diffusione del deep learning, ma ormai sono diventati decine e cambiano in continuazione, e secondo me diventa essenziale per chi vuole sviluppare applicazioni sceglierne uno “giusto” e (soprattutto) capire le differenze fra le varie librerie.
Per cominciare mi concentro su una breve panoramica sugli strumenti in Python, chi ha esperienza in altri linguaggi, ha commenti o vuole discutere su relativi pregi/svantaggi è il benvenuto ad integrare! 
L’aspetto fondamentale di tutte le librerie moderne per il deep learning è di dare accesso ad uno strumento di differenziazione automatica, di modo che la parte di definizione del modello sia enormemente semplificata (in sostanza, la back-propagation è calcolata dalla libreria nel modo più efficiente possibile). Per chi voglia approfondire questo aspetto, segnalo questo preprint:
https://arxiv.org/abs/1502.05767
L’altro aspetto essenziale di quasi tutte le librerie è l’interfacciamento con la GPU, di modo da parallelizzare alcuni aspetti dei calcoli. Storicamente la prima libreria a soddisfare questi due prerequisiti e ad ottenere grande popolarità (ed anche una delle più basilari) è stata Theano, sviluppata all’interno dell’università di Montréal:
http://deeplearning.net/software/theano/
Theano ad oggi è rimasta usata per la sua prevalenza storica (soprattutto in ambienti didattici), ma mi sembra essere in netto declino. Un esempio di libreria “essenziale” come Theano ma più recente è Autograd:
Fra Autograd e Theano c’è una differenza essenziale, che è simile alla differenza fra linguaggi compilati ed interpretati, che è spiegata molto bene qui:
http://docs.chainer.org/en/stable/tutorial/basic.html
A livello pratico, le librerie come Autograd sono più facili da debuggare (in quanto tutti i risultati intermedi sono facilmente accessibili da terminale), e permettono di eseguire più facilmente modelli che richiedono alcuni operazioni di controllo di flusso o con cicli for. Ad esempio, l’articolo che in sostanza introduce Autograd ne mostra l’uso per eseguire una back-propagation attraverso migliaia di passi di ottimizzazione insieme:
Al di sopra di queste librerie, ci sono framework più complessi che, oltre al meccanismo di differenziazione, mettono a disposizione buona parte del codice necessario a creare reti neurali ed ad ottimizzarle, oltre ad alcune “amenità” aggiuntive come alcuni modelli pre-allenati. Qui c’è un confronto rispetto alle feature di molte di queste librerie:
La più famosa è in assoluto TensorFlow, che è stata rilasciata in open source da Google:
L’utilizzo di TensorFlow è simile a Theano (richiede la definizione dichiarativa di un grafo computazionale), mentre un framework più simile ad Autograd è PyTorch, sviluppato con il contributo del FAIR di Facebook, a partire da un framework precedente sviluppato per Lua (http://torch.ch/):
http://pytorch.org/
Mi sembra che Pytorch si stia diffondendo enormemente in ambito di ricerca, essendo più facile prototipare modelli estremamente complessi, mentre per aspetti di produzione è più diffuso TensorFlow (PyTorch è ancora in early beta, tra l’altro). Altri competitor al momento sono Chainer (si veda link sopra), CNTK di Microsoft, ed MxNet di Amazon (che si è costruito una buona nicchia grazie alle sue performance altissime):
Un altro competitor (soprattutto in accademia) relativamente alle reti convolutive è Caffe, sviluppato all’interno dell’università di Berkeley:
http://caffe.berkeleyvision.org/
PyTorch ha un repository aggiuntivo interamente dedicato al processamento di immagini:
Su un terzo livello ci sono librerie come quest’ultima, che si appoggiano alle librerie descritte prima ma ne semplificano l’utilizzo oppure le integrano su certi aspetti. Keras è una libreria enormemente diffusa che semplica la strutturazione di modelli comuni di reti neurali:
https://keras.io/
Keras sta lentamente diventando l’interfaccia ufficiale di TensorFlow, ma in realtà permette di utilizzare come back-end anche altre librerie (es., Theano, su cui nasce, CNTK, ecc.), quindi è una scelta interessante per cercare di minimizzare la dipendenza da una sola tecnologia. Altre librerie ad alto livello si sono specializzate su una sola libreria ed a causa di questo hanno sofferto molto, ad esempio Lasagne e Blocks per Theano, oppure TFLearn per Tensorflow:
http://tflearn.org/
[TFLearn non va confuso con tf.contrib.learn, che è un modulo ad alto livello incluso direttamente dentro TensorFlow.]
TensorFlow è il framework con il maggior numero di “plug-in” per funzionalità avanzate, la maggior parte ufficiali, tra cui la TensorBoard (per il debugging), Edward (per la progettazione di modelli probabilistici), e Tensor2Tensor (per la creazione di modelli seq2seq, ovvero che lavorano da sequenze a sequenze, come nel caso della traduzione automatica con modelli neurali):
Mi fermo! 