2016-06-01 27 views
6

Tensorflow bietet einen schönen LSTM-Wrapper.Regularisierung für LSTM in Tensorflow

rnn_cell.BasicLSTM(num_units, forget_bias=1.0, input_size=None, 
      state_is_tuple=False, activation=tanh) 

Ich möchte Regularisierung verwenden, sagen L2 Regularisierung. Allerdings habe ich keinen direkten Zugriff auf die verschiedenen Gewichtsmatrizen in der LSTM Zelle verwendet, so kann ich nicht explizit etwas tun, wie

loss = something + beta * tf.reduce_sum(tf.nn.l2_loss(weights)) 

Gibt es eine Möglichkeit, die Matrizen für den Zugriff oder Regularisierung verwendet irgendwie mit LSTM?

+0

Ich habe einen ganzen Prozess als Antwort auf Ihre Frage gestellt. Chk aus https://stackoverflow.com/questions/37869744/tensorflow-lstm-regularization/46761296#46761296 – sdr2002

Antwort

9

tf.trainable_variables gibt Ihnen eine Liste von Variable Objekten, die Sie verwenden können, um den L2-Regularisierungsterm hinzuzufügen. Beachten Sie, dass dies die Regularisierung für alle Variablen in Ihrem Modell hinzufügt. Wenn Sie den L2-Ausdruck nur auf eine Teilmenge der Gewichtungen beschränken möchten, können Sie name_scope verwenden, um Ihre Variablen mit spezifischen Präfixen zu benennen und diese später zum Filtern der Variablen aus der von zurückgegebenen Liste zu verwenden.

0

Tensorflow hat einige eingebaute und Hilfsfunktionen, die Sie L2 Normen für Ihr Modell gelten wie tf.clip_by_global_norm lassen:

# ^^^ define your LSTM above here ^^^ 

    params = tf.trainable_variables() 

    gradients = tf.gradients(self.losses, params) 

    clipped_gradients, norm = tf.clip_by_global_norm(gradients,max_gradient_norm) 
    self.gradient_norms = norm 

    opt = tf.train.GradientDescentOptimizer(self.learning_rate) 
    self.updates = opt.apply_gradients(
        zip(clipped_gradients, params), global_step=self.global_step) 

in Ihrem Trainingsschritt laufen:

outputs = session.run([self.updates, self.gradient_norms, self.losses], input_feed) 
6

ich tun das Folgende, aber das einzige, was ich weiß, ist, dass einige Parameter nicht mit L2, wie Batch-Norm-Parameter und Verzerrungen regularisiert werden. LSTMs enthält einen Bias-Tensor (trotz konzeptioneller Überlegungen hat es viele Verzerrungen, sie scheinen verkettet zu sein oder etwas für die Performance), und für die Batch-Normalisierung füge ich "noreg" in den Variablennamen ein, um es ebenfalls zu ignorieren.

loss = your regular output loss 
l2 = lambda_l2_reg * sum(
    tf.nn.l2_loss(tf_var) 
     for tf_var in tf.trainable_variables() 
     if not ("noreg" in tf_var.name or "Bias" in tf_var.name) 
) 
loss += l2 

Wo lambda_l2_reg der kleine Multiplikator ist, zum Beispiel: float(0.005)

Doing diese Auswahl (die die volle if in der Schleife ist zu verwerfen einige Variablen in der Regularisierung) einmal mir von 0.879 F1 Punktzahl springen gemacht 0.890 in einem Schuss der Code zu testen, ohne den Wert der Konfig lambda, gut dies war einschließlich der Änderungen für die Batch-Normalisierung und die Biases und ich hatte andere Vorurteile im neuronalen Netzwerk.

Nach this paper kann die Regularisierung der wiederkehrenden Gewichtungen mit explodierenden Gradienten helfen.

Auch, nach this other paper, würde Dropout besser zwischen gestapelten Zellen und nicht innerhalb von Zellen verwendet werden, wenn Sie einige verwenden.

Über das Problem des explodierenden Gradienten, wenn Sie Gradienten-Clipping mit dem Verlust verwenden, dem die L2-Regularisierung bereits hinzugefügt wurde, wird diese Regularisierung auch während des Clipping-Prozesses berücksichtigt.


P.S. Hier ist das neurale Netzwerk, an dem ich gerade arbeitete: https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs

Verwandte Themen