Apprendimento automatico applicato allo sviluppo del codice


17

Il mio background è in ingegneria meccanica, quindi ti prego di perdonare la mia ignoranza in questo settore.

Mi piace molto la programmazione e lo sviluppo del software. Inoltre, di recente ho seguito un corso online gratuito di Machine Learning (ML), che consiglio vivamente, tenuto dal professor Andrew Ng di Stanford. Link qui .

Ho sentito questo professore dire che è difficile trovare aree che ML non avrà mai impatto.

Domanda

Quindi la mia domanda è: quale ricerca è stata fatta finora nell'applicare l'apprendimento automatico allo sviluppo del codice? Che ne dici di debug?

Si prega di includere risorse / fonti / articoli scientifici se possibile.

Non ho avuto fortuna a cercarlo perché spesso la ricerca di sviluppo di ML e software (o programmazione) finisce per portare a risultati nello sviluppo di software (o programmazione) di applicazioni ML.


La tua domanda sul codice che scrive codice o stai ponendo domande sulle tecniche di codifica per implementare l'apprendimento automatico?
Robert Harvey,

Codice (codice ML) che scrive codice, o migliora il codice, o verifica la presenza di errori nel codice (sia che si tratti di sviluppo web, risolutore numerico ecc.). Non tecniche per implementare l'apprendimento automatico.
Charles,

Per non dire che ciò non accadrà mai, ma i linguaggi di programmazione di alto livello sono progettati per rendere più semplici le istruzioni del computer per gli esseri umani con unità di controllo ad attivazione chimica lenta. Al livello più fondamentale, ML sono le macchine che determinano cosa dovrebbero fare le macchine. In futuro, le lingue progettate per sacche d'acqua squishy saranno inutili quanto gli umani stessi.
JimmyJames,

Questa domanda dovrebbe essere migrata sul sito di Intelligenza Artificiale. Coloro che hanno votato per favore ci dicono perché ??
quintumnia,

Questa è in realtà una domanda davvero interessante!
Rhys Johns,

Risposte:


6

Il fuzzing è un metodo di prova in cui l'apprendimento automatico può ed è stato applicato. Il fuzzing è un metodo di test nel regno dei test esplorativi automatizzati. Tenta di trovare difetti nel software eseguendo un gran numero di input e cercando errori. Le eccezioni non gestite sono la categoria più semplice, ma un'implementazione intelligente può utilizzare ML per trovare output sospetti. ML è ampiamente utilizzato in questo settore al fine di rendere il processo più efficiente. Questo funziona usando ML per evitare di testare ogni possibile input addestrando su input "interessanti". (Ingressi non simili che potrebbero causare guasti.)


Interessante. Quindi questo tipo di rientra nella categoria del test del codice, giusto? Mi piace la risposta di RJB un po 'di più, per quanto riguarda lo sviluppo, piuttosto che i test. Ma test / debugging è sicuramente ancora utile.
Charles,

Si. È sicuramente nel regno dei test e non abbastanza persone lo hanno provato, ma sta guadagnando slancio come tecnica praticabile come il cloud computing diventa sempre più normale. È diventato più facile procurarsi un cluster di macchine, eseguire test per una settimana, quindi scartare il cluster fino alla prossima volta.
RubberDuck,

4

