各种梯度下降法的简单理解

微分

如何看待微分的直观含义,有以下两种最普遍的理解:
1.函数图像中,某点的斜率
2.函数的变化率
单变量微分:
各种梯度下降法的简单理解_第1张图片
多变量微分(分别对多个变量求偏导数):
各种梯度下降法的简单理解_第2张图片

梯度

梯度其实就是变量偏导数的一般化,如下
各种梯度下降法的简单理解_第3张图片

  • 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
  • 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向。
  • 梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点!

梯度下降法思想

目标函数

目标函数,一般都是凸函数。凸函数求解问题,可以把目标损失函数想象成一口锅,来找到这个锅的锅底。

三要素

  • 出发点
  • 下降方向
  • 下降步长(学习率λ)

思想

梯度下降法一个最贴切的现实场景假设就是下山的过程。如果我们想尽快下山,我们往往会朝着下降最快即最陡峭的地方行走。对于求函数极值也是如此,我们只要不断沿着梯度的方向进行迭代,一般就可以找到极值点。
具体来说,如果我们有一个可微分的函数。这个函数假设代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,我们设定现在的出发点,找到当前位置最陡峭的方向,然后沿着此方向向下走(下降方向),对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向走一定步长(下降步长),就能让函数值下降的最快!因为我们知道,梯度的方向就是函数之变化最快的方向。

迭代过程

在梯度下降法中,进行下面的迭代:
Theta(n) = Theta(n-1) - alpha*▼(theta)
theta是我们迭代求解的参数向量,其中alpha在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋,哈哈,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

迭代过程由来

梯度方向:
各种梯度下降法的简单理解_第4张图片
不难理解,沿着梯度方向的反方向就是下降最快的地方。如果我们把步长设为常数Δ,我们会发现:
如果用在梯度较大的时候,离最优解比较远,W的更新比较快;然而到了梯度较小的时候,也就是较靠近最优解的时候,W的更新竟然也保持着跟原来一样的速率,这样会导致W很容易更新过度反而远离了最优解,进而出现在最优解附近来回震荡。所以,既然在远离最优解的时候梯度大,在靠近最优解的时候梯度小,我们让步长随着这个律动,于是我我们就用λ|W|来代替Δ,得到:
各种梯度下降法的简单理解_第5张图片
这就是我们想要的迭代过程的普遍表达,各种改进的梯度下降法,都是在该基础上进行的变形。

全量梯度下降法(Batch gradient descent)

BGD每次学习都使用整个训练集,因此每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点,凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点,缺陷就是学习时间太长,消耗大量内存。

随机梯度下降法(Stochastic Gradient Descent)

SGDSGD一轮迭代只用一条随机选取的数据,尽管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梯度下降法

暂时不做详细展开

在下面的文章中,将运用梯度下降法进行实例的演示。

你可能感兴趣的:(Machine,Learining)