2017-05-13 2 views
1

Wenn ich Dropout-Mechanismus für LSTM verwendet, führt die Rouge Punktzahl und Verlust von keinem Dropout-Modell besser als Modell mit Dropout. Also frage ich mich, ob mein Dropout-Code korrekt ist? Ich verwende tensorflow 0,12Wie DropoutWrapper in LSTM Training und Decodierung

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) 

Beim Training I gesetzt diejenigen prob halten den Wert I wie 0,5 verwenden sein wird, wenn der Verlust der Trainingssatz und Validierungs Set Computing I halten sie als 0,5, aber in der Decodierschritt I 1 verwenden , die nichts ausgelassen haben. Hab ich recht?

Antwort

1

Fast!

Wenn Sie die Genauigkeit und Validierung berechnen, müssen Sie die keep_probability manuell auf 1.0 setzen, damit Sie bei der Evaluierung Ihres Netzwerks keine Ihrer Gewichtswerte löschen. Wenn Sie dies nicht tun, werden Sie den Wert, den Sie bisher in Ihrem Netzwerk trainiert haben, im Wesentlichen falsch berechnen. Dies könnte sich sicherlich negativ auf Ihre Acc/Val-Werte auswirken. Vor allem mit einer Dropout-Rate von 50%.

Ihre im Decodierschritt verwendete Dropout-Ebene ist optional und sollte mit ihnen experimentiert werden. Wenn Sie es verwenden, sollten Sie es auf etwas anderes als 1.0 setzen. Um die Passanten zu rekapitulieren, besteht die Idee hinter dem Dropout darin, die Werte von zufälligen Gewichtungen über Ihre Netzwerkgewichte zurückzusetzen, um die Wahrscheinlichkeit zu erhöhen, dass Neuronen nicht irrtümlich repariert werden (oder was auch immer Sie bevorzugen) Anpassung Ihres Netzwerks. Denken Sie daran, dass wir im Allgemeinen versuchen, unsere Netzwerke an eine Funktion anzupassen oder anzupassen. Da das Anpassen von Netzwerken im Grunde ein Optimierungsproblem ist, müssen wir uns Gedanken darüber machen, ob wir auf ein lokales Minimum (oder Maxima ... je nachdem, wie das Bild in Ihrem Kopf ausgerichtet ist) optimieren. Dropout ist also eine Form der Regularisierung, die uns hilft, Überanpassungen zu vermeiden.

Wenn jemand weitere Einsichten oder Korrekturen hat, bitte posten!