目录
前言
虽然神经网络具有非常强的表达能力,但是当应用神经网络模型到机器学习时两大类问题:
(1) 优化问题:深度神经网络的优化十分困难。首先,神经网络的损失函数是一个高度非凸函数,找到全局最优解通常比较困难。
其次,深度神经网络的参数量一般十分巨大,训练数据也比较大,因此也无法使用计算代价很高的二阶优化方法, 而一阶优化方法的训练效率通常比较低。此外,深度神经网络存在梯度消失或爆 炸问题,导致基于梯度的优化方法经常失效。
(2) 泛化问题:由于深度神经网络的复杂度比较高,并且拟合能力很强,很容易在训练集上产生过拟合。因此在训练深度神经网络时,同时也需要通过一定 的正则化方法来改进网络的泛化能力。
一些相关基础概念已在 《凸优化(Quasi convex optimization)与梯度下降(Grad descent)》中描述。
一、网络优化
网络优化是指我们通过一些方法改进网络的一些内容,比如模型结构、参数等;深层的神经网络往往损失函数是非凸的,而对其优化就是一个非凸优化的问题,这给我们带来许多难度。
1.1低维非凸优化
低维优化问题可能会使我们陷入局部最优点,这些点是极值点,但却不是最值点;
例如:下图中的函数有许多向下的凹陷,每个凹陷的最低点导数值为0,且在左右一段领域中是最小值点,但却不是函数在定义域上的最小值点,这就是我们说的局部最小值,也是损失函数的局部最优点。
1.2高维非凸优化
而在高维空间中,我们的问题便不是面对局部最优了,而是试着不陷入鞍点(Saddle Point)。鞍点的阶梯度为 0,但是二阶梯度的黑塞(Hessian) 矩阵不是半正定矩阵,他并非最值点。
例如:下图中的红点其中一个维度上是最大值,而在另一个维度上是最小值。
在高维空间中,想在每一个维度都达到最优是一件困难的事,如果我们在某一维度上达到最优的概率 ,假设我们有10000维的参数,在整个参数空间中驻点是局部最优点的概率为 ,这种可能性非常小几乎为0;所以说,高维空间中大部分驻点都是鞍点。
二、优化算法
我们神经网络常用的参数优化方式时梯度下降法。
梯度下降指使得参数在梯度的负方向更新一个步长的单位,其中的是损失。
。
随着参数的更新,损失不断的减小,其意义为让参数朝着损失减小的方向进行更新。
2.1小批量梯度下降
如果我们将训练集所有的样本的损失加起来作为损失进行梯度下降,该方法称为全局梯度下降(Full gradient descent)。
全局梯度下降每进行一个epoch都要计算一次所有样本的损失,消耗的资源十分巨大。
因此,我们计算损失时并不会选取整个训练集,而是将训练集分成多个批次(batch),每个批次有若干样本,每个批次的样本数量称之为批量(batch size);每训练一个批次成为完成一次迭代(Iteration),当训练集所有的样本都完成了一次迭代后我们成为完成了一个回合(epoch),对应公式:
计算损失时,我们将批次中每个样本分别计算损失再相加,除以批量之后得到一个损失进行梯度下降,这就是我们常使用的小批量梯度下降法(Mini-Batch Gradient Descent)。
对于批量大小我们该如何选择呢?
当批量为,梯度的均值为,方差为时
,该批量的均值仍为,但方差就变成了,当批量越大时,小批量就越接近整体,损失的方差便越小;反之,批量越小时,损失的方差越大。
当损失的方差过大时,训练越不容易收敛;而损失方差过小时,训练较为稳定,但方差小的同时意味着扰动噪声小,我们希望有一个小扰动助于我们逃离鞍点。
所以批大小需要根据数据集进行选择;下图是在MNIST数据集上批量大小对损失下降的影响;
左图中可以看出,批量大小越大,下降效果越明显,并且下降曲线越平滑;但从右图来看,如果按整个数据集上的回合(Epoch)数来说,则是批量样本数越小,下降效果越明显。适当小的批量会导致更快的收敛。
2.2学习率衰减
从经验来看,在训练初期使用较大的学习率可以让模型更快收敛,在收敛点附近使用较小学习率可以避免损失来混震荡。
我们希望学习率可以随着训练周期不断地减小,通过学习率衰减(Learning Rate Decay)来控制学习率。
学习率衰减有几种常见的方法,假设初始学习率为
1)分段常数衰减(Piecewise Constant Decay):
每经过 次迭代将学习率衰减为原来的 倍;
2)逆时衰减(Inverse Time Decay):
其中为衰减率
3)指数衰减(Exponential Decay):
其中为衰减率
4)余弦衰减(Cosine Decay):
其中为总的迭代次数
设定初始学习率,绘制学习率衰减图像
学习率衰减会使得学习率随着随着迭代次数增加而减少,所以务必要注重参数的选择,以免学习率衰减趋于0了离收敛还有很大差距。笔者建议在选择学习率衰减之前可以先观察损失的变化曲线,如果损失在训练某个时期来回震荡,可以设置参数使得学习率在这时衰减到一定值了。
2.3AdaGrad
在我们参数更新的时候,参数有些维度的梯度很大,而有些维度的梯度很小,如果我们使用相同的步长可能导致各个维度的收敛速度各不相同;
那么我们是否可以通过一定条件的约束,使得大梯度的参数更新少一点,小梯度的参数更新多一点呢?
AdaGrad算法(Adaptive Gradient Algorithm),每次迭代时自适应地调整每个参数的学习率。
先计算每个参数平方的累计值:
其中为按元素乘积,例如:,,是第次迭代的梯度
AdaGrad算法的一次参数更新差值为:
其中可以在的时候防止除法失效,通常取到;同时上式的加和开方都是按元素操作
2.4动量法
我们会从过往的经历学到一些东西;积极的经历会使我们更加勇敢、激进一些;而挫败的经历会使我们畏手畏脚,变得保守一些。
说到底,我们的决策会受到过去经验的影响。我们参数更新也用到这一思想,如果过去的梯度一直都是朝着某个方向,我们就可以在整个方向更新多一些,变得更‘激进’一些;反之,我们需要变得‘保守’一些。
其中使第此更新的值,是动量因子,通常取0.9,是学习率
我们从公式中解读到:当前参数更新值受到历史梯度的影响,且这些历史越古老,对当前更新的值影响越小
2.5Adam算法
Adam算法(Adaptive Moment Estimation Algorithm)使用动量作为参数更新方向,同时自适应调整学习率。
其中 和分别为两个移动平均的衰减率,通常取值为= 0.9,= 0.99。我们可以把 和 分别看作梯度的均值(一阶矩)和未减去均值的方差(二阶矩)。
假设 ,那么在迭代初期和 的值会比真实的均值和方差 要小。特别是当 和都接近于1时,偏差会很大;因此,需要对偏差进行修正。
次更新值为
其中是学习率
Adam算法思想是同时调整学习率和梯度,是动量法与RMSprop(类AdaGrad)的结合