売上などの時系列データを予測するモデルは、基本となるのは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)で作るときの作り方を、簡単に解説します。
Contents
時系列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_sequencesとreturn_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)はsimpleRNNやGRUにはありません。ですので、利用するRNNがLSTMなのかsimpleRNNなのかGRUなのかで、ちょっとEncoder層からDecoder層へデータを渡すとき、ちょっと注意が必要になります。LSTMのEncoder層はパターン3(return_stateのみTrue)がいいでしょう。記憶セル(c)の情報をDecoder層に渡すためです。記憶セル(c)のないsimpleRNNとGRUはパターン1(両方ともFalse)でいいでしょう。
Decoder層にRepeatVectorとTimeDistributedを仕込む
今回の命題は、複数先予測を実現するモデルを構築することです。
例えば、12期先までの複数先予測は、1期先予測を12回繰り返すことで可能になります。
RepeatVectorとTimeDistributedで、このことが実現していきます。
使い方を簡単に説明すると、Decoder層のRNN層の前後をRepeatVectorとTimeDistributedで挟みます。
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による実装例をお話しします。