Kerasで双方向LSTMを使う方法(エラーの回避方法)

ここでは,Kerasで双方向LSTM(Bidirectional LSTM)を用いる方法を紹介します。

With a Bidirectional LSTM layer, you can see the improvement in accuracy with fewer epochs.

双方向LSTM層を用いると,より少ないエポック数で精度の改善を得ることができます。

ただし,私が実験した限りでは,通常のLSTM層を単に双方向LSTMに変えただけでは,予測結果の著しい改善は見られませんでした。

model = Sequential()
model.add(Embedding(len(char_indices)+1,
                    300,
                    batch_size=(seq_length-time_step)*batch_size,
                    weights=[embedding_matrix],
                    mask_zero=True,
                    trainable=False))
model.add(Bidirectional(LSTM(512,
                             dropout=0.15,
                             return_sequences=True),
                             merge_mode='concat'))
model.add(Bidirectional(LSTM(512,dropout=0.15),merge_mode='concat'))
model.add(Dense(len(char_indices)+1, activation='softmax'))

双方向LSTM層がエラーを出すという書き込みがネット上に多くあるようですが,原因は双方向LSTM層ではなくreturn_sequencesです。

Dense層は二次元配列のみ受け取ることができます。しかし,LSTM層のreturn_sequences=Trueとすると, 3 次元の配列を出力します。これは,return_sequencesが一つのシーケンスに対して複数の出力を持つからです。その結果,以下のようなエラーを出します。

ValueError: Shapes (None, None) and (3500, None, 10500) are incompatible

これを解決する一つの方法は,LSTM層をもう一つ置くことです。2 つ目のLSTM層は 1 つ目のLSTM層から 3 次元の配列を受け取り,2 次元の配列を出力します。

2 つ目のLSTM層は 3 次元のデータを 2 次元に変換するためのものであり,学習にはあまり関係していないようです。しかし,エラーを回避するために必要です。このあたりは,今後Kerasがバージョンアップしたときに改善するかもしれません。