诚信为本,市场在变,诚信永远不变...
  咨询电话:400-123-4567

公司新闻

【入门】深度学习优化算法


学习目标:
- 知道局部最优问题、鞍点与海森矩阵
- 说明批梯度下降算法的优化
- 说明三种类型的优化算法
- 知道学习率退火策略
- 知道参数初始化策略与输入归一化策略
- 应用完成梯度下降算法的优化
1、为什么深度学习需要进行优化?
虽然硬件水平的提升,让我们可以很方便的构建大型神经网络,但是构建神经网络的算法,还是需要我们自己进行一些优化。所以深度学习是需要优化。
2、优化好处
帮助我们能够提高模型的计算效率

在这里插入图片描述

反思一个问题:深度学习里面的“优化算法”,指的是什么?以下说明本人的看法,欢迎各位一起讨论!我们平时所说的优化,在算法领域,我们都知道一个nlogn级别的算法要优于n^2级别的算法,这里讨论的优化算法是降低算法的时间复杂度,就好比在排序领域,我们将两次for循环n方级别的算法优化成nlong级别的算法。在深度学习领域,个人体会到所说的优化算法是将测试集的准确率尽可能的提高,也就是在训练集和测试机都得到一个错误率都比较小又比较接近的一个模型效果,这样一来,需要我们去解决最小值问题、鞍点问题等等一系列在深度学习模型中会遇到的问题。

  • 优化的目标在于降低训练损失,只关注最小化目标函数上的表现
    深度学习问题中,我们通常会预先定义一个损失函数。有了损失函数之后,我们就可以用优化算法将其最小化。
    优化遇到的挑战:
    • 局部最有
    • 梯度消失

在这里插入图片描述
比如:
在这里插入图片描述
该函数图像为:
在这里插入图片描述
如果扩展到多维:
在这里插入图片描述
也就是说,当一个优化问题的数值在局部最优解附近时,由于目标函数有关解的梯度接近或者变为零,最终迭代求得的数值可能只令目标函数局部最小而并非全局最小化。

在这里插入图片描述
下面这个点Y,是鞍点。
在这里插入图片描述
那么达到这个鞍点之后,有什么性质呢?函数在一阶导数为零处(驻点)的海森矩阵为不定矩阵。
当我们有优化问题时,遇到的最大的问题就是鞍点问题。
当函数的海森矩阵在梯度为0的位置上:
- 特征值全为正:局部最小值
- 特征值全为负:局部最大值
- 特征值有正有负:鞍点

为什么需要用到海森矩阵?在很多时候,我们通过一阶求导,通过这个导函数为0得到的判断仅仅为必要条件,也就是说,如果一阶导数为0的点并不能推出是原函数的极值点。用数学上的极限公式来看:该点的导数=当x->x0时的极值,该值等于0,什么问题也说明不了。海森矩阵就是针对这个问题而研究出来的。
也就是可以通过海森矩阵就能看出目前我们的目标函数处于哪个状态中。
1、利用海森矩阵可以判定多元函数的极值问题
2、是一个多元函数的二阶偏导数构成的方阵

为什么会造成损失很难优化?有个原因是因为激活函数存在梯度消失的问题。我们来看一下输出:
在这里插入图片描述
使用的激活函数是sigmoid函数。我们都知道sigmoid函数会把值映射到[0,1]之间,也就是不断的在“收缩”,这些个“收缩”后的值作为下一层网络的输入,然后下一次网络进行计算得出的值再经过sigmoid函数,我们得到了一个损失函数,那么在进行反向传播的过程中,如果这一层和上游多层的w在[0,1]之间,那么就会产生梯度消失;反之,如果大于1,那么可能会产生梯度爆炸。
接下来的内容就是产生了梯度消失或者梯度爆炸后的解决办法。

也就是将整个样本都拿来进行训练,虽然速度会慢些(当样本数量几千万的时候)。
所以对于批梯度下降来说,范围还是比较广的

Mini-Batch 梯度下降

