对于机器学习,经常提及的就是批量梯度下降、随机梯度下降,以及两者结合的小批量梯度下降。在深度学习中,常用的还有梯度下降的一些变种,像Adam、AdaGrad……这里只说最基本的三种。
简要过程
像普通线性回归、Ridge回归,通过求导,也就是最小二乘法就可以求解,但Lasso不可以,Lasso通常采用的是坐标轴下降法。除了最小二乘法,还有另外一种方法,也是最常用的:梯度下降法。
比如有一个函数
y=f(x)=x²
对应的图

我们要求的是
x∗=xargminy
这里简单说一下梯度下降基本的原理:
比如先随机找一点 x0=2,此时 y0=4。而目标点是 (0,0) 这个点;
现在找一点 x1,x1 只有在 x0 的左侧,即 x1<x0,才可能更接近目标点,比如找到的点是 x1=−1.2,此时 y1=1.44;
接着再找 x2,x2 应位于 x1 的右侧,即 x2>x1……
……
最终如上图,越来越接近目标点。也就我们基于递归的思想,每步都离目标更近一些。
对于 x0=2,y0′=4>0,我们期望找到 x1=x0−∆1
假如现在找到了 x1=−1.2,此时 y0′=−2.4<0,下一步则期望找到 x2=x1+∆2
我们不可能全部的∆ 都找出来。我们知道导数表示变化率,梯度表示的变化最快的情况,导数同时也是梯度在一维(这里说的是 x 的维度)空间的表现形式。我们当然是希望以最快的方式找到目标点,那么可不可以把梯度引入进来?
观察一下上面的内容,
对于 ∆1,可以令他等于 ∆∗y0′,即 x1=x0−∆∗y0′
对于 ∆2,可以令他等于 ∆∗y1′,而 y1′ 是负数,所以 x2=x1−∆2=x1−∆∗y1′
……
综上,可得
xm+1=xm−∆∗ym′
即:
xk+1=xk−αf′(xk)
通过上面的迭代一定能找到目标点。
上面说的是一维,如果是多维,比如二维呢?其实是一样的,举个例子:

公式推导
基于之前线性回归的目标函数
J(θ)=21i=1∑m(hθ(x(i))−y(i))2
初始化θ(随机初始化,可以初始为0),沿着负梯度方向迭代,更新后的θ使J(θ)更小(因为J(θ)是一个凸函数,和y=x²类似。如果不是凸函数呢?可能会找到局部最优,而非全局最优。这种情况可采用Adam算法,深度学习中有用到)
θ=θ−α∙∂θ∂J(θ)
注 α:学习率、步长,大于0,一般取0.001,0.01,0.1,从小到大调参
总的来说就是沿负梯度方向进行迭代更新
图

公式推导
J(θ)=21i=1∑m(hθ(x(i))−y(i))2
右式是累加的形式,可以以其中一项为例,即一个样本
∂θj∂J(θ)=∂θj∂21(hθ(x)−y)2=2⋅21(hθ(x)−y)⋅∂θj∂(hθ(x)−y)=(hθ(x)−y)⋅∂θj∂(i=1∑nθixi−y)=(hθ(x)−y)xj
再来看一下
θ=θ−α∙∂θ∂J(θ)
这是一个向量的减法,具体的计算,是向量的每一维度进行相应的减操作,因此可以通过循环操作,对每一维度进行更新。
3种梯度下降
1)批量梯度下降算法(BGD)
∂θj∂J(θ)=(hθ(x)−y)xj
∂θj∂J(θ)=i=1∑m∂θj∂J(θ)=i=1∑m(hθ(x(i))−y(i))xj(i)
第一行表示一条数据的情况,如果对于m条数据,就是第二行的累加情况。
批量梯度下降,也就是对 θj 进行更新时,一次对m条数据进行操作:m条数据导数累加的和,然后再做更新
θj=θj+αi=1∑m(y(i)−hθ(x(i)))xj(i)
2)随机梯度下降算法(SGD)
既然能一次性更新所有的样本,那能不能一次只更新一个样本?这就是随机梯度下降:也就是有一条样本就更新一次 θj
∂θj∂J(θ)=(hθ(x)−y)xj

总体是趋于最优值。但由于是一条样本一更新,当有异常样本时,可能会出现远离的情况。所以总体往往有波动。
比较


- SGD速度比BGD快(迭代次数少)
- SGD在某些情况下(全局存在多个相对最优解/J(θ)不是一个二次),SGD有可能跳出某些小的局部最优解,所以不会比BGD坏
- BGD一定能够得到一个局部最优解(在线性回归模型中一定是得到一个全局最优解),SGD由于随机性的存在可能导致最终结果比BGD的差
注意:优先选择SGD
3)小批量梯度下降法(MBGD)
如果即需要保证算法的训练过程比较快,又需要保证最终参数训练的准确率,而这正是小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)的初衷。MBGD中不是每拿一个样本就更新一次梯度,而且拿b个样本(b一般为10)的平均梯度作为更新方向。

注意点
由于梯度下降法中负梯度方向作为变量的变化方向,所以有可能导致最终求解的值是局部最优解,所以在使用梯度下降的时候,一般需要进行一些调优策略。
学习率的选择:学习率过大,表示每次迭代更新的时候变化比较大,有可能会跳过最优解;学习率过小,表示每次迭代更新的时候变化比较小,就会导致迭代速度过慢,很长时间都不能结束;一般取0.001,0.01,0.1,从小到大调参

算法初始参数值的选择:初始值不同,最终获得的最小值也有可能不同,因为梯度下降法求解的是局部最优解,所以一般情况下,选择多次不同初始值运行算法,并最终返回损失函数最小情况下的结果值;sklearn无此功能
标准化:由于样本不同特征的取值范围不同,可能会导致在各个不同参数上迭代速度不同,为了减少特征取值的影响,可以将特征进行标准化操作。
BGD、SGD、MBGD的区别:
-
当样本量为m的时候,每次迭代BGD算法中对于参数值更新一次,SGD算法中对于参数值更新m次,MBGD算法中对于参数值更新m/n次,相对来讲SGD算法的更新速度最快;
-
SGD算法中对于每个样本都需要更新参数值,当样本值不太正常的时候,就有可能会导致本次的参数更新会产生相反的影响,也就是说SGD算法的结果并不是完全收敛的,而是在收敛结果处波动的;
-
SGD算法是每个样本都更新一次参数值,所以SGD算法特别适合样本数据量大的情况以及在线机器学习(Online ML)。