RMSprop 全称 root mean square prop 算法,和动量方法一样都可以加快梯度下降速度。关于动量方法的内容可以参考这篇博文模型优化-动量方法。

动量方法借助前一时刻的动量,从而能够有效地缓解山谷震荡以及鞍部停滞问题。而 RMSprop 对比动量方法的思想有所不同,以 y = wx + b 为例,因为只有两个参数,因此可以通过可视化的方式进行说明。

假设纵轴代表参数 b,横轴代表参数 w,由于 w 的取值大于 b,因此整个梯度的等高线呈椭圆形。可以看到越接近最低点(谷底),椭圆的横轴与纵轴的差值也越大,正好对应我们先前所说的山谷地形。

上图中可以看到每个点的位置,以及这些点的梯度方向,也就是说,每个位置的梯度方向垂直于等高线。那么在山谷附近,虽然横轴正在推进,但纵轴方向的摆动幅度也越来越大,这就是山谷震荡现象。如果使用的随机梯度下降,则很有可能不断地上下震荡而无法收敛到最优值附近。所以,我们向减缓参数 b 方向(纵轴)的速度,同时加快参数 w 方向(横轴)的速度。

【计算过程】:

  • 单独计算每个参数在当前位置的梯度。
    dwi=∂L(w)∂widw_{i} = \frac{\partial L(w)}{\partial w_i} dwi​=∂wi​∂L(w)​

  • 计算更新量。
    Sdwi=βSdwi+(1−β)dwi2Sdw_{i} = \beta Sdw{i} + (1 - \beta)dw_{i}^2 Sdwi​=βSdwi+(1−β)dwi2​
    需要注意的是 dw2dw^2dw2 是指对 dw 做平方处理。

  • 更新参数。
    wi=wi−ηdwiSdwiw_i = w_i - \eta \frac{dw_i}{\sqrt{Sdw_i}} wi​=wi​−ηSdwi​​dwi​​

需要注意 SdwiSdw_iSdwi​ 有可能为 0,因此可以添加一个极小的常数来防止分母为零的情况出现。
wi=wi−ηdwiσ+Sdwiw_i = w_i - \eta \frac{dw_i}{\sigma + \sqrt{Sdw_i}} wi​=wi​−ησ+Sdwi​​dwi​​
也可以把这个极小的值放到根号里面。
wi=wi−ηdwiσ+Sdwiw_i = w_i - \eta \frac{dw_i}{\sqrt{\sigma + Sdw_i}} wi​=wi​−ησ+Sdwi​​dwi​​

根据参数更新公式,SdwiSdw_iSdwi​ 越大,则 w 更新得越慢。在先前所讲的山谷地形中,纵轴方向的梯度要大于横轴方向的梯度,也就是说 db 远大于 dw,db/Sdbdb/\sqrt{Sdb}db/Sdb​ 值要小于 dw/Sdwdw/\sqrt{Sdw}dw/Sdw​,最终在纵轴方向上更新得较慢,而在横轴上更新得更快。

RMSprop 实际上是将椭圆形的等高线转换为圆形的等高线。怎么理解呢?当采用特征归一化将 w 和 b 都转化为 [0, 1] 区间后,此时的图等同于右图。

因为是圆形,无论是纵轴还是横轴的梯度大小都相等,那么计算得到的更新量 Sdw = Sdb。若等高线呈椭圆形,则椭圆形长轴方向更新量要大于椭圆形短轴方向,就好比长轴长度为 10,短轴长度为 5,长轴方向每次更新 1,短轴方向每次更新 0.5。虽然速度上不想等,但两者最终从一端抵达另一端所需的时间是一致的。这也是为什么我将 RMSprop 理解成将椭圆形等高线转换为圆形。

【代码实现】:

def RMSprop(x, y, step=0.01, iter_count=500, batch_size=4, beta=0.9):length, features = x.shapedata = np.column_stack((x, np.ones((length, 1))))w = np.zeros((features + 1, 1))Sdw, eta = 0, 10e-7start, end = 0, batch_sizefor i in range(iter_count):# 计算梯度dw = np.sum((np.dot(data[start:end], w) - y[start:end]) * data[start:end], axis=0) / length        # 计算更新量Sdw = beta * Sdw + (1 - beta) * np.dot(dw, dw)                     # 更新参数w = w - (step / np.sqrt(eta + Sdw)) * dw.reshape((features + 1, 1))start = (start + batch_size) % lengthif start > length:start -= lengthend = (end + batch_size) % lengthif end > length:end -= lengthreturn w

对比 AdaGrad 的实现代码,我们可以发现 RMSprop 实际上在 AdaGrad 的梯度累积平方计算公式上新增了一个衰减系数 β 来控制历史信息的获取。

  • AdaGrad:
    r=r+dw2r = r + dw^2 r=r+dw2
  • RMSprop:
    Sdw=βSdw+(1−β)dw2Sdw = \beta Sdw + (1 - \beta)dw^2 Sdw=βSdw+(1−β)dw2

从这个角度来说,RMSprop 改变了学习率。

RMSprop 算法可以结合牛顿动量,RMSprop 改变了学习率,而牛顿动量改变了梯度,从两方面改变更新方式。

【代码实现】:

def RMSprop(x, y, step=0.01, iter_count=500, batch_size=4, alpha=0.9, beta=0.9):length, features = x.shapedata = np.column_stack((x, np.ones((length, 1))))w = np.zeros((features + 1, 1))Sdw, v, eta = 0, 0, 10e-7start, end = 0, batch_size# 开始迭代for i in range(iter_count):# 计算临时更新参数w_temp = w - step * v# 计算梯度dw = np.sum((np.dot(data[start:end], w_temp) - y[start:end]) * data[start:end], axis=0).reshape((features + 1, 1)) / length        # 计算累积梯度平方Sdw = beta * Sdw + (1 - beta) * np.dot(dw.T, dw)# 计算速度更新量、v = alpha * v + (1 - alpha) * dw# 更新参数w = w - (step / np.sqrt(eta + Sdw)) * vstart = (start + batch_size) % lengthif start > length:start -= lengthend = (end + batch_size) % lengthif end > length:end -= lengthreturn w

