深度学习(五)——梯度下降算法介绍及优化

     基础知识掌握情况决定研究的高度,我们刚开始接触深度学习时,一般都是看到别人的概括,这个方法很好能让我们快速上手,但是也有一个很大的缺点, 知识理解的不透彻,导致我们对算法优化时一头雾水。我也是抱着知识总结的思想开始自己的深度学习知识精髓的探索,也希望能从中帮助到更多人。文章中间存在表述不清的地方希望各位研友(研究深度学习的朋友)提出,我会努力完善自己的文章。

一、梯度下降算法的介绍

     前面我们提到的求取损失函数的目的就是,通过降低损失不断地对参数进行优化来达到对网络的优化。其中显而易见我们是需要求出来一个极值。我们对一次函数求极值特别简单,就是不断的求导然后进行判断求取极值。当是二元的函数时,我们就需要进行求偏导。如果函数不是凸函数我们就会得到多个极值问题。因此对于深度学习这种高微的损失函数求极小值是一个困难的事情,在加上深度学习需要大量的样本进行学习,这带来不同的梯度下降方法带来不同的效果。首先我们先介绍一下最常用求梯度的框架:

     1、全局梯度下降(batch gradient descent

           每次迭代求梯度都需要全部的训练集样本来更新模型

     for i in range(epochs):

          params_grad = evaluate_gradient(loss_function,data,params)

          params = params - learning_rate * params_grad

上面是代码实现,我们可以总结一下全局变量的优缺点,我们可以看出由于每次都是全部数据参与迭代,会保证我们每次优化的方向是正确的,从而能够让函数收敛到一个极值(如果是凸函数会是最小值,如果是非凸函数则可能是一个局部极值)。但是,每次迭代都会需要很长时间,并且一次训练太多的数据会导致计算内存不足。

   2、随机梯度下降(Stochastic gradient descent)

         随机梯度下降是,每次从训练中随机选择一个样本进行学习。

       优缺点:SGD一个缺点就是带来的loss值波动比较大,并不能每次更新都能保证梯度按正确的方向进行。但是,从中也有一些优点就是可能因为波动是使函数跳出局部最优解,到达另一个更好的局部最优解。是收敛性效果更佳甚至是全局最优点。此外,由于波动会使迭代次数增多,收敛变慢。不过最终仍然会收敛到局部或者全局最优。

  3、小批量梯度下降(Mini-batch graidentc decent

     小批量梯度下降是在全局梯度下降和随机梯度下降中间取一个平衡,首先我们将数据打乱进行随机分组。然后每次训练输入一小组数据。

   优缺点: 相对于梯度下降,Mini-batch 梯度下降降低了收敛的波动性。使更新更加稳定。相对于全局梯度下降MIni-batch提升了学习速度,不用担心内存带来的局限性。其中每次输入的图片是一个选择问题,我们可以经过多次试验选取一个合适的样本数。

二、梯度下降算法存在的问题和挑战

  1、学习率的选择特别难,如果小的学习率会导致收敛速度慢,如果大的学习率会导致收敛效果不好,即在极值附近不断的动荡但降不下来。

  2、学习速率调整,即设定好一个策略在训练过程中,不断地改变学习速率,但是这仍需要对阈值进行设定。

  3、模型中每次参数更新都需要相同的学习率,但是,由于数据特征的稀疏情况和每个特征的取值统计特征和空间不同,则每次更新参数都需要不同的学习率。

  4、 对于非凸函数,会导致容易陷入局部最优解。另外一个最严重的问题就是不熟出现在局部最优解而是鞍点(在某条线上比较平稳但既不是极大值又不是极小值)。

三、缓解以上问题的优化方法

  下面我们介绍一下梯度下降优化算法:

   1、 Momentum(动量)

    在一些比较多局部极值的函数,采用梯度下降会在这些地方进行徘徊,从而收敛速度回下降,在这中情况下我们添加动量记性结局。原理就是当此刻梯度下降的方向与前一时刻的梯度下降方向相同,就会增大此刻的梯度下降速度。如果与前一时刻的方向相反,则需要减低该方向上的梯度下降速度。这样就会保证在错误的方向上不会偏移太多,让梯度下降更加迅速。

  2、 Adagrad 

  Adagrad是一种基于梯度的优化算法,它能够对每次参数更新自适应不同的学习速率,对稀疏特征得到大的学习率,对于特征多的我们采用较小的学习速率。因此该优化算法比较适合处理稀疏的特征数据,并且能够提高网络的鲁棒性。一般可以训练得到词向量,对于进场出现的单词赋予小的学习速率。

方程如下:

                   

  从方程可以看到momentum 不同,采用了二阶动量。

  3、Adam

  Adaptive Moment Estimation(Adam)也是一种自适应学习速率的方法,其衰减方式类似于动量。

    其方程为:其实就是把一节动量和二阶动量进行结合。

               

四、如何选择SGD优化器

    如果你的数据特征是稀疏的,那么你最好使用自适应学习速率SGD优化方法(Adagrad 、Adadelta、RMSprop 、Adam),因为你不需要在训练的过程中对学习率进行人工调整。但是,现在最新的许多论文都是使用SGD最基础的学习速率退火调整,证据表明SGD有机会得到最小值,但是相对于其他的优化器依赖于鲁棒性的初始化值以及学习速率退火调整策略,并且容易陷入极小值和鞍点。因此为了达到快的收敛,应该选择自适应学习速率的SGD优化方法。

五、 更多的SGD优化策略

    前面提到的Momentum、Adagrade 和Adam都是以改变学习率和控制梯度向正确方向进行进行。下面这些优化算法是对这些散发的一个补充,让训练更加稳定。

   1、  随机打乱样本或者对样本根据某种意义进行排序。

     打乱训练集的顺序是为了保证学习过程中不存在偏差;不过一些情况下我们是逐步解决问题的,而将训练集进行某种有意义的排序更加有利于收敛和SGD的性能。

    2、Batch normalization(BN算法)

      为了保证网络的收敛和训练速度性能的影响,我们常常对输入的数据进行零均值和1方差的原则进行初始化。但是随着网络的训练,参数得到不同程度的更新,这样这些参数会失去0均值和1方差的分布。这样会带来数据的偏移,导致收敛速度下降,并且容易带来过多神经元未被激活,会带来参数的调整过大影响收敛性能。

    3、early stoping(提前结束训练)

     如果多次多次迭代过程中损失函数不再显著减低,应该提前结束训练。或者出现上升的过拟合现象都要提前终止。

  4、 gradient noise

   在每次迭代的时候添加一个高斯分布的随机误差,这样能够增加网络的鲁棒性,并且适合深度网络的训练。因为增加随机噪声很能会跳过局部极值,达到更好的收敛效果。

    以上是对梯度下降相关知识的总结,存在表述不清楚和错误的欢迎指正。接下来我们将对文中提到的BN(batch normalization)的原理以及在深度网络中扮演的角色进行详细介绍。

猜你喜欢

转载自blog.csdn.net/qq_37100442/article/details/81743813