当前位置: 首页 > news >正文

深度学习常用的优化器整理

常见优化器整理

一、SGD(随机梯度下降)

  • 公式:在这里插入图片描述

  • 经典的mini-batch SGD使用的很多,效果也比较不错,但是存在一部分问题

    • 选择恰当的初始学习率很困难
    • 学习率调整策略受限于预先制定的调整规则
    • 相同的学习率被应用于各个参数
    • 高度非凸的误差函数的优化过程,如何避免陷入大量的局部次优解或鞍点

梯度下降遇到的问题

  1. 很难选择一个合适的学习率,如果学习率太小,将会导致收敛非常缓慢;如果学习率太大,也会阻碍收敛,导致损失函数值在最小值附近波动甚至发散。
  2. 上述问题可以通过提前定义一个学习速率表,当达到相应轮数或者阈值时根据表改变学习率,但是这样无法适应训练数据本身特征。
  3. 并且,对于所有参数我们使用同一个学习速率,如果我们的数据是稀疏的或者我们特征具有不同的频率,我们可能不希望将它们更新到同样的程度,并且我们希望对那些出现频率低的特征更新更快。
  4. 另外在神经网络中,普遍是具有非凸的误差函数,这使得在优化网络过程中,很容易陷入无数的局部最优点,而且更大困难往往也不是陷入局部最优点,而是来自鞍点(也就是在一个维度上其梯度是递增,另一个维度其梯度是递减,而在鞍点处其梯度为0),这些鞍点附近往往被相同误差点所包围,且在任意维度梯度近似为0,所以随机梯度下降很难从这些鞍点逃出。

二、AdaGrad(Adaptive Gradient 自适应梯度)

  • 能够对每个不同的参数调整不同的学习率,对频繁变化的参数以更小的步长进行更新,对稀疏的参数以更大的步长进行更新

  • 公式

    • 在这里插入图片描述
  • 增加了分母(梯度平方和的平方根),能够累积个参数的历史梯度评分,频繁更新的梯度累计分母大,步长就小;稀疏的梯度累积的梯度分母小,步长就大。AdaGrad能够自动为不同参数适应不同的学习率(平方根的分母项相当于对学习率α进行了自动调整),大多数的框架实现采用默认学习率α=0.01

  • 优势:在数据分布稀疏的场景,能够更好利用稀疏梯度的信息,比标准SGD更容易收敛

  • 缺点:分母项不断累积,当时间累积后,会导致学习率收缩到太小导致无法收敛

三、RMSProp

  • 结合梯度平方的指数移动平均数来调节学习率变化,能够在不稳定的目标函数情况下很好收敛。

  • 公式

    • 计算t时刻的梯度
      在这里插入图片描述

    • 计算梯度平方的指数移动平均数(Exponential Moving Average),γ是遗忘因子(指数衰减率),默认设置为0.9
      在这里插入图片描述

    • 梯度更新的时候,与AdaGrad类似,只是更新的梯度平方的期望(指数移动均值),其中ε=10−8,避免除数为0。默认学习率α=0.001。
      在这里插入图片描述

  • 优势:能够克服AdaGrad梯度急剧减小的问题,再很多应用中都展现出优秀的学习率自适应能力,尤其在不稳定(Non-Stationary)的目标函数下,比基本的SGD、Momentum、AdaGrad表现更良好。

四、Adadelta

  • Adadelta算法可以解决上述问题,其一阶向量跟adagrad一样,二阶参数有所变化:
    在这里插入图片描述

  • 二阶参数表达式跟动量表达式相似,引入了参数γ,可以知道二阶动量其实之前所有梯度平方的一个加权平均值,表达式如下:
    在这里插入图片描述

  • 从而可以解决AdaGrad带来的分母越来越大的问题

五、Adam(adaptive Moment Estimation自适应矩估计)

  • Adam是一种将动量和Adadelta或RMSprop结合起来的算法,也就引入了两个参数β1和β2,其一阶和二阶动量公式为:
    在这里插入图片描述

  • 但是由于一阶和二阶动量初始训练时很小,接近于0,因为β值很大,于是又引入一个偏差来校正:
    在这里插入图片描述

  • 其中t代表其t次方,所以刚开始训练时,通过除以(1-β)就可以很好修正学习速率,当训练多轮时,分母部分也接近1,又回到了原初始方程,所以最后总的梯度更新方程为:
    在这里插入图片描述

  • 其中β1默认值为0.9,β2默认值为0.999,ε为10-8,Adam集合动量和Adadelata两者的优点,从经验中表明Adam在实际中表现很好,同时与其他自适应学习算法相比,更有优势。

http://www.lryc.cn/news/14230.html

相关文章:

  • Java 内部类
  • 【FAQ】集成分析服务的常见问题及解决方案
  • 11.注意力机制
  • 45岁当打之年再创业,剑指中国版ChatGPT,这位美团联合创始人能否圆梦?
  • 数据结构——第二章 线性表(2)——链式存储结构
  • 【更新】囚生CYの备忘录(20230216~)
  • 分布式事务几种方案
  • Eclipse各版本安装Tomcat插件全攻略
  • 志趣相投的人总会相遇——社科院与杜兰大学金融管理硕士项目
  • 算法专题训练营
  • 让ChatGPT生成以自己为主角的短篇小说
  • c++提高篇——vector容器
  • 使用BP神经网络诊断恶性乳腺癌(Matlab代码实现)
  • # Rust Web入门(二):Actix
  • jvm之String
  • WebRTC系列-工具系列之ByteBuffer,BitBuffer及相关类
  • Spring中bean的生命周期(通俗易懂)
  • 雷达编程实战之恒虚警率(CFAR)检测
  • Github隐藏功能:显示自己的README,Github 个人首页的 README,这样玩儿
  • @JsonSerialize—优雅地封装返回值
  • 【Python网络编程】利用Python进行TCP、UDP套接字编程
  • fuzz测试之libfuzzer使用小结
  • 电子标签拣货系统——外接供电版
  • 为什么启动一个线程不用run()方法,而是用start()方法
  • Java File相关操作
  • LabVIEW利用矢量量化直方图开发人脸识别
  • RK3568工业开发板工控板说明
  • JavaScript Web API 来构建你不了解的网站
  • KeePass敏感信息明文传输漏洞复现 (CVE-2023-24055)
  • Android 11 中的权限更新