Github: https://github.com/batzner/indrnn
独立してリカレントニューラルネットワーク
独立リカレントニューラルネットワーク(IndRNN)の簡単なTensorFlow実装: Shuai Liらによるより長くより深いRNNの構築
概要
IndRNNでは、反復層のニューロンは互いに独立している。 基本RNNは、 h = act(W * input + U * state + b)
隠れ状態h
を計算する。 IndRNNsは、各ニューロンが最後の隠れ状態に接続された単一の反復重みを有することを意味する、要素ごとのベクトル乗算u * state
を使用する。
IndRNN
- ReLUアクティベーション機能で効率的に使用することができます。グラジェントを飽和させることなく、複数の繰り返し層を簡単にスタックできます。
- 同じ層のニューロンが互いに独立しているため、より良い解釈可能
- 各ニューロンの反復的な体重を調節することによって、消滅し、爆発する勾配を防止する
使用法
ind_rnn_cell.pyをプロジェクトにコピーします。
from ind_rnn_cell import IndRNNCell
# Regulate each neuron's recurrent weight as recommended in the paper
recurrent_max = pow(2, 1 / TIME_STEPS)
cell = MultiRNNCell([IndRNNCell(128, recurrent_max_abs=recurrent_max),
IndRNNCell(128, recurrent_max_abs=recurrent_max)])
output, state = tf.nn.dynamic_rnn(cell, input_data, dtype=tf.float32)
...
論文の実験
論文から「問題を追加する」スクリプトを再現するスクリプトについては、 examples / addition_rnn.pyを参照してください。 以下は、 addition_rnn.py
コードで再現された結果です。
100、500、1000のタイムステップでは、動作は図2の場合と似ています。 5000回のタイムステップでは、IndRNNは収束しません。 これは、繰り返し、入力、およびsoftmaxの重みの初期値が異なるためです。 これらはこの論文で言及されておらず、大きな違いを生むことが分かっています。
Sequential MNISTのようなより多くの実験は、次の日に続きます。
要件
- Python 3.4以降
- TensorFlow 1.5+