Open Source im professionellen Einsatz
Linux-Magazin 10/2017
© z_i_b_i, 123RF

© z_i_b_i, 123RF

KI-Automaten sollen Wertefolgen ermitteln

Immer der Reihe nach

2, 5, 7, 10, 12 – und welche Zahl kommt als nächste? Michael Schilli testet, ob sich von Psychologen erdachte Intelligenztests mit modernen KI-Automaten knacken lassen.

773

Neuronale Netzwerke leisten Großes, wenn es darum geht, in Eingangsdaten verrauschte Muster zu erkennen und sie eindeutigen Ergebnissen zuzuordnen. Wenn ein Dutzend Personen die Buchstaben A oder B in unterschiedlichen Handschriften in ein Formular eintragen, fieselt ein trainiertes Netzwerk die richtige Zuordnung raus. Und eine Mustererkennung für Nummernschilder vorbeizischender Fahrzeuge extrahiert auf den Fotos die Autokennzeichen, damit der Verkehrsminister auch genau weiß, wer wann wohin gefahren ist.

Hat ein neuronales Netzwerk aber einmal ausgelernt, ordnet es den gleichen Eingangsdaten immer das gleiche Ergebnis zu. Bei Aufgaben, die sich darum drehen, aus Zeit-diskreten Wertefolgen den folgenden Wert zu ermitteln, schneiden sie oft nicht optimal ab, besonders falls das Eingangssignal Schwankungen unbekannter Periodizität unterliegt.

In neuronalen Netzwerken justiert der Lernalgorithmus interne Gewichte anhand der Trainingsdaten, die sich aber zur Laufzeit nicht mehr ändern, also keine temporalen Änderungen in den Eingangsdaten berücksichtigen können, da der Automat sich keinen Zustand merkt. Zwar führen in so genannten Recurrent Neural Networks (RNN) interne Verbindungen wieder zurück zum Eingang und beeinflussen so den nächsten Eingabevektor, doch reicht das bei simplen Netzwerken nicht aus, um zeitliche Muster zu erkennen, die sich über mehrere Zyklen erstrecken.

Beim Psychologen

Ein Beispiel zum Vorhersagen von Sequenzen sind die von Psychologen verwendeten Intelligenztests (Abbildung 1), bei denen es für eine Ziffernfolge zu ermitteln gilt, welche Ziffer als nächste folgt. Ein Schulkind kann sagen, dass nach 2, 4, 6 die 8 folgt, aber wie sieht es mit der Folge 2, 5, 7, 10, 12 aus?

Abbildung 1: Ein Intelligenztest, bei dem der Kandidat eine Ziffernfolge ergänzen muss [2].

Abbildung 2 zeigt zwei Lernschritte und einen Testschritt für ein "Long Short-Term Memory"-Netzwerk (LSTM), das lernen soll, welche Zahl nach der 12 kommt. Im ersten Lernschritt in der ersten Reihe der Matrix erfährt es, dass auf die Kombination »2,5,7« immer eine »10« folgt. Die zweite Reihe weist der um einen Schritt verschobenen Teilfolge »5,7,10« als Ergebnis die 12 zu. Mit diesen Trainingsdaten justiert das LSTM-Netzwerk die Parameter seiner internen Zellen (Abbildung 3).

Abbildung 2: Ein- und Ausgabewerte zum Trainieren des LSTM-Netzwerks.
Abbildung 3: Aufbau der LSTM-Zelle.

Anders als beim neuronalen Netzwerk produziert nicht jeder Eingabewert einen Ausgabewert, sondern es merkt sich den aktuellen Zustand in einer Speicherzelle (Abbildung 4), um erst nach der – im vorliegenden Fall – dritten Eingabe und unter Auswertung des auf jedem Zeitschritt mitgeschleppten Zustands einen Ausgabewert (y(1)) zu produzieren.

Abbildung 4: Zeitlich aufeinanderfolgende Eingabewerte verändern zunächst nur den aktuellen Status und produzieren alle drei Zeitschritte eine Ausgabe.

Matrizen umkneten

Zur Implementierung des LSTM-Netzwerks greift Listing 1 auf die Python-Library »Keras« zu [3]. Da viele ihrer Funktionen Daten in Form von Matrizen entgegennehmen, bietet sich eine Erläuterung der Funktion »reshape()« aus der Numpy-Array-Library an. Einen eindimensionalen Numpy-Array, also einen Vektor, wandelt »reshape()« , wie Abbildung 5 zeigt, in Matrizen voreingestellter Dimensionen um.

