"Machines don't learn. What a typical "learning machine" does, is finding a mathematical formula, which, when applied to a collection of inputs (called "training data"), produces the desired outputs. This mathematical formula also generates the correct outputs for most other inputs (distinct from the training data) on the condition that those inputs come from the same or a similar statistical distribution as the one the training data was drawn from." [Burkov, 2019, S. xvii]
Was das bedeutet, werde ich im Rahmen dieses Artikels anhand eines einfachen Beispiels zeigen.
Ein Anwendungsfall für KI ist das Lesen von handgeschriebenen Texten. Ein Mensch lernt das Lesen üblicherweise im ersten Schuljahr. Er beginnt damit, einzelne Buchstaben und Ziffern zu lesen und im Laufe des Jahres lernt er das Lesen ganzer Wörter und Zahlen. Nach einem Jahr kann er es noch nicht perfekt, aber gut genug, um einfache Texte zu lesen und zu verstehen.
Auch Maschinen kann das Lesen beigebracht werden. Um den Rahmen das Artikels nicht zu sprengen, wird das Problem vereinfacht. Statt ganzer Texte, werden im folgenden Beispiel nur einzelne handgeschriebene Ziffern gelesen. Dazu werde ich ein einfaches Modell trainieren und zeigen, dass es gute Ergebnisse liefert, wenn die Eingabedaten den Trainingsdaten ähneln. Anschließend werde ich zeigen, wie unzuverlässig das Ergebnis ist, wenn die tatsächlichen Eingaben deutlich von den Daten abweichen, mit denen das Modell trainiert wurde.
An dieser Stelle kommt der Mensch ins Spiel. Bereits beim Erstellen des Modells ist er gefordert, mögliche Ausnahmen und Abweichungen vorherzusehen und zu berücksichtigen. Durch Fachwissen, Kreativität und Intelligenz kann er Systeme entwickeln, die sich dann scheinbar intelligent verhalten.
Für die Beispiele wird das MNIST-Dataset [MNIST] verwendet. Dieses enthält Bilder der handgeschriebenen Ziffern 0-9. Die hier gezeigten Modelle werden in Python mit Keras und TensorFlow 2 erstellt. Für das Verständnis des Artikels ist der Code nicht zwingend notwendig, er kann beim Lesen übersprungen werden.
Das MNIST-Dataset
Die MNIST-Daten wurden ursprünglich vom National Institute of Standards and Technology (NIST) veröffentlicht. Das MNIST-Dataset ist eine modifizierte Teilmenge dieser Daten, die oft für Beispiele und Übungen verwendet wird. Die Keras API enthält eine Funktion, um dieses "Toy"-Dataset [Keras-Datasets] zu laden.
Variable | Dimension | Kommentar
-------------+-----------------+--------------------------
X_train_raw | (60000, 28, 28) | Bilder der Trainingsdaten
X_test_raw | (10000, 28, 28) | Bilder der Testdaten
y_train_raw | (60000,) | Label der Trainingsdaten
y_test_raw | (10000,) | Label der Testdaten
Das Dataset besteht aus 60.000 Bildern für das Training und weiteren 10.000 Bildern für den Test. Die Bilder selbst haben eine Größe von 28 * 28 Pixeln und 256 Graustufen. Zusätzlich enthält das Dataset die erwarten Werte 0-9 (Label) für die Trainings- und Testdaten. Mit dem folgenden Code werden einige der Bilder zusammen mit dem erwarteten Wert (Label) angezeigt.
Daten normalisieren
Bevor mit TensorFlow und der Keras-API ein Modell erstellt wird, werden die Daten in ein geeignetes Format gebracht werden. Die einzelnen Bilder sind aktuell zweidimensionale Arrays (Matrizen). Für das Modell werden diese in eindimensionale Arrays (Vektoren) umgewandelt. Zusätzlich wird der Wertebereich der Pixel (Features) auf den Bereich von 0 bis 1 normalisiert.
Als Ergebnis werden die Ziffern 0 bis 9 erwartet. Auch die erwarteten Werte (Label) werden konvertiert. Dazu wird das One-Hot-Encoding verwendet. Dabei wird für jeden der möglichen 10 Werte eine einzelne Spalte angelegt. Eine dieser Spalten enthält dann immer eine 1, während alle anderen eine 0 enthalten.
Zur Verdeutlichung wird das Bild der Ziffer 7, der Wert des Labels im Original und die Werte nach der On-Hot-Kodierung ausgegeben.
Original Label: 7
One-Hot-Encoding: [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
Modell erstellen und trainieren
Als nächstes wird mit der Keras API ein Modell erstellt und mit den Trainingsdaten trainiert. Die Qualität des Modells wird mit den Testdaten ermittelt. Als Kennzahl wird hier die Genauigkeit (Accuracy) verwendet. Das ist der Prozentsatz der Datensätze, die vom trainierten Modell richtig erkannt (klassifiziert) wurden.
Train on 60000 samples
Epoch 1/50
60000/60000 [==============================] - 1s 12us/sample - loss: 1.2746 - accuracy: 0.6949
Epoch 2/50
60000/60000 [==============================] - 1s 12us/sample - loss: 0.7139 - accuracy: 0.8406
...
Epoch 50/50
60000/60000 [==============================] - 1s 14us/sample - loss: 0.3093 - accuracy: 0.9140
10000/10000 [==============================] - 0s 28us/sample - loss: 0.2987 - accuracy: 0.9171
Genauigkeit Testdaten: 0.9171000123023987
Das Modell hat eine Genauigkeit von ca. 92%. Für eine zuverlässige Handschrifterkennung ist dieser Wert noch zu gering. Für den geringen Aufwand, der bis jetzt in die Entwicklung des Modells gesteckt wurde, ist dies bereits ein sehr guter Wert.
Durch Optimierungen an den Daten (Feature-Engineering), am Modell und an den verwendeten Parametern (Hyperparameter-Optimierung) kann dieser Wert noch deutlich gesteigert werden. Auf der Keras-Homepage gibt es ein Beispiel, das mit dem MNIST-Dataset eine Genauigkeit von ca. 99% erreicht [MNIST-99%]. Um mit einem Modell einen so guten Wert zu erreichen, wird dann wieder der Mensch mit seiner Intelligenz und Kreativität benötigt.
In diesem Artikel geht es nicht darum, das bestmögliche Ergebnis zu erzielen! Vielmehr soll gezeigt werden, wie sich die Ergebnisse verändern, wenn ein Modell mit unerwarteten Daten konfrontiert wird.
Bilder klassifizieren
Mit dem folgenden Code werden einige Bilder klassifiziert. Die erwarteten und die vorhergesagten Werte werden zusammen mit dem Bild ausgegeben. Bei einer falschen Klassifikation wird der Text in Rot ausgegeben.
Für diese Beispieldaten wurde die Ziffer 5 einmal nicht korrekt erkannt. Hier hat das Modell eine 6 statt einer 5 vorhergesagt. Ein Fehler bei 20 Vorhersagen entspricht einer Genauigkeit von 95% und war bei der zuvor berechneten Genauigkeit von ca. 92% zu erwarten.
Abweichende Daten
Was passiert jetzt, wenn sich die Eingabedaten auf unerwartete Weise ändern?
Wie würde zum Beispiel ein Schüler der zweiten Klasse reagieren, wenn er einen Text lesen soll, der auf dem Kopf steht? Vermutlich dauert es einen Moment, aber einfache Texte wird er sicherlich nach kurzer Zeit lesen können. Auf keinen Fall wird er ein weiteres Jahr zur Schule gehen müssen, um es zu lernen.
Aber wie reagiert das Modell, wenn es mit umgedrehten Bildern konfrontiert wird?
Bilder um 180-Grad drehen
Für das Experiment werden die Bilder der Testdaten gedreht und normalisiert. Die gedrehten Bilder werden dann verwendet, um mit dem ersten Modell die Genauigkeit zu berechnen und einige Bilder zu klassifizieren. Zur Erinnerung: Das Modell wurde nur mit den nicht gedrehten Bildern trainiert.
10000/10000 [==============================] - 0s 20us/sample - loss: 5.1361 - accuracy: 0.1948
Genauigkeit original: 0.9165Genauigkeit gedreht : 0.1948
Anhand des Plots der Zahlen sind einige Vorhersagen des Modells leicht nachvollziehbar. Bei der 6 und bei der 9 ist es auch für einen Menschen schwer, den richtigen Wert zu erkennen. Hier fällt aber auf, dass eine 6 als 3 und die 9 zweimal als 4 klassifiziert wurde.
Bei der 0 und der 1 ist es eigentlich egal, ob Sie gedreht werden. Eine 1 wird vom Modell aber als 8 klassifiziert.
Die Ergebnisse für diese 1 werden jetzt genauer untersucht.
TensorFlow berechnet für jede mögliche Klasse (0-9) die Wahrscheinlichkeit, dass das Bild dieser Klasse entspricht. Diese Werte werden als nächstes für das originale und das gedrehte Bild der 1 ausgegeben.
Beim originalen Bild ist das Modell zu fast 100% sicher, dass es eine 1 ist. Beim gedrehten Bild, sind die Werte nicht so eindeutig. Hier hat das Modell für die 8 eine Wahrscheinlichkeit von ca. 60% berechnet, während die 1 auf ca. 30% kommt.
Im direkten Vergleich ist bei den Bildern kein großer Unterschied erkennbar. Insbesondere haben die Bilder keine Ähnlichkeit mit einer 8.
Warum sieht die Maschine das anders?
Um diese Frage zu beantworten, werden zuerst einige Trainingsbilder der 8 ausgegeben.
Text(0.5, 0.98, 'Trainingsdaten mit Label 8')
Einige dieser Bilder haben eine starke Ähnlichkeit mit der 1 aus dem obigen Beispiel.
Die genauen Ursachen für die falsche Klassifizierung sind komplex und deren detaillierte Analyse würde den Rahmen dieses Artikels sprengen.
Eine stark vereinfachte Erklärung ist, dass das Modell beim Training Beispiele für die verschiedenen Ziffern auswendig gelernt hat. Die einzelnen Trainingsbilder enthalten aber keine Information darüber, wie "gut" oder "schlecht" eine abgebildete Ziffer ist. Beim Klassifizieren der gedrehten, "schlechten" 1 erkennt das Modell jetzt eine Ähnlichkeit mit der 8 und berechnet für die 8 eine höhere Wahrscheinlichkeit als für die 1.
An dieser Stelle ist der Mensch gefordert, die Ergebnisse zu interpretieren und das Problem zu lösen.
Training mit gedrehten Bildern
Das Modell zusätzlich mit den gedrehten Bildern zu trainieren, ist eine mögliche Lösung. Mit dem folgenden Code werden die Daten entsprechend vorbereitet und es wird ein zweites Modell erstellt und trainiert.
Train on 120000 samples
Epoch 1/50
120000/120000 [==============================] - 1s 12us/sample - loss: 1.3864 - accuracy: 0.6104
Epoch 2/50
120000/120000 [==============================] - 1s 12us/sample - loss: 0.9902 - accuracy: 0.7213
...
Epoch 50/50
120000/120000 [==============================] - 1s 11us/sample - loss: 0.6452 - accuracy: 0.8144
Für das erste und das zweite Modell wird jetzt die Genauigkeit ermittelt. In beiden Fällen werden die gedrehten Bilder zusammen mit den originalen Bildern zur Berechnung verwendet.
20000/20000 [==============================] - 0s 24us/sample - loss: 2.6978 - accuracy: 0.5566
Genauigkeit Modell 1: 0.5565520000/20000 [==============================] - 0s 24us/sample - loss: 0.6193 - accuracy: 0.8183
Genauigkeit Modell 2: 0.8183
Das erste Modell erreicht eine Genauigkeit von ca. 56%, wenn sowohl die originalen als auch die gedrehten Bilder berücksichtigt werden. Die Ergebnisse des zweiten Modells sind mit ca. 82% deutlich besser. Im Vergleich mit dem ersten Modell und den nicht gedrehten Bildern ist die Genauigkeit aber um ca. 10% schlechter geworden.
Die verbesserte Genauigkeit spiegelt sich auch in den Ergebnissen bei der Klassifizierung wider. Mit dem zweiten Modell wird die gedrehte 1 auch als 1 klassifiziert. Weiterhin schafft es das neue Modell, die gedrehten Neunen richtig zu erkennen. Von den insgesamt 40 Beispielen wurden 34 richtig erkannt, was 85% entspricht.
Das Modell zusätzlich mit gedrehten Bildern zu trainieren, ist nur eine mögliche Lösung. Es gibt noch viele weitere Optionen:
- Es werden zwei Modelle trainiert. Eines mit gedrehten und eines mit nicht gedrehten Ziffern. Das bessere Ergebnis wird als Vorhersage verwendet.
- Es wird ein Modell erstellt, dass die Orientierung der Ziffern erkennt. Gedrehte Bilder werden dann richtig gedreht und an das erste Modell (für nicht gedrehte Bilder) übergeben.
- Das Neuronale Netz wird um weitere Schichten (Layer) erweitert, so dass es bessere Vorhersagen liefert.
- Es werden die einzelnen Wahrscheinlichkeiten gegen einen Schwellwert geprüft. Wenn dieser nicht erreicht wird, dann gibt es keine Vorhersage, sondern eine Fehlermeldung.
Hier sind der Kreativität kaum Grenzen gesetzt. Das weitere Vorgehen hängt stark vom konkreten Anwendungsfall ab. Wenn nur einzelne Ziffern erkannt werden sollen, dann ist es sehr schwer, die Orientierung zu ermitteln. Bei längeren Ziffernfolgen oder ganzen Texten ist dies, unter der Voraussetzung, dass alle Zeichen dieselbe Orientierung haben, deutlich einfacher.
Fazit
Anhand des MNIST-Datasets wurde gezeigt, dass es sehr einfach ist ein Modell zu trainieren, das in der Lage ist, handgeschriebene Ziffern zu erkennen.
Es wurde aber auch deutlich, dass das Modell für Daten, die von den Trainingsdaten stark abweichen, sehr viele falsche Ergebnisse liefert. Das Problem aus diesem Artikel ist etwas konstruiert, kommt in der Praxis in vergleichbarer Form aber häufig vor. Ein konkretes Beispiel ist die KI in einem Auto, die auf ein neu eingeführtes Verkehrsschild reagieren muss.
Der Mensch wird bei weiteren Fortschritten beim Maschinellen Lernen ein wichtiger Faktor bleiben. Nur durch die Kombination von menschlicher und künstlicher Intelligenz können zuverlässige KI-Systeme entwickelt werden.
Sprechen Sie uns an, wenn Sie für Ihr KI-Projekt auf der Suche nach menschlicher Intelligenz sind. Wir können Ihnen weiterhelfen.
Quellen
[Burkov ,2019]
Yann LeCun, Corinna Cortes, Christopher J.C. Burges
The MNIST database of handwritten digits
http://yann.lecun.com/exdb/mnist/
[MNIST]
Andriy Burkov
The Hundred-Page Machine Learning Book
http://themlbook.com/
2019
[Keras-Datasets]
Keras Toy-Datasets
https://keras.io/api/datasets/
MNIST digits classification dataset
https://keras.io/api/datasets/mnist/
[MNIST-99%]
Simple MNIST convnet
https://keras.io/examples/vision/mnist_convnet/