RMSprop

吴恩达:RMSprop

简介

RMSprop,全称Root Mean Square prop,是一种用于深度学习梯度计算的方法。要想理解RMSprop算法,我们先从梯度下降开始说起。


梯度下降

我们来看一下张经典的三维图片


convex_function.png

可以看到我们在上面任何一个点采用梯度下降以达到最低点,得到水平方向的梯度将会是零。而垂直方向梯度则随着接近最低点逐渐减小,最终达到最优结果。但是这是理想情况下的凸函数,如果我们面对的是非凸函数,如下图所示:

non-convex_function.jpg

在这种情况下,梯度方向和大小计算都将受到严重的干扰。此时,随机初始化的起始点所计算的梯度大小往往含有特别大的噪声,若直接采用计算出的梯度大小,就会出现以下问题:

  • 鞍点(Saddle point)


    Saddle_point.png

从高处落入鞍点时,可能遇到的问题就是一个方向的梯度大,另一个方向的梯度接近于0,导致在鞍点停留此摆动而无法继续靠近最优点。实际上此时为0的梯度不该严格遵守,因为从初始化到得到最优解的过程中,大部分情况的梯度大小都并没有直接为靠近最优点服务。

  • 高原(plateau)
    而另一种情况就是在高损失区域出现平地,就好像在内蒙古高原丢一个铁球,它不会因为高海拔而一直滑落,反而会因为出现平原地区而保持静止。平地导致各方向梯度均趋近于0,这种情况也将造成收敛困难。同样,我们可以认为此时的梯度大小都并没有直接为靠近最优点服务,需要作出优化。

总的来说,梯度太高或者太低,很可能就是局部造成的,是对接近最优点没有意义的暂时结果。没有大局观需要宏观调控。


优化方法

Rprop算法

为了解决上面说到的梯度大小问题。为梯度增加上下限是有必要的。

假设S为实际采用梯度大小,\beta为学习率,dw为反向传播计算得梯度大小。

dw[t] * dw[t - 1] > 0:
S = min(S * \beta, S_{max})

dw[t] * dw[t - 1] < 0:
S = max(S * \beta, S_{min})
直观来说,梯度一直朝着某个方向前进时,会加一个上限,不让梯度因为局部陡峭而造成大量偏差。而出现前面说到的两种情况,某些方向梯度降到接近于0而无法收敛时。梯度将采用一个最小值,防止无法摆脱局部。


从Rporp到RMSprop

Rporp常常运用于全数据集的运算,简单地说,为梯度添加最小限制的同时也减小了梯度的容错率。详细地说,假设采用Mini Batch进行10步梯度运算,得出前9步梯度为-0.1而最后1步梯度为0.9,当这种情况发生时最好的做法时正负梯度抵消,总梯度值尽量保持不变,而Rprop则会进行9次梯度减少和一次梯度增加,造成梯度的严重失衡(当然这里取决于梯度上下限的设置,但是总能找到极端情况)。

为此,引入RMSprop:
S_{dw} = \beta S_{dw} + (1 - \beta)dw^2
w = w - \alpha \frac{dw}{\sqrt{S_{dw}}}
其中dw是梯度, S_{dw}作为一个值容器承载着梯度平方加权平均的结果,并且作为梯度缩放的因子。\alpha是学习率,\beta 则类似于动量梯度下降法中的衰减因子,代表过去梯度对当前梯度的影响,一般取值0.9

这样子,用梯度自身的大小约束自身避免过大或者过小,减少了人为干预和极端情况发生的可能。在引入Mini Batch的同时不割裂各个Mini Batch之间的梯度关系,就从Rprop算法进化到了RMSprop。


以上就是RMSprop的关键内容,下面是一些细节性的不重要内容,可以忽略


不重要的附录:

  1. S_{dw} = \beta S_{dw} + (1 - \beta)dw^2中对梯度平方个人认为是为了保证非负
  2. w = w - \alpha \frac{dw}{\sqrt{S_{dw}}}的根号中,为了避免出现0,往往会加上极小值1e^{-8}
  3. 相关代码块:
Rprop关键代码
for t in range(num_interations):
    dw[t] = compute_gradient(x, y)
    
    if dw[t] * dw[t - 1] > 0:
        step_size = min(step_size * incFactor, step_size_max)
    elif dw[t] * dw[t - 1] < 0:
        step_size = max(step_size * decFactor, step_size_min)
    
    w[t] = w[t - 1] - sign(dw[t]) * step_size
RMSprop关键代码
drad_squared = 0
for _ in num_iterations:
    dw = compute_gradients(x, y)
    grad_squared = 0.9 * grads_squared + 0.1 * dx * dx
    w = w - (lr / np.sqrt(grad_squared)) * dw
  1. 文章部分参考自外文博客
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 有前面的知识,我们知道如何构建目标函数了,当目标函数构建出来后,如何求其参数使的目标函数最小化呢?这就是这一小节的...
    李涛AT北京阅读 4,547评论 0 0
  • 大宝:浩轩 6十11 小宝:浩正 4岁 小组:2组 丫丫老师的锦囊2听后感:放下期待收获的都是惊喜!90天不是...
    H叶燕子阅读 2,206评论 0 0
  • 操作系统磁盘管理章节(二) 课程介绍部分 1.磁盘体系结构应用 磁盘格式化操作 磁盘挂载操作 如何自动挂载 挂...
    亦雨萧萧阅读 3,280评论 0 0
  • 基于病叶图像处理技术的植物病害识别是一个具有挑战性的研究课题。 病态叶片图像的复杂性。深入学习模式在植物病害鉴定方...
    菜田的守望者w阅读 3,321评论 0 0
  • 仙老师一生就知道两个天才,一个是复有诗书的小程序——美图配诗的制作者小毛老师,另一个,就是王勃了。 王勃,用陈子昂...
    大仙故事会阅读 5,395评论 0 4

友情链接更多精彩内容