2017-07-17 6 views
4

私は最近、LayerNormBasicLSTMCellがLayer Normalizationとドロップアウトが実装されたLSTMのバージョンであることを発見しました。したがって、元のコードをLSTMCellをLayerNormBasicLSTMCellに置き換えました。この変更により、96%から〜92%までのテスト精度が低下しただけでなく、訓練に長時間(約33時間)かかる(元の訓練時間は約6時間)。エポックの数(10)、スタックされたレイヤの数(3)、隠れたベクトルサイズ(250)の数、ドロップアウトの保持の問題(0.5)、...すべてのパラメータは同じです。なぜLayerNormBasicLSTMCellはLSTMCellよりもはるかに遅く正確さが劣るのですか?

私の質問は次のとおりです。私はここで間違っていましたか? (LSTMCellを使用して)

私のオリジナルモデル:

# Batch normalization of the raw input 
tf_b_VCCs_AMs_BN1 = tf.layers.batch_normalization(
    tf_b_VCCs_AMs, # the input vector, size [#batches, #time_steps, 2] 
    axis=-1, # axis that should be normalized 
    training=Flg_training, # Flg_training = True during training, and False during test 
    trainable=True, 
    name="Inputs_BN" 
    ) 

# Bidirectional dynamic stacked LSTM 

##### The part I changed in the new model (start) ##### 
dropcells = [] 
for iiLyr in range(3): 
    cell_iiLyr = tf.nn.rnn_cell.LSTMCell(num_units=250, state_is_tuple=True) 
    dropcells.append(tf.nn.rnn_cell.DropoutWrapper(cell=cell_iiLyr, output_keep_prob=0.5)) 
##### The part I changed in the new model (end) ##### 

MultiLyr_cell = tf.nn.rnn_cell.MultiRNNCell(cells=dropcells, state_is_tuple=True) 

outputs, states = tf.nn.bidirectional_dynamic_rnn(
    cell_fw=MultiLyr_cell, 
    cell_bw=MultiLyr_cell, 
    dtype=tf.float32, 
    sequence_length=tf_b_lens, # the actual lengths of the input sequences (tf_b_VCCs_AMs_BN1) 
    inputs=tf_b_VCCs_AMs_BN1, 
    scope = "BiLSTM" 
    ) 

(LayerNormBasicLSTMCellを使用して)私の新しいモデル:

... 
dropcells = [] 
for iiLyr in range(3): 
    cell_iiLyr = tf.contrib.rnn.LayerNormBasicLSTMCell(
     num_units=250, 
     forget_bias=1.0, 
     activation=tf.tanh, 
     layer_norm=True, 
     norm_gain=1.0, 
     norm_shift=0.0, 
     dropout_keep_prob=0.5 
     ) 
    dropcells.append(cell_iiLyr) 
... 
+0

考え:[https://stackoverflow.com/questions/43234667/tf-layers-batch-normalization-large-test-error](this)が問題になりますか? 平均と分散が 'tf.layers.batch_normalization'で自動的に更新されないようです。 'tf.contrib.rnn.LayerNormBasicLSTMCell'に同じ問題があるのだろうかと思います。 –

+0

@FariborzGhavamian、正規化関数(つまり、 'update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)'と 'tf.control_dependencies(update_ops):' ...)の両方に2番目の方法を使用しました。 –

+1

トレーニング時間について:私はtensorflowのウェブサイトでこれを見つけました:https://www.tensorflow.org/performance/performance_guide#common_fused_ops。 'fused'というパラメータを有効にして、12%-30%の速度を上げることができます。 –

答えて

0

トレーニング時間について:私はこのブログの記事に出くわした:http://olavnymoen.com/2016/07/07/rnn-batch-normalization。最後の図を参照してください。バッチ標準化された1stmは、バニラ1stmよりも3倍以上遅かった。作者は、その理由はバッチ統計計算であると主張している。

精度について:わかりません。

+0

私は非常に慎重に投稿を読んでいない、私はポストは、層の正規化(問題の1つではなく)バッチ正規化について話していると思いますか? –

+0

はい、投稿はバッチの正規化に関するものです。しかし、それと層の正規化との間の共通の根拠は、統計(平均値と分散)の計算です。統計は異なるデータ(BN:バッチオーバー、LN:レイヤー)に基づいて計算されているが、それにもかかわらず追加の計算コストがかかるようだ。 –

+0

統計情報(平均値または分散値)の計算にそれほどの時間がかかる理由(特にGPUの場合)はなぜわかりません。 –

0

dropout_keep_probには、定数値の代わりにプレースホルダを割り当てる必要があります。トレーニングでは0.5、推論では1.0を割り当ててみてください。ちょうど推測。

関連する問題