【问题标题】:Regularization for LSTM in tensorflow张量流中 LSTM 的正则化
【发布时间】:2016-06-01 14:26:24
【问题描述】:

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 访问矩阵或使用正则化?

【问题讨论】:

标签: neural-network tensorflow lstm recurrent-neural-network


【解决方案1】:

tf.trainable_variables 为您提供Variable 对象列表,您可以使用这些对象添加 L2 正则化项。请注意,这会为模型中的所有变量添加正则化。如果您只想将 L2 项限制为权重的子集,您可以使用 name_scope 使用特定前缀命名变量,然后使用它从 tf.trainable_variables 返回的列表中过滤变量。

【讨论】:

    【解决方案2】:

    我喜欢做以下事情,但我唯一知道的是一些参数不喜欢用 L2 进行正则化,例如批量规范参数和偏差。 LSTMs 包含一个 Bias 张量(尽管从概念上讲它有很多偏差,但它们似乎是串联的,为了性能),对于批量标准化,我在变量名称中添加“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,丢弃了正则化中的一些变量)曾经让我在不重新调整的情况下一次性测试代码的 F1 分数从 0.879 跳到 0.890配置的lambda 的值,这包括批量标准化和偏差的变化,我在神经网络中还有其他偏差。

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

    另外,根据this other paper 的说法,如果你使用一些,dropout 最好在堆叠单元之间使用,而不是在单元内部。

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


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

    【讨论】:

      【解决方案3】:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        • 1970-01-01
        • 2018-03-25
        • 1970-01-01
        • 2016-05-05
        • 2018-02-03
        • 1970-01-01
        相关资源
        最近更新 更多