Lernfähige IT-Systeme
Die Demonstration zeigt in stark vereinfachter Form, wie ein System neue Zuordnungen aufnehmen und später wiederverwenden kann. Echtes maschinelles Lernen arbeitet wesentlich komplexer: Dabei werden aus Beispieldaten Muster oder Regeln abgeleitet, statt lediglich neue Begriffe in einer Liste zu speichern.
Nachfolgend soll eine Demonstration für ein rudimentär lernfähiges IT-System gezeigt werden.
Programmlogik
Die grundsätzliche Logik dieses Programmes ist recht einfach: Dem Benutzer werden ein paar Bilder in kleiner Skalierung angezeigt. Jedem Bild ist ein Begriff (beispielsweise „Schmetterling“) zugeordnet, dieser Begriff wird aber nicht angezeigt.
Darunter befindet sich ein Bereich, in dem eines der Bilder in großer Skalierung angezeigt werden kann. Dazu muss der Benutzer lediglich den betreffenden Begriff in ein Formularfeld tippen und die Eingabe mit der „Enter“-Taste oder per Button bestätigen.
Solange der Benutzer einen dem Programm bekannten Begriff eingibt, wird das betreffende Bild vergrößert angezeigt.
Da aber der Benutzer die im System hinterlegten Begriffe nicht sieht, kann es sein, dass ein „falscher“ (also ein dem System unbekannter) Begriff eingegeben wird. Zum Beispiel könnte ein Benutzer das kleine Bild vom Schmetterling sehen und in das Eingabefeld „Falter“ eingeben. Der Begriff für das angezeigte Objekt ist zwar grundsätzlich korrekt, jedoch dem System nicht bekannt.
Ein sehr einfach aufgebautes Programm könnte an dieser Stelle lediglich melden, dass der eingegebene Begriff nicht bekannt ist.
Anders in dieser Demonstration. Hier wird der Algorithmus die Eingabe mit den ihm bekannten Begriffen vergleichen und feststellen, dass es diesen Begriff im System nicht gibt. Anstatt nun einen Fehler zu melden, fragt der Algorithmus den Benutzer, welches Bild mit dem Begriff gemeint war. Der Benutzer klickt das betreffende kleine Bild an und ab diesem Moment merkt sich der Algorithmus den neuen Begriff zusätzlich für dieses Objekt.
Gibt der Benutzer ab jetzt „Schmetterling“ oder „Falter“ ein, wird in beiden Fällen der Schmetterling angezeigt. So kann der Algorithmus nach und nach immer neue Begriffe für die Objekte lernen und danach korrekt zuordnen.
Nun kann es aber sein, dass der Benutzer gar keinen alternativen Begriff eingeben wollte, sondern sich nur vertippt hat. Dann soll natürlich das falsch geschriebene Wort nicht im Gedächtnis des Algorithmus landen. Aus diesem Grund bietet das Programm bei einem neuen Begriff zwei Möglichkeiten an: Der Benutzer kann eine versehentliche Falscheingabe korrigieren oder durch Anklicken eines Bildes bestätigen, dass der neue Begriff tatsächlich erlernt werden soll.
Bilder
Zunächst wird ein Bildverzeichnis auf dem Webserver ausgelesen:
| Bild 1: | automobil.png | |
| Bild 2: | fisch.png | |
| Bild 3: | flasche.png | |
| Bild 4: | haus.png | |
| Bild 5: | hut.png | |
| Bild 6: | monitor.png | |
| Bild 7: | schiff.png | |
| Bild 8: | schmetterling.png | |
| Bild 9: | smiley.png | |
| Bild 10: | weintrauben.png |
Die Dateinamen der Demonstrationsbilder liegen einheitlich in Kleinschreibung vor. Da sie zugleich als Ausgangsbegriffe und zum Aufruf der Bilddateien verwendet werden, sollten auch später ergänzte Bilder nach diesem Schema benannt werden.
Der Dateiname „automobil.png“ wurde bewusst gewählt, weil sich daraus ein eindeutiger Grundbegriff für das dargestellte Objekt ergibt. Bei der Benutzung kann trotzdem problemlos die kürzere Bezeichnung „Auto“ als zusätzlicher Begriff erlernt werden.
Die Objektnamen werden übrigens beim Überfahren der obigen Bilder mit dem Mauspfeil angezeigt. Sie bilden das anfängliche „Grundwissen“ des Programmes.
Alle Bilddateien liegen im PNG-Format mit Alphakanal-Transparenz vor und besitzen zur besseren Skalierung ein quadratisches Seitenverhältnis. Die Bilder sind lizenzfrei und wurden für dieses Projekt optimiert.
Programmiersprachen
Der erste Teil der Programmierung wurde teilweise mit der serverseitigen Sprache PHP realisiert.
JavaScript im Browser kann nicht ohne Weiteres das Bildverzeichnis auf dem Webserver auslesen. Zwar erlauben moderne Browser nach ausdrücklicher Auswahl und Zustimmung des Benutzers begrenzte Zugriffe auf lokale Dateien oder Verzeichnisse. Aber das automatische Auslesen eines serverseitigen Verzeichnisses muss hier auf dem Server erfolgen. Deshalb wird dafür PHP eingesetzt.
Die Sicherheitsbeschränkungen zeigen, dass JavaScript nicht einfach so auf Dateien eines Rechners zugreifen kann. Daher ist ein grundsätzliches Deaktivieren von JavaScript bei heutigen Webseiten unnötig, zumal dadurch viele interaktive Funktionen nicht mehr laufen würden. Wie bei jeder ausführbaren Technik können dennoch Sicherheitslücken oder missbräuchliche Skripte vorkommen.
Der Rest der Programmierung wurde mit der clientseitigen Sprache JavaScript umgesetzt. Dies hat den Vorteil, dass diese Webseite interaktive Inhalte haben kann. Anders als mit reinem PHP-Code muss die Seite für eine inhaltliche Änderung nicht neu geladen werden, sie aktualisiert sich je nach Benutzereingaben dynamisch. Weiterhin kann der Benutzer den in JavaScript geschriebenen Code über den Seitenquelltext im Browser einsehen, während dem Benutzer ein PHP-Code niemals im Original übermittelt wird. Der Server behält ihn für sich und sendet dem Benutzer nur das über PHP generierte Ergebnis.
Der ausgelagerte JavaScript-Code kann in einem separaten Tab eingesehen werden: [JavaScript-Code]
Außer HTML(5) und zur Formatierung CSS kommt keine weitere Sprache zum Einsatz und es gibt im Hintergrund auch keine Datenbank, in der Informationen dauerhaft abgelegt werden.
Schnittstellen
In diesem Projekt werden die client- und die serverseitige Programmiersprache nicht nur parallel eingesetzt. Vielmehr muss es zwischen ihnen auch noch eine Kommunikation zumindest in eine Richtung geben. Die serverseitige Sprache (PHP) kann Verzeichnisse auslesen, was die clientseitige Sprache (JavaScript) nicht so einfach kann. Aber JavaScript benötigt die Informationen aus dem ausgelesenen Serververzeichnis, um damit weiterarbeiten zu können.
Die Lösung im aktuellen Fall: Mit PHP kann nicht nur HTML-Code generiert werden, sondern auch JavaScript-Code. So enthält der JavaScript-Code scheinbar „hartkodierte“ Informationen, wie beispielsweise die Liste der vorhandenen Bilder.
Ein Beispiel findet man im Kopfbereich des HTML-Quellcodes. Dort gibt es zwei JavaScript-Bereiche. Einmal einen internen JavaScript-Bereich für die Definition des Wörterbuch-Arrays. Dieser Bereich wurde per PHP generiert, da es vorab mit den Standardbegriffen für die Objekte gefüllt werden muss. Diese ergeben sich erst durch das Auslesen des Bildverzeichnisses.
Und gleich darunter folgt der Aufruf einer externen JavaScript-Datei, die tatsächlich mit fest gespeichertem Code vorliegt und für die Programmlogik nach dem Start verantwortlich ist.
Die betreffenden PHP-JavaScript-Übergänge sind im Quellcode dieser Webseite mit entsprechenden HTML-Kommentaren kenntlich gemacht.
Dann mal los!
Nachfolgend sehen Sie 10 Objekte:
Bitte geben Sie den Begriff für das zu vergrößernde Objekt ein:
Wie es funktioniert
Zu Beginn liest PHP das Bildverzeichnis auf dem Server aus und generiert einen JavaScript-Code zur Erstellung eines Arrays. Dieses Array fungiert im weiteren Programmverlauf als „Wörterbuch“.
Die originalen Begriffe für die Objekte ergeben sich aus den Dateinamen der Bilder. Das neue Array wird von PHP mit diesen Begriffen initialisiert.
Der Aufbau des Wörterbuch-Arrays erfordert ein wenig Trickserei, da in JavaScript leider keine mehrdimensionalen Arrays möglich sind.
In anderen Sprachen könnte man ein zweidimensionales Array wie eine Tabelle mit zwei Spalten verwenden, vergleichbar mit einem Vokabelheft. In der linken Spalte würden alle Eingabebegriffe stehen, sowohl die Grundbegriffe als auch die später erlernten. Und in der rechten Spalte die jeweils zugeordneten Originalbegriffe.
So könnte ein durch Verschachtelung aufgebautes zweidimensionales Array aussehen:
In JavaScript werden mehrdimensionale Strukturen durch die Verschachtelung von Arrays erzeugt. Das kann man sich so vorstellen, dass in jedes Feld einer Liste ein weiteres Array gesteckt wird.
Der Code soll aber der Demonstration dienen und daher nicht zu kompliziert werden. Deswegen wurde hier eine andere Lösung gewählt: Es wird ein eindimensionales Array erstellt und in jedes Feld dieser Liste werden beide Begriffe (Eingabebegriff und Zuordnung) durch ein Gleichheitszeichen getrennt hintereinander abgespeichert.
Auch dazu ein Bild zum besseren Verständnis:
Zum getrennten Auslesen der Werte gibt es in JavaScript die Funktion „split()“, mit der man den Inhalt eines Feldes auf Grundlage eines bestimmten Zeichens (hier das Gleichheitszeichen) voneinander trennen kann. So ist es möglich, die Benutzereingabe mit dem ersten Teil zu vergleichen und bei Übereinstimmung das im zweiten Teil zugeordnete Objekt aufzurufen.
Sollte das Programm bei der Suche im Array nicht fündig werden, bedeutet das für das System einen unbekannten Begriff. Dann wird der Benutzer gebeten, das betreffende Bild anzuklicken. Dazu besitzt jedes der kleinen Bilder eine „onClick“-Aktion. So erkennt das System, welches Bild ausgewählt wurde und schreibt den betreffenden Begriff zusammen mit der Zuordnung als neuen Eintrag in das Array.
Kurz: Das System hat einen neuen Begriff gelernt!
Gewollte Demenz
Dieses Programm ist so angelegt, dass der langsam wachsende Erfahrungsschatz nach einem Neuaufruf der Webseite zurückgesetzt wird. Man kann es als „gewollte Demenz“ bezeichnen. Der Algorithmus könnte zwar auch mit einer Datenbank zur dauerhaften Speicherung neuer Begriffe ausgestattet werden, das wäre nur ein geringer Mehraufwand gewesen.
Es soll aber verhindert werden, dass über einen längeren Zeitraum mehr und mehr falsche oder unsinnige Begriffe eingegeben werden. Jeder Benutzer soll mit demselben Grund-Datenbestand beginnen.
Um dies zu realisieren, wird mit einem JavaScript-Array gearbeitet. Durch die clientseitige Sprache existiert das Wörterbuch-Array mit den Alternativbegriffen bei jedem Benutzer separat und auch nur so lange, wie die Webseite im Browser des Benutzers aktiv ist. Wird die Seite verlassen, geht der nachträglich gesammelte Datenbestand verloren.
Fazit
So einfach die Demonstration auch aufgebaut ist – dieser Algorithmus kann sein anfängliches Wörterbuch während der Benutzung selbstständig erweitern!
Hier sorgt der Benutzer dafür, dass der Algorithmus neue Begriffe erlernt. In ausgefeilteren Systemen könnte sich ein Algorithmus seine neuen Informationen aber auch von woanders holen, zum Beispiel aus dem Internet. In der Praxis werden mittlerweile auch KI-Systeme eingesetzt, um andere KI-Systeme zu trainieren.
Mögliche Auswirkungen auf unser Leben:
In vielen Bereichen, in denen Menschen aufwendig und kostenintensiv ausgebildet werden müssen, könnte in Zukunft stattdessen eine KI zum Einsatz kommen.
Ein Beispiel aus der Fliegerei: Es dauert Jahre, um einen menschlichen Piloten auszubilden und es kostet relativ viel Geld. Aber selbst nach einer gemeinsamen Ausbildung können Piloten in bestimmten Situationen unterschiedlich reagieren.
Ist ein System für eine KI-basierte Flugzeugsteuerung erst einmal entwickelt und umfassend erprobt, lässt sich die grundlegende Software auf weitere baugleiche Systeme übertragen. Anders als bei Menschen muss dabei nicht jedes einzelne System von Grund auf neu ausgebildet werden. Auch wenn Anpassung, Erprobung, technische Überwachung und Zulassung erforderlich bleiben, stellt es doch eine deutliche Optimierung dar. Erkenntnisse aus dem Betrieb könnten anschließend gesammelt werden, um in verbesserte Versionen aller Systeme einzufließen.
Ob wir es gut finden oder nicht – die Entwicklung geht in diese Richtung.
Wohin uns lernfähige Programme vielleicht einmal bringen könnten, kann man in diesem interessanten Artikel erfahren: „Technologische Singularität“