Maschinelles Lernen für die Codeentwicklung

16

Mein Hintergrund liegt im Maschinenbau, bitte verzeihen Sie mir meine Unkenntnis in diesem Bereich.

Ich genieße es wirklich, zu programmieren und Software zu entwickeln. Außerdem habe ich kürzlich einen kostenlosen Online-Kurs für maschinelles Lernen (ML) besucht, den ich wärmstens empfehlen kann und der von Stanford-Professor Andrew Ng unterrichtet wird. Verknüpfen Sie hier .

Ich habe diesen Professor sagen hören, dass es schwierig ist, Bereiche zu finden, auf die ML niemals Einfluss haben wird.

Frage

Meine Frage ist also, welche Forschungen wurden bisher durchgeführt, um maschinelles Lernen auf die Codeentwicklung anzuwenden? Wie wäre es mit Debuggen?

Bitte geben Sie nach Möglichkeit Ressourcen / Quellen / wissenschaftliche Arbeiten an.

Ich hatte kein Glück bei der Suche, da die Suche nach ML und die Softwareentwicklung (oder -programmierung) häufig zu Ergebnissen bei der Softwareentwicklung (oder -programmierung) von ML-Anwendungen führen.

Charles
quelle
Haben Sie Fragen zu Code, der Code schreibt, oder zu Codiertechniken zum Implementieren von maschinellem Lernen?
Robert Harvey
Code (ML-Code), der Code schreibt oder verbessert oder auf Fehler im Code prüft (sei es für die Webentwicklung, den numerischen Löser usw.). Keine Techniken zum Implementieren von maschinellem Lernen.
Charles
Um nicht zu sagen, dass dies niemals passieren wird, aber hochentwickelte Programmiersprachen wurden entwickelt, um Menschen mit langsamen chemisch aktivierten Steuergeräten die Computeranweisungen zu erleichtern. Auf der grundlegendsten Ebene sind ML Maschinen, die bestimmen, was Maschinen tun sollen. In Zukunft werden Sprachen, die für matschige Wassersäcke entwickelt wurden, ebenso unnötig sein wie die Menschen selbst.
JimmyJames
Diese Frage soll auf die Website für künstliche Intelligenz migriert werden. Können diejenigen, die dafür gestimmt haben, uns mitteilen, warum?
Quintumnia
Das ist wirklich eine coole Frage!
Rhys Johns

Antworten:

6

Fuzzing ist eine Testmethode, bei der maschinelles Lernen angewendet werden kann. Fuzzing ist eine Testmethode im Bereich der automatisierten Erkundungstests. Es wird versucht, Fehler in der Software zu finden, indem eine große Anzahl von Eingaben ausgeführt und nach Fehlern gesucht wird. Nicht behandelte Ausnahmen sind die einfachste Kategorie, aber eine intelligente Implementierung kann ML verwenden, um verdächtige Ausgaben zu finden. ML wird in diesem Bereich weitgehend eingesetzt, um den Prozess jedoch effizienter zu gestalten. Dies funktioniert mit ML, um zu vermeiden, dass jede mögliche Eingabe durch Training an "interessanten" Eingaben getestet wird. (Dis-ähnliche Eingänge, die wahrscheinlich zu Fehlern führen.)

Quietscheentchen
quelle
Interessant. Also fällt diese Art in die Kategorie des Code-Testens, oder? Die Antwort von RJB gefällt mir etwas besser, da sie sich eher auf die Entwicklung als auf das Testen bezieht. Testen / Debuggen ist aber sicherlich noch sinnvoll.
Charles
Ja. Es ist definitiv im Testbereich und nicht genug Leute haben es ausprobiert, aber es gewinnt an Dynamik, da Cloud Computing immer normaler wird. Es ist jetzt einfacher, sich einen Cluster von Computern anzueignen, Tests für eine Woche durchzuführen und den Cluster dann bis zum nächsten Mal zu verwerfen.
RubberDuck
4

