02.06.2019
· Wissenschaft und Technik
· 1 minAuf 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.
Über James Joyces „Ulysses“ und Lesegewohnheiten
18.02.2019
· Feuilleton
· 8 minSeit 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, 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.
Oder: Der ewige Kreis – über zirkuläre Abhängigkeiten in Angular
01.11.2018
· Wissenschaft und Technik
· 26 minMit 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. - 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.
Oder: Warum mein intelligenter Staubsaugerroboter so schnell kein Bewusstsein entwickeln und die Weltherrschaft an sich reißen wird
04.10.2018
· Wissenschaft und Technik
· 11 minKü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. Hier soll es heute dabei um eine ganz besondere Form dieser
Ängste gehen: Die Angst vor einer Superintelligenz wie sie zum Beispiel vom Futuristen
Nick Bostrom beschrieben wird. Die Angst: „Künstliche Intelligenzen“ könnten schlauer sein als der
Mensch und (mehr oder weniger bewusst) die Menschheit auslöschen.
Drei Klassifizierungsverfahren
03.10.2018
· Wissenschaft und Technik
· 15 minIn 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. Diese Lernaufgabe wird im
maschinellen Lernen auch „Funktionenlernen aus Beispielen“ genannt, die gelernten Regeln
häufig „Modelle“. Bei den Eingabedaten spricht man auch von „feature variables“ oder einem
Merkmalsvektor, bei den Ausgabedaten von „target variables“, die im Falle von Klassifizierung
aus einer endlichen Wertemenge aus zuzuordnenden „Klassen“ oder „Labels“ stammen.
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. 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.