学习率是深度学习训练中至关重要的参数,很多时候一个合适的学习率才能发挥出模型的较大潜力。所以学习率调整策略同样至关重要,这篇博客介绍一下Pytorch中常见的学习率调整方法。

import torch
import numpy as np
from torch.optim import SGD
from torch.optim import lr_scheduler
from torch.nn.parameter import Parameter model = [Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = SGD(model, lr=0.1)

以上是一段通用代码,这里将基础学习率设置为0.1。接下来仅仅展示学习率调节器的代码,以及对应的学习率曲线。

1. StepLR

这是最简单常用的学习率调整方法,每过step_size轮,将此前的学习率乘以gamma。

scheduler=lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

2. MultiStepLR

MultiStepLR同样也是一个非常常见的学习率调整策略,它会在每个milestone时,将此前学习率乘以gamma。

scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[30,80], gamma=0.5)

3. ExponentialLR

ExponentialLR是指数型下降的学习率调节器,每一轮会将学习率乘以gamma,所以这里千万注意gamma不要设置的太小,不然几轮之后学习率就会降到0。

scheduler=lr_scheduler.ExponentialLR(optimizer, gamma=0.9)

4. LinearLR

LinearLR是线性学习率,给定起始factor和最终的factor,LinearLR会在中间阶段做线性插值,比如学习率为0.1,起始factor为1,最终的factor为0.1,那么第0次迭代,学习率将为0.1,最终轮学习率为0.01。下面设置的总轮数total_iters为80,所以超过80时,学习率恒为0.01。

scheduler=lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.1,total_iters=80)

5. CyclicLR

scheduler=lr_scheduler.CyclicLR(optimizer,base_lr=0.1,max_lr=0.2,step_size_up=30,step_size_down=10)

CyclicLR的参数要更多一些,它的曲线看起来就像是不断的上坡与下坡,base_lr为谷底的学习率,max_lr为顶峰的学习率,step_size_up是从谷底到顶峰需要的轮数,step_size_down时从顶峰到谷底的轮数。至于为啥这样设置,可以参见论文,简单来说最佳学习率会在base_lr和max_lr,CyclicLR不是一味衰减而是出现增大的过程是为了避免陷入鞍点。

scheduler=lr_scheduler.CyclicLR(optimizer,base_lr=0.1,max_lr=0.2,step_size_up=30,step_size_down=10)

6. OneCycleLR

OneCycleLR顾名思义就像是CyclicLR的一周期版本,它也有多个参数,max_lr就是最大学习率,pct_start是学习率上升部分所占比例,一开始的学习率为max_lr/div_factor,最终的学习率为max_lr/final_div_factor,总的迭代次数为total_steps。

scheduler=lr_scheduler.OneCycleLR(optimizer,max_lr=0.1,pct_start=0.5,total_steps=120,div_factor=10,final_div_factor=10)

7. CosineAnnealingLR

CosineAnnealingLR是余弦退火学习率,T_max是周期的一半,最大学习率在optimizer中指定,最小学习率为eta_min。这里同样能够帮助逃离鞍点。值得注意的是最大学习率不宜太大,否则loss可能出现和学习率相似周期的上下剧烈波动。

scheduler=lr_scheduler.CosineAnnealingLR(optimizer,T_max=20,eta_min=0.05)

7. CosineAnnealingWarmRestarts

这里相对负责一些,公式如下,其中T_0是第一个周期,会从optimizer中的学习率下降至eta_min,之后的每个周期变成了前一周期乘以T_mult。

\(eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})\left(1 +
\cos\left(\frac{T_{cur}}{T_{i}}\pi\right)\right)\)

scheduler=lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=20, T_mult=2, eta_min=0.01)

8. LambdaLR

LambdaLR其实没有固定的学习率曲线,名字中的lambda指的是可以将学习率自定义为一个有关epoch的lambda函数,比如下面我们定义了一个指数函数,实现了ExponentialLR的功能。

scheduler=lr_scheduler.LambdaLR(optimizer,lr_lambda=lambda epoch:0.9**epoch)

9.SequentialLR

SequentialLR可以将多个学习率调整策略按照顺序串联起来,在milestone时切换到下一个学习率调整策略。下面就是将一个指数衰减的学习率和线性衰减的学习率结合起来。

scheduler=lr_scheduler.SequentialLR(optimizer,schedulers=[lr_scheduler.ExponentialLR(optimizer, gamma=0.9),lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.1,total_iters=80)],milestones=[50])

10.ChainedScheduler

ChainedScheduler和SequentialLR类似,也是按照顺序调用多个串联起来的学习率调整策略,不同的是ChainedScheduler里面的学习率变化是连续的。

scheduler=lr_scheduler.ChainedScheduler([lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.5,total_iters=10),lr_scheduler.ExponentialLR(optimizer, gamma=0.95)])

11.ConstantLR

ConstantLRConstantLR非常简单,在total_iters轮内将optimizer里面指定的学习率乘以factor,total_iters轮外恢复原学习率。

scheduler=lr_scheduler.ConstantLRConstantLR(optimizer,factor=0.5,total_iters=80)

12.ReduceLROnPlateau

