Break-It-Fix-It: Unüberwachtes Lernen zur Programmreparatur

Wir betrachten Reparieraufgaben: gegeben sei ein Kritiker (z.B. ein Compiler), der die Qualität einer Eingabe bewertet. Das Ziel ist es, einen Reparaturmechanismus zu trainieren, der ein schlechtes Beispiel (z.B. Code mit Syntaxfehlern) in ein gutes Beispiel (z.B. Code ohne Syntaxfehler) umwandelt. Bestehende Arbeiten erzeugen Trainingsdaten, die aus (schlecht, gut) Paaren bestehen, indem sie gute Beispiele durch Heuristiken (z.B. das Entfernen von Token) verzerren. Allerdings generalisieren Reparaturmechanismen, die auf diesen synthetisch generierten Daten trainiert wurden, nicht gut auf die tatsächliche Verteilung von schlechten Eingaben. Um diese Lücke zu schließen, schlagen wir einen neuen Trainingsansatz vor, den wir Break-It-Fix-It (BIFI) nennen. Dieser Ansatz basiert auf zwei zentralen Ideen: (i) Wir verwenden den Kritiker, um die Ausgabe eines Reparaturmechanismus auf echten schlechten Eingaben zu überprüfen und fügen gute (reparierte) Ausgaben den Trainingsdaten hinzu; und (ii) Wir trainieren einen Brecher, um realistischen schlechten Code aus guten Code zu generieren. Auf dieser Grundlage aktualisieren wir den Brecher und den Reparaturmechanismus iterativ und nutzen sie gemeinsam zur Erzeugung weiterer gepaarter Daten. Wir evaluieren BIFI anhand zweier Code-Reparatur-Datensätze: GitHub-Python, einem neuen Datensatz, den wir einführen und bei dem das Ziel darin besteht, Python-Code mit AST-Parse-Fehlern zu reparieren; und DeepFix, bei dem das Ziel darin besteht, C-Code mit Compilerfehlern zu reparieren. BIFI übertrifft bestehende Methoden und erreicht eine Reparaturgenauigkeit von 90,5 % auf GitHub-Python (+28,5 %) und 71,7 % auf DeepFix (+5,6 %). Besonders erwähnenswert ist dabei, dass BIFI keine etikettierten Daten benötigt; wir hoffen, dass es ein starker Ausgangspunkt für das unüberwachte Lernen verschiedener Reparaturaufgaben sein wird.