Python Keras(TensorFlow)で作る
深層学習(Deep Learning)時系列予測モデル(その5)

時系列Encoder-Decoder(Seq2Seq)モデルで複数先予測(解説編)

Python Keras(TensorFlow)で作る深層学習(Deep Learning)時系列予測モデル(その5)  時系列Encoder-Decoder(Seq2Seq)モデルで複数先予測(解説編)

売上などの時系列データを予測するモデルは、基本となるのは1期先予測(1-Step ahead prediction)ですが、実務では複数先予測(Multi-Step ahead prediction)が求められます。

ニューラルネットワークの場合、どうなるのでしょうか?

幾つかやり方があります。

その中の1つに、時系列の多変量予測モデルを1つ作る方法があります。言い換えると、目的変数yを多変量化(ベクトル化)し予測モデルを1つ作るということです。

前回お話ししました。

他にも予測方法があります。

その1つが、Seq2Seq とも呼ばれるEncoder-Decoder型RNN(LSTMやGRUを含む)モデルを構築し複数先予測をするというものです。

Encoder-Decoder型RNNは、Encoder層Decoder層RNNを組み込みます。

Pythonによる実装例をお話しする前に、時系列データに対するEncoder-Decoder型RNN(LSTMやGRUを含む)モデルKeras(TensorFlow)で作るときの作り方を、簡単に解説します。

時系列Encoder-Decoder型RNN

時系列データに対するEncoder-Decoder型RNN(LSTMやGRUを含む)モデルは、非常にシンプルです(たぶん……)。

過去の目的変数の値などの説明変数Encoder層へのインプットになります。

Decoder層から出力されるのは予測値で、未来の目的変数の値が出力されます。ここが複数先まで出力されるように作れば、複数先予測(Multi-Step ahead prediction)になります。

以前お話ししましたが、LSTMは2つの情報を持ちます。

  • ユニットの記憶セル(c)
  • ユニットの出力値(h)

RNN層のreturn_sequencesとreturn_stateの設定

Keras(TensorFlow)RNN(LSTMやGRUを含む)には、いくつかのパラメータがあります。その中に、出力に関する以下の2つのパラメータがあります。

  • return_sequences
  • return_state

このreturn_sequencesreturn_stateの設定の仕方で、出力されるものが異なります。

以下の4パターンです。

 

return_sequences return_state
パターン1 False False
パターン2 True False
パターン3 False True
パターン4 True True

簡単に各パターンで出力されるものを説明します。

パターン1(両方ともFalse)は、基本となる設定(デフォルト)で、ユニットの最後の出力が吐き出されます。

パターン2(return_sequencesのみTrue)は、シーケンスの出力(期ごとの出力)が吐き出されます。

パターン3(return_stateのみTrue)は、ユニットの最後の状態が吐き出されます。

パターン4(両方ともTrue)は、シーケンスの出力(期ごとの出力)とユニットの最後の状態が吐き出されます。

では、今回の時系列Encoder-Decoder型RNNの場合、どうすればいいでしょうか?

例えば、今回は次のように設定することにします。

  • Encoder層:パターン1(両方ともFalse)もしくはパターン3(return_stateのみTrue)
  • Decoder層:パターン2(return_sequencesのみTrue)

例えば、Encoder層のRNNユニットが100個ある場合には、RNNユニットの最後の出力と記憶セルの状態が、そのユニットの数だけ出力されることになります。

ちなみに、記憶セル(c)simpleRNNGRUにはありません。ですので、利用するRNNLSTMなのかsimpleRNNなのかGRUなのかで、ちょっとEncoder層からDecoder層へデータを渡すとき、ちょっと注意が必要になります。LSTMEncoder層パターン3(return_stateのみTrue)がいいでしょう。記憶セル(c)の情報をDecoder層に渡すためです。記憶セル(c)のないsimpleRNNGRUパターン1(両方ともFalse)でいいでしょう。

Decoder層にRepeatVectorとTimeDistributedを仕込む

今回の命題は、複数先予測を実現するモデルを構築することです。

例えば、12期先までの複数先予測は、1期先予測を12回繰り返すことで可能になります。

RepeatVectorTimeDistributedで、このことが実現していきます。

使い方を簡単に説明すると、Decoder層RNN層の前後をRepeatVectorTimeDistributedで挟みます。

RepeatVector

RNN(return_sequencesのみTrue)

TimeDistributed

では、RepeatVector は何でしょうか?

RepeatVector設定した長さ分だけ処理を繰り返します

例えば、12期先を予測したい場合、12回繰り返すことになります。

ここで、Encoder層のRNNユニットが100個ある場合には、100×12だけの出力が生まれます。1期先予測用(h_{t+1})が100個、2期先予測用(h_{t+2})が100個、…、12先予測用(h_{t+12})が100個といった具合です。

各期先の予測値を、この100個の出力をもとに1つだけ作ります。

そのことを実現するのがTimeDistributedです。

TimeDistributedは、時間方向に繰り返しこのような処理を実施し、各期の予測値つまり複数先予測(Multi-Step ahead prediction)を求めていきます。

整理すると……

比較的単純な時系列Encoder-Decoder型RNNは次のような構成になります。

Input sequence(入力データ)

Encoder層(RNN:return_stateのみTrue)

Decoder層

↓ RepeatVector
↓ ↓
↓ RNN:return_sequencesのみTrue
↓ ↓
↓ TimeDistributed

複数先予測(Multi-Step ahead prediction)

以下は、Keras(TensorFlow)で構築したときの構造図で、Pythonから出力されたものです。

まとめ

今回は、時系列データに対するEncoder-Decoder型RNN(LSTMやGRUを含む)モデルKeras(TensorFlow)で作るときの作り方を、簡単に解説しました。

次回は、Pythonによる実装例をお話しします。

Python Keras(TensorFlow)で作る深層学習(Deep Learning)時系列予測モデル(その6) 時系列Encoder-Decoder(Seq2Seq)モデルで複数先予測(実践編)