SDA SE Wiki

Software Engineering for Smart Data Analytics & Smart Data Analytics for Software Engineering

User Tools

Site Tools


Projektgruppe Angewandte Softwaretechnologie

Dr. Günter Kniesel-Wünsche, Lars Reimann, Firas Kassawat

Motivation & Themenstellung

Die Projektgruppe wird dazu beitragen eine Entwicklungsumgebung zu bauen, die speziell die Entwicklung von Anwendungen des maschinellem Lernens erheblich beschleunigen wird. Der Kerngedanke ist, auch im Kontext von Maschinellem Lernen Programmierfehler so frühzeitig zu erkennen, wie Sie es aus der Entwicklung herkömmlicher Programme kennen.

Im Folgenden wird erst beschrieben, was herkömmliche Entwicklungsumgebungen für Java und ähnliche Sprachen leisten, was darüberhinaus durch die PG ermöglichet werden soll und warum es im Kontext des maschinellen Lernens besonders kritisch ist, das zu können. Anschliessend beschreiben wir, was die PG konkret in diesem Rahmen tun wird und was Sie dabei lernen können.

Programmierfehler frühzeitig erkennen

Schon während man in Java ein Programm schreibt erhält man vom Compiler und der Entwicklungsumgebung allerhand Hinweise zur Korrektheit des Programms, dupliziertem Code, Ineffizienzen etc. Dies bezeichnet man als statische Programmanalyse. Ein wesentlicher Teil der Programmierfehler kann somit schon behoben werden, ohne das Programm ausführen zu müssen.

Nehmen wir einmal folgendes Programm als Beispiel, das einen String als Konsolenargument entgegennimmt und diesen wieder auf der Konsole ausgibt (echo):

Das Programm überprüft zunächst, ob genau ein Konsolenargument übergeben wurde. Wenn nicht, erhält der Benutzer eine entsprechende Meldung und das Programm wird abgebrochen. Sonst wird der übergebene String wie erwünscht auf der Konsole ausgegeben.

Allerdings hat sich in diesem Programm ein Fehler eingeschlichen: Wenn wir den Code nach der if-Anweisung ausführen, muss das Array args die Länge 1 haben, denn sonst hätten wir vorher die return-Anweisung ausgeführt. Wir greifen allerdings im Array args auf das Element an Index 1, also das zweite Element zu (zur Erinnerung: Indizierung beginnt in Java bei 0). Dies führt zur Laufzeit zu einer ArrayIndexOutOfBoundsException. Glücklicherweise hat die Entwicklungsumgebung diesen Fehler aber bereits erkannt und zeigt eine entsprechende Meldung an, so dass man sich die Wartezeit für Kompilierung und Ausführung des Programms ersparen kann:

Statische Programmanalyse für Maschinelles Lernen

Eine Domäne, die von statische Programmanalyse besonders profitieren würde, ist Maschinelles Lernen (ML). Während beim obigen Programm die Wartezeit für Kompilierung und Ausführung im Sekundenbereich liegt, muss man beim ML teilweise Stunden oder Tage auf ein Ergebnis warten. Ein Programmfehler gegen Ende der Ausführungszeit kann alle bisher erzielten Ergebnisse zunichte machen.

Ein Produkt, dass umfassende statische Programmanalyse für Maschinelles Lernen durchführt, ist uns allerdings nicht bekannt. Korrektheitsbedingungen werden stattdessen in natürlicher Sprache in der Dokumentation von ML-Bibliotheken ausgedrückt, wie die folgenden Beispiele von scikit-learn zeigen:

Die Beispiele zeigen die Vielfalt der nur natürlichsprachlich spezifizierten Bedingungen:

  1. Typbedingungen für 'kernel': Nur eine Reihe vordefinierter Strings sind tatsächlich erlaubt. Außerdem können Funktionen übergeben werden, also ist die am Anfang der Spezifikation behauptete Typeinschränkung auf Strings falsch.
  2. Abhängigkeiten für 'degree': Nur wenn der Wert von 'kernel' auf “poly” gesetzt ist, hat der 'degree'-Parameter überhaupt eine Funktion.
  3. Temporale Bedingungen für 'probability': Dieser Parameter muss aktiviert werden, bevor die fit Methode aufgerufen wird.
  4. Anforderungen an den Ausführungskontext für 'verbose': Falls Threads benutzt werden, um das Programm effizienter zu gestalten, funktioniert dieser Parameter ggf. nicht.

Vorgehen in der Projektgruppe

In der Projektgruppe werden wir einen Parser für die Dokumentation von (ML-)Bibliotheken und für kleine Teile des Codes entwickeln. Dieser hat zwei Aufgaben:

  • Analyse der Codestruktur: Welche Klassen gibt es in der Bibliothek? Welche Methoden und Felder haben diese? Wie ist die Signatur einer Methode?
  • Analyse der Korrektheitsanforderungen: Welche Bedingungen sind in der Dokumentation formuliert, damit ein Programm korrekt funktioniert?

Beide Ergebnisse können kombiniert werden: Sobald wir durch die Analyse der Codestruktur wissen, dass 'kernel' und 'degree' Parameter sind, können wir in der Dokumentation erkennen, wenn wir auf einen Parameter Bezug nehmen. So lassen sich Abhängigkeiten zwischen Parametern erkennen, wie eben zwischen 'kernel' und 'degree'.

Außerdem bauen wir einen Codegenerator, der die interne Darstellung der Ergebnisse des Parsers in logische Regeln überführt, die sich für statische Programmanalyse nutzen lassen.

Hier ist das Gesamtbild das wiedergibt, wie der Parser aus der Dokumentation der Bibliothek und deren Implementierung Informationen extrahiert, diese miteinander abgleicht und der Codegenerator bei Bedarf die Implementierung so ergänzt, dass der Compiler der Zielsprache auftretende Probleme statisch erkennen kann:

Was Sie lernen werden

  • Statische Programmanalyse
  • Einfache Parsingtechniken
  • Grundlagen der Verarbeitung natürlicher Sprache (NLP)
  • Grundlagen der Logischen Programmierung
  • Grundlagen des Maschinellen Lernens
  • Agile Softwareentwicklung

All dies ist eingebettet in das Open-Source Projekt Simple-ML. Die Zeit die Sie in dieser Projektgruppe investieren kommt also der ML-Community zugute und Sie selbst können bei zukünftigen Bewerbungen stets auf die entsprechenden Repositories verweisen.

teaching/projectgroups/ast/2020/themenstellung.txt · Last modified: 2020/03/27 09:15 by Lars Reimann

SEWiki, © 2020