Listing 1

iq

01 #!/usr/bin/python3
02 import numpy as np
03 from sklearn.preprocessing \
04         import StandardScaler
05 from keras.models import Sequential
06 from keras.layers import Dense, Activation
07 from keras.layers import LSTM
08 import os
09
10 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
11
12 def window(npa, n=2):
13     for start in range(npa.size-n+1):
14         yield npa[start:start+n:1]
15
16 input_size=3
17
18 seq= np.array(
19         [2,5,7,10,12]).astype('float64')
20
21 print("learn input: " + str(seq))
22
23 scaler = StandardScaler()
24 seq = seq.reshape(-1,1)
25 seq = scaler.fit_transform(seq)
26 seq = seq.reshape(-1)
27
28 X=np.array([])
29 y=np.array([])
30
31 for chunk in window(seq, n=input_size+1):
32     X=np.append(X, chunk[:-1])
33     y=np.append(y, chunk[-1])
34
35 X=X.reshape((-1,input_size,1))
36 y=y.reshape((-1,1))
37
38 model = Sequential()
39 model.add(LSTM(5,
40     input_shape=(input_size,1)))
41 model.add(Dense(1))
42 model.add(Activation("linear"))
43 model.compile(loss="mean_squared_error",
44         optimizer="rmsprop")
45 model.fit(X,y, epochs=500, verbose=0)
46
47 print("\nresults:")
48 for input in X:
49     input=input.reshape(1,input_size,1)
50     pred=model.predict(input)
51     print(scaler.inverse_transform(
52         input.reshape(-1,1)))
53     print(scaler.inverse_transform(
54         pred.reshape(-1,1)))
55
56 test = seq[-input_size::1]
57 print(scaler.inverse_transform(
58     test.reshape(-1,1)))
59 test=test.reshape(1,input_size,1)
60 y1=model.predict(test)
61 print(scaler.inverse_transform(
62     y1.reshape(-1,1)))
Abbildung 5: Ein Numpy-Array nimmt mit reshape() verschiedene Dimensionen an.

Dabei gibt der erste Parameter nach »reshape()« die Anzahl der Elemente der ersten Dimension an, gefolgt von der Anzahl der zweiten und so weiter. Da die Anzahl der Elemente in der ersten Dimension implizit feststeht, nachdem tiefere Dimensionen festgelegt sind, wird Erstere oft als »-1« angegeben. Dann füllt die Library die Matrix mit den übrigen Elementen auf.

Mit nur einem Parameter aufgerufen (»reshape(-1)« ), macht die Methode aus einer verschachtelten Array-Struktur wieder einen eindimensionalen Vektor.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Tensorflow erreicht Version 1.0

    Tensorflow 1.0 verspricht Stabilität für sein Python API und beschleunigt die aktuelle und zukünftige Arbeit mit der Einführung des domain-spezifischen XLA Compilers.

  • Snapshot

    Anhand von Trainingsdaten in Form von täglich im Auto erfassten Kilometerständen versucht Michael Schillis KI-Programm Muster im Fahrverhalten zu erkennen und Prognosen abzugeben.

  • Virtueller Bühnenbildner

    Ob Bildschirmschoner, CAD-System oder Flugsimulator - Programme mit dreidimensionalen Effekten sind auf den meisten Computern zu finden, aber schwer zu schreiben. Ein neues Projekt macht Letzteres leichter und öffnet Skript-Programmierern den Vorhang für 3D-Effekte in ihrer Software.

  • Im Rampenlicht

    Ein überzeugendes Bühnenbild sorgt für die passende Atmosphäre im Theater. Auch am Computer machen Anstrich und Beleuchtung die Illusion von 3D-Modellen perfekt. Selbst einfache Skripte zaubern dank OpenGL mit Hilfe von Bitmaps und Beleuchtung Überraschendes auf den Schirm.

  • Machine Learning

    Der Arbeitgeber von Autor Chris Hinze litt wie vermutlich alle Homepage-Baukasten-Anbieter unter Spammern und illegalen Inhalten. Ein Praxisbericht, der auf der Theorie des Deep Learning beruht.

comments powered by Disqus

Ausgabe 10/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.