Inhaltsverzeichnis

Navigation: 📈 Teil 1 - 📈 Teil 2 Loading ⌛Loading ⌛

📈 Zeitreihenvorhersage mit TensorFlow 2

🎯 In dieser Reihe erfährst du, wie du mit neuronalen Netzen Zeitreihen vorhersagen kannst und erhältst Einblicke in das Programmierer-Framework „TensorFlow“.

↩️ Zurück zum ersten Teil.

Inhaltsverzeichnis

1. Was ist TensorFlow?

Künstliche_Intelligenz in der Form von neuronalen Netzen wird in der Forschung und für zahlreiche Anwendungen eingesetzt. Das Schreiben von Programmen zum Erstellen, Trainieren, Auswerten und Anwenden von neuronalen Netzen ist aufwändig.

Damit nicht alle „das Rad neu erfinden“ müssen, gibt es mehrere Sammlungen von Programmcodestücken (sogenannte Frameworks) für neuronale Netze, die als Open_Source gekennzeichnet sind, d.h. frei genutzt werden können. Diese Open-Source-Frameworks werden von Freiwilligen (Community), Organisationen oder/und Firmen weiterentwickelt. Das vermutlich bekannteste und umfangreichste Neuronale-Netz-Framework ist TensorFlow. Z.B. nutzt Spotify TensorFlow, um Musikempfehlungen zusammenzustellen1).

Obwohl TensorFlow2) ursprünglich von Google für die Programmiersprache Python entwickelt wurde, ist TensorFlow mittlerweile für mehrere Programmiersprachen verfügbar, unter anderem auch für JavaScript.

Obwohl TensorFlow viel Programmierarbeit abnimmt, ist die Nutzung immer noch aufwändig und braucht viel Einarbeitungszeit. Das liegt daran, dass sich TensorFlow nur mit fortgeschrittenen JavaScript-Programmiertechniken und -konzepten nutzen lässt. Aus diesem Grund gibt es mittlerweile „Meta-Frameworks“, welche den Gebrauch von TensorFlow vereinfachen, wie z.B. Keras für Python oder ml5.js für JavaScript.

Die Programme in diesen Kapiteln nutzen direkt TensorFlow für JavaScript. Der Grund dafür liegt darin, dass das Meta-Framework ml5.js (im Gegensatz zu Keras) für unsere Zwecke zu viele Einstellungen für das Training von neuronalen Netzen vorgibt.

TensorFlow für JavaScript wird als Tensorflow.js bezeichnet. Auf der Tensorflow.js-Webseite gibt es Tutorials, Demos und bereits fertig trainierte neuronale Netze, welche frei genutzt werden dürfen. Eine Auflistung und Beschreibung aller TensorFlow.js-Komponenten ist auf Tensorflow.js API zu finden.

2. Herumexperimentieren mit TensorFlow.js

💡 Da die Handhabung von TensorFlow.js relativ aufwändig ist, wurden alle Programmteile, welche für die Erstellung und das Training der neuronalen Netze relevant sind, in die „Parametersektion“ ganz oben im Programmen verschoben. Somit musst du dich nicht vertieft mit den JavaScript-Konzepten von TensorFlow.js auseinandersetzen, sondern kannst dich auf die Möglichkeiten konzentrieren, welche TensorFlow.js dir bietet.

2.1 Layer und Activation

TensorFlow model mit layers und units3)

In TensorFlow wird ein neuronales Netz als model bezeichnet. TensorFlow nutzt per Default ein sogenanntes Feedforward Neural Network, welches aus mehreren layers (Schichten) aufgebaut ist. Jeder layer besteht aus mehreren units (Neuronen). Jeder unit besitzt eine activation (Aktivierungsfunktion).

Die beiden Sourcecode unten zeigen, wie in TensorFlow ein neuronales Netz aus mehren layer aufgebaut wird. Im Code links ist ein neuronales Netz mit nur einem Hidden Layer definiert, rechts ein neuronales Netz mit zwei Hidden Layers.

Jeder tf.layers.dense(...) Abschnitt stellt einen Hidden Layer dar. Der Input Layer wird gerade mit dem ersten Hidden Layer zusammen definiert durch die Zeile inputShape, wobei in den [ ]-Klammern die Anzahl der Eingangsgrössen (Input Neuronen) definiert wird (hier die Anzahl TIMESERIES_FEATURES plus Sinus und Cosinus der Tagesstunde). Das letzte tf.layers.dense(...) stellt den Output Layer dar. Alle weiteren Hidden Layer beinhalten keine inputShape-Zeile, diese kommt nur im ersten Hidden Layer vor. Um einen Hidden Layer hinzuzufügen oder zu entfernen, wird einfach ein tf.layers.dense(...) Abschnitt hinzugefügt oder entfernt und der Name hinter name entsprechend angepasst.

„Einfaches“ Modell „Deep Learning“ Modell
const MODEL_LAYERS = [
  tf.layers.dense({
    name: 'HiddenLayer1',
    inputShape: [TIMESERIES_FEATURES + 2],
    units: ANZAHL_HIDDEN_NEURONS,
    activation: 'tanh'
  }),
  tf.layers.dense({
    name: 'OutputLayer',
    units: 1,
    activation: 'linear'
  })
];
const MODEL_LAYERS = [
  tf.layers.dense({
    name: 'HiddenLayer1',
    inputShape: [TIMESERIES_FEATURES + 2],
    units: ANZAHL_HIDDEN_NEURONS,
    activation: 'relu'
  }),
  tf.layers.dense({
    name: 'HiddenLayer2',
    units: ANZAHL_HIDDEN_NEURONS,
    activation: 'relu'
  }),
  tf.layers.dense({
    name: 'OutputLayer',
    units: 1,
    activation: 'linear'
  })
];

