Ist das Kunst oder kann das weg?

Auf der 19. Gulaschprogrammiernacht des CCC Karlsruhe Anfang Juni 2019 ist dieses kleine Projekt entstanden, das die uralte Frage ein für alle mal lösen will: Ist das Kunst oder kann das weg? Und natürlich macht man das heutzutage mit Deep Machine Learning!

Wie funktioniert das jetzt genau?
Technisch gesehen mit Hilfe von Neuronalen Netzen und Deep Machine Learning. Praktisch gesehen mit einer Menge schwarzer Magie, Code-Snippets von Stack-Overflow und einem kleinen bisschen Confirmation Bias.
Und wie gut klappt das?
Das klappt großartig! Während der Entwicklung wurde das neuronale Netz nur auf insgesamt 600 Bildern trainiert. Die Alpha-Version basiert schon auf fast 6000 – sie ist also 10 mal so gut!
Ist Kunst nicht subjektiv?
Nein! Offensichtlich kann die App ganz klar vorhersagen, was Kunst ist und was weg kann. Das Problem ist also klar gelöst, Kunst ist ab jetzt rein objektiv bewertbar.
Und das ist Wissenschaft?
Ja, Zu 95 Prozent! Es muss wissenschaftlich absolut valide sein, denn dieses Projekt hat seine eigene DOI: 10.5281/zenodo.3349570

Der Quellcode unter Apache-Lizenz zum Selber-Trainieren sowie ein APK zum Installieren unter Android findet sich auf GitHub.

Scylla und Charybdis

Über James Joyces „Ulysses“ und Lesegewohnheiten

Seit einigen Wochen ist es vollbracht, mein großes Leseprojekt von 2018. Das Buch, das jetzt schon fast 5 Jahre auf meiner „Noch zu Lesen“-Liste stand, ist bezwungen. Und es lässt mich mit gemischten Gefühlen zurück, die mich zu dieser etwas ausgedehnteren Reflexion geführt haben.

Ulysses ist ein 1922 erschienener Roman des irischen Schriftstellers James Joyce, in dem der Protagonist Leopold Bloom für den Tag des 16. Juni 1904 bei seinem Alltag in Dublin begleitet wird. Der Roman gilt als richtungsweisend, weil er neben einer äußeren Beschreibung der Handlung auch moderne Techniken wie den Bewusstseinsstrom als zentrale Stilmittel einsetzt.

Und viel mehr lässt sich eigentlich über das Buch gar nicht sagen, ohne direkt in Details zu den einzelnen Kapiteln zu gehen. Dennoch möchte ich zunächst etwas allgemeiner ansetzen, denn: Für mich war das Leseerlebnis von Ulysses ein permanenter Wechsel zwischen „anstrengend“ und „großartig“. Warum das so ist, möchte ich jetzt ergründen.

Telemachie

Was hat Ulysses für mich also lesenswert gemacht? Ohne mir da jetzt zu viel anmaßen zu wollen, glaube ich, dass es der Teil ist, an dem der Autor auch das meiste Interesse hatte: Das Buch ist eine unglaublich dichte Erzählung und reich an Facetten einer nur angedeuteten, größeren Welt. Wie Joyce selbst sagt:

I want to give a picture of Dublin so complete that if the city one day suddenly disappeared from the earth it could be reconstructed out of my book.

Gerade aus heutiger Sicht fand ich den Blick aus dem Inneren des Alltags dieser Zeit ganz spannend, weil… Man hat so grob ein Gefühl dafür, wie die Leute im Mittelalter gelebt haben müssen,1 und auch, wie es zum Beispiel in den 70ern gewesen sein muss. Aber 1904? Keine Ahnung, was da war. Die Zeit direkt vor dem ersten Weltkrieg ist in dieser Hinsicht eine große Lücke im Geschichtsunterricht.

alles →

Stabile Sessions für offline-fähige Web-Apps mit PouchDB

Oder: Der ewige Kreis – über zirkuläre Abhängigkeiten in Angular

Mit einer kleinen Gruppe von Studierenden entwickele ich im Rahmen von Aam Digital, einem Teilprojekt der Karlsruher Engineers Without Borders die Web-App NGO-DB, die es kleinen NGOs – vor allem unserem Partner H.E.L.G.O. – einfacher machen soll, ihre Daten zu verwalten.

Bei H.E.L.G.O. geht es dabei primär um das erfassen von Daten der Schüler, die das Projekt in Kalkutta fördert. Eine wichtige Anforderung ist hierbei die Offline-Fähigkeit der App, da Internet nicht immer verfügbar ist.

Als technische Basis wurden daher Angular, ein TypeScript-Framework mit Unterstützung für Progressive Web Apps, sowie PouchDB, ein JavaScript-Klon der dokumentenorientierten Datenbank CouchDB, die Features wie Offlinefähigkeit und Synchronisation zur Verfügung stellt, verwendet.

Dieser Blog-Post beschäftigt sich nun mit der Frage, wie eine User-Session von Login über Synchronisation der lokalen Datenbank-Replik bis hin zur Nutzung der Datenbank sinnvollerweise aussehen könnte. Dabei wird die ganz am Anfang des Projekts entwickelte, bestehende Session analysiert, um daraus für die neu zu gestaltende Session zu lernen.

