2017-05-13 9 views
1

lstmにドロップアウトメカニズムを使用した場合、ルーグスコアとドロップアウトなしモデルの損失はドロップアウトのあるモデルよりも優れています。だから私はドロップアウトコードが正しいのだろうか?私はtensorflow 0.12LSTMのトレーニングとデコードでDropoutWrapperを使用する方法

cellClass = tf.nn.rnn_cell.LSTMCell 
    for layer_i in xrange(hps.enc_layers): 
    with tf.variable_scope('encoder%d'%layer_i), tf.device(
     self._next_device()): 
     #bidirectional rnn cell 
     cell_fw = cellClass(
      hps.num_hidden 
      ,initializer=tf.random_uniform_initializer(-0.1, 0.1, seed=123), 
      state_is_tuple=False 
    ) 
     cell_bw = cellClass(
      hps.num_hidden 
      ,initializer=tf.random_uniform_initializer(-0.1, 0.1, seed=113), 
      state_is_tuple=False 
    ) 
     cell_fw = tf.nn.rnn_cell.DropoutWrapper(cell_fw, input_keep_prob=hps.input_dropout, output_keep_prob=hps.output_dropout) 
     cell_bw = tf.nn.rnn_cell.DropoutWrapper(cell_bw, input_keep_prob=hps.input_dropout, output_keep_prob=hps.output_dropout) 
     (emb_encoder_inputs, fw_state, _) = tf.nn.bidirectional_rnn(
      cell_fw, cell_bw, emb_encoder_inputs, dtype=tf.float32, 
      sequence_length=article_lens) 
    #decoder 
    cell = cellClass(
     hps.num_hidden 
     ,initializer=tf.random_uniform_initializer(-0.1, 0.1, seed=113), 
     state_is_tuple=False 
     ) 
    cell=tf.nn.rnn_cell.DropoutWrapper(cell, input_keep_prob=hps.input_dropout, output_keep_prob=hps.output_dropout) 
    decoder_outputs, self._dec_out_state, self.cur_attns, self.cur_alpha = seq2seq.attention_decoder(
     emb_decoder_inputs, self._dec_in_state, self._enc_top_states, 
     cell, num_heads=1, loop_function=loop_function, 
     initial_state_attention=initial_state_attention) 

使用私はトレーニングセットは、それらが私は0.5のように使用する値であることがPROBを維持する場合、訓練セットと検証セットの損失を計算するとき、私は0.5としておくが、復号化ステップでI 1を使用しますそれは何も落とさなかった。私は正しいですか?

答えて

1

ほぼ!

精度と検証を計算するときは、keep_probabilityを1.0に手動で設定して、ネットワークを評価しているときに実際に重量値を削除しないようにする必要があります。これをしないと、ネットワークを訓練した価値を誤って予測してしまいます。これは確かにあなたのacc/valのスコアに悪影響を与える可能性があります。特に50%のドロップアウト率。

デコードステップで使用されるドロップアウトレイヤーはオプションであり、実験を行う必要があります。それを使用する場合は、1.0以外の値に設定することをお勧めします。

パスワビーを要約すると、ドロップアウトの背後にあるアイデアは、ニューロンが誤って固定されない(または好きな言葉で)確率が高くなるように、ネットワークウェイト全体のランダムウェイトの値をリセットすることです。あなたのネットワークのフィッティング。一般的に言えば、私たちのネットワークを近似したり、機能に合わせたりしようとしています。フィッティングネットワークは本質的に最適化の問題であるため、局所的な最小値(または最大値)に最適化することを心配する必要があります。したがって、ドロップアウトは正規化を回避するのに役立つ正規化の一種です。

さらなる洞察または訂正がある場合は、投稿してください。

関連する問題