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​+α∗gt​pt+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​)⋅gt​vt​=β2​⋅vt−1​+(1−β2​)⋅gt​2m^t​=1−β1​tmt​​v^t​=1−β2​tvt​​θ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算法学习笔记相关推荐

  1. AI火爆干货最全整理!五套深度学习和算法学习教程和三套Python学习视频!!!限时无套路免费领取!...

    点击蓝色"AI专栏"关注我哟 选择"星标",重磅干货,第一时间送达 这是站长第 31 期免费送丰富宝贵的干货资源与教程 本期绝对是满满的干货! 获取更多资源请关 ...

  2. php算法学习,php算法学习之动态规划

    动态规划程序设计是对解最优化问题的一种途径.一种方法,最终问题的最优解可以通过前面子问题的最优解推导出来. 对于动态规划这个算法,自己学习的还不是很透彻,简单的总结自己学习的感受是: 动态规划思想中融 ...

  3. 学习Raft算法的笔记

    Raft是一种为了管理日志复制的一致性算法.它提供了和Paxos算法相同的功能和性能,但是它的算法结构和Paxos不同,使得Raft算法更加容易理解并且更容易构建实际的系统.为了提升可理解性,Raft ...

  4. python机器学习(一)算法学习的步骤、机器学习的应用及流程(获取数据、特征工程、模型、模型评估)

    机器学习入门 机器学习中需要理论性的知识,如数学知识为微积分(求导过程,线性回归的梯度下降法),线性代数(多元线性回归,高纬度的数据,矩阵等),概率论(贝叶斯算法),统计学(贯穿整个学习过程),算法根 ...

  5. 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现

    强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...

  6. Yann Lecun纽约大学《深度学习》2020课程笔记中文版,干货满满!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]Yann Lecun在纽约大学开设的2020春季<深度学习>课 ...

  7. DL之Yolov3:基于深度学习Yolov3算法实现视频目标检测之对《我要打篮球》视频段进行实时目标检测

    DL之Yolov3:基于深度学习Yolov3算法实现视频目标检测之对<我要打篮球>视频段进行实时目标检测 目录 输出结果 设计思路 核心代码 相关文章 成功解决AttributeError ...

  8. 收藏 | Yann Lecun纽约大学《深度学习》2020课程笔记中文版

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:专知 AI博士笔记系列推荐 周志华<机器学习>手推笔 ...

  9. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

最新文章

  1. ajax 阻止默认提交,jQuery验证插件:在对ajax调用servlet时,submitHandler不会阻止默认提交-返回false无效...
  2. 世界人工智能大会圆桌实录:AI与产业融合创新的挑战与机遇
  3. ucore操作系统实验笔记 - Lab1
  4. MFC中如何从EDIT控件中获取文字
  5. [Todo] 乐观悲观锁,自旋互斥锁等等
  6. 约瑟夫环问题(顺序表和单向链表)
  7. dmv 统计数据库io_使用内置功能和动态管理视图(DMV)发现特定于数据库的信息
  8. android获取当前activity view,Android中如何通过View获取Activity
  9. Android JNI
  10. Python统计txt文件中的英文单词个数
  11. springcloud使用LCN分布式事务
  12. android linkedin 登陆授权及分享
  13. 深度桌面操作系统架构设计
  14. OC算法 输出手机号码归属地
  15. LaTeX制作幻灯片
  16. Matlab GUI编程技巧(十七):Matlab GUI设计总结
  17. ADO简介(未完成)
  18. 王者荣耀微信查看服务器地址大全,王者荣耀游戏账号在哪里查看微信
  19. 内容都是XXXXX 如何把他们批量的插入表中
  20. sqlserverSMSS登录 18456 错误

热门文章

  1. Dubbo-2.7.3升级遇到的问题
  2. 在QT中使用同步阻塞式HTTP请求的方法
  3. logic:equal,logic:present用法
  4. 从可视化模板,到数据仓库、数字化的资料,我整理并分享出来
  5. 人人都是程序员?一边吐槽,一边却偷偷用,低代码工具真香
  6. 这大概是今年最值得推荐的“数据分析工具”
  7. 掌握这个套路,让你的可视化大屏万里挑一
  8. 彻底告别“人工+Excel”低效模式,传统制造业实现“一站式”数据化管理
  9. matlab 索力迭代,索梁组合体系桥梁施工索力确定的割线迭代法
  10. unity多人联机插件_Mirror ---Unity多人联机游戏API(一)