🚀 机器学习系列前期回顾
1、初识机器学习
2、线性模型到神经网络
3、local minima 的问题如何解决
4、batch和momentum🚀在初识机器学习中,了解了机器学习是如何工作的并引入了线性模型,
🚀在线性模型到神经网络这节,将线性模型进一步改进为弹性较大的神经网络模型并在结尾简要说了一下使用一个batch
更新一次参数,
🚀在local minima
的问题如何解决这节,解决了求解模型未知参数的时候遇见local minima
的解决办法。
🚀在这batch和momentum这节,探索了不同batch
大小可以让梯度下降很好的走出local minima,同时进一步引入momentum,使得local minima不在是问题。
🚀在这小节,我们将继续探索训练网络中会遇见的另外一个问题。
1、出现的问题
随着训练次数的进行,损失值会越来越小,如下图所示。随着训练次数来到500次之后,损失非常小的时候,我们也许就会认为训练来到了critical point
,可是事实真的是这样吗?我们仅仅通过损失值不再下降就得出来到了critical point
,是一种草率的判断,我们还应去看看再500次训练后的每个损失值点处的梯度是否很接近于零,只有这样,我们才可以得出是到达了 critical point
。
所以损失值不再下降了,有可能不是卡在了critical point
。
我们将每个损失点处的梯度计算出来,绘制的图如下所示。不难看出,在300-400和600-700
这些区间里,损失值很低,但他们的梯度有时候确一点也不低,所以损失稳定且很低不一定是由于critical point
导致的。
导致以上现象的原因如下:
由于梯度更新的步子太快,从而导致其在山壁之间来回震荡,即出现损失很小且稳定,但是梯度不趋于零的现象。
2、如何解决
当损失值要接近于最低点的时候,由于学习率过大从而导致最后在山谷之家来回震荡,从而到达不了最低点;既然是由于学习率引起的这个问题,所以首先想到的就是调低学习率,让其步子小一点。
来看一下下图,其绘制的一个损失面图,黄色叉的位置是最佳的,黑色位置是使用梯度下降的初始位置。
来看一下,使用梯度下降算法后,其真实的路径走向如下,更新的w和b并没有让损失降低,反而是让其损失大小上下横跳。
所以,也就是说,可能是学习率太高了,导致每一次更新的w和b都过大了,所以就试着将学习率调低,最开始的时候,走的很顺利,一旦到达了较为平缓的地方(即将接近谷底的地方),由于其学习率低且坡度小,就会导致最后更新得到的w和b变化非常的小,从而导致其梯度走起来非常的慢,在转弯后的那个部分集中了10万个点,发现其学习率遇见坡度较小 的位置,其几乎走不动。
所以不难发现,对于学习率的设置应该对每一个不同的位置特定化,当遇见坡度较大的时候,其学习率应该小一点就比较好;当坡度较小时;其学习率应该较大比较好。即将之前更新参数
θ
\theta
θ 的式子改成下图绿色框住的式子,即将学习率下面加了一个
σ
i
t
\sigma_i^t
σit来得到不同位置不同的学习率。
其更新后的式子如何更新参数
其更新的过程如下, σ i t \sigma_i^t σit中 i i i表示其中的某个参数,为了便于理解方便就保持 i i i不变,看一个参数是如何更新的,
- 在最开始,将 σ i 0 \sigma_i^0 σi0设置为 ∣ g j 0 ∣ |g_j^0| ∣gj0∣,其实由于第一次更新,对于学习率的的设置还是不可知的,所以,就是直接用当前参数值减去学习率。
- 第二次更新参数的时候, σ i 1 \sigma_i^1 σi1设置为了第一次梯度和第二次梯度的平方和平均再开根号。
- 其 σ i t \sigma_i^t σit的设置依次如下,每次都是前几次梯度的平方求和求平均再开根号。
为什么如此设置
σ
i
t
\sigma_i^t
σit就可以实现对于不同点设置不同的学习率呢? 原因如下:
对于梯度较大的来说,其最后算出来的
σ
\sigma
σ就会也会比较大,由于
σ
\sigma
σ是在学习率的分母上,所以整体的学习率反而是下降的;对于梯度较小的来说,其最后算出来的
σ
\sigma
σ就会也会比较小,由于
σ
\sigma
σ是在学习率的分母上,所以整体的学习率反而是变大的;所以就达到坡度大,学习率小;坡度小,学习率大的要求。
其实也不难发现,这种方式也是存在问题的,对于在1000次更新的时候,他再考虑的时候竟然还需要第一次更新时候的梯度,这显然是非常不合理的,所以有以下改进:
每次更新的时候,只考虑最近的两次梯度。
3、该进后的训练结果
先选用第一次的该进后的进行训练得到以下结果,可以发现,其实是可以走到最后的最优点的,但是为什么会在最优点的附近震荡几次呢?
其原因就是考虑的梯度太多,将所有的梯度都考虑了进来导致的;蓝色区域梯度都较大,会使其学习率较低,使其平稳缓慢的走到梯度较小的区域;进入绿色区域,随着一直在梯度较小的区域,会导致学习率变大,由于梯度较小区域的累计,就会导致学习率突然的变大,从而出现红框里面的现象,但是一旦出去了,还是会由于梯度突然变大,降低学习率又会回来,从而就会出现红框里面的现象。
其实出现这个问题,我们也是可以改变学习率本身的大小进而规避掉这个问题,其实究其根本就是由于学习率本身不变,只是通过改变 σ \sigma σ进而影响学习率从而导致最后出现后面的震荡的情况,如果将学习率本身也随着时间改变的话,即让后期的学习率也减小,就不会出现以上情况了。(学习率本身的变化如下图所示)
没加Learing Rate Decay
和加上Learing Rate Decay
的对比如下
除掉Learing Rate Decay
以外,还有一个叫做warm up
的技术也是可以的,其学习率随时间的变化曲线如下
4、再加上momentum
通过对以上式子的改写,即将梯度
g
g
g替换为
m
m
m,但是又出现了一个新的问题:
m
m
m是前面所有梯度的和,而
σ
\sigma
σ也几乎是,一个在分母一个在分子,不就抵消了吗,有何意义?
产生这个疑问最根本的原因就是没有理解
m
m
m和
σ
\sigma
σ的本质,
m
m
m的和是一个向量和,而
σ
\sigma
σ只是简单的代数和。