作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于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
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)));
最佳答案
编辑:另请参阅this PR刚刚合并到TF。
当使用纯SGD(无动量)作为优化器时,重量衰减与向损耗中添加L2正则项相同。当使用任何其他优化器时,情况并非如此。
重量衰减(这里不知道如何TeX,请原谅我的伪标记):
w[t+1] = w[t] - learning_rate * dw - weight_decay * w
loss = actual_loss + lambda * 1/2 sum(||w||_2 for w in network_params)
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页)
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)))
arg_scope
负责将每个图层的L2正则化项附加到
REGULARIZATION_LOSSES
图键,然后我将全部总结并使用SGD进行优化,如上所示,它与实际的权重衰减相对应。
关于tensorflow - Adam Optimizer减轻体重的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44452571/
我希望该按钮(子项)占水平 LinearLayout(其父项)全宽的 25%。代码: LinearLayout ll = new LinearLayout(this); ll.setLayoutPar
我想问一下,当循环开始并再次循环时,字符串变量名称会增加1,我该怎么做。这个程序应该问你要写多少个病人。如果你为前任写信。 10,那么循环将进行10次,它会询问我想要的所有信息,然后将它们添加到我已经
我是一名优秀的程序员,十分优秀!