我正在尝试将TensorFlow用于我的深度学习项目。
当我使用Momentum Gradient Descent时,如何设定重量成本强度?
(此formula中的λ。)
答案 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
与重量衰减相同,但将lambda
与learning_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。