Wie Time Series Forecasting mithilfe von Deep Learning funktioniert

Die Fortschritte, die in den Bereichen Natural Language Processing und Computer Vision mithilfe von Deep Learning in den letzten Jahren gemacht wurden, sind beeindruckend. Das ist vor allem sogenannten sequentiellen Modellen zu verdanken. Solche Modelle lassen sich ebenso für die Vorhersage von Zeitreihen (Time Series Forecasting) verwenden. 

In dem vorherigen Blog-Beitrag “Mittels Deep Learning Benzinpreise vorhersagen” wurde die Vorhersage einer Zeitreihe mithilfe der Encoder-Decoder Architektur am Beispiel von Benzinpreisen erläutert. Wie eine solche Encoder-Decoder Architektur für diesen Anwendungsfall im Detail funktioniert, soll in diesem Beitrag erläutert werden. Die Daten, die zur Vorhersage verwendet werden sollen, sind in folgendem Bild dargestellt. 

Stündliche Dieselpreise zweier Tankstellen über drei Tage. Mithilfe solcher Eingabedaten soll eine Vorhersage der Benzinpreise des nächsten Tages ermittelt werden.

Zunächst stellt sich die Frage wieso Deep Learning überhaupt für diese Zeitreihe verwendet werden sollte. Schließlich ist die Zeitreihenanalyse ein ganz eigenes Teilgebiet im Bereich Machine Learning, das schon existierte, bevor Deep Learning populär wurde. Häufig werden klassische, statistische Modelle wie ARIMA verwendet. Solche Modelle sind besonders für kurze, einzelne Zeitreihen geeignet. In dem vorgestellten Anwendungsfall mit den Benzinpreisen liegen jedoch viele Millionen Preisdaten von unterschiedlichen Tankstellen vor. Bei solchen Datenmengen lassen sich mittels Deep Learning häufig die besten Ergebnisse erreichen. In der folgenden Grafik sind Preisdaten für zwei Tankstellen dargestellt.

Encoder-Decoder Architektur

Die Encoder-Decoder Architektur gilt heute mit verschiedenen Erweiterungen als State-of-the-Art in vielen Bereichen. Sie bietet sich immer dann an, wenn aus einer Eingabesequenz eine Ausgabesequenz generiert werden soll. Vorteilhaft ist zudem, dass die Länge der beiden Sequenzen nicht identisch sein muss und jeweils variabel sein kann. Es muss sich also nicht im Vorfeld auf eine Länge beschränkt werden.

Encoder-Decoder Architektur für many-to-many Sequenzmodellierung in sogenannter “entrollter” Darstellung. x1, x2 und x3 sind Eingaben einer Zeitreihe in dieselbe RNN-Zelle zu unterschiedlichen Zeitpunkten. Ebenso sind y1 und y2 die Ausgaben derselben RNN-Zelle.

Eine solche Architektur besteht aus einem Encoder und einem Decoder. Diese bestehen jeweils aus einer (oder mehreren) sogenannten Recurrent Neural Network (RNN) Zelle. Diese zeichnet sich dadurch aus, dass stets ein interner Zustand zwischen den jeweiligen Zeitschritten weitergegeben wird. Von diesen RNN Zellen gibt es viele verschiedene Versionen. In den allermeisten Fällen wird jedoch eine der folgenden drei Zellen verwendet:

  • Minimalversion einer Recurrent Neural Network Zelle
  • Long Short-Term Memory (LSTM) Zelle
  • Gated Recurrent Unit (GRU) Zelle

Funktionsweise einer RNN-Zelle

Die Minimalversion einer RNN Zelle funktioniert fast genauso wie ein gewöhnliches neuronales Netz. Sie besteht lediglich aus einer Ebene mit anschließender Aktivierungsfunktion. Die RNN-Zelle unterscheidet sich nur darin, dass nicht nur die Zeitreihendaten diese Ebene durchlaufen sondern ebenfalls der interne Zustand des letzten Zeitschritts ht-1. Das Ergebnis nach Durchlaufen der Ebene ergibt anschließend sowohl die Ausgabe der Zelle für diesen Zeitschritt, wie auch den internen Zustand für den nächsten Zeitschritt ht.

Legende für die RNN-Zell Diagramme. Die Minimalversion der RNN-Zelle besitzt noch keine Pointwise (elementweise) Operation.

Diese Minimalversion bringt jedoch einen entscheidenden Nachteil mit sich: Das Problem der explodierenden respektive verschwindenden Gradienten während des Trainingsprozesses. Das führt dazu, dass diese Minimalversion für lange Sequenzen ungeeignet ist. Darum wird sie heute eher selten verwendet.