Ja. Dieser Bereich ist gerade heiß. Es heißt "Big Code" und DARPA steckte 40 Millionen US-Dollar in das Programm: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Einige beeindruckende Ergebnisse sind aus dieser Bewilligung hervorgegangen, wie z. B. das Prophet- und Genesis-System von Fan Long, mit dem mithilfe eines gelernten Modells korrekter Patches Fehler in Programmen automatisch behoben werden können. Martin Vechev und sein Schüler Veselin Raychev waren ebenfalls Pioniere auf diesem Gebiet. Das vielleicht beeindruckendste Ergebnis ist JSNice ( http://jsnice.org/ ), mit dem JavaScript-Code "minimiert" werden kann.

Insgesamt hat die Idee von Big Code ihr Versprechen nicht erfüllt: Die Daten sind viel zu spärlich, um etwas Interessanteres als Variablennamen zu lernen. Während ich zum Teil noch durch dieses DARPA-Programm finanziert werde, hat mein Labor die Arbeit daran größtenteils eingestellt. In diesem Sinne ist das Letzte, was ich über DeepCoder gehört habe, dass es im Vergleich zum Stand der Technik in der Programmsynthese ziemlich erbärmliche Ergebnisse liefert.

Die meisten erfolgreichen Tools für die automatisierte Programmierung basieren immer noch auf Nicht-ML-Methoden wie SMT-Solvern. Sehen Sie sich die Abläufe einer PL-Konferenz (z. B. PLDI, POPL, OOPSLA) oder einer Konferenz für akademisches Software-Engineering (z. B. ICSE, FSE, ISSTA, ASE) an und sehen Sie zahlreiche Beispiele.

James Koppel
quelle
3

Microsoft hat DeepCoder entwickelt, um mithilfe von Deep Learning einen Methodenkörper anhand einer bestimmten Eingabe und Ausgabe vorherzusagen. Das ist das einzige Beispiel, das ich nebenbei kenne.

Ich kann Ihnen sagen, dass Meta-Genetic Programming ein Studienbereich mit einem ähnlichen Ziel ist, aber ich kann nicht sagen, dass ich genug darüber weiß, um sachkundig zu sein.

Genetische Programmierung war in den Nachrichten des Jahres 2015, als muScalpel eine Lösung entwickelte, um eine Funktion von einem Programm auf ein anderes zu übertragen, wobei die Unit-Tests für beide als eine Art Trainingssatz verwendet wurden.

RJB
quelle
Das ist wie das Generieren von Algorithmen mithilfe eines genetischen Modells, oder? Kennen Sie Anwendungen zur Unterstützung der Codeentwicklung? Ich denke eher an die Zusammenarbeit von Mensch und Maschine als an ein rein maschinengetriebenes (genetisch bedingtes Modell). Ich weiß, dass dies spezifisch klingen mag, aber ich bin größtenteils neugierig, weil ich neu in diesem Bereich bin.
Charles
Sicher hast du recht, ich habe falsch verstanden, ich habe zu rekursiv darüber nachgedacht, ML für ML zu verwenden :) #edited
RJB
2

Meine Frage ist also, welche Forschungen wurden bisher durchgeführt, um maschinelles Lernen auf die Codeentwicklung anzuwenden? Wie wäre es mit Debuggen?

Eine verwandte Frage betrifft Techniken des maschinellen Lernens für die Codegenerierung und -kompilierung (da Sie sich Transpiler und Compiler als eine Möglichkeit vorstellen könnten , Code automatisch zu "entwickeln" - tatsächlich Code zu schreiben - aus einer höheren Sprache).

Es gab mehrere Artikel darüber, zum Beispiel MILEPOST GCC .

Sie können auch Artikel zu maschinellen Lerntechniken für das Debuggen oder zur statischen Quellcode-Analyse (oder zu jeder Art von statischer Programmanalyse) suchen .

Siehe auch J.Pitrats Blog zum Bootstrapping künstlicher Intelligenz, der mit Ihrer Frage zusammenhängt.

Basile Starynkevitch
quelle
1

In einem kürzlich erschienenen Artikel in Communications of the ACM über das Geldverdienen mit Mathematik zitierte Erik Meijer Jeff Dean, Senior Fellow bei Google Systems and Infrastructure Group:

Wenn Google heute von Grund auf neu erstellt würde, würde ein Großteil davon gelernt, nicht codiert.

Der Artikel gibt einen Überblick über aktuelle Aktivitäten im Forschungsbereich. Es befindet sich hinter einer Gewinnschwelle, ist aber möglicherweise lesenswert, wenn Sie an theoretischen Parallelen zwischen Codierung und maschinellem Lernen / Statistik interessiert sind. Vielleicht ist auch die Referenzliste am Ende des Artikels hilfreich.

Als Beispiel verweist der Artikel auf WebPPL, probabilistische Programmierung für das Web .

Claude
quelle
0

Hier ist ein Anwendungsfall zur Verwendung von maschinellem Lernen zum Debuggen von Mikrodiensten. Ich habe einige Anstrengungen zur Analyse von Leistungsdaten von Mikroservices mit maschinellem Lernen dokumentiert, wobei ich einen Entscheidungsbaum aus den Leistungsdaten trainiert habe, die beim Testen eines Mikroservices gesammelt wurden. Anschließend habe ich den Baum untersucht, der mir Einblick in ein Umweltproblem gab, und dabei geholfen, einen Leistungsfehler zu diagnostizieren und zu beheben.

Glenn
quelle
0

Ich fand eine ziemlich umfangreiche Leseliste zu allen Themen rund um das maschinelle Lernen .

Wie Sie sehen, haben die Leute versucht, maschinelles Lernen auf das Codieren anzuwenden, aber immer in sehr engen Bereichen, nicht nur auf einem Computer, der alle Arten von Codierung oder Debugging beherrscht.
Der Rest dieser Antwort konzentriert sich auf Ihren relativ breiten Bereich "Debugging" -Maschine und warum dies noch nicht wirklich versucht wurde (soweit meine Forschung zum Thema zeigt).


