gpt4 book ai didi

tensorflow - Adam Optimizer减轻体重的正确方法是什么

转载 作者:行者123 更新时间:2023-12-04 01:55:55 27 4
gpt4 key购买 nike

由于Adam Optimizer保留了一对移动平均值,例如梯度的均值/方差,因此我想知道它应该如何正确处理权重衰减。我已经看到了两种实现方法。


仅基于客观损失从梯度中更新均值/方差,在每个小批量中明确地衰减权重。 (以下代码摘自https://github.com/dmlc/mxnet/blob/v0.7.0/python/mxnet/optimizer.py

weight[:] -= lr*mean/(sqrt(variance) + self.epsilon)

wd = self._get_wd(index)
if wd > 0.:
weight[:] -= (lr * wd) * weight

根据目标损失+正则化损失更新梯度的均值/方差,并像平常一样更新权重。 (以下代码摘自 https://github.com/dmlc/mxnet/blob/master/src/operator/optimizer_op-inl.h#L210

grad = scalar<DType>(param.rescale_grad) * grad +
scalar<DType>(param.wd) * weight;
// stuff
Assign(out, req[0],
weight -
scalar<DType>(param.lr) * mean /
(F<square_root>(var) + scalar<DType>(param.epsilon)));



这两种方法有时在训练结果上显示出显着差异。我实际上认为第一个更有意义(并且发现它有时会提供更好的结果)。 Caffe和旧版本的mxnet遵循第一种方法,而割炬,tensorflow和新版本的mxnet遵循第二种方法。

非常感谢您的帮助!

最佳答案

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

当使用纯SGD(无动量)作为优化器时,重量衰减与向损耗中添加L2正则项相同。当使用任何其他优化器时,情况并非如此。

重量衰减(这里不知道如何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进行优化,如上所示,它与实际的权重衰减相对应。

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

关于tensorflow - Adam Optimizer减轻体重的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44452571/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com