Das Problem wurde mit der Long Short-Term Memory Zelle weitestgehend gelöst. Die LSTM Zelle führte in den letzten Jahren zu erstaunlichen Fortschritten in den verschiedensten Bereichen. 

Long Short-Term Memory Zelle

Die LSTM-Zelle unterscheidet sich vor allem dadurch, dass ein interner Speicher c eingeführt wird. Dieser ist nicht identisch mit der Ausgabe der Zelle. Diese Zelle ist deutlich komplizierter als die Minimalversion. Schaut man sich jedoch die Teile einzeln an, so wird die Funktionsweise der Zelle schnell verständlich.

Forget-Gate der Long Short-Term Memory Zelle

Der erste Teil der Zelle ist das sogenannte Forget-Gate. Dieses ist in der Lage Teile des internen Speichers zu löschen. Welche Teile gelöscht werden, entscheidet sich aus dem Ergebnis einer Ebene mit anschließender Sigmoid-Aktivierungsfuntion. Die Ausgabe dieser Aktivierungsfunktion liegt stets zwischen 0 und 1. Für alle Elemente, dessen Wert nahe der 0 liegt, wird der dazugehörige interne Speicher gelöscht.

Input/Update-Gate der Long Short-Term Memory Zelle

Der zweite Teil der LSTM-Zelle ist für das Verändern des internen Speichers verantwortlich. Hier werden zwei unterschiedliche Ebenen verwendet. Eine Ebene mit Sigmoid-Aktivierungsfunktion und eine mit hyperbolischer Tangens-Aktivierungsfunktion. Die erste Ebene entscheidet darüber, ob die jeweiligen Elemente des internen Speichers verändert werden. Die zweite Ebene entscheidet wie die Elemente verändert werden.

Output-Gate der Long Short-Term Memory Zelle

Der dritte Teil der LSTM-Zelle ist entscheidend dafür, wie die Ausgabe der Zelle ht aussieht. Dieser Teil besitzt ebenfalls eine Ebene eines neuronalen Netzes.

Die wesentlich größere Komplexität der LSTM-Zelle gegenüber der Minimalversion ist zugleich ihr Nachteil. In jeder Ebene eines neuronales Netz wird eine Parametermatrix verwendet. Die LSTM-Zelle verfügt über drei weitere solcher Ebenen. Dementsprechend sind deutlich mehr Rechenzeit sowie größere Datenmengen erforderlich. Aus diesem Grund wird häufig die Gated Recurrent Unit Zelle verwendet. 

Gated Recurrent Unit Zelle

Die GRU-Zelle benötigt lediglich drei Parametermatrizen, erzielt aber häufig ähnlich gute Ergebnisse wie die LSTM-Zelle. Sie unterscheidet sich außerdem dadurch, dass sie keinen internen Speicher verwendet.

Reset-Gate der Gated Recurrent Unit Zelle

Die GRU-Zelle lässt sich in zwei Teile unterteilen. Der erste Teil ist das Reset-Gate. Dieses entscheidet darüber, welcher Anteil der Information aus dem letzten Zeitschritt ht-1 vergessen werden soll. Die Funktionsweise ist ähnlich dem Forget-Gate der LSTM-Zelle.

Update-gate der Gated Recurrent Unit Zelle

Das Update-Gate entscheidet welcher Anteil der Information aus dem letzten Zeitschritt ht-1, sowie aus der Eingabe des derzeitigen Zeitschritts xt, in die nächsten Zeitschritte übernommen werden soll. Das Ergebnis der Ebene mit Sigmoid-Aktivierungsfunktion entscheidet, wie sich der interne Zustand ht dieses Zeitschritts zusammensetzt. Liegt der Wert zt fast bei 1, so bleibt der interne Zustand ht nahezu unverändert. Liegt er fast bei 0, so wird der interne Zustand überwiegend durch einen neuen Wert ersetzt. 

Erweiterung der Architektur