Mini-batch位于banch和SGD(当mini-banch的大小为1时,就是SGD;当mini-banch大大小为全体样本数时,就是banch)之间,mini-banch是每次同时处理固定大小的数据集。关于Banch和mini-banch二者的代价函数下降如下图所示:左边是banch梯度下降,右边是mini-banch梯度下降算法。
在这里插入图片描述
至于为什么会产生这个样子,我们先不去探讨。我们要先搞清楚banch,SGD和mini-banch之间进行梯度下降时,损失函数的不同:

  • banch梯度下降算法
    • 对所有样本执行一次梯度下降,每一次迭代时间较长,训练过程很慢。
    • 相对来说噪声会低,而且总体的成本函数总是朝着最小化的方向去。(毕竟用的是全部样本)
  • 随机梯度下降
    • 对每一个训练样本执行一次梯度下降,训练速度快,但是会丢失向量化带来的计算加速
    • 有很多噪声,需要减少学习率。成本函数总体趋势向全局最小值靠近,但是永远不会收敛,一直在最小值附近徘徊。
      在这里插入图片描述
      因此,选择一个合适大小进行mini-banch梯度下降,可以实现快速学习,也应用了向量化带来的好处,且成本函数的下降处于前两者之间。

mini-banch大小选择

以下的规则可以在论文或者工业界实际操作中应用:

  • 如果训练样本比较小,比如m<=2000时,用banch
  • 如果训练样本比较大,用mini-banch。选择mini-banch大小为2的幂次方,典型为2^6

目的:解决因鞍点问题而带来的梯度停止更新问题
解决办法:在SGD中,加入指数加权平均数来更新参数的梯度

指数加权平均

是一种序列数据处理方式,通常用在金融序列分析、温度变化序列分析等。
在这里插入图片描述
这个气温变化可以当成波动比较大,异常比较多,那么怎么平缓一些呢?
在这里插入图片描述
图中的红线是比较平缓(B=0.9)的,那么怎么得到这条红线?通过指数加权的公式得来的:
在这里插入图片描述
其中Yt为t下的实际值,这是一个递推公式,第t项的结果与1~(t-1)项的结果有关。
当B越大的时候,能够 利用前面的新思想也就越多,那么曲线就会越平滑且越落后(绿色),B=0.5时,是黄色曲线
在这里插入图片描述
这个B叫做偏差修正。
所以,动量梯度下降中,使用的是梯度的指数加权平均,并利用该值进行梯度更新。通常将B设置为0.9,下图是梯度下降(红色)和动量梯度下降(蓝色)的对比图:
在这里插入图片描述
其中,图中的GD并没有指SGD还是mini-banch

怎么解决鞍点问题

通过使用动量梯度下降的方法,使下降的时候偏离鞍点的方向,即可解决鞍点问题。

逐参数适应学习率方法

我自己理解的逐参数适应学习率的方法意思是:我们之前的梯度下降,都是用这一次的权重值去更新下一次的权重值,但是这样子进行更新会像SGD和mini-banch方法都会出现抖动现象,那么研究人员就想了一个办法就是不让这个抖动发生的那么频繁或者减少其抖动,其目的是让这条曲线(也就是损失函数)更加平滑,顺带解决鞍点的问题,那么就把之前全部更新的权重参数拿过来进行参考下一次权重更新的方向。这个思想有点像动态规划里面的单串问题之dp[i]跟前面(i-1)都有联系,但是不同的是动态规划是要最优,取满足最优条件的值即可,而这里的逐参数是用全部的权重参数。以下是学习内容:
前面讨论的方法都是全部的权重参数乘上学习率的方法(反向传播):
在这里插入图片描述
学习率调参是很耗费计算资源的过程,所以很多工作投入到发明能够适应性地对学习率调参的方法,甚至是逐个参数适应学习率调参。

  • 对不同的参数,每个参数更新的学习率会自适应本身参数特点进行梯度更新
  • Adagrad
  • RMSprop
  • Adam

Adagrad

