J.A.R.V.I.S

DeepCoder: l’AI che produce … codice sorgente!

Che voi siate alle prime armi o degli esperti della programmazione, saprete sicuramente quanto sia importante e vantaggioso utilizzare le funzioni delle librerie standard o di terze parti all’interno del codice, per svolgere il vostro obiettivo più rapidamente ed efficacemente.

Per non parlare della sacra ricerca online per risolvere dubbi o problemi, che nel 99% dei casi si conclude su StackOverflow, la nota community di programmatori.

Fonte: pbs.twimg.com

Ma cosa ne pensereste di uno strumento basato sull’Intelligenza Artificiale (AI), che vi fornisce in pochi secondi il codice sorgente che risolve un vostro compito? Magari non comune come dato un vettore, estrarre i numeri negativi multipli di 4 in ordine decrescente“?

 Sappiate che questo strumento, seppur ancora in fase prototipale esiste già, prende il nome di DeepCoder, e come il nome stesso suggerisce, è l’ennesima applicazione del Deep Learning, la moderna variante di uno dei principali strumenti del Machine Learning, le classiche reti neurali artificiali.

 

DeepCoder: concetti chiave

DeepCoder assembla il codice sorgente risolutore estraendo da un insieme di funzioni predefinite, quella combinazione che lo porterà ad ottenere il corretto risultato.

Per assemblarlo, l’obiettivo principale di Deepcoder è risolvere un problema che prende il nome di Inductive Program Synthesis (IPS): data una coppia di input-output, lo scopo è quello di generare del codice sorgente ad alto livello, che produca esattamente dall’input precedentemente dato, l’output associato.

I principali problemi che si presentano nel risolverlo sono due:

  1. la ricerca: ricercare ed ordinare le funzioni che condurranno al risultato voluto, tra le varie funzioni possibili
  2. la scelta: in caso di più insiemi di funzioni che conducono alla soluzione, quale scegliere?

 

Inoltre, si necessita di linguaggi di programmazione adatti alle esigenze dell’AI, che semplifichino il più possibile l’IPS problem.

Questi linguaggi, chiamati Domain Specific Languages (DSLs), differiscono dai linguaggi standard (C, Python, …) solamente perché essi sono più restrittivi, quindi ad esempio non posseggono esplicitamente: complicati tipi di dato, sofisticate operazioni, loops o altri controlli di flusso.

Questo non sempre significa che essi siano meno potenti, ma che semplicemente si è scelto di sacrificare un insieme di operazioni articolate, per poter ottenere una maggiore versatilità usando quelle basilari; un po’ come non utilizzare l’operatore divisione, poiché con le sottrazioni successive si è ugualmente in grado di compiere tale operazione.

Usando un linguaggio DSL, i problemi di scelta e ricerca enunciati precedentemente divengono più semplici e più efficienti da risolvere, grazie alla sua restrittività.

Così facendo, DeepCoder sarà in grado di poter risolvere l’IPS problem, e poter quindi raggiungere il suo obiettivo principale.

Il funzionamento

Il cuore di DeepCoder consiste in una rete neurale artificiale ad architettura feed-forward consistente in 3 strati nascosti da 256 neuroni per strato, con una funzione d’attivazione sigmoidea.
Si sta quindi utilizzando una rete neurale la cui architettura non contiene cicli (feed-forward), che elabora le informazioni tramite 3 insiemi (gli strati) ognuno di 256 neuroni totalmente connessi, e dove l’output (l’attivazione) di ogni neurone è definito dalla funzione matematica sigmoidea dell’input.

Architettura feed-forward della rete neurale artificiale utilizzata da DeepCoder
Fonte: openreview.net

Dopo aver generato un insieme di dati (chiamato training set) consistente in milioni d’esempi di input-output, svolti da tutte le funzioni disponibili del linguaggio DSL (che nel caso di DeepCoder somiglia all’SQL), esso verrà utilizzato per allenare la rete neurale.

Successivamente alla fase d’allenamento, la rete sarà in grado, data una coppia input-output, di predire la presenza o l’assenza di una funzione all’interno del codice sorgente; in questo modo, si otterranno delle probabilità sull’utilità che delle funzioni possano produrre l’output voluto dall’input associato.

Risposta probabilistica della rete neurale: le colonne rappresentato le funzioni DLS, mentre le righe le combinazioni scelte.
Fonte: openreview.net

A questo punto, un algoritmo basato su una versione ottimizzata del Depth First Search (DFS), il celebre algoritmo di visita dei grafi, analizzerà ed applicherà la risposta predittiva della rete neurale, scegliendo ed ordinando le funzioni che condurranno alla soluzione e che infine comporranno il codice sorgente.

Nell’immagine sottostante, si possono facilmente analizzare i dati d’ingresso (la coppia input-output) e il risultato finale (il codice sorgente DSL).

ZipWith(-) effettua la sottrazione tra 2 vettori, mentre count(>0) restituisce il numero degli elementi positivi di un vettore.
Fonte: openreview.net

DeepCoder potrebbe essere un utile strumento da poter applicare in molti ambiti, ma è ancora in grado di risolvere semplici problemi e produrre brevi codici. Purtroppo per risolvere i più comuni problemi reali si necessita di codici complessi e tecniche di programmazione avanzata come quella dinamica o ad oggetti. Per raggiungere tali livelli, sarà necessario estendere le funzioni disponibili e le caratteristiche del linguaggio DSL applicato.

 Ad ogni modo l’interesse, gli investimenti e le potenzialità del Deep Learning sono attualmente consistenti, quindi non si può che essere fiduciosi in un futuro e rapido miglioramento.

Published by
Gianluca Salvo