权重衰减和学习率衰减

概念

之前一直对“权重衰减”和“学习率衰减”存在误解,我甚至一度以为它们是同一个东西,以至于使用的时候感觉特别困惑。在优化器中使用了“权重衰减”,竟然发现模型的准确率下降了,假如它们是同一个东西,至少应该是学得慢,而不是学坏了。因此,专门查了一下资料,了解两者的区别,这篇随笔做一下记录。

  • 权重衰减

权重衰减 (weight decay),是一种正则化的方法,应用了权重衰减的神经网络,最终某些权重会变成零 [1],相当于输入在这个神经元上会被抛弃。神经网络中某些权重归零,表示模型的复杂度下降了,多了一个零,少了一个参数。

  • 学习率衰减

学习率衰减 (learning rate decay) 就是调小学习率,使到损失可以进一步减小。如果整个优化过程,学习率一直保持较大的数值,那么在损失可能在局部最小值的周围震荡,而又到不了局部最小。将学习率变小,学习的步长变小了,使到损失可以到达局部最小。

权重衰减

为什么叫做权重衰减

有的时候(因为另一些时候不叫),权重衰减又叫做 L2 正则化,意思是在损失函数上面加上一个 L2 正则项。

[L(w) ightarrow L(w) + frac{gamma}{2} w^2 ]

梯度下降的时候,权值的更新公式将变为如下:

[w_i ightarrow w_i - eta g(w_i) - eta gamma w_i ]

如果一个权值每次梯度下降的时候,梯度都很小,甚至没有,如果我们将公式忽略掉,经过多次更新,可以看到权值将指数衰减(每次都乘以一个数),最终趋向于零。趋向于零的速度,取决于系数,如果是 0.01,那么 100 次迭代,每次更新为原来的 0.99,100 次后权值会变为原来的 0.36。

权重衰减应该设置多少

这个属于炼丹的参数,在 0 到 1 之间即可。不知道设置多少,就设置 0.01 或 0.001 吧,保守一点 [4]。如果有足够多的时间或者 GPU,那就搜索一下咯。

权重衰减和 Adam

[3] 改进了权重衰减。对于 Adam 优化器,如果我们还是像前面使用的 L2 正则化那样,在损失函数后面加正则项,梯度还是那样算,但是一顿算之后,权重衰减就变得和原来的“衰减”不太相同了。没有人保证在一顿算之后,权重更新的公式还是权重衰减的。所以 [3] 提出直接在权重更新的公式上面加上更新项,这样才符合权重衰减的名字嘛。Pytorch 中 Adam 的 weight decay 用的是 L2 正则化,AdamW 是 [3] 提出的方法。链接 [2] 对这个话题进行了一些讨论,可以看看。

学习率衰减

Pytorch 中提供了调整学习率的方法。

  • 可以使用 ExponentialLR 来使到学习率指数衰减,每次学习率乘以一个倍数。
  • 可以用 ReduceLROnPlateau,在训练几个 epoch 之后,如果仍然不提高,那么将衰减学习率,使其可以达到局部最小。

学习率

学习率衰减的本质,其实是一种调整学习率的策略,将学习率往小的方向调整。抛开学习率衰减,我在查阅资料的过程中,还发现了周期性学习率(Cyclical Learning Rate)这个东西。在整个学习的过程中不断调整学习率,学习率在周期函数上变化,时大时小,属于一种炼丹小技巧。CLR 的论文说可以避免再微调和减少训练的 epoch。[5]

学习率衰减和 Adam

Adam 自己就是会动态改变学习率的,那我们还需要学习率衰减吗?

可以用,炼丹小技巧 +1。

[6] 指出,设置了学习率的 Adam,可以保证 Adam 每个参数的更新的时候,不会超过这个上界。使用学习率衰减来减小更新的步长。

总结

查阅完资料,总结了一下之后,我发现,这 TM 就是两个东西,完全不同的两个东西。一个是为了防止过拟合,一个就是为了过拟合啊!

参考链接

[1] https://stats.stackexchange.com/questions/29130/difference-between-neural-net-weight-decay-and-learning-rate
[2] https://towardsdatascience.com/why-adamw-matters-736223f31b5d
[3] https://arxiv.org/abs/1711.05101
[4] https://machinelearningmastery.com/how-to-reduce-overfitting-in-deep-learning-with-weight-regularization/
[5] https://zhuanlan.zhihu.com/p/54745666
[6] https://stackoverflow.com/questions/39517431/should-we-do-learning-rate-decay-for-adam-optimizer
[7] https://pytorch.org/docs/stable/optim.html#:~:text=adjust learning rate-,torch.optim.lr_scheduler,-provides several methods

原文地址:https://www.cnblogs.com/zzk0/p/15056312.html