如何在TensorFlow中设置重量成本强度?

时间:2016-01-25 07:09:21

标签: deep-learning tensorflow

我正在尝试将TensorFlow用于我的深度学习项目。

当我使用Momentum Gradient Descent时,如何设定重量成本强度?
(此formula中的λ。)

2 个答案:

答案 0 :(得分:8)

重量成本/衰减的术语不是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,这应该等同于您的关联等式。

答案 1 :(得分:0)

请注意,您显示的公式实际上并未显示真正的“重量衰减”,而是表示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似乎还没有支持“适当”的体重衰减。讨论它有一些问题,特别是因为上面的论文。

实现它的一种可能方法是编写一个op,在每个优化器步骤之后手动执行衰减步骤。我正在做的另一种方式是使用额外的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对其进行求和并进行优化,如上所示,对应于实际重衰变。

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

编辑:另请参阅刚刚合并到TF的this PR