深度学习——Optimizer算法学习笔记
1 致谢
感谢赵老师的讲授!
2 前言
今天在学习Pytorch~记得Johnson助教好像讲过有一个优化算法最好用的,不过忘了是哪一个了,然后就回顾了一下赵老师讲课的视频;
3 最常用的Optimizer算法是Adam方法
最常用的Optimization算法是Adam方法;
(我在Wider Face数据集上用过一次Adam方法,不过用了一下感觉效果不是很好;
后来赵老师在课上讲到这种自适应的方法总存在一些局限性:
“从最后训练的精度上来看,还是SGD方法好一些,虽然训练会慢一些;如果是80个Epoch,可以先用Adam训练30个Epoch.等到最难的地方差不多过去的时候,再用SGD继续进行训练;”
我看了一下这个比例:3/8 = 0.375 = 1 - 0.625,感觉跟黄金比例有点类似0.618,
以后可以再做实验来看看; )
4 常见的Optimizer算法
4.1 基本的符号表示
α\alphaα:学习率
4.1 SGD方法(Stochastic Gradient Descent)
就是最普通的随机梯度下降方法。
4.2 SGD with Momentum
带有动量的SGD优化方法。
其公式如下:
{vt=γvt−1−α⋅∇θJ(θt−1)θt=θt−1+vt\left\{\begin{matrix} v_t = \gamma v_{t-1} - \alpha\cdot\nabla_\theta J\left ( \theta_{t-1}\right )\\ \theta_t = \theta_{t-1} + v_t \end{matrix}\right. {vt=γvt−1−α⋅∇θJ(θt−1)θt=θt−1+vt
4.2 Nesterov方法
根据t时刻速度计算Momentum的方法,
其公式如下:
vt+1=μ∗vt+α∗gtpt+1=pt−lr∗(vt+1+α∗gt)v_{t+1} = \mu*v_{t} + \alpha*g_{t}\\ p_{t+1} = p_t - lr*(v_{t+1} + \alpha*g_{t}) vt+1=μ∗vt+α∗gtpt+1=pt−lr∗(vt+1+α∗gt)
(由于Nesterov方法有多种不同的实现方法,这里我们采用的是PyTorch的官方文档中给出的公式,此公式是我根据PyTorch中原始公式进行相应扩展得出的)
(单凭上面的公式难以直接看出Nesterov方法的含义,我们可以参考一下Nesterov方法的原始论文中的公式,
可以看到t+1t+1t+1时刻的速度是由他t+1t+1t+1时刻的梯度(即∇f(θt+μvt)\nabla f\left ( \theta_t + \mu v_t\right )∇f(θt+μvt))计算出来的)
(具体的推导可以参阅我的博文《深度学习——Nesterov方法的学习笔记》)
4.3 Adam方法
Adam方法的公式如下:
{gt=∇θft(θt−1)mt=β1⋅mt−1+(1−β1)⋅gtvt=β2⋅vt−1+(1−β2)⋅gt2m^t=mt1−β1tv^t=vt1−β2tθt=θt−1−α⋅m^tv^t+ϵ\left\{\begin{matrix} g_t = \nabla_\theta f_t\left ( \theta_{t-1}\right )\\ m_t = \beta_1\cdot m_{t-1}+\left ( 1 - \beta_1\right ) \cdot g_t\\ v_t = \beta_2\cdot v_{t-1} + \left ( 1 - \beta_2\right ) \cdot {g_t}^2\\ \hat{m}_t = \frac{m_t}{1 - {\beta_1}^t}\\ \hat{v}_t = \frac{v_t}{1 - {\beta_2}^t}\\ \theta_t = \theta_{t-1} - \frac{\alpha \cdot \hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon} \end{matrix}\right. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧gt=∇θft(θt−1)mt=β1⋅mt−1+(1−β1)⋅gtvt=β2⋅vt−1+(1−β2)⋅gt2m^t=1−β1tmtv^t=1−β2tvtθt=θt−1−v^t+ϵα⋅m^t
在PyTorch中的函数形式为:
torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
其中β1\beta_1β1和β2\beta_2β2的默认值分别为0.90.90.9和0.9990.9990.999;
4.3.1 Adam算法形象化的解释
Adam算法最为优秀之处在于,解决了鞍点的问题,那么我们首先来看看什么是鞍点:
这个GIF的动图能很好地形象化地解释鞍点,以及各个优化器函数的表现;
在Adam算法中,分母v作为惩罚项,用来记录小球的能量;
则在鞍点附近,小球会有如下类似形象化的表现:
如果小球在x方向上震荡,则能量v会不断累计,而由于震荡,梯度一阶估计m则会出现有正有负的情况,从而被削弱,震荡变小;
同时,如果y方向是鞍点真正的落点,则由于小球在该方向上没有震荡,虽然能量也在累计,但是梯度的方向一直朝下,此时相对于x方向上的力而言,y方向上力占主导,从而引导小球向落点滑动,从而更加顺利的走出鞍点,滑向落点;
4.4 AdamW——Adam with decoupled weight decay
(请参见论文《Decoupled Weight Decay Regularization》)
AdamW也就是使用了“decoupled weight decay”的优化器算法,具体表现形式就是在后面加上了一个“衰减的正则项”,
这里的“正则项”是我在网上看到的解释(虽然明明老师也是这样解释的),不过我觉得不是很形象;
在我看来这里的“decoupled weight decay”实际上就是一种滑动平均,(将ηtλ\eta_t\lambdaηtλ移出来,写成(1−ηtλ)θt(1-\eta_t\lambda)\boldsymbol{\theta}_t(1−ηtλ)θt),就可以发现这里的weight-decay实际上实现了一种滑动平均的效果;
(有三老师也说“weight-decay的参数都是为了移动平均”)
5 自适应Optimization算法
自适应最优解算法所解决的根本问题,就是如何解决不同参数朝向不同局部最优解前进时的分歧问题;
深度学习——Optimizer算法学习笔记相关推荐
- AI火爆干货最全整理!五套深度学习和算法学习教程和三套Python学习视频!!!限时无套路免费领取!...
点击蓝色"AI专栏"关注我哟 选择"星标",重磅干货,第一时间送达 这是站长第 31 期免费送丰富宝贵的干货资源与教程 本期绝对是满满的干货! 获取更多资源请关 ...
- php算法学习,php算法学习之动态规划
动态规划程序设计是对解最优化问题的一种途径.一种方法,最终问题的最优解可以通过前面子问题的最优解推导出来. 对于动态规划这个算法,自己学习的还不是很透彻,简单的总结自己学习的感受是: 动态规划思想中融 ...
- 学习Raft算法的笔记
Raft是一种为了管理日志复制的一致性算法.它提供了和Paxos算法相同的功能和性能,但是它的算法结构和Paxos不同,使得Raft算法更加容易理解并且更容易构建实际的系统.为了提升可理解性,Raft ...
- python机器学习(一)算法学习的步骤、机器学习的应用及流程(获取数据、特征工程、模型、模型评估)
机器学习入门 机器学习中需要理论性的知识,如数学知识为微积分(求导过程,线性回归的梯度下降法),线性代数(多元线性回归,高纬度的数据,矩阵等),概率论(贝叶斯算法),统计学(贯穿整个学习过程),算法根 ...
- 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现
强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...
- Yann Lecun纽约大学《深度学习》2020课程笔记中文版,干货满满!
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]Yann Lecun在纽约大学开设的2020春季<深度学习>课 ...
- DL之Yolov3:基于深度学习Yolov3算法实现视频目标检测之对《我要打篮球》视频段进行实时目标检测
DL之Yolov3:基于深度学习Yolov3算法实现视频目标检测之对<我要打篮球>视频段进行实时目标检测 目录 输出结果 设计思路 核心代码 相关文章 成功解决AttributeError ...
- 收藏 | Yann Lecun纽约大学《深度学习》2020课程笔记中文版
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:专知 AI博士笔记系列推荐 周志华<机器学习>手推笔 ...
- l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树
二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...
最新文章
- ajax 阻止默认提交,jQuery验证插件:在对ajax调用servlet时,submitHandler不会阻止默认提交-返回false无效...
- 世界人工智能大会圆桌实录:AI与产业融合创新的挑战与机遇
- ucore操作系统实验笔记 - Lab1
- MFC中如何从EDIT控件中获取文字
- [Todo] 乐观悲观锁,自旋互斥锁等等
- 约瑟夫环问题(顺序表和单向链表)
- dmv 统计数据库io_使用内置功能和动态管理视图(DMV)发现特定于数据库的信息
- android获取当前activity view,Android中如何通过View获取Activity
- Android JNI
- Python统计txt文件中的英文单词个数
- springcloud使用LCN分布式事务
- android linkedin 登陆授权及分享
- 深度桌面操作系统架构设计
- OC算法 输出手机号码归属地
- LaTeX制作幻灯片
- Matlab GUI编程技巧(十七):Matlab GUI设计总结
- ADO简介(未完成)
- 王者荣耀微信查看服务器地址大全,王者荣耀游戏账号在哪里查看微信
- 内容都是XXXXX 如何把他们批量的插入表中
- sqlserverSMSS登录 18456 错误
热门文章
- Dubbo-2.7.3升级遇到的问题
- 在QT中使用同步阻塞式HTTP请求的方法
- logic:equal,logic:present用法
- 从可视化模板,到数据仓库、数字化的资料,我整理并分享出来
- 人人都是程序员?一边吐槽,一边却偷偷用,低代码工具真香
- 这大概是今年最值得推荐的“数据分析工具”
- 掌握这个套路,让你的可视化大屏万里挑一
- 彻底告别“人工+Excel”低效模式,传统制造业实现“一站式”数据化管理
- matlab 索力迭代,索梁组合体系桥梁施工索力确定的割线迭代法
- unity多人联机插件_Mirror ---Unity多人联机游戏API(一)