Nebenbei wird es dabei auch in großer Tiefe um zirkuläre Abhängigkeiten in JavaScript-Modulen, bei Dependency Injection sowie zwischen Modulen in Angular gehen und um Strategien, wie diese Abhängigkeiten aufgelöst werden können.

Wer den Post nur für diesen Teil ließt, empfehle ich, direkt hinab zum Spaß zu springen: Zirkuläre Abhängigkeiten. Allen anderen empfehle ich auch gerne die nun folgende Einführung des Gesamtszenarios des Session-Handlings der Applikation.

Die bestehende Session

An der Session sind eine Reihe von Komponenten beteiligt, die in die folgenden Angular-Module aufgeteilt sind:

  • Database: Enthält eine Abstraktion über den Datenbankzugriff, eine Implementierung für eine lokale PouchDB sowie eine Mock-Datenbank. Außerdem ist ein DatabaseManagerService abstrakt und für die beiden Implementierungen enthalten, der den Angular-Provider für die Datenbank selbst hält. Die PouchDB-Implementierung, der PouchDatabaseManagerService hält intern Referenzen auf die lokale und entfernte PouchDB und stellt Methoden zum Login an der entfernten sowie zur Synchronisierung zwischen lokaler und entfernter Datenbank zur Verfügung. Aus prinzipiellen Gründen enthält die lokale Datenbank auch eine Kopie der User mit ihren gehashten Passwörtern.1
  • Entity: Enthält einen simplen EntityMapper zur Benutzung mit unserer Datenbankabstraktion. Andere Module implementieren die abstrakte Klasse Entity um in der Datenbank gespeichert werden zu können.
  • User: Der User ist eine solche Entity, die zudem Methoden zur Prüfung des Passworts beinhaltet.
  • Session: Die Session beinhaltet den SessionService, der alle Bestandteile zusammenhält und schlussendlich verwendet wird, um herauszufinden, welcher User angemeldet ist.

Services

Das folgende UML-Klassendiagramm stellt (etwas vereinfacht) die beteiligten Services und Klassen mit ihren wichtigsten Methoden dar. Gestrichelte Pfeile sind dabei Abhängigkeiten, durchgezogene Pfeile Injections durch Angular.

alles →

Hilfe, die Singularität kommt!

Oder: Warum mein intelligenter Staubsaugerroboter so schnell kein Bewusstsein entwickeln und die Weltherrschaft an sich reißen wird Künstliche Intelligenz ist in den letzten Jahren zu einem unglaublichen Trend geworden – jedes Produkt, das etwas auf sich hält, muss jetzt irgendwie „smart“ sein und Machine Learning beinhalten. Das geht von Smart-TVs über digitale Assistenten bis hin zu Stromspar-Features in den neuesten Versionen von Handy-Betriebssystemen. Und je tiefer sich die intelligente Software in unser Leben verankert, umso lauter werden die kritischen Stimmen, die vor dieser Software warnen, die wir nicht mehr verstehen.
alles →

Von Bäumen, Netzen und Maschinen

Drei Klassifizierungsverfahren

In einem vergangenen Post habe ich bereits über künstliche Intelligenz und maschinelles Lernen im Allgemeinen gesprochen. In diesem Artikel möchte ich nun drei ganz konkrete Verfahren des maschinellen Lernens vorstellen, genauer gesagt drei Klassifizierungsverfahren.

Klassifizierung ist ein Teilbereich des überwachten Lernens, bei dem aus einer Reihe von Eingabe-Ausgabe-Paaren eine Regel abgeleitet werden soll, die Eingabe auf Ausgabe abbildet.1 Diese Lernaufgabe wird im maschinellen Lernen auch „Funktionenlernen aus Beispielen“ genannt,2 die gelernten Regeln häufig „Modelle“. Bei den Eingabedaten spricht man auch von „feature variables“ oder einem Merkmalsvektor, bei den Ausgabedaten von „target variables“,3 die im Falle von Klassifizierung aus einer endlichen Wertemenge aus zuzuordnenden „Klassen“ oder „Labels“ stammen.1

Klassifizierungs-Algorithmen bestehen in der Regel aus drei Phasen: In einer Lern- oder Trainingsphase werden Regeln aus Beispielen (beschriftete Daten aus Eingabedaten mit zugeordneten Ausgabedaten), auch Trainingsdaten genannt, abgeleitet. Diese Regeln werden in einer Test- oder Validierungsphase auf andere, ebenfalls beschriftete Daten angewendet, damit geprüft werden kann, wie gut die gelernten Regeln bei anderen Eingabewerten funktionieren.3 Danach können die so trainierten Klassifikatoren in der praktischen Anwendung auf neue, unbeschriftete Daten angewendet werden. Dies ist ein Thema, mit dem sich die Literatur in der Regel nicht mehr beschäftigt.

Im Folgenden sollen drei großen Gruppen der Klassifizierungs-Algorithmen sowie ihre jeweilige Funktion beschrieben werden. Zuvor soll jedoch noch ein wichtiges allgemeines Konzept der Klassifizierung eingeführt werden. Lösungen für Klassifikationsaufgaben haben immer das Risiko der Überanpassung (englisch „Overfitting“), bei der die Entscheidungs-Regeln zu stark auf die Trainingsdaten angepasst wurden und somit bei den Validierungsdaten und damit in der späteren praktischen Anwendung nicht ausreichend gut funktionieren.

We will say that a hypothesis overfits the training examples if some other hypothesis that fits the training examples less well actually performs better over the entire distribution of instances.4

alles →