ReduceLROnPlateau参数非常多,其功能是自适应调节学习率,它在step的时候会观察验证集上的loss或者准确率情况,loss当然是越低越好,准确率则是越高越好,所以使用loss作为step的参数时,mode为min,使用准确率作为参数时,mode为max。factor是每次学习率下降的比例,新的学习率等于老的学习率乘以factor。patience是能够容忍的次数,当patience次后,网络性能仍未提升,则会降低学习率。threshold是测量最佳值的阈值,一般只关注相对大的性能提升。min_lr是最小学习率,eps指最小的学习率变化,当新旧学习率差别小于eps时,维持学习率不变。

因为参数相对复杂,这里可以看一份完整的代码实操

scheduler=lr_scheduler.ReduceLROnPlateau(optimizer,mode='min',factor=0.5,patience=5,threshold=1e-4,threshold_mode='abs',cooldown=0,min_lr=0.001,eps=1e-8)
scheduler.step(val_score)

史上最全学习率调整策略lr_scheduler的更多相关文章

  1. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结

    本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言   MySQL作为开源技术的代表作之一,是 ...

  2. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  3. 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结

    1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”>,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文将针对上篇中提到的特性,结合我们的实践经 ...

  4. 【转载】 PyTorch学习之六个学习率调整策略

    原文地址: https://blog.csdn.net/shanglianlm/article/details/85143614 ----------------------------------- ...

  5. 史上最全的maven的pom.xml文件详解(转载)

    此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  6. JVM史上最全实践优化没有之一

    JVM史上最全优化没有之一 1.jvm的运行参数 1.1 三种参数类型 1.1.1 -server与-clinet参数 2.1 -X参数 2.1.1 -Xint.-Xcomp.-Xmixed 3.1 ...

  7. Springcloud 配置 | 史上最全,一文全懂

    Springcloud 高并发 配置 (一文全懂) 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Spring ...

  8. Tomcat8史上最全优化实践

    Tomcat8史上最全优化实践 1.Tomcat8优化 1.1.Tomcat配置优化 1.1.1.部署安装tomcat8 1.1.2 禁用AJP连接 1.1.3.执行器(线程池) 1.1.4 3种运行 ...

  9. 史上最全的音视频SDK包分享给大家

    史上最全的音视频SDK包分享给大家 概述一下SDK功能: 项目 详情视频通信  支持多种分辨率的视频通信语音通信  提供语音通信,可支持高清宽带语音动态创建房间  可以根据需要,随时创建房间H5 支持 ...

  10. PyTorch学习之六个学习率调整策略

    PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 有序调整:等间隔调整(Step),按需调整学习率(Mul ...

随机推荐

  1. jQuery插件(cookie存值)

    使用cookie插件后,可以很方便地通过cookie对象保存.读取.删除用户的信息,还能通过cookie插件保存用户的浏览记录,它的调用格式为: 保存:$.cookie(key,value):读取:$ ...

  2. 第一次用Axure~

    刚刚接触axure感觉好多不会呢~但是一步一步来吧~ 操作到后来发现字体的变化很奇怪,总是只有一个字体出现,只有在编辑时才出现我设定的字体. 但最后还是有个样子出来了~做了一个联系的新页面 最后学姐又 ...

  3. 模拟Executor策略的实现

    Executor作为现在线程的一个管理工具,就像管理线程的管理器一样,不用像以前一样,通过start来开启线程 Executor将提交线程与执行线程分离开来,使得用户只需要提交线程,并不需要在乎怎么和 ...

  4. 【elasticsearch】python下的使用

    有用链接: 最有用的:http://es.xiaoleilu.com/054_Query_DSL/70_Important_clauses.html 不错的博客:http://www.cnblogs. ...

  5. 回溯法之求n个集合的幂集

    幂集:有一个集合A,集合A的幂集是由集合A的全部子集所组成的集合. 集合中的每一个元素仅仅有两种状态:属于幂集的元素集或不属于幂集的元素集. 集合{1,2,3},用一棵二叉树来表示. 递归函数 voi ...

  6. CS小分队第二阶段冲刺站立会议(5月31日)

    昨日成果:查找相关C#资料,清楚一些bug 遇到问题:系统获取的图标分辨率太低,网上找来的获取图标的代码看不太懂 今日计划:完善获取文件图标功能,并且能够删除获取的图标文件

  7. dia无法输入中文?

    解决方法: 以管理员权限打开/usr/bin/dia ,做如下修改 #dia-gnome --integrated "[email protected]" dia-gnome "[email protected]"

  8. ios开发 int,NSInteger,NSUInteger,NSNumber

    分享一下,在工作工程中遇到的一些不留心的地方: 1.当需要使用int类型的变量的时候,可以像写C的程序一样,用int,也可以用NSInteger,但更推荐使用NSInteger,因为这样就不用考虑设备 ...

  9. oracle给用户分配特定用户下特定表的只读权限

    以下是测试过程,测试环境oracle 11.2.0.3 linux平台: 模拟将HR用户下的employees表的只读权限非配给test_ycr创建用户:SQL> create user tes ...

  10. Sublime Text2使用规则

    Sublime Text是我发现的有一好用的编辑器,它不单单只支持 python ,几乎支持目前主流的语言,快捷键丰富,可以极大的提高代码开发效率.Sublime Text 网址:http://www ...