由于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
Run Code Online (Sandbox Code Playgroud)根据客观损失+正则化损失更新梯度的均值/方差,并像往常一样更新权重.(以下代码摘自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遵循第二种方法.
真的很感谢你的帮助!