Sì. Questa zona è calda in questo momento. Si chiama "big code" e DARPA ci ha messo 40 milioni di dollari: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Alcuni risultati impressionanti sono emersi da questa concessione, come i sistemi Prophet e Genesis di Fan Long, che possono correggere automaticamente i bug nei programmi usando un modello appreso di patch corrette. Anche Martin Vechev e il suo studente Veselin Raychev sono stati pionieri in questo settore. Forse il loro risultato più impressionante è JSNice ( http://jsnice.org/ ), che può "minimizzare il codice JavaScript.

Nel complesso, l'idea del big code non è stata all'altezza delle sue promesse: i dati sono troppo scarsi per imparare qualcosa di molto più interessante dei nomi delle variabili. Mentre sono ancora finanziato in parte da questo programma DARPA, il mio laboratorio ha smesso di lavorarci. In quella nota, l'ultima cosa che ho sentito su DeepCoder è che ottiene risultati abbastanza patetici rispetto allo stato dell'arte nella sintesi del programma.

Gli strumenti di maggior successo per la programmazione automatizzata si basano ancora su metodi non ML come i solutori SMT. Dai un'occhiata agli atti di qualsiasi conferenza PL (ad esempio: PLDI, POPL, OOPSLA) o qualsiasi conferenza accademica di ingegneria del software (ad esempio: ICSE, FSE, ISSTA, ASE) e vedrai molti esempi.


3

Microsoft ha sviluppato DeepCoder per utilizzare il deep learning per prevedere un corpo del metodo da un determinato input e output. Questo è l'unico esempio che conosco di persona.

Posso dirti che la Programmazione Meta-genetica è un campo di studio con un'ambizione simile, ma non posso dire di conoscerne abbastanza per essere informato.

La programmazione genetica era stata pubblicata nel 2015 quando muScalpel ha sviluppato una soluzione per trapiantare una funzione da un programma a un altro, utilizzando i test unitari per entrambi come una sorta di set di addestramento.


È come generare algoritmi usando un modello genetico, giusto? Conosci qualche applicazione per favorire lo sviluppo del codice? Sto pensando di lavorare insieme uomo-macchina, piuttosto che un mero macchinario (modello basato sulla genetica). So che può sembrare specifico, ma sono per lo più curioso perché sono nuovo in quest'area.
Charles,

Sicuramente hai ragione, ho letto male, stavo pensando troppo ricorsivamente all'utilizzo di ML per fare ML :) #edited
RJB

2

Quindi la mia domanda è: quale ricerca è stata fatta finora nell'applicare l'apprendimento automatico allo sviluppo del codice? Che ne dici di debug?

Una domanda correlata riguarda le tecniche di apprendimento automatico per la generazione e la compilazione del codice (dal momento che potreste immaginare transpilers e compilatori come un modo per "sviluppare automaticamente il codice", scrivendo in realtà codice da un linguaggio di livello superiore).

Ci sono stati diversi articoli a riguardo, ad esempio MILEPOST GCC .

Puoi anche cercare documenti sulle tecniche di apprendimento automatico per il debug o per l'analisi del codice sorgente statico (o qualsiasi tipo di analisi del programma statico ).

Vedi anche il blog di J.Pitrat sul bootstrap dell'intelligenza artificiale correlata alla tua domanda.


1

In un recente articolo in Communications of ACM su Come fare soldi usando la matematica Erik Meijer ha citato Jeff Dean, Google Senior Fellow, Systems and Infrastructure Group:

Se Google venisse creato da zero oggi, molto verrebbe appreso, non codificato.

L'articolo offre una panoramica delle recenti attività nell'area di ricerca. È dietro un muro di pagamento ma potrebbe valere la pena leggere se sei interessato a parallelismi teorici tra codifica e apprendimento automatico / statistiche. Forse anche l'elenco di riferimento alla fine dell'articolo potrebbe essere utile.

Ad esempio l'articolo fa riferimento a WebPPL, programmazione probabilistica per il web .



0

Ho trovato un elenco di letture piuttosto esteso su tutti gli argomenti di apprendimento automatico relativi alla codifica .

Come puoi vedere, le persone hanno cercato di applicare l'apprendimento automatico alla codifica, ma sempre in campi molto ristretti, non solo una macchina in grado di gestire tutti i tipi di codifica o debug.
Il resto di questa risposta si concentra sulla tua macchina di "debugging" relativamente ampia e sul perché questo non è stato ancora veramente tentato (per quanto mostra la mia ricerca sull'argomento).


Ho redatto una lunga parte della risposta. Riassumendo (è importante per la parte successiva): seguendo l'attuale metodologia di apprendimento automatico, tutto ciò che un essere umano può imparare, anche una macchina può farlo. Siamo limitati solo dal regno fisico (velocità della CPU, dimensioni di una macchina, ...), non da una presunta limitata applicabilità dell'algoritmo di apprendimento stesso.

quale ricerca è stata fatta finora nell'applicare l'apprendimento automatico allo sviluppo del codice? Che ne dici di debug?

Il problema qui non è che è impossibile, ma piuttosto che è un argomento incredibilmente complesso.

Gli umani non si sono nemmeno avvicinati alla definizione di uno standard di codifica universale con cui tutti concordano. Anche i principi più ampiamente condivisi come SOLID sono ancora fonte di discussione quanto profondamente deve essere implementato. Per tutti gli scopi pratici, è impossibile aderire perfettamente a SOLID a meno che non si abbia alcun vincolo finanziario (o temporale); che semplicemente non è possibile nel settore privato in cui si verifica la maggior parte dello sviluppo. SOLID è una linea guida, non un limite rigido.

In assenza di una misura oggettiva di giusto e sbagliato, come potremo dare un feedback positivo / negativo a una macchina per farlo apprendere?
Nella migliore delle ipotesi, possiamo avere molte persone che danno la propria opinione alla macchina ("questo è un codice buono / cattivo"), e il risultato della macchina sarà quindi un "giudizio medio". Ma non è necessariamente lo stesso di a soluzione corretta . Può essere, ma non è garantito che lo sia.

In secondo luogo, per il debug in particolare, è importante riconoscere che specifici sviluppatori sono inclini a introdurre un tipo specifico di bug / errore. La natura dell'errore può in alcuni casi essere influenzata dallo sviluppatore che l'ha introdotto.

Ad esempio, poiché sono spesso coinvolto nella correzione di errori di codice di altri sul lavoro, ho una sorta di aspettativa sul tipo di errore che ogni sviluppatore è incline a fare. Dato un certo problema, so che dev A probabilmente dimenticherà di aggiornare il file di configurazione, mentre dev B scrive spesso cattive query LINQ. Sulla base dello sviluppatore, potrei prima guardare al file di configurazione o al LINQ.
Allo stesso modo, ho lavorato come consulente in diverse aziende e posso vedere chiaramente che tipi di bug possono essere distorti verso determinati tipi di aziende. Non è una regola dura e veloce che posso sottolineare definitivamente, ma c'è una tendenza definita.

Una macchina può imparare questo? Può rendersi conto che dev A ha maggiori probabilità di incasinare la configurazione e dev B ha maggiori probabilità di incasinare una query LINQ? Certo che può. Come ho detto prima, tutto ciò che un essere umano può imparare, anche una macchina.
Tuttavia, come fai a sapere che hai insegnato alla macchina l'intera gamma di possibilità? Come puoi mai fornire un set di dati piccolo (cioè non globale) e sapere per certo che rappresenta l'intero spettro di bug? Oppure, creeresti invece debugger specifici per aiutare specifici sviluppatori / aziende, piuttosto che creare un debugger universalmente utilizzabile?

Chiedere un debugger appreso in macchina è come chiedere un Sherlock Holmes appreso in macchina. Non è dimostrabile impossibile crearne uno, ma spesso il ragionamento fondamentale per essere un debugger / Sherlock dipende da valutazioni soggettive che variano da soggetto a soggetto e toccano una varietà incredibilmente ampia di conoscenze / possibili difetti.
La mancanza di risultati corretti / errati rapidamente dimostrabili rende difficile insegnare facilmente a una macchina e verificare che stia facendo buoni progressi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.