wake-up-neo.com

Regularisierung für LSTM im Tensorflow

Tensorflow bietet einen Nice LSTM-Wrapper an.

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

Ich möchte die Regularisierung verwenden, sagen wir L2-Regularisierung. Ich habe jedoch keinen direkten Zugriff auf die verschiedenen Gewichtungsmatrizen, die in der LSTM-Zelle verwendet werden, und kann daher nicht explizit so etwas tun

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

Gibt es eine Möglichkeit, auf die Matrizen zuzugreifen oder die Regularisierung irgendwie mit LSTM zu verwenden?

9
BiBi

tf.trainable_variables gibt Ihnen eine Liste von Variable-Objekten, die Sie zum Hinzufügen des L2-Regularisierungsausdrucks verwenden können. Beachten Sie, dass dies für alle Variablen in Ihrem Modell eine Regularisierung hinzufügt. Wenn Sie den L2-Term nur auf eine Teilmenge der Gewichtungen einschränken möchten, können Sie die Variablen mit name_scope mit bestimmten Präfixen benennen und diese anschließend verwenden, um die Variablen aus der von tf.trainable_variables zurückgegebenen Liste zu filtern.

10
keveman

Ich mache gerne folgendes, aber das einzige, was ich weiß, ist, dass einige Parameter es vorziehen, nicht mit L2 zu regulieren, wie Batch-Norm-Parameter und Voreingenommenheit. LSTMs enthält einen Bias-Tensor (obwohl er konzeptionell viele Vorurteile hat, sie scheinen verkettet zu sein oder etwas für die Leistung), und für die Batch-Normalisierung füge ich "noreg" im Namen der Variablen hinzu, um ihn 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

Dabei ist lambda_l2_reg der kleine Multiplikator, z. B. float(0.005)

Durch diese Auswahl (das ist der vollständige if in der Schleife, in dem einige Variablen in der Regularisierung verworfen werden), habe ich einmal zu einem Sprung von 0,879 F1 zu 0,890 in einem Schuss gebracht des Testens des Codes, ohne den Wert von lambda der Konfiguration neu einzustellen. Nun, dies beinhaltete sowohl die Änderungen für die Batch-Normalisierung als auch für die Bias und ich hatte andere Neigungen im neuronalen Netzwerk.

Nach diesem Artikel kann das Regularisieren der wiederkehrenden Gewichte bei der Explosion von Gradienten hilfreich sein. 

Entsprechend diesem anderen Papier wäre Dropout besser zwischen gestapelten Zellen und nicht innerhalb von Zellen zu verwenden, wenn Sie solche verwenden. 

Wenn Sie das explodierende Gradientenproblem verwenden, wird bei Verwendung des Verlaufs-Clipping mit dem Verlust, zu dem bereits die L2-Regularisierung hinzugefügt wurde, diese Regularisierung auch während des Clipping-Prozesses berücksichtigt.


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

11

Tensorflow verfügt über einige integrierte Funktionen und Hilfsfunktionen, mit denen Sie L2-Normen auf Ihr Modell anwenden können, z. B. tf.clip_by_global_norm :

    # ^^^ 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 deinem Trainingsschritt: 

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