梯度下降法

来源:互联网 发布:网络舆情相关政策 编辑:程序博客网 时间:2024/06/04 19:23

一、方向导数与梯度

1.1 方向导数

现在我们来讨论函数在一点沿某一方向的变化率问题.

定义 设函数在点的某一邻域内有定义.自点引射线.设轴正向到射线的转角为(逆时针方向:0;顺时针方向:0),并设'(+△,+△)为上的另一点且'∈.我们考虑函数的增量(+△,+△)-'两点间的距离的比值.当'沿着趋于时,如果这个比的极限存在,则称这极限为函数在点沿方向的方向导数,记作,即

                              (1)

从定义可知,当函数在点的偏导数xy存在时,函数在点沿着轴正向=轴正向=的方向导数存在且其值依次为xy,函数在点沿轴负向=轴负向=的方向导数也存在且其值依次为-x、-y.

关于方向导数的存在及计算,我们有下面的定理.

定理  如果函数在点是可微分的,那末函数在该点沿任一方向的方向导数都存在,且有

                                                    (2)

其中轴到方向的转角.

证  根据函数在点可微分的假定,函数的增量可以表达为

           

两边各除以,得到

                      

所以                  

这就证明了方向导数存在且其值为

                           

对于三元函数=来说,它在空间一点沿着方向 (设方向的方向角为的方向导数,同样可以定义为

                               (3)

其中,△=,△=,△=.

同样可以证明,如果函数在所考虑的点处可微分,那末函数在该点沿着方向的方向导数为


1.2 梯度

定义 设函数在平面区域内具有一阶连续偏导数,则对于每一点,都可定出一个向量

                              

这向量称为函数=在点的梯度,记作,即

                     

如果设是与方向同方向的单位向量,则由方向导数的计算公式可知

            

这里,(^,e)表示向量的夹角.由此可以看出,就是梯度在射线上的投影,当方向与梯度的方向一致时,有

                       (^,1,

从而有最大值.所以沿梯度方向的方向导数达到最大值,也就是说,梯度的方向是函数在这点增长最快的方向.因此,我们可以得到如下结论:

函数在某点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值.

由梯度的定义可知,梯度的模为

                    

我们知道,一般说来二元函数在几何上表示一个曲面,这曲面被平面z=c(c是常数)所截得的曲线的方程为

                                

这条曲线面上的投影是一条平面曲线(图8―10),它在平面直角坐标系中的方程为

                                

对于曲线上的一切点,已给函数的函数值都是,所以我们称平面曲线为函数的等高线.

由于等高线上任一点处的法线的斜率为

                         ,

所以梯度                       

为等高线上点处的法向量,因此我们可得到梯度与等高线的下述关系:函数在点的梯度的方向与过点的等高线在这点的法线的一个方向相同,且从数值较低的等高线指向数值较高的等高线(图8―10),而梯度的模等于函数在这个法线方向的方向导数.这个法线方向就是方向导数取得最大值的方向。


二、梯度下降法

梯度下降法是一个最优化算法,可以用于求解非线性方程组,通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一,许多有效算法都是以它为基础进行改进和修正而得到的。最速下降法是用负梯度方向为搜索方向的,最速下降法越接近目标值,步长越小,前进越慢。

2.1 梯度下降的几何形式

下图为梯度下降的目的,找到J(θ)的最小值。

其实,J(θ)的真正图形是类似下面这样的,因为其是一个凸函数,只有一个全局最优解,所以不必担心像上图一样找到局部最优解

直到了要找到图形中的最小值之后,下面介绍自动求解最小值的办法,这就是梯度下降法

对参数向量θ中的每个分量θj,迭代减去速率因子a* (dJ(θ)/dθj)即可,后边一项为J(θ)关于θj的偏导数

2.2 梯度下降的原理

下图展示了对单个特征θ1的直观图形,起始时导数为正,θ1减小后并以新的θ1为基点重新求导,一直迭代就会找到最小的θ1,若导数为负时,θ1的就会不断增到,直到找到使损失函数最小的值。

 

 

有一点需要注意的是步长a的大小,如果a太小,则会迭代很多次才找到最优解,若a太大,可能跳过最优,从而找不到最优解。

另外,在不断迭代的过程中,梯度值会不断变小,所以θ1的变化速度也会越来越慢,所以不需要使速率a的值越来越小

下图就是寻找过程

当梯度下降到一定数值后,每次迭代的变化很小,这时可以设定一个阈值,只要变化小于该阈值,就停止迭代,而得到的结果也近似于最优解。

若损失函数的值不断变大,则有可能是步长速率a太大,导致算法不收敛,这时可适当调整a值

为了选择参数a,就需要不断测试,因为a太大太小都不太好。

 

 

如果想跳过的a与算法复杂的迭代,可以选择 Normal Equation。

梯度下降的几何形式

下图为梯度下降的目的,找到J(θ)的最小值。

其实,J(θ)的真正图形是类似下面这样的,因为其是一个凸函数,只有一个全局最优解,所以不必担心像上图一样找到局部最优解

直到了要找到图形中的最小值之后,下面介绍自动求解最小值的办法,这就是梯度下降法

对参数向量θ中的每个分量θj,迭代减去速率因子a* (dJ(θ)/dθj)即可,后边一项为J(θ)关于θj的偏导数

Steepest gradient 方法得到的是局部最优解,如果目标函数是一个凸优化问题,那么局部最优解就是全局最优解,理想的优化效果如下图,值得注意一点的是,每一次迭代的移动方向都与出发点的等高线垂直

需要指出的是,在某些情况下,最速下降法存在锯齿现象( zig-zagging)将会导致收敛速度变慢:

粗略来讲,在二次函数中,椭球面的形状受 hesse 矩阵的条件数影响,长轴与短轴对应矩阵的最小特征值和最大特征值的方向,其大小与特征值的平方根成反比最大特征值与最小特征值相差越大,椭球面越扁,那么优化路径需要走很大的弯路,计算效率很低。


三、几种常见的梯度下降

在具体使用梯度下降法的过程中,主要有以下几种不同的变种,即:batch、mini-batch、SGD。其主要区别是不同的变形在训练数据的选择上。

1、批量梯度下降法BGD 
  批梯度下降法(Batch Gradient Descent)针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。 
  批量梯度下降法的损失函数为: 
       这里写图片描述 
  进一步得到批量梯度下降的迭代式为: 
    这里写图片描述 
  每迭代一步,都要用到训练集所有的数据,如果样本数目很大,那么可想而知这种方法的迭代速度! 
  优点:全局最优解;易于并行实现; 
  缺点:当样本数目很多时,训练过程会很慢。
 
  从迭代的次数上来看,BGD迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下: 
       这里写图片描述 
        
2、小批量梯度下降法MBGD 
  在上述的批梯度的方式中每次迭代都要使用到所有的样本,对于数据量特别大的情况,如大规模的机器学习应用,每次迭代求解所有样本需要花费大量的计算成本。是否可以在每次的迭代过程中利用部分样本代替所有的样本呢?基于这样的思想,便出现了mini-batch的概念。 
  假设训练集中的样本的个数为1000,则每个mini-batch只是其一个子集,假设,每个mini-batch中含有10个样本,这样,整个训练数据集可以分为100个mini-batch。伪代码如下: 
     这里写图片描述

3、随机梯度下降法SGD

  随机梯度下降算法(stochastic gradient descent)可以看成是mini-batch gradient descent的一个特殊的情形,即在随机梯度下降法中每次仅根据一个样本对模型中的参数进行调整,等价于上述的b=1情况下的mini-batch gradient descent,即每个mini-batch中只有一个训练样本。 
  随机梯度下降法的优化过程为: 
这里写图片描述 
  随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。 
  优点:训练速度快; 
  缺点:准确度下降,并不是全局最优;不易于并行实现。 

  从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。其迭代的收敛曲线示意图可以表示如下: 
  
这里写图片描述

随机梯度下降代码


load data; %导入X,Y,test_featureepsilon = 0.0001; %收敛阈值alpha = 0.001; %学习率k = 1; %迭代次数n = size(X,2); %特征数+1m = size(X,1); %训练样本个数theta = zeros(n,1);theta_new = zeros(n,1);converge = 0;while(converge==0)    %未收敛        for(i=1:m)        %反复使用m个训练样本,每个样本就更新一次参数            J(k) = 1/2 * (norm(X*theta - Y))^2;            for(j = 1:n)                theta_new(j) = theta(j)-alpha*(X(i,:)*theta-Y(i,:))*X(i,j);            end;            if norm(theta_new-theta) < epsilon                converge=1;                theta = theta_new;                break;            else                theta = theta_new;                k = k + 1;            end        end;end;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

三种梯度下降方法的总结

  1.批梯度下降每次更新使用了所有的训练数据,最小化损失函数,如果只有一个极小值,那么批梯度下降是考虑了训练集所有数据,是朝着最小值迭代运动的,但是缺点是如果样本值很大的话,更新速度会很慢。

  2.随机梯度下降在每次更新的时候,只考虑了一个样本点,这样会大大加快训练数据,也恰好是批梯度下降的缺点,但是有可能由于训练数据的噪声点较多,那么每一次利用噪声点进行更新的过程中,就不一定是朝着极小值方向更新,但是由于更新多轮,整体方向还是大致朝着极小值方向更新,又提高了速度。

  3.小批量梯度下降法是为了解决批梯度下降法的训练速度慢,以及随机梯度下降法的准确性综合而来,但是这里注意,不同问题的batch是不一样的,只能通过实验结果来进行超参数的调整。

四 普通梯度下降的挑战与改进

  • 如何选择正确的学习率。学习率太小收敛太慢。学习率太大导致损失函数在极值点波动或发散。

  • 调整训练期间的学习速率。例如根据预定义的时间减少学习率,或者当epoch之间的目标的变化降到阈值以下时,即early stopping。 然而,这些时间计划和阈值必须提前定义,因此不能适应数据集的特性。

  • 对所有参数使用相同的学习率。 如果数据稀疏,并且每个特征具有不同的使用频率,我们不想将其全部更新到相同的程度,但是对使用频率较少的特征执行更大的更新。 
    (ps:数据稀疏,例如对于文本分类问题,通常使用bag-of-words作为特征,每个文档都用一个向量表示,向量的长度是词表的长度,并且有很多值是0,代表文档中没有这个词。那么这个数据就是稀疏数据。而对于图片来说,每个图片都有像素,且值不为0,这个数据就是稠密数据)

  • 对于神经网络通用的高度非凸的误差函数最小化的另一个关键挑战是避免陷入其众多次优局部最小值中。 Dauphin等人认为难度实际上不是来自局部最小值,而是来自鞍点,如下图所示。 这些鞍点通常被具有相同误差的平台包围,这使得SGD难以逃脱,因为梯度在所有维度上接近于零。 
    这里写图片描述

梯度下降优化算法

Momentum

SGD方法的一个缺点是其更新的方法完全依赖于当前的batch,因而其更新十分不稳定,可引入mementum,模拟惯性,即更新时在一定程度上保留很之前更新的方向,同时利用当前的batch的梯度微调最终的更新方向,可一定程度上增加稳定性,从而学习的更快,且还有一定摆脱局部最优的能力难。

SGD方法很难从陡峭的区域上跳出来,陡峭的区域指的是一个维度上的表面比在另一个维度上的表面更加陡的区域,这在局部最优中是常见的。在这些情况下,SGD在峡谷的斜坡上振荡。 
这里写图片描述 
SGD without momentum 
这里写图片描述 
SGD with momentum

Momentum 是一种有助于在相关方向上加速SGD并抑制振荡的方法,如图所示。


 一般取0.9或类似的值


对于梯度指向相同方向的维度,动量项增加,并且减少梯度改变方向的维度的更新。 因此获得更快的收敛和减少振荡。

Nesterov accelerated gradient

现在我们设计一种更加聪明的方法,通过(参数下一个位置的近似值)来指导参数更新。

再次,我们将动量项 设置为大约0.9的值。 当动量首先计算当前梯度(图4中的小蓝色矢量),然后在更新的累积梯度(大蓝色矢量)的方向上进行大跳跃时,NAG首先在先前累积梯度的方向上跳跃很大( 棕色矢量),测量渐变,然后进行校正(红色矢量),这导致完整的NAG更新(绿色矢量)。 这种预期的更新阻止了我们的速度太快,导致响应速度增加,这大大增加了RNN在许多任务上的性能。

现在,我们可以使我们的更新适应我们的损失函数的斜率,并依次加速SGD,我们也希望根据自己的重要性调整每个参数的更新以执行更大或更小的更新。

Adagrad

Adagrad是一种参数的自适应学习率算法,对常用的参数执行较小的更新,对不常用的参数执行较大更新。 因此,它非常适合处理稀疏数据。

以前,我们对所有参数
同时执行更新,因为每个参数使用相同的学习速率Adagrad在每个时间步长t对每个参数 间步长t对每个参数θi使用不同的学习速率,首先表示出Adagrad的每个参数更新,然后将其向量化。 是参数在时间不长t时候的梯度;


t,i
 
g

是一个对角矩阵,每一个对角元素是θ 到时间t的梯度的和。
 是一个平滑参数,为了不让分母为0。不用平方根的话,算法表现不好。

SGD更新θ
θ

Adagrad 改变θ
θ

 是一个对角矩阵,每一个对角元素是θ 到时间t的梯度的和。
 是一个平滑参数,为了不让分母为0。不用平方根的话,算法表现不好。

Adagrad的主要优点之一是它不需要手动调整学习速率。 大多数实现使用默认值0.01。

Adagrad的主要弱点是它在分母中的平方梯度的积累:由于每个增加的项都是正数,累积的总和在训练期间保持增长。 这又导致学习速率收缩并且最终变得无穷小,在该点处算法不再能够获取额外的知识。 以下算法旨在解决这个缺陷。

需要手工设置一个全局的初始学习率

更新参数时,左右两边的单位不同一。

Adadelta

Adadelta是Adagrad的延伸,旨在减少其单调降低的学习率。 Adadelta不是累积所有过去的平方梯度,而是将累积过去的梯度的窗口限制到一定的固定大小w区间。

Adadelta的梯度采用过去所有时刻梯度平方的衰减平均,时刻t的值仅依赖于之前的均值和当前梯度


类似于momentum项,我们将的值取在0.9附近




Adam(Adaptive Moment Estimation)

该方法除了像Adeadelta和Rmsprop一样保存过去梯度平方和的指数衰减外,还保存类似momentum一样过去梯度的指数衰减平均。

其中分别是梯度的一阶距(均值)和二阶距(偏方差)的估计。由于是由全零的向量初始化的,Adam的作者认为他们会被偏向0,特别是在初始时间步长和衰减率都很小的时候(即都接近于1)
可以通过计算偏差矫正的一阶距和二阶距的估计抵消掉偏差。

然后使用上述项和Adadelta和Rmspop一样参数更新,得到Adam的更新规则:

其中的默认值一般是0.9和0.999,的默认值为。他们以经验表明,Adam在实践中效果良好,与其他适应性学习方法算法相比更有利。


SGD optimization on loss surface contours


SGD optimization on saddle point
As we can see, the adaptive learning-rate methods, i.e. Adagrad, Adadelta, RMSprop, and Adam are most suitable and provide the best convergence for these scenarios.

采用哪种方法
如何输入的数据是稀疏的,那你更可能通过某种自适应学习速率方法来获得最好的结果,另一个好处是不必去调学习速率,仅用默认值就可以取得最好的结果。
Rmsprop是Adagrad的一种针对处理Adagrad的学习速率减小的扩展,它和Adadelta是一样的,唯一不同的是Adadelta使用在更新规则的分子中使用参数更新的RMS。
Adam是将偏差修正和动量加入到Rmsprop中,Rmsprop、Adadelta和Adam是很相似的算法,且在相似的环境中性能都不错。
Kingma等人发现在优化后期由于梯度越来越稀疏,bais_correction使得Adma稍微强于Rmsprop,综合来看,Adma可能是最佳选择。

原创粉丝点击