Lernfähige IT-Systeme

Dies ist die Folgeseite zum Thema Künstliche Intelligenz.

Hier soll nun gezeigt werden, wie relativ einfach es ist, einen Algorithmus dazu zu bringen, sich bisher unbekannte Gegebenheiten für die spätere Verwendung zu merken. Dieses Verhalten – natürlich in wesentlich komplexerer Form – wird auch als "Maschinelles Lernen" bezeichnet.

Nachfolgend soll eine Demonstration für ein rudimentär lernfähiges IT-System gezeigt werden.

   A) Programmlogik
   B) Bilder
   C) Programmiersprachen
   D) Schnittstellen
   E) Und los geht's!
   F) Wie es funktioniert
   G) Gewollte Demenz
   H) Fazit

A) 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 (z.B. "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" (d.h. 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 einfacher Algorithmus hätte jetzt ein Problem und das Programm würde mit einer Fehlermeldung abbrechen.

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 abzubrechen, 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 fragt das Programm bei neuen Begriffen zur Sicherheit noch einmal nach, ob der Begriff auch wirklich korrekt geschrieben wurde. Falls nicht, kann der Benutzer seine Eingabe noch einmal korrigieren.

↑ Nach oben ↑

B) Bilder

Zunächst wird ein Bildverzeichnis auf dem Webserver ausgelesen:

Bild 1: Automobil automobil.png
Bild 2: Fisch fisch.png
Bild 3: Flasche flasche.png
Bild 4: Haus haus.png
Bild 5: Hut hut.png
Bild 6: Monitor monitor.png
Bild 7: Schiff schiff.png
Bild 8: Schmetterling schmetterling.png
Bild 9: Smiley smiley.png
Bild 10: Weintrauben weintrauben.png

Die Dateinamen werden einheitlich in Kleinschreibung umgewandelt, obwohl sie in diesem Fall bereits in Kleinschreibung vorliegen. Bei nachträglich hochgeladenen weiteren Bilddateien könnte das aber auch anders sein, was dann ohne Umwandlung zu Problemen führen würde.

Der Name der Bilddatei "automobil.png" wurde absichtlich so gewählt. Der Begriff "Auto" für einen fahrbaren Untersatz ist zwar umgangssprachlich gebräuchlicher als die Langform "Automobil". Allerdings werden die Dateinamen vom Programm verwendet, um daraus Objektnamen abzuleiten.

Das Wort "auto" könnte dabei zu Problemen führen, da es in manchen Programmiersprachen reserviert ist. Zur Sicherheit wurde die Kurzform deswegen vermieden. Bei der Programmbenutzung kann "Auto" aber problemlos als neuer Alternativbegriff eingegeben 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 als PNG-Datei mit Alphakanal-Transparenz vor und besitzen zur besseren Skalierung ein quadratisches Seitenverhältnis. Die Bilder sind lizenzfrei und wurden für dieses Projekt optimiert.

↑ Nach oben ↑

C) Programmiersprachen

Der erste Teil der Programmierung wurde teilweise mit der serverseitigen Sprache PHP realisiert.

Hintergrund für diese Entscheidung ist, dass es in einem reinen Browser-Umfeld ohne die Hilfe eines Servers nicht möglich ist, ein Verzeichnis auf dem lokalen Dateisystem auszulesen. Das ist aber hier nötig, um beispielsweise die vorhandenen Bilder zu ermitteln. Die Sicherheitsbeschränkungen moderner Webbrowser verhindern den direkten Zugriff über JavaScript.

Daran sieht man übrigens, dass die im Internet weit verbreitete Panikmache vor JavaScript ("Zur Sicherheit deaktivieren Sie JavaScript in Ihrem Webbrowser!") völlig übertrieben ist und nur dazu führt, dass viele Webseiten beim Aufruf mit so konfigurierten Browsern nicht korrekt funktionieren.

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. D.h. es gibt im Hintergrund auch keine Datenbank, in der Informationen dauerhaft abgelegt werden.

↑ Nach oben ↑

D) Schnittstellen

In diesem Projekt werden client- und 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 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 z.B. 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 Kommentaren kenntlich gemacht.

↑ Nach oben ↑

E) Und los geht's!

Nachfolgend sehen Sie 10 Objekte:

 
 
 
Bitte geben Sie den Begriff für das zu vergrößernde Objekt ein:


 

↑ Nach oben ↑

F) 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 (in JavaScript leider nicht mögliches) zweidimensionales Array aussehen:

N-DIM

In JavaScript sind leider nur eindimensionale Arrays möglich. Das kann man sich wie eine Tabelle mit nur einer Spalte vorstellen. Eine Lösung wäre die Verschachtelung von Arrays, d.h. in jedes Feld der Liste wird ein weiteres Array gesteckt.

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:

1-DIM

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!

↑ Nach oben ↑

G) 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.

↑ Nach oben ↑

H) Fazit

So einfach die Demonstration auch aufgebaut ist – dieser Algorithmus ist lernfähig!

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, z.B. 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.

Lernt man stattdessen ein System für eine KI-basierte Flugzeugsteuerung optimal an, kann man den fertigen Algorithmus einfach auf beliebig viele weitere Systeme kopieren. Die Arbeit, die Zeit und somit auch die Kosten für die Ausbildung fallen damit nur noch ein einziges Mal an. Und man kann sich sicher sein, dass jedes kopierte System in jeder Situation identisch reagiert. Nachträglich erlernte Fähigkeiten können dann entweder ebenfalls auf die anderen Systeme übertragen oder gleich über einen gemeinsamen Datenpool untereinander geteilt werden.

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".

↑ Nach oben ↑