Die zuvor beschriebene Encoder-Decoder Architektur ist mithilfe einer LSTM- oder einer GRU-Zelle bereits in der Lage, sehr präzise die Benzinpreise des nächsten Tages oder der nächsten Tage vorherzusagen. Jedoch gibt es zahlreiche Möglichkeiten das Modell noch zu erweitern. Eine Möglichkeit ist das Verwenden von weiteren Features:

  • Zeitreihen-basierte Features: Beispielsweise die durchschnittlichen, stündlichen Benzinpreise von Tankstellen der gleichen Marke oder von in der Nähe befindlichen Tankstellen. In diesem Fall würde statt einer univariaten Zeitreihe eine multivariate Zeitreihe verwendet, welche die Eingabe der RNN-Zelle darstellt.
  • Nicht-Zeitreihen-basierte Features: Etwa die Marke der Tankstelle, Standort der Tankstelle oder die ID der Tankstelle. Solche Features lassen sich ebenfalls als Eingabe für die RNN-Zelle verwenden. Da diese jedoch nicht auf Zeitreihen basieren, ist es besser die Architektur um ein anschließendes neuronales Netzwerk zu erweitern.

Erweiterte Encoder-Decoder Architektur. Die Ausgabe der RNN Zelle wird mit Features konkateniert, die nicht auf Zeitreihen basieren. Anschließend wird ein neuronales Netz (MLP) verwendet, welches die endgültigen Vorhersagen generiert.

Die ID der jeweiligen Tankstelle wird als Nicht-Zeitreihen-basiertes Feature verwendet. Das Standardverfahren, um kategorische Features verwenden zu können, ist das sogenannte One-Hot-Encoding. Dies ist jedoch aufgrund der hohen Anzahl an Tankstellen in diesem Fall nicht praktikabel. Stattdessen wird eine sogenannte Embedding-Matrix verwendet, die während des Trainingsprozesses ebenfalls optimiert wird. Diese Matrix weist jeder Tankstelle einen eigenen Vektor zu, der dann vom anschließenden neuronalen Netz als Eingabe verwendet wird.

Erweiterter Teil der Architektur. Der Embedding-Vektor der Tankstelle wird mit der Ausgabe des Decoders konkateniert und anschließend als Eingabe für ein neuronales Netz verwendet.

Vorhersage der Benzinpreise

Die Teilung der Daten in Trainings-, Validierungs- und Testdatensatz erfolgt zeitbasiert. Und zwar so, dass die Validierungsdaten und die Testdaten jeweils aus neueren Zeiträumen ausgewählt werden. Die Länge der Eingabesequenz beträgt 72 Stunden und die Länge der Ausgabesequenz ist auf 24 Stunden festgelegt. Die Daten werden so vorbereitet, dass sich dieser 96-Stunden-Zeitraum bei den Datenreihen einer Tankstelle niemals überlappt. Für das Netzwerk werden GRU Zellen genutzt.

Stündliche Dieselpreise zweier Tankstellen über drei Tage (rot) und Vorhersage des Preises für den nächsten Tag (grün).

Auf dem Testdatensatz erreicht der mittlere absolute Fehler einen Wert von 1,3 Cent. Dies ist beeindruckend, da das Modell nur auf einem Bruchteil der Daten trainiert wurde und nur sehr geringfügig Hyperparameter tuning betrieben wurde. Hier liegt also noch viel Potenzial verborgen, das Modell mit wenig Aufwand spürbar zu verbessern.

Auch aus anderen Gründen ist zu erwarten, dass die Performance des Modells noch deutlich gesteigert werden kann. Dazu gehören, wie erwähnt, weitere Features oder das Verwenden von Regularisierung. Außerdem gibt es noch eine Vielzahl an Erweiterungen von Recurrent Neural Network Architekturen, die sich in anderen Bereichen bewährt haben. Zu den bekanntesten Erweiterungen gehören:

  • Stacking: Innerhalb des Encoders und des Decoders können mehrere übereinander gestapelte RNN-Ebenen statt nur einer einzelnen verwendet werden.
  • Bidirektionales-RNN: Statt die Eingabesequenz innerhalb des Encoders nur in eine Richtung zu durchlaufen, kann sie ebenfalls in die entgegengesetzte Richtung durchlaufen werden. Die Ergebnis-Vektoren der beiden Durchläufe werden anschließend gemittelt.
  • Attention-Mechanismus: Der Attention-Mechanismus unterstützt den Decoder um noch besser längere Sequenzen vorhersagen zu können. Das geschieht, indem die internen Zwischenzustände des Encoders jedes Zeitschrittes verwendet werden. Dem Decoder werden in jedem Dekodier-Schritt einige Zwischenzustände des Encoders bereitgestellt, welche er in dem jeweiligen Schritt besonders beachten soll.

Wie sich also zeigt, lassen sich mit Recurrent Neural Networks ebenfalls vielversprechende Ergebnisse für die Vorhersage von Zeitreihen erreichen. Insbesondere dann, wenn große Datenmengen von verschiedenen Zeitreihen miteinander kombiniert werden können. 

devoteam

Contact

Peter Klauke