小编Xin*_*ang的帖子

为Adam Optimizer加权衰减的正确方法是什么?

由于Adam Optimizer保持一对平均值,如渐变的均值/方差,我想知道它应该如何正确处理重量衰减.我已经看到了两种实现它的方法.

  1. 仅根据客观损失,每个小批量明确的衰减权重更新梯度的均值/方差.(以下代码摘自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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根据客观损失+正则化损失更新梯度的均值/方差,并像往常一样更新权重.(以下代码摘自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)));
    
    Run Code Online (Sandbox Code Playgroud)

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

真的很感谢你的帮助!

deep-learning torch caffe tensorflow mxnet

11
推荐指数
2
解决办法
1万
查看次数

标签 统计

caffe ×1

deep-learning ×1

mxnet ×1

tensorflow ×1

torch ×1