Ich habe einen längeren Teil der Antwort überarbeitet. Zusammenfassend (es ist wichtig für den nächsten Teil): Nach der aktuellen Methode des maschinellen Lernens kann jeder Mensch alles lernen, auch eine Maschine. Wir sind nur durch den physischen Bereich (CPU-Geschwindigkeit, Größe einer Maschine, ...) und nicht durch eine angeblich eingeschränkte Anwendbarkeit des Lernalgorithmus selbst begrenzt.

Welche Forschungen wurden bisher durchgeführt, um maschinelles Lernen auf die Codeentwicklung anzuwenden? Wie wäre es mit Debuggen?

Das Problem hier ist nicht, dass es unmöglich ist, sondern dass es ein unglaublich komplexes Thema ist.

Der Mensch hat noch nicht einmal annähernd einen universellen Kodierungsstandard definiert, dem alle zustimmen. Selbst die am weitesten verbreiteten Prinzipien wie SOLID sind immer noch eine Quelle für Diskussionen darüber, wie tief sie umgesetzt werden müssen. Für alle praktischen Zwecke ist es unmöglich, SOLID perfekt einzuhalten, es sei denn, Sie haben keinerlei finanzielle (oder zeitliche) Einschränkungen. Das ist im privaten Sektor, in dem die meisten Entwicklungen stattfinden, einfach nicht möglich. SOLID ist eine Richtlinie, keine feste Grenze.

Wie können wir einer Maschine, die kein objektives Maß für Richtig und Falsch hat, positives / negatives Feedback geben, um sie zum Lernen zu bringen?
Bestenfalls können wir viele Leute dazu bringen, der Maschine ihre eigene Meinung mitzuteilen ("das ist ein guter / schlechter Code"), und das Ergebnis der Maschine ist dann eine "durchschnittliche Meinung". Dies ist jedoch nicht unbedingt das Gleiche wie eine korrekte Lösung . Es kann sein, aber es ist nicht garantiert.

Zweitens ist es insbesondere für das Debuggen wichtig zu berücksichtigen, dass bestimmte Entwickler dazu neigen, eine bestimmte Art von Fehlern einzuführen. Die Art des Fehlers kann in einigen Fällen von dem Entwickler beeinflusst werden, der ihn eingeführt hat.

Da ich zum Beispiel häufig an der Fehlerbehebung des Codes anderer beteiligt bin, habe ich eine gewisse Erwartung, welche Art von Fehler jeder Entwickler machen kann. Angesichts eines bestimmten Problems weiß ich, dass Entwickler A wahrscheinlich die Aktualisierung der Konfigurationsdatei vergisst, während Entwickler B häufig fehlerhafte LINQ-Abfragen schreibt. Basierend auf dem Entwickler kann ich zuerst in Richtung der Konfigurationsdatei oder der LINQ schauen.
In ähnlicher Weise habe ich jetzt als Berater in mehreren Unternehmen gearbeitet, und ich sehe deutlich, dass Arten von Fehlern auf bestimmte Arten von Unternehmen ausgerichtet sein können. Es ist keine feste Regel, auf die ich endgültig hinweisen kann, aber es gibt einen eindeutigen Trend.

Kann eine Maschine das lernen? Kann es erkennen, dass Entwickler A die Konfiguration eher durcheinander bringt und Entwickler B eine LINQ-Abfrage eher durcheinander bringt? Natürlich kann es. Wie ich bereits sagte, alles, was ein Mensch lernen kann, kann auch eine Maschine.
Woher wissen Sie jedoch, dass Sie der Maschine alle Möglichkeiten beigebracht haben? Wie können Sie ihm jemals einen kleinen (dh nicht globalen) Datensatz zur Verfügung stellen und wissen, dass er das gesamte Spektrum an Fehlern darstellt? Oder würden Sie stattdessen bestimmte Debugger erstellen, um bestimmten Entwicklern / Unternehmen zu helfen, anstatt einen Debugger zu erstellen, der universell einsetzbar ist?

Nach einem maschinengelernten Debugger zu fragen ist wie nach einem maschinengelernten Sherlock Holmes zu fragen. Es ist nicht nachweislich unmöglich, einen zu erstellen, aber der Kern der Überlegung, ein Debugger / Sherlock zu sein, hängt oft von subjektiven Einschätzungen ab, die von Thema zu Thema variieren und eine unglaublich große Vielfalt an Kenntnissen / möglichen Fehlern berühren.
Das Fehlen von schnell nachweisbaren korrekten / inkorrekten Ergebnissen macht es schwierig, eine Maschine einfach zu unterrichten und zu überprüfen, ob sie gute Fortschritte macht.

Flater
quelle