在利用梯度下降算法的时候,如果不同方向的梯度大小差异比较大,就会造成一个困扰。如果学习速率设置过大会导致dw较大的方向上反复波动,不能到达最低值。如果学习速率设置太小,训练速率就会减慢。

上一篇文章我们用动量梯度下降的办法来解决这个问题。动量梯度下降只有在已经出现波动的时候才有效,但是在未出现波动的时候,并不能预防出现波动。解决这个问题还有一个想法就是我们在不同维度上让学习速率不一样。如果这个方向上的dw很大,那么我们让它的学习率变小一些。如果dw很小,我们让它学习率变大一些。这样不同的维度就能基本同时达到最优点。从而一定程度上预防了波动。

RMSprop (Root Mean Square Prop) 方法

RMSprop方法就是调整每次dw的大小。让各个维度的dw都尽量同时到达最低点。如果两个维度要降低的绝对距离一样。dw高的那个维度学习率就低一些,dw低的那个维度学习率就高一些。这时是怎么做到的呢?答案就是给原来不变的学习率乘以一个系数。在得到这个系数之前我们先看一个对{(dw)}^2的指数加权平均。用S_{dw}来表示。
初始S_{dw}=0
每次迭代,更新为:
S_{dw}=\beta_{2}*S_{dw}+(1-\beta_{2})*{(dw)}^2

最终我们给学习率乘以这个系数:
\frac{1}{\sqrt{S_{dw}}}

怎么理解这个系数呢?
首先,S_{dw}能表示过去一段时间dw的平均大小。为什么用平方呢就是为了防止正负抵消。
给学习率除以S_{dw}就可以达到调节学习率的目的。如果dw大,那么除以的数也大。相当步长减小。dw小则除以的数也小。步长相对影响不大。从而达到了平衡的目的,让不同的维度可以基本保证同时到达最低点。
为什么最后要开根号呢?就是为了去掉之前平方的影响。

根据经验\beta_{2}一般取值为0.999
为了防止除零,我们可以给分母上加一个很小的数,比如10的负8次方
\frac{1}{\sqrt{S_{dw}}+\varepsilon}

Adam (Adaptive Moment Estimation)

Adam就是动量梯度下降和RMSprop方法的结合:
初始化V_{dw}=0S_{dw}=0
每次迭代:
V_{dw}=\beta_{1}*V_{dw}+(1-\beta_{1})*dw
S_{dw}=\beta_{2}*S_{dw}+(1-\beta_{2})*{(dw)}^2
更新w:
W=W-a*\frac{V_{dw}}{\sqrt{S_{dw}}+\varepsilon}

基本上差不多了。还有一个小问题就是之前我们没有提到的关于对指数加权平均计算的时候会因为初始值为0,以及前边元素不够多而导致指数加权平均值偏小的问题。这个偏小的值并不能代表平均值。对此我们可以做一个修正,只是在深度学习里得迭代次数很多,前边元素不多的影响后来会消失。我们并没有对指数加权平均初始不准进行修正。但是在Adam算法时,一般是需要修正的。
修正的方法是指数加权平均的值需要除以1-{\beta}^t,其中t代表现在正在计算的迭代次数。
所以我们修正之前的公式为:
V_{dw}=\frac{\beta_{1}*V_{dw}+(1-\beta_{1})*dw}{1-{\beta_{1}}^t}
S_{dw}=\frac{\beta_{2}*S_{dw}+(1-\beta_{2})*{(dw)}^2}{1-{\beta_{2}}^t}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: