吴恩达:RMSprop
简介
RMSprop,全称Root Mean Square prop,是一种用于深度学习梯度计算的方法。要想理解RMSprop算法,我们先从梯度下降开始说起。
梯度下降
我们来看一下张经典的三维图片
可以看到我们在上面任何一个点采用梯度下降以达到最低点,得到水平方向的梯度将会是零。而垂直方向梯度则随着接近最低点逐渐减小,最终达到最优结果。但是这是理想情况下的凸函数,如果我们面对的是非凸函数,如下图所示:
在这种情况下,梯度方向和大小计算都将受到严重的干扰。此时,随机初始化的起始点所计算的梯度大小往往含有特别大的噪声,若直接采用计算出的梯度大小,就会出现以下问题:
-
鞍点(Saddle point)
从高处落入鞍点时,可能遇到的问题就是一个方向的梯度大,另一个方向的梯度接近于0,导致在鞍点停留此摆动而无法继续靠近最优点。实际上此时为0的梯度不该严格遵守,因为从初始化到得到最优解的过程中,大部分情况的梯度大小都并没有直接为靠近最优点服务。
- 高原(plateau)
而另一种情况就是在高损失区域出现平地,就好像在内蒙古高原丢一个铁球,它不会因为高海拔而一直滑落,反而会因为出现平原地区而保持静止。平地导致各方向梯度均趋近于0,这种情况也将造成收敛困难。同样,我们可以认为此时的梯度大小都并没有直接为靠近最优点服务,需要作出优化。
总的来说,梯度太高或者太低,很可能就是局部造成的,是对接近最优点没有意义的暂时结果。没有大局观需要宏观调控。
优化方法
Rprop算法
为了解决上面说到的梯度大小问题。为梯度增加上下限是有必要的。
假设为实际采用梯度大小,为学习率,为反向传播计算得梯度大小。
若
若
直观来说,梯度一直朝着某个方向前进时,会加一个上限,不让梯度因为局部陡峭而造成大量偏差。而出现前面说到的两种情况,某些方向梯度降到接近于0而无法收敛时。梯度将采用一个最小值,防止无法摆脱局部。
从Rporp到RMSprop
Rporp常常运用于全数据集的运算,简单地说,为梯度添加最小限制的同时也减小了梯度的容错率。详细地说,假设采用Mini Batch进行10步梯度运算,得出前9步梯度为而最后1步梯度为,当这种情况发生时最好的做法时正负梯度抵消,总梯度值尽量保持不变,而Rprop则会进行9次梯度减少和一次梯度增加,造成梯度的严重失衡(当然这里取决于梯度上下限的设置,但是总能找到极端情况)。
为此,引入RMSprop:
其中是梯度, 作为一个值容器承载着梯度平方加权平均的结果,并且作为梯度缩放的因子。是学习率, 则类似于动量梯度下降法中的衰减因子,代表过去梯度对当前梯度的影响,一般取值。
这样子,用梯度自身的大小约束自身避免过大或者过小,减少了人为干预和极端情况发生的可能。在引入Mini Batch的同时不割裂各个Mini Batch之间的梯度关系,就从Rprop算法进化到了RMSprop。
以上就是RMSprop的关键内容,下面是一些细节性的不重要内容,可以忽略
不重要的附录:
- 中对梯度平方个人认为是为了保证非负
- 的根号中,为了避免出现0,往往会加上极小值。
- 相关代码块:
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
- 文章部分参考自外文博客