关于 RMSProp 相关的代码都可从 传送门 中获得。

参考

  • 吴恩达老师的深度学习课程
  • Deep Learning 最优化方法之 RMSProp:https://blog.csdn.net/bvl10101111/article/details/72616378

模型优化-RMSprop相关推荐

  1. mongodb线程池_常用高并发网络线程模型设计及MongoDB线程模型优化实践

    服务端通常需要支持高并发业务访问,如何设计优秀的服务端网络IO工作线程/进程模型对业务的高并发访问需求起着至关重要的核心作用. 本文总结了了不同场景下的多种网络IO线程/进程模型,并给出了各种模型的优 ...

  2. python回归建模_Python实现回归预测及模型优化

    大家好,之前写多了自动化办公的内容,现在换个机器学习的专题跟大家交流学习,作为一个眼科研究生后面也希望后面多通过一些眼科案例顺带普及下眼科知识!在眼科中AI的一项应用就是利用卷积神经网络实现图像识别. ...

  3. DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优

    DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优 目录 基于keras对LSTM算法进行超参数调优 1.可视化LSTM模型的loss和acc曲线

  4. DL之模型调参:深度学习算法模型优化参数之对深度学习模型的超参数采用网格搜索进行模型调优(建议收藏)

    DL之模型调参:深度学习算法模型优化参数之对深度学习模型的超参数采用网格搜索进行模型调优(建议收藏) 目录 神经网络的参数调优 1.神经网络的通病-各种参数随机性 2.评估模型学习能力

  5. DL之DNN:利用DNN【784→50→100→10】算法对MNIST手写数字图片识别数据集进行预测、模型优化

    DL之DNN:利用DNN[784→50→100→10]算法对MNIST手写数字图片识别数据集进行预测.模型优化 导读 目的是建立三层神经网络,进一步理解DNN内部的运作机制 目录 输出结果 设计思路 ...

  6. 【视频课】模型优化拆分!分别学习模型剪枝与模型量化理论与实践

    前言 好的模型结构是深度学习成功的关键因素之一,不仅是非常重要的学术研究方向,在工业界实践中也是模型是否能上线的关键.对各类底层深度学习模型设计和优化技术理解的深度是决定我们能否在深度学习项目中游刃有 ...

  7. 【CV夏季划】2021年有三AI-CV夏季划出炉,冲刺秋招,从CV基础到模型优化彻底掌握...

    2021年的有三AI-CV夏季划正式发布,并且这也是最后一届由言有三本人直接带领的夏季划小组,仅限于今年. 有三AI-CV夏季划是言有三直接一对一带领的深度学习和计算机视觉学习计划小组,目标是在新手入 ...

  8. 【直播课】TensorRT工程落地实践:快速掌握模型优化部署

    前言 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟.高吞吐率的部署推理.TensorRT可用于对超大规模数据中心.嵌入式平台或自动驾驶平台进行推 ...

  9. 【CV秋季划】模型优化很重要,如何循序渐进地学习好?

    好的模型结构是深度学习成功的关键因素之一,不仅是非常重要的学术研究方向,在工业界实践中也是模型是否能上线的关键.对各类底层深度学习模型设计和优化技术理解的深度是决定我们能否在深度学习项目中游刃有余的关 ...

最新文章

  1. Failed to find byte code for java/util/function/BiConsumer
  2. sdut 1466 双向队列
  3. java实现扫地agent_如何实现java agent?分享java agent的使用案例
  4. 电脑手写输入法_QQ拼音输入法除了能打字,竟然还有 N 多妙用!
  5. 5.1.7 INSERT新增数据
  6. 云小课 | 一分钟了解AppCube中的应用
  7. SVN 回退到某一个版本
  8. 基于51单片机的简易计算器
  9. html如何调用function,请问HTML function函数怎么定义和调用?
  10. Ubuntu安装NVDIA显卡驱动,CUDA及cuDNN
  11. Spring Boot-配置
  12. 5.2 差模信号、共模信号、共模抑制比
  13. 解决docker容器中使用composer,无法解析安装包
  14. 毕业设计 基于单片机的智能盲人头盔系统 - 导盲杖 stm32
  15. 微信小程序搭建新闻列表(跟进上一篇博客案例)
  16. UltraISO 制作U盘启动盘
  17. 添加VBA控件按钮及操作提示框
  18. 梦幻西游手游:工坊进阶考试题目攻略—考古、乐艺篇
  19. idea 启动报错: Failed to create JVM.JVM.Path XXXXXXX\jbr\ 我的解决办法
  20. C++入门——电影《老师好》剧情作业

热门文章

  1. linux suse创建用户及密码,suse linux下创建用户方式
  2. 名人堂与代金券(25 分)
  3. leetcode 50. Pow(x,n)
  4. EC600N-AT 软件包笔记
  5. 扩频时钟(SSC)概念以及Lattice FPGA对扩频时钟的支持
  6. c语言b6=1什么意思,维生素c加维生素b6功效
  7. 大数据产业现状及发展趋势分析
  8. 有关金书中正练九阴真经和逆练九阴真经的感悟
  9. matlab 二维样条插值函数,matlab中二维插值函数interp2的使用详解
  10. Oracle报错:ORA-01722-无效数字