图像语义分割实践(五)优化器与学习率
概述
在数据制作环节中,提到minibatch思想用于数据批次量获取,是一种优化器思想,而该文则是对各种优化器进行介绍。
优化器:最小化损失函数算法,把深度学习当炼丹的话,优化器就是炉子,决定火候大小,炉子属性等,在深度学习监督学习的模型中,常用梯度下降法求解最优参数;
学习率:在优化器中,决定着梯度下降的速度,炉子调整火候的时间点;
Pytorch中,torch.optim 提供优化器类型选择,torch.optim.lr_scheduler 提供学习率调整策略;
优化器策略
优化器(“炉子”)的属性分析
1.根据每次更新使用的样本数量产生的梯度下降方法
梯度下降方法(Gradient Descent)变体如图所示,BGD全样本训练,计算量太大,计算速度慢;SGD太过震荡,容易陷入鞍点找不到最优点;MBGD训练稳定,计算速度快;
SGD 公式
vt=η∇θJ(θt−1)θt=θt−1−vtv_t=η∇_θJ(θ_{t−1}) \\θ_t=θ_{t-1}−v_t vt=η∇θJ(θt−1)θt=θt−1−vt
即使采用MBGD的方法仍然有很大难题,还不能保证良好的收敛性。
- 学习率选择和设计问题;
- 参数更新都在同一个学习率下更新的,实际训练特征出现频率少的需要更大的学习率;
2.根据局部历史梯度对当前梯度进行平滑方法
由 SGD -> Momentum
vt=γvt−1+η∇θJ(θt−1)θt=θt−1−vtv_t = γ v_{t−1} + η \nabla_θ J(θ_{t−1}) \\ θ_t = θ_{t-1} − v_t vt=γvt−1+η∇θJ(θt−1)θt=θt−1−vt
Momentum,动量法, 除了保留∇θJ(θt−1)∇_θJ(θ_{t−1})∇θJ(θt−1)该位置的梯度向量,同时加入vt−1v_{t−1}vt−1考虑上一次梯度向量,保证更新的梯度方向不会过分偏离上一次梯度,从而方向抖动不会很明显,前进方向由惯性动量决定,因此,γγγ称为动量超参。可以看出,缺陷还是很明显的,所有参数还是无法逃离共享同一个学习率的命运。
由 Momentum -> Nesterov Accelerated Gradient
vt=γvt−1+η∇θJ(θt−1−γvt−1)θt=θt−1−vtv_t = \gamma v_{t−1} + \eta \nabla_θ J(θ_{t−1} - \gamma v_{t−1}) \\ θ_t = θ_{t-1} − v_t vt=γvt−1+η∇θJ(θt−1−γvt−1)θt=θt−1−vt
Nesterov Accelerated Gradient,NAG加速动量法,当前位置梯度加入−γvt−1-γv_{t−1}−γvt−1近似预测未来的权重,部分RNN网络上表现良好,比Momentum震荡幅度会小,“冲坡”不至于太快 。
# NAG加速动量法
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3, momentum=0.9, nesterov=True)
3.根据自动调整梯度下降方法
Adagrad(Adaptive Gradient 自适学习率应梯度下降)
nt=nt−1+gt2,[其中,gt为当前梯度]Δθt=−ηnt+ϵ.gt,[ϵ防止分母为0而已]n_t = n_{t-1} + g_t^2, \quad \quad [ 其中,g_t为当前梯度] \\ \Delta θ_t = - \frac{\eta}{\sqrt{n_t + \epsilon }} . g_t , \quad \quad [\epsilon防止分母为0而已] nt=nt−1+gt2,[其中,gt为当前梯度]Δθt=−nt+ϵη.gt,[ϵ防止分母为0而已]
其中,Δθt\Delta θ_tΔθt项是 θtθ_tθt 的差值,更新较频繁的θtθ_tθt累计的ntn_tnt越大,分母越大,学习率变小,从而θiθ_iθi的学习率就调小。因此,AdagradAdagradAdagrad对于更新频率较低的参数用较大的学习率,对于更新频率较高的参数用较小的学习率。
有的时候学习速率收敛的过快会导致模型在训练到局部最优解前就停止参数更新。为了解决这个问题,人们提出了RMS Prop梯度下降法
Adadelta & Rmsprop
θt=θt−1−ηRMS[g]t−1.gt−1θ_t=θ_{t−1}−\eta RMS[g]_{t−1} . g_{t−1} θt=θt−1−ηRMS[g]t−1.gt−1
优点是不需要指定学习率
Adaptive Moment Estimation(Adam)
本质是带 Momentum 的 RMSProp 方法,新手推荐该方法,万金油。
# Adam
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3, momentum=0.9, nesterov=True)
几个优化器的梯度下降过程如图所示
学习率策略
PyTorch提供的学习率调整策略分为三大类,分别是
- 有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和余弦退火(CosineAnnealing)。
- 自适应调整:自适应调整学习率 ReduceLROnPlateau。
- 自定义调整:自定义调整学习率 LambdaLR。
注:PyTorch提供的学习率调整策略, 学习率调整策略接在优化器后头即可,torch.optim.lr_scheduler为代码接口。
# 对构建的模型选择 optimizer :: torch.optim
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
# 对optimizer选择 learning_rate :: torch.optim.lr_scheduler
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=500, gamma=0.9)
各类 optimizer 的原理
自适应学习率优化器伪代码
优化器推导公式
优化器文字描述推荐
优化器方法
pythorch优化器学习率写法
md符号
【Pytorch 】笔记七:优化器源码解析和学习率调整策略
【Pytorch 】笔记六:初始化与18种损失函数的源码解析
kaggle学习率示例:https://www.kaggle.com/code/isbhargav/guide-to-pytorch-learning-rate-scheduling/notebook
图像语义分割实践(五)优化器与学习率相关推荐
- 图像语义分割实践(一)标签制作与转换
语义分割实践过程中,网上常用公开数据集和模型都是打包固化的,只要配置环境一致就可以进行所谓"复现",但是这种拿来主义很被动,很多人陷入邯郸学步,贪多嚼不烂的窘迫感,最后浪费大把时间 ...
- 图像语义分割实践(三)模型搭建与实现
众所周知,神经网络搭建常用基础模块有卷积,池化,归一,激活,全连接等等.如果使用Pytorch进行网络的搭建时,除了需要掌握这些基础模块外,还需要熟悉模型容器. Pytorch.nn 的容器conta ...
- 图像语义分割实践(二)数据增强与读取
Pytorch数据加载顺序 手把手视频讲解+代码讲解 1.如何实现输入(完全免费解析直达,致力干货分享) 2.如何实现模型(完全免费解析直达,致力干货分享) 3.如何实现输出(完全免费解析直达,致 ...
- 图像语义分割实践(四)损失函数与实现
在确定检测任务和模型构建完成后,随之需要对训练的准则Criterion进行实现,可称之为损失函数或代价函数,简明而言,训练过程中真实值和计算值的误差. 视频讲解,转移至西瓜视频主页:@智能之心 ...
- 图像语义分割python_图像语义分割ICNET_飞桨-源于产业实践的开源深度学习平台...
图像语义分割-ICNET 类别 智能视觉(PaddleCV) 应用 自动驾驶 室内导航 医学图像诊断 穿戴设备 虚拟现实与增强现实 无人机 模型概述 ICNet 主要用于图像实时语义分割,能够兼顾速度 ...
- PaddleServing图像语义分割部署实践
目录 一.任务概述 二.官方示例部署 2.1 安装PaddleServing 2.2 导出静态图模型 2.3 转换为serving模型 2.4 启动服务 2.5 客户端请求 三.基于PipeLine的 ...
- 学习笔记-基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day2
高分辨率遥感图像语义分割-day2 摘要 一.引言 二.方法 2.1 对比学习 2.2 全局风格与局部匹配对比学习网络(GLCNet) 2.2.1 全局风格对比学习模块: 2.2.2局部匹配对比学习: ...
- 图像语义分割网络FCN(32s、16s、8s)原理及MindSpore实现
一.FCN网络结构 全卷积网络(Fully Convolutional Networks),是较早用于图像语义分割的神经网络.根据名称可知,FCN主要网络结构全部由卷积层组成,在图像领域,卷积是一种非 ...
- 深度学习遥感图像语义分割目标检测
深度学习遥感图像语义分割&目标检测 代码见github: WangZhenqing-RS/2021Tianchi_RSgithub.com 图标 赛题描述 本赛题基于不同地形地貌的高分辨率遥感 ...
最新文章
- ChipScope Pro内核生成器应用实例
- 【News】SpagoBI中国官方微信对外发布
- 《象与骑象人》总结一
- linux下搜狗安装目录,Linux安装搜狗输入法
- 2、运行WordCount程序
- 创业团队如何与兼职做饭的阿姨结算工资比较好?
- GARFIELD@02-13-2005
- [Errno 256] No more mirrors to try.
- nginx 反向代理机制解决前端跨域问题
- Ng第五课:Octave 教程(Octave Tutorial)
- 计算机应用基础项目化教程ppt,计算机应用基础项目化教程_课件
- 微信小程序图片上传java后台
- 程序员职业规划(转)
- Android-图片压缩
- MATLAB数字图像小系统
- MEC@JavaSE@实战篇@笔记05@计算机网络技术基础
- 怎么正确理解股票量化的概念?
- 一次小米路由器3刷机的翻车记录
- UEFI启动视频详解:启动分析+N项操作实例
- 开关电源:效率与VOUT的关系
热门文章
- 危害肠道健康的两大敌人:诺如病毒和轮状病毒
- 老域名值不值得购买?买老域名需要注意啥?
- 微信小程序项目实例——密码管理器
- 安卓开发学习11-1:Android程序调试:DDMS工具使用
- 使用VSCODE创建MAVEN项目
- 2021年安全员-C证报名考试及安全员-C证模拟考试题库
- 转:【专题九】实现类似QQ的即时通信程序
- 衍射极限、MTF与相机分辨率(2)
- Microsoft JET Database Engine (0x80004005) 未指定的错误的完美解决[转贴]
- js和 ts 将大数字金额转换成带单位的数字金额,万,千万,亿,格式化金额数字,格式化成带单位的金额,附ts版代码