DAY20:学习率(下)

学习率


自定义学习率:LambdaLR

  • 自己定义学习率的调整,以官网范例示范。

    optimizer = optim.SGD(params = model.parameters(), lr=0.05)
    lambda1 = lambda epoch:epoch // 10 
    lambda2 = lambda epoch:0.95 ** epoch 
    scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
    
    • optimizer:选择搭配的优化器。
    • lr_lambda:自定义的学习率函数。
    • last_epoch:设置到哪个epoch就不再调整,预设为-1,到最後个epoch才会从初始学习率开始。

    发现会报错,如下图。

    他只需要一个lambda函数。於是我们将其拆开看。

  • 用lambda1去尝试。

    scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1)
    


    图片来源:https://www.shuzhiduo.com/A/kPzO4am3Jx/

  • 用lambda2去尝试。

    scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda2)
    


    图片来源:https://www.shuzhiduo.com/A/kPzO4am3Jx/

  • 我们也可以尝试自己去定义调整学习率的函数。


自定义学习率:MultiplicativeLR

  • 与lambdaLR相似,差别在於lambdaLR是用初始学习率去乘lambda函数,而MultiplicativeLR是用前一个epoch的lr去乘上lambda函数去调整lr。

CyclicLR

  • 与学习率衰减和固定学习率不同,他是有周期性的调整学习率,我个人认为有点类似CosineAnnealingLR和CosineAnnealingWarmRestarts都是一个周期就回到初始值再继续衰减,後又升起到初始值。
    torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1, verbose=False)
    
    • optimizer:选择搭配的优化器。
    • base_lr:初始学习率。
    • max_lr:每个循环周期的最大学习率。
    • step_size_up:在增加的半个周期中所要迭代的次数,预设2000次。
    • step_size_down:在下降的半个周期中所要迭代的次数,预设None。
    • mode:周期的模式。三种模式:triangular, triangular2, exp_range。
    • gamma:exp_range中的常量gamma**(cycle iterations)
      详细可参考:https://blog.csdn.net/zisuina_2/article/details/103236864

鞍点(Saddle Points)

  • 当我们在训练的过程中,在梯度为0时,不一定是最佳解也不一定是最大值,梯度会保持在一个最小值,导致训练非常缓慢停滞不前,那就是卡在了鞍点(Saddle Points)。
      
      图片来源:https://www.twblogs.net/a/5c245d4ebd9eee16b4a7d124

  • 如何解决鞍点这个问题,我们需要利用优化器搭配好的学习率,才能解决停滞在鞍点的问题。


今日小结

  • 学习率衰减的方式有很多种,我个人比较常用CosineAnnealingLR,他带有周期循环的学习率,较不易有卡在鞍点的机会发生。

  • 学习率要搭配优化器做梯度下降,试图找到全局最佳解,但往往没有那麽容易,明天跟大家介绍优化器的比较。


<<:  Day 20 测试router的前奏

>>:  day20: immuable

Gulp bower(2) DAY86

今天要来介绍 gulp 如何与 bower 结合 这里必须新增一个套件 main-bower-fil...

Day30 - 云端 Study Lab 总结,清除 GCP 专案

Study Lab 总结 在这 30 天中介绍了许多 DevOps 的工具以及工作流程,若读者想要学...

[C 语言笔记--Day15] 如何清空终端机

// clear.c #include <stdio.h> int main() { p...

Day 13:vim 设定档

+++ title = "Day 13:vim 设定档" date = &quo...

Day28_隐私盾协定听起来好酷呀-2021/10/11

▉估狗『各国 个资法』 就~如标题,既昨天的笔记,想看看,那各国的个资法是?? 然後就看到这个『隐私...