zoukankan      html  css  js  c++  java
  • 学习率衰减问题

    1.介绍

    转自:https://blog.csdn.net/program_developer/article/details/80867468

    在训练到一定阶段后,学习率可能会产生震荡,但是一开始用小的学习率的话,训练速度会很慢。

    学习率衰减(learning rate decay) 就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。
    学习率衰减基本有两种实现方法:
    1. 线性衰减。例如:每过5个epochs学习率减半。
    2. 指数衰减。例如:随着迭代轮数的增加学习率自动发生衰减,每过5个epochs将学习率乘以0.9998。具体算法如下:
    decayed_learning_rate=learning_rate*decay_rate^(global_step/decay_steps)
    其中decayed_learning_rate为每一轮优化时使用的学习率,learning_rate为事先设定的初始学习率,decay_rate为衰减系数,decay_steps为衰减速度。

    2.WarmupLinearSchedule 热启动机制

    https://www.zhihu.com/question/338066667 ,宝藏问题。

    warmup是初始阶段使用较小学习率启动,后期恢复正常;而decay是初始时使用较大的学习率,之后进行衰减。

    这里面的回答我还待看,为什么warmup是有效的呢?还挺难的。有公式推导。

    https://blog.csdn.net/zkq_1986/article/details/100220425 这个讲的就很直接:

    //不太懂,还需要再看。

    3.pytorch实现不同策略

    https://zhuanlan.zhihu.com/p/93624972

    3.1 指数衰减

    optimizer_ExpLR = torch.optim.SGD(net.parameters(), lr=0.1)
    ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)

     gamma表示不同的衰减率。

    3.2 固定步长衰减

    optimizer_StepLR = torch.optim.SGD(net.parameters(), lr=0.1)
    StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)

    3.3 多步长衰减

    optimizer_MultiStepLR = torch.optim.SGD(net.parameters(), lr=0.1)
    torch.optim.lr_scheduler.MultiStepLR(optimizer_MultiStepLR,
                        milestones=[200, 300, 320, 340, 200], gamma=0.8)

    希望不同的区间采用不同的更新频率,或者是有的区间更新学习率,有的区间不更新学习率,这就需要使用MultiStepLR来实现动态区间长度控制。

    3.4 余弦退火衰减

    3.5 用法

    scheduler = ...
    >>> for epoch in range(100):
    >>>     train(...)
    >>>     validate(...)
    >>>     scheduler.step()

    一回训练之后达到的结果。

  • 相关阅读:
    接口与实现分离
    C++的explicit关键字
    C++的类型转换
    使用catch做单元测试简介
    C++可调用对象与函数表
    在sublime中使用cppcheck
    你需要的代码静态检查
    构造析构与拷贝赋值那些事
    c++的关联容器入门(map and set)
    【致敬程序猿】
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/14245720.html
Copyright © 2011-2022 走看看