zoukankan      html  css  js  c++  java
  • 权重衰减和学习率衰减

    概念

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

    • 权重衰减

    权重衰减 (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

  • 相关阅读:
    Django的开发服务的搭建和使用
    Openerp
    Django Url设计 小知识点
    try...finally的用法
    SQL rownum的用法
    oracle 日期常用函數sysdate
    datetime.datetime.now()时间格式转化是碰到的问题
    CSS BACKGROUND汇总
    css3动画效果小结
    javascript花式理解闭包
  • 原文地址:https://www.cnblogs.com/zzk0/p/15056312.html
Copyright © 2011-2022 走看看