【问题标题】:How to set weight cost strength in TensorFlow?如何在 TensorFlow 中设置权重成本强度?
【发布时间】:2016-01-25 07:09:20
【问题描述】:

我正在尝试在我的深度学习项目中使用 TensorFlow。

当我使用 Momentum Gradient Descent 时,如何设置权重成本强度?
(这个formula中的λ。)

【问题讨论】:

    标签: deep-learning tensorflow


    【解决方案1】:

    权重成本/衰减术语不是 TensorFlow 中优化器的一部分。

    但是,通过在权重上使用 L2 损失向成本函数添加额外的惩罚,很容易包含:

    C = <your initial cost function>
    l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()])
    C = C + lambda * l2_loss
    

    tf.nn.l2_loss(v) link 就是 0.5 * tf.reduce_sum(v * v) 并且各个权重的梯度将等于 lambda * w,这应该等同于您的链接方程。

    【讨论】:

    • 非常感谢。我也在 Theano 中实现了这部分,它起作用了。但是当我在 tensorflow 中尝试这个时,它仍然无法得到预期的结果。他们之间有什么不同?请查收:stackoverflow.com/questions/35488019/…
    • 注意不要在这种损失中包含偏差,因为它们也是 tf.trainable_variables()
    【解决方案2】:

    请注意,您显示的公式实际上并不是真正的“重量衰减”,而是 L2 正则化。很多人把这些混为一谈,包括知名教授。让我解释一下。

    当使用纯 SGD(没有动量)作为优化器时,权重衰减与在损失中添加 L2 正则化项是一样的。 使用任何其他优化器(包括 Momentum)时,情况并非如此。

    权重衰减(这里不知道如何 TeX,所以请原谅我的伪符号):

    w[t+1] = w[t] - learning_rate * dw - weight_decay * w
    

    L2-正则化:

    loss = actual_loss + lambda * 1/2 sum(||w||_2 for w in network_params)
    

    在 L2 正则化中计算额外项的梯度得到lambda * w,从而将其插入到 SGD 更新方程中

    dloss_dw = dactual_loss_dw + lambda * w
    w[t+1] = w[t] - learning_rate * dw
    

    给出与权重衰减相同的值,但将lambdalearning_rate 混合在一起。任何其他优化器,甚至是带有动量的 SGD,都会为权重衰减提供与 L2 正则化不同的更新规则!有关详细信息,请参阅论文 Fixing weight decay in Adam。 (编辑:AFAIK,this 1987 Hinton paper 引入了“权重衰减”,字面意思是“每次更新权重时,它们的大小也会减少 0.4%”,第 10 页)

    话虽如此,TensorFlow 中似乎还不支持“适当的”权重衰减。有几个问题在讨论它,特别是因为上面的论文。

    实现它的一种可能方法是编写一个在每个优化器步骤之后手动执行衰减步骤的操作。我目前正在做的另一种方法是使用额外的 SGD 优化器来进行权重衰减,并将其“附加”到您的 train_op。不过,这两者都只是粗略的解决方法。我当前的代码:

    # In the network definition:
    with arg_scope([layers.conv2d, layers.dense],
                   weights_regularizer=layers.l2_regularizer(weight_decay)):
        # define the network.
    
    loss = # compute the actual loss of your problem.
    train_op = optimizer.minimize(loss, global_step=global_step)
    if args.weight_decay not in (None, 0):
        with tf.control_dependencies([train_op]):
            sgd = tf.train.GradientDescentOptimizer(learning_rate=1.0)
            train_op = sgd.minimize(tf.add_n(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)))
    

    这在某种程度上利用了 TensorFlow 提供的簿记功能。请注意,arg_scope 负责将每一层的 L2 正则化项附加到 REGULARIZATION_LOSSES 图形键上,然后我使用 SGD 对其进行总结和优化,如上所示,对应于实际的权重衰减。

    希望对您有所帮助,如果有人为此获得更好的代码 sn-p,或者 TensorFlow 更好地实现它(即在优化器中),请分享。

    编辑:另见this PR,它刚刚被合并到 TF 中。

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 2018-01-10
      • 2018-08-25
      • 2020-01-10
      • 2018-11-02
      相关资源
      最近更新 更多