Deep learning 如何在TensorFlow中设置权重成本强度?

Deep learning 如何在TensorFlow中设置权重成本强度?,deep-learning,tensorflow,Deep Learning,Tensorflow,我正在尝试在我的深度学习项目中使用TensorFlow 当我使用动量梯度下降法时,权重成本强度是如何设置的? (此处的λ)。权重成本/衰减的术语不属于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 + lambd

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

当我使用动量梯度下降法时,权重成本强度是如何设置的?

(此处的λ)。

权重成本/衰减的术语不属于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
C=
l2_损失=tf.add_n([tf.nn.l2_损失(v)表示tf.trainable_变量()中的v)
C=C+lambda*l2_损耗

tf.nn.l2_损失(v)
只是
0.5*tf.reduce_sum(v*v)
,各个权重的梯度将等于
lambda*w
,这应该等同于您的链接方程。

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

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

重量衰减(这里不知道如何计算TeX,请原谅我的伪符号):

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
学习率
。任何其他优化器,即使是带有动量的SGD,都会为权重衰减提供与L2正则化不同的更新规则!有关更多详细信息,请参阅本文。(编辑:AFAIK,在第10页引入了“重量衰减”,字面意思为“每次重量更新时,其大小也会减少0.4%”)

也就是说,在TensorFlow中似乎还没有支持“适当”的重量衰减。有几个问题在讨论它,特别是因为上面的文章

实现它的一种可能方法是编写一个op,在每个优化器步骤之后手动执行衰减步骤。另一种不同的方法,也就是我目前正在做的,就是使用一个额外的SGD优化器,只用于重量衰减,并将其“附加”到您的
train\u 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_作用域
负责将每一层的L2正则化项附加到
regulation_loss
图形键,然后使用SGD对其进行汇总和优化,如上所示,SGD对应于实际重量衰减

希望这能有所帮助,如果有人得到了更好的代码片段,或者TensorFlow实现得更好(即在优化器中),请分享


编辑:另请参见刚刚合并到TF中的内容。

非常感谢。我也在Theano中实现了这一部分,它是有效的。但是当我在tensorflow中尝试这一部分时,它仍然不能得到预期的结果。他们之间有什么不同?请检查:小心不要在该损失中包含偏差,因为它们也是tf.trainable_变量()
# 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)))