web-dev-qa-db-fra.com

Régularisation pour LSTM en tensorflow

Tensorflow propose un wrapper Nice LSTM.

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

Je voudrais utiliser la régularisation, disons la régularisation L2. Cependant, je n'ai pas d'accès direct aux différentes matrices de poids utilisées dans la cellule LSTM, je ne peux donc pas faire explicitement quelque chose comme:

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

Existe-t-il un moyen d'accéder aux matrices ou d'utiliser la régularisation d'une manière ou d'une autre avec LSTM?

9
BiBi

tf.trainable_variables vous donne une liste d'objets Variable que vous pouvez utiliser pour ajouter le terme de régularisation L2. Notez que cela ajoute une régularisation pour toutes les variables de votre modèle. Si vous souhaitez limiter le terme L2 à un sous-ensemble des poids, vous pouvez utiliser le name_scope pour nommer vos variables avec des préfixes spécifiques, puis pour filtrer les variables de la liste renvoyée par tf.trainable_variables.

10
keveman

J'aime faire ce qui suit, mais la seule chose que je sache, c'est que certains paramètres préfèrent ne pas être régularisés avec L2, tels que les paramètres de norme de lot et les biais. Les LSTM contiennent un tenseur de biais (même si, conceptuellement, il a de nombreux biais, ils semblent être concaténés, ou quelque chose comme ça, pour la performance), et pour la normalisation des lots, j'ajoute "noreg" dans le nom des variables pour l'ignorer également. 

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

lambda_l2_reg est le petit multiplicateur, par exemple: float(0.005)

Faire cette sélection (qui correspond à la if complète dans la boucle en écartant certaines variables de la régularisation) m'a une fois fait sauter de 0,879 score F1 à 0,890 d'un coup de tester le code sans réajuster la valeur de la variable lambda de la configuration Bien, cela incluait à la fois les modifications apportées à la normalisation des lots et les biais et j’avais d’autres biais dans le réseau neuronal.

Selon cet article , régulariser les poids récurrents peut aider à exploser des gradients. 

En outre, selon cet autre document , le décrochage serait mieux utilisé entre les cellules empilées et non à l'intérieur des cellules si vous en utilisez. 

En ce qui concerne le problème de l’explosion du gradient, si vous utilisez le découpage en dégradé avec la perte à laquelle la régularisation L2 a déjà été ajoutée, cette régularisation sera également prise en compte lors du processus de découpage.


P.S. Voici le réseau de neurones sur lequel je travaillais: https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs

11
Guillaume Chevalier

Tensorflow possède des fonctions intégrées et auxiliaires qui vous permettent d’appliquer des normes L2 à votre modèle, telles que 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)

dans votre course d'entraînement: 

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