一、梯度法思想
梯度法思想的三要素:出发点、下降方向、下降步长。
机器学习中常用的权重更新表达式为
:,这里的λ就是学习率,本文从这个式子出发来把机器学习中的各种“梯度”下降法阐释清楚。
梯度方向是
,步长设为常数Δ,这时就会发现,如果用在梯度较大的时候,离最优解比较远,W的更新比较快;然而到了梯度较小的时候,也就是较靠近最优解的时候,W的更新竟然也保持着跟原来一样的速率,这样会导致W很容易更新过度反而远离了最优解,进而出现在最优解附近来回震荡。所以,既然在远离最优解的时候梯度大,在靠近最优解的时候梯度小,我们让步长随着这个律动,于是我我们就用λ|W|来代替Δ,最后得到了我们熟悉的式子:
二、全量梯度下降法(Batch gradient descent)
全量梯度下降法每次学习都使用整个训练集,因此每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点,凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点,缺陷就是学习时间太长,消耗大量内存。
第二、随机梯度下降法(Stochastic Gradient Descent)
SGD一轮迭代只用一条随机选取的数据,尽管SGD的迭代次数比BGD大很多,但一次学习时间非常快。
SGD的缺点在于每次更新可能并不会按照正确的方向进行,参数更新具有高方差,从而导致损失函数剧烈波动。不过,如果目标函数有盆地区域,SGD会使优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样对于非凸函数,可能最终收敛于一个较好的局部极值点,甚至全局极值点。
缺点是,出现损失函数波动,如下图所示,并且无法判断是否收敛。
第三、小批量梯度下降法(Mini-Batch Gradient Descent)
SGD相比BGD收敛速度快,然而,它也的缺点,那就是收敛时浮动,不稳定,在最优解附近波动,难以判断是否已经收敛。这时折中的算法小批量梯度下降法,MBGD就产生了,道理很简单,SGD太极端,一次一条,为何不多几条?MBGD就是用一次迭代多条数据的方法。
并且如果Batch Size选择合理,不仅收敛速度比SGD更快、更稳定,而且在最优解附近的跳动也不会很大,甚至得到比Batch Gradient Descent 更好的解。这样就综合了SGD和Batch Gradient Descent 的优点,同时弱化了缺点。总之,Mini-Batch比SGD和Batch Gradient Descent都好。
第四、Momentum梯度下降法
SGD、BSGD两种改进方法都存在不同程度的震荡,如何避免震荡?或者说震荡是怎么产生的?震荡,从可视图表现来看,就是频繁更改方向,所以,如果能够把之前下降的方向考量进来,那么将会减少振荡。
上边第二个图是带动量的梯度下降法。
下面推导动量下降法。
在普通的梯度下降法W -= V中,每次W的更新量V为V = dW * λ;
当使用冲量时,V考虑为本次的梯度下降量与部分上次更新量的矢量和,即-dW*λ与上次x的更新量V乘以一个介于[0, 1]的系数momemtum的和,即:
V = dW * λ+ V*momemtum。
当本次梯度下降方向与上次更新量的方向相同时,上次的更新量能够对本次的搜索起到一个正向加速的作用。当本次梯度下降方向与上次更新量的方向相反时,上次的更新量能够对本次的搜索起到一个减速的作用。下面两个图,第一图是没有动量的梯度下降法,第二图是有动量的梯度下降法,很明显减少了震荡。
既减少震荡,又大方向不变(本次梯度下降方向),从而保证了效率和正确的收敛。
第五、NAG梯度下降法
NAG(Nesterov Accelerated Gradient)不仅仅把SGD梯度下降以前的方向考虑,还将Momentum梯度变化的幅度也考虑了进来。
上图是Momentum的优化轨迹,下图是NAG的优化轨迹:
在给出公式之前,先看一个向量图:
这个图来源于 G. Hinton’s的文章,网上对这个图的解释大都来源于《An overview of gradient descent optimizationalgorithms》中文翻译,其实并没有真正讲解清楚。本文严格按照愿意解释一下:
Momentum梯度法首先计算的是当前的梯度(图中的小蓝色向量)然后沿着更新的累积梯度的方向来一个大的跳跃(图中大蓝色向量),而NAG梯度法首先沿着先前的累积梯度方向(棕色向量)实现一个大的跳跃,然后加上一个小的按照动量梯度法计算的当前梯度(上图红色向量)进行修正得到上图绿色的向量。此处我抛出一个问题,上图为什么画了两个三角形?如果能理解第二个矢量三解形的意义,才能正在理解NAG。注意第二个矢量三角形的棕色向量与前一个的绿色向量方向一致,因为上一个矢量三角形的结果是绿色向量,而棕色代表的是先前的累积梯度,方向就应该和绿色的一样。然后,再加上当前按照动量梯度法计算出的梯度,就得到第二个三角形的绿色向量。
这个NAG的等效形式与Momentum的区别在于,本次更新方向多加了一个,注意到没有,这项其实就是目标函数的二阶导数!所以NAG本质上是多考虑了目标函数的二阶导信息,读过《一篇中矣:彻底理解XGBoost!》一文的读者,是不是觉得很面熟,二阶导数再次发挥作用!其实所谓“往前看”的说法,在牛顿法这样的二阶方法中经常提到,形象说“往前看”,数学思维则是利用了目标函数的二阶导信息。
转自:https://baijiahao.baidu.com/s?id=1613121229156499765&wfr=spider&for=pc