La programmazione differenziabile è un paradigma di programmazione in cui un programma numerico per computer può essere interamente differenziato tramite differenziazione automatica. Ciò consente l'ottimizzazione basata sul gradiente dei parametri nel programma, spesso tramite discesa del gradiente, ed anche altri approcci di apprendimento basati su informazioni tratte da derivate di ordine superiore. La programmazione differenziabile ha trovato impiego in un'ampia varietà di settori, in particolare nel calcolo scientifico e nell'apprendimento automatico. Una delle prime proposte per adottare tale framework in modo sistematico per migliorare gli algoritmi di apprendimento è stata fatta dallAdvanced Concepts Team presso l'Agenzia spaziale europea all'inizio del 2016.

Approcci La maggior parte dei framework di programmazione differenziabili agiscono costruendo un grafo contenente il flusso di controllo e le strutture dati nel programma. Gli approcci generalmente rientrano in due gruppi:

Approcci statici basati su grafici compilati come TensorFlow,Come default TensorFlow1 usa l'approccio con grafo statico, mentre TensorFlow2 quello dinamico. Theano e MXNet. Essi tendono a consentire una buona ottimizzazione del compilatore e una più semplice scalabilità per sistemi di grandi dimensioni, ma la loro natura statica limita l'interattività e i tipi di programmi che possono essere creati facilmente (ad esempio quelli che coinvolgono loop o ricorsione), oltre a rendere più difficile per gli utenti ragionare efficacemente sui loro programmi. Una toolchain di compilazione proof-of-concept denominata Myia utilizza un sottoinsieme di Python come front-end e supporta funzioni di ordine superiore, ricorsione e derivate di ordine superiore. Sovraccarico degli operatori, approcci basati su grafici dinamici come PyTorch, il pacchetto autograd di NumPy e Pyaudi. La loro natura dinamica e interattiva consente di scrivere e ragionare più facilmente sulla maggior parte dei programmi. Tuttavia, comportano un sovraccarico dell'interprete (in particolare quando si compongono molte piccole operazioni), una minore scalabilità e una riduzione dei benefici dell'ottimizzazione del compilatore.

è emerso l'uso della compilazione just-in-time come possibile soluzione per superare alcuni dei colli di bottiglia dei linguaggi interpretati. Il pacchetto C++ heyoka e Python heyoka.py sfrutta ampiamente questa tecnica per offrire funzionalità avanzate di programmazione differenziabile (anche per la derivazione di ordine elevato). Un pacchetto per il linguaggio di programmazione Julia, denominato Zigote), è capace di lavorare direttamente sulla rappresentazione intermedia di Julia.

Un limite degli approcci precedenti sta nel fatto che essi sono in grado di differenziare solo codice scritto in modo adatto al framework, limitandone l'interoperabilità con altri programmi. Gli approcci più recenti risolvono questo problema costruendo il grafo a partire dalla sintassi del linguaggio o dall'IR, consentendo la differenziazione di codice arbitrario.

Applicazioni La programmazione differenziabile è stata applicata in aree quali la combinazione di apprendimento profondo con motori fisici nella robotica, la risoluzione di problemi di struttura elettronica con la teoria del funzionale della densità differenziabile, il ray tracing differenziabile, l'imaging differenziabile, l'elaborazione delle immagini, e la programmazione probabilistica.

Applicazione multidisciplinare La programmazione differenziabile sta compiendo passi da gigante in vari settori, anche al di là delle sue applicazioni tradizionali. In ambito sanitario e delle scienze della vita, ad esempio, essa viene utilizzata per l'apprendimento approfondito nella modellazione biofisica dei meccanismi molecolari, in aree come la previsione della struttura proteica e la scoperta di nuovi farmaci. Tali applicazioni dimostrano il potenziale del paradigma nel contribuire a progressi significativi nella comprensione di sistemi biologici complessi e nel miglioramento delle soluzioni per cure sanitarie.

Note

Voci correlate

Funzione differenziabile Apprendimento automatico

Categoria:Paradigmi di programmazione Categoria:Calcolo differenziale Categoria:Apprendimento automatico Categoria:Apprendimento profondo Categoria:Reti neurali artificiali