Für jeden Hidden und Output Layer können andere Aktivierungsfunktionen gewählt werden. Die Aktivierungsfunktion wird nach activation eingetragen.

Activation
Die gängigen Aktivierungsfunktionen sind: elu, hardSigmoid, linear, relu, relu6, selu, sigmoid, softmax, softplus, softsign, tanh. Sie sind auf dieser Webseite beschrieben.
Die „advanced“ Aktivierungsfunktionen LeakyReLU, PReLU, ReLU sind in der Tensorflow.js API - Advanced Activation dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
✍ Auftrag – Layer und Activation
  1. Starte das Programm so wie es ist (1 Hidden Layer mit 'tanh' activation). Ändere die activation 'linear' im Output Layer nicht, diese activation erlaubt es beliebig grosse Zahlen vorherzusagen. Z.B. 'tanh' kann nur Zahlen im Bereich -1 und +1 produzieren.
  2. Verwende nun die 'relu' activation im Hidden Layer. Wie verändert sich das Resultat?
  3. Füge einen zweiten Hidden Layer hinzu. Wie verändert sich das Resultat?
  4. Spiele noch etwas mit verschiedenen Aktivierungsfunktionen und einem oder mehreren Hidden Layern herum.
  5. Loading ⌛Wenn du dir nun zutraust, verschiedene Aktivierungsfunktionen und ein oder mehrere Hidden Layer einzustellen, dann bestätige mit „Erledigt“ sonst hole Hilfe.

2.2 Optimizer und LOSS

Für das Training des neuronalen Netzes müssen der optimizer (Update- oder Lernalgorithmus) und der loss (Fehlerfunktion) festgelegt werden. Dies wird in TensorFlow im folgenden Code festgelegt.

const MODEL_COMPILE = {
  optimizer: tf.train.sgd(LERNRATE),
  loss: tf.losses.meanSquaredError
};

Nicht alle optimizer brauchen eine Lernrate. Z.B. kommt der aktuell sehr beliebte „adam“ Algorithmus ohne Lernrate aus. Dieser kann mit optimizer: tf.train.adam() verwendet werden.

Optimizer
Die TensorFlow.js optimizer sind auf TensorFlow.js API - Optimizers aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
Loss
Die TensorFlow.js loss Funktionen sind auf TensorFlow.js API - Training Losses aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
✍ Auftrag – Layer und Activation
  1. Starte das Programm so wie es ist.
  2. Verwende den „adam“ optimizer: optimizer: tf.train.adam(). Wie verändert sich das Resultat?
  3. Verwende den „huberLoss“ loss: tf.losses.huberLoss. Wie verändert sich das Resultat?
  4. Spiele noch etwas mit verschiedenen optimizern und loss herum
    ⚠️ Nicht alle werden funktionieren - egal.
  5. Loading ⌛Wenn du dir nun zutraust, verschiedene optimizer und loss einzustellen, dann bestätige mit „Erledigt“ sonst hole Hilfe.

3. Labor und Auftrag

Activation
Die gängigen Aktivierungsfunktionen sind: elu, hardSigmoid, linear, relu, relu6, selu, sigmoid, softmax, softplus, softsign, tanh. Sie sind auf dieser Webseite beschrieben.
Die „advanced“ Aktivierungsfunktionen LeakyReLU, PReLU, ReLU sind in der TensorFlow.js API - Advanced Activation dokumentiert (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
Optimizer
Die TensorFlow.js optimizer sind auf TensorFlow.js API - Optimizers aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
Loss
Die TensorFlow.js loss Funktionen sind auf TensorFlow.js API - Training Losses aufgelistet und beschrieben (linke Spalte, einfach etwas nach unten scrollen, dann erscheinen diese sogleich).
✍ Auftrag

💡 Die beiden untenstehenden Programme sind zum Experimentieren gedacht. Das neuronale Netz im roten Bereich nutzt die Zeitreihe + Sinus und Cosinus der Tageszeit. Das neuronale Netz im gelben Bereich nutzt nur die Zeitreihe und stellt somit die grössere Herausforderung dar. Die folgenden Aufträge können mit einem oder beiden Programmen durchgeführt werden.

  1. Vergleiche die folgenden beiden Ansätze:
    • „Traditioneller“ Ansatz: Möglichst gutes Resultat mit möglichst wenig Hidden Neuronen erzielen (mit nur 1 Hidden Layer). Häufig werden für diesen Ansatz genutzt: activation tanh, optimizer tf.train.sgd(LERNRATE), loss tf.losses.meanSquaredError.
    • Moderner „Deep Learning“ Ansatz: Mehr als ein Hidden Layer und genügend Hidden Neuronen verwenden. Häufig werden für diesen Ansatz genutzt: activation relu (in allen Hidden Layern), optimizer tf.train.adam(), loss tf.losses.meanSquaredError.
  2. Spiele mit allen Möglichkeiten etwas herum (Anzahl Epochen, Anzahl Zeitreihenpunkte, Anzahl der Hidden Layer und Neuronen, Aktivierungsfunktionen, optimizer und allenfalls Lernrate, loss). Versuche mit möglichst wenigen TIMESERIES_FEATURES auszukommen. Halte fest, mit welchen Einstellungen du dein bestes Resultat erzielen konntest.Loading ⌛
Zeitreihe mit Sinus und Cosinus der Tagesstunde

Nur Zeitreihe

Eigene Notizen

Loading ⌛

1)
Verschiedene Anwendungsbeispiele für TensorFlow sind zu finden auf https://www.tensorflow.org/about/case-studies
2)
TensorFlow-Webseite: https://www.tensorflow.org/
3)
eigene Darstellung, CC0 1.0