先贴上一段话:
在这里插入图片描述
这段话怎么理解?
首先看在这里插入图片描述这个公式,这个公式很眼熟对吧?像不像进行梯度更新时的函数?但是呢,这个学习率α除上一个以前没见过的东西:“根号下st+ε”,那么st是什么?ε又是什么呢?
来一步步分解:首先看st,找到第一个式子,第一个式子是在更新st,那么是怎么去更新的呢?是用到了上一次的st,即s(t-1),加上了梯度的平方。这个是不是很像“这次更新使用到了历史的参数”,即前面介绍的逐参数适应,也就是动量梯度下降的方法。也就是下图所示:
在这里插入图片描述
其中需要明白的几点:
1、梯度计算大,也就是s1比较大,后面进行梯度下降时用到的学习率小(也就是学习率下降的快),过程优化慢;同理:梯度计算小,学习率大(也就是学习率下降的慢),过程优化快
2、开始用Adagrad可以发现刚开始还不错,但是当越训练,步数越来越多,还没有达到一个很好效果的时候,或者样本越来越多,那么到后面就基本上不下降了,很难找到一个比较优的解。
3、前期没有找到一个很好的解,当后期学习率更小的时候也就会更难找到。

RMSProp算法

由于Adagrad算法在后期学习率过小,可能很难找到一个有用的解,为了解决这一问题,RMSProp算法对Adagrad算法做了一点小小的修改。
Adagrad算法里面的状态变量st是截至至时间步t所有小批量随机梯度按元素平方和,RMSProp(Root Mean Square Prop)算法将这些梯度按元素平方做指数加权移动平均
在这里插入图片描述

Adam算法

将动量和RMSProp结合在一起。
在这里插入图片描述
原论文中作者建议的参数设置的值:
- 学习率α:0.9
- β1:常用的缺省值为0.9
- β2:Adam算法作者建议为0.999
- ε:Adam算法作者建议为1e-8
注:β1,β2,ε通常不需要调试
Adam允许我们使用一个较大的学习率。
所有优化算法比较:https://www.cnblogs.com/GarfieldEr007/p/5328618.html

学习率退火

如果设置一个固定的学习率α,那么可能会出现两个问题:

  • 如果设置学习率过大,那么可能会在最优点附近来回震荡
  • 如果设置的学习率过小,那么下降的会非常慢
    刚开始下降的快,后面下降的慢,是我们所希望的。那么应该怎么做呢?这里有三种最常用的学习率退火方法:
    1、随步数衰减
    2、指数衰减
    在这里插入图片描述
    3、1/t衰减
    在这里插入图片描述
    对于大型的数据模型,需要使用这些方式去自动进行学习率衰减,而一些小型网络可以直接手动进行调整。

参数初始化策略和归一化输入

参数初始化主要指的是神经网络的权重系数,归一化主要指的是特征处理。我们都知道参数不能初始化成同一个值(因为这样的话梯度更新就没有意义了),同样也不能设置过大或者过小,这里是有策略的,目前我还没学到,就先放到这里~。
归一化是为了将数据统一量纲。因为我们现实中的数据,数据的数值之间差距会非常大,这给之后的初始化权重参数、学习率等带来了非常大的影响。而且还会有一个好处是:对网络输入的特征进行标准化,能够缓解梯度消失或者梯度爆炸。至于更详细的视频可以去B站看吴恩达的视频讲解,链接:https://www.bilibili.com/video/BV164411b7dx?p=20

权重初始化有四种方法:
1、随机初始化
从均值为0,标准差为1的高斯分布中进行取样,使用一些很小的值对权重进行初始化。
2、标准初始化
从均匀分布(概率密度函数)中进行抽样。均匀分布的区间范围跟神经元的个数有关
以上两种目前用的很少,下面两种是目前常用的办法
1、Xavier初始化

初始化的值考虑到上一层神经元的个数和下一层神经元的个数。其中输入层和输出层不需要进行权重初始化。

 

2、He初始化
何凯明大神提出来的一种参数初始化方法

平台注册入口