张量流中 LSTM 的正则化

Regularization for LSTM in tensorflow

Tensorflow 提供了一个很好的 LSTM 包装器。

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

我想使用正则化,比如 L2 正则化。但是,我无法直接访问 LSTM 单元中使用的不同权重矩阵,因此我无法明确地执行类似

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

有没有办法通过 LSTM 访问矩阵或以某种方式使用正则化?

tf.trainable_variables gives you a list of Variable objects that you can use to add the L2 regularization term. Note that this add regularization for all variables in your model. If you want to restrict the L2 term only to a subset of the weights, you can use the name_scope 使用特定前缀命名变量,稍后使用它从 tf.trainable_variables.

返回的列表中过滤变量

Tensorflow 有一些内置的辅助函数,可让您将 L2 范数应用于模型,例如 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)

在您的训练步骤中 运行:

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

我喜欢做以下事情,但我唯一知道的是有些参数不喜欢用 L2 进行正则化,例如批量规范参数和偏差。 LSTM 包含一个偏差张量(尽管从概念上讲它有很多偏差,但为了性能,它们似乎是串联的或其他东西),并且对于批量归一化,我在变量名称中添加 "noreg" 以忽略它。

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为小乘数,例如:float(0.005)

做这个选择(这是完整的 if 在循环中丢弃正则化中的一些变量)曾经让我 从 0.879 F1 分数一次跳到 0.890 在不重新调整配置值的情况下测试代码 lambda,好吧,这包括批归一化和偏差的变化,我在神经网络中还有其他偏差。

根据 this paper,对循环权重进行正则化可能有助于梯度爆炸。

此外,根据 this other paper,dropout 最好在堆叠的单元格之间使用,而不是在单元格内部使用。

关于梯度爆炸问题,如果你使用已经添加了L2正则化的损失的梯度裁剪,那么在裁剪过程中也会考虑到正则化。


P.S。这是我正在研究的神经网络:https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs