鴨川η

not δ

BidirectionalRNNはKerasだと1行でかける

2016年8月くらいのkerasのコミットで Bidirectional というRNNのラッパーのレイヤーが追加されています(該当ページ).

RNNは長さ の系列データ(自然言語とか)を 番目から順に 番目までを再帰的に計算するレイヤーです(KerasのRNN にあるSimpleRNN, GRU, LSTM の3種類が該当). いくつかの深層学習のモデル(有名な例を挙げるとGNMT)では,系列の先頭からRNNにいれるだけではなくて,逆順にも入れています. このようなRNNは,BidirectionalRNN (双方向RNN)と呼ばれています.

Kerasでは,RNNのラッパーレイヤーとしてBidirectionalというレイヤーが提供されており,他のレイヤーと同様に1行で記述可能です. 以下の最終行がBidirectionalレイヤーの使用例です.

from keras.layer import LSTM, Bidirectional
from keras.model import Sequential

model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5, 10)))

Bidirectionalの引数に双方向に処理するRNNのレイヤーを渡します. 注意点として,Bidirectionalにしたあとの2つテンソルに対する操作は, Bidirectionalの引数merge_modeに以下のどれか1つから選択する必要があります.デフォルトはconcatです.

  • 'sum': 要素和
  • 'mul': 要素積
  • 'concat': 結合
  • 'ave': 平均
  • None: 結合せずにlistを返す

ここにない操作,例えばcosine similarityやdot, などは行数が増えてしまいますが,Noneを指定してから,merge を使うことで可能になります.

より具体的な使用例はimdbのデータに対してBidirectionalなLSTMを使った公式サンプルコードがあるので,そちらを見ていただければと思います.