写在开头:优化器的最大作用就是在网络训练过程中通过训练集数据找到其最小的损失函数(目标函数)所用到的一些优化方法,但是正如所说的其只能用训练误差量化训练效果,所以最终应用于测试集时候需要使用一些策略防止过拟合,但是合适的优化器在网络迭代中发挥了重要的作用,该篇文章简单介绍该部分知识包括gd,sgd,batch-gd, momentum,AdaGrad,RMSProp,AdaDekta,Adam。
在深度学习中很多问题不存在解析解,通常使用基于数值方法的优化算法找到近似解即数值解,通过优化算法有限次迭代模型参数来尽可能降低损失函数,找到最小化目标函数的数值解。
海森矩阵:海森矩阵(Hessian matrix) 是一个自变量为向量的实值函数的 二阶偏导数 组成 的方块矩阵,假设有一个实数函数。
如果f所有的二阶偏导数都存在,那么f的海森矩阵的第ij项,即:
其中即:
即可通过海森矩阵在梯度为0的位置判断出其是局部最小值,局部最大值或者鞍点。
梯度下降的核心其实就是根据导数变化的方向不断更新迭代其中参数并逐步趋近于数值解,因为在梯度下降过程中,先选取一个初始值x和常数η,然后不断通过上式来迭代x。
当输入目标函数时d维向量,目标函数有关x的梯度是一个由d个偏导数组成的向量:
随机梯度下降(stochastic gradient descent,SGD)减少了每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样的一个样本索引 ∈{1,…, },并计算梯度 ? ( )来迭代
每轮迭代中随机均匀采样多个样本组成一个小批量,然后使用这个小批量来计算梯度,相对sgd来说其使用min-batch代替了单个样本值,其计算精确度更高,而相对gd来说,通过使用min-batch能够很好解决大样本值时候计算复杂度的问题。
在接下来的每一个时间步 >0中,小批量随机梯度下降随机均匀采样一个由训练数据样本索引组成的小批量 。我们可以通过重复采样或者不重复采样得到一个小批量中的各个样本。
同随机梯度一样,重复采样所得的小批量随机梯度 也是对梯度? ( ?1)的无偏估计。给定学习率 (取正数),小批量随机梯度下降对自变量的迭代如下:
当批量大小为1时,该算法即随机梯度下降;当批量大小等于训练数据样本数时,该算法即梯度下降。当批量较小时,每次迭代中使用的样本少,这会导致并行处理和内存使用效率变低。这使得在计算同样数目样本的情况下比使用更大批量时所花时间更多。当批量较大时,每个小批量梯度里可能含有更多的冗余信息。为了得到较好的解,批量较大时比批量较小时需要计算的样本数目可能更多,例如增大迭代周期数。
当批量大小为样本总数为1500时,使用的时梯度下降,需要6次迭代后目标值才趋于平稳。
当批量为1时,优化使用的是随机梯度下。其目标值在一个迭代周期后逐渐变得平稳。因为一个迭代周期自变量会进行1500次更新,所以其耗时相较梯度下降快了很多。
当将批量大小设置为10的时候,能够明显提高梯度下降的速度,并且其迭代周期也较小。
针对梯度下降在不同方向上斜率(变化率)不同,为了防止一方向上变化过快,需要将学习率整体调小就会影响整体迭代速度,如下图x2方向变化率很快,但是x1方向变化很小,这时候学习率稍大,机会导致发散。
动量法的提出是为了解决梯度下降的上述问题。由于小批量随机梯度下降比梯度下降更为广义,以时间步 的小批量随机梯度 的定义。设时间步 的自变量为 ,学习率为 。 在时间步0,动量法创建速度变量 0,并将其元素初始化成0。在时间步 >0,动量法对每次迭代的步骤做如下修改:
其主要用到了指数加权移动平均,给定超参数0≤ <10,当前时间步 的变量 是上一时间步 ?1的变量 ?1和当前时间步另一变量 的线性组合:
我们可以对 展开:
令=1/(1? ),那么=。因为
所以当 →1时,=exp(?1),如≈exp(?1)。如果把exp(?1)当作一个比较小的数,我们可以在近似中忽略所有含和比更高阶的系数的项。例如,当=0.95,
因此,在实际中,我们常常将 看作是对最近1/(1? )个时间步的 值的加权平均。例如,当=0.95时, 可以被看作对最近20个时间步的 值的加权平均;当=0.9时, 可以看作是对最近10个时间步的 值的加权平均。而且,离当前时间步 越近的 值获得的权重越大(越接近1)。
由指数加权移动平均理解动量法,对动量法的速度变量做变形
由指数加权移动平均的形式可得,速度变量 实际上对序列{ ? ? /(1? ):=0,…,1/(1? )?1}做了指数加权移动平均。换句话说,相比于小批量随机梯度下降,动量法在每个时间步的自变量更新量近似于将前者对应的最近1/(1? )个时间步的更新量做了指数加权移动平均后再除以1? 。所以,在动量法中,自变量在各个方向上的移动幅度不仅取决于当前梯度,还取决于过去的各个梯度在各个方向上是否一致。在本节之前示例的优化问题中,所有梯度在水平方向上为正(向右),而在竖直方向上时正(向上)时负(向下)。这样,我们就可以使用较大的学习率,从而使自变量向最优解更快移动。
Momentum(0-1)参数表示对于个时间步的数据做平均,如果momentum=0.2,表示为2个时间步的2倍小批量作平均,当momentum=0.9,表示为10个时间步的10倍小批量作加权平均, 并且在放大momentum时候需要缩小学习率,不然容易迭代时候不平滑。
总结
1、动量法使用了指数加权移动平均的思想。它将过去时间步的梯度做了加权平均,且权重按时间步指数衰减。
2、动量法使得相邻时间步的自变量更新在方向上更加一致。
因为不同轴上梯度存在差异,所以在梯度下降时候需要保持较小的学习率,动量法可以在一定程度下解决这个问题,而AdaGrad算法能够根据自变量在每个维度的梯度值大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
AdaGrad算法会使用一个小批量随机梯度 按元素平方的累加变量 。在时间步0,AdaGrad将 0中每个元素初始化为0。在时间步 ,首先将小批量随机梯度 按元素平方后累加到变量
其中 ⊙是按元素相乘。接着,我们将目标函数自变量中每个元素的学习率通过按元素运算重新调整一下:
小批量随机梯度按元素平方的累加变量 出现在学习率的分母项中。因此,如果目标函数有关自变量中某个元素的偏导数一直都较大,那么该元素的学习率将下降较快;反之,如果目标函数有关自变量中某个元素的偏导数一直都较小,那么该元素的学习率将下降较慢。然而,由于 一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低。
核心:AdaGrad算法能够根据自变量在每个维度的梯度值大小求和后变成st来调整各个维度上的学习率η,从而避免统一的学习率难以适应所有维度的问题,再结合梯度更新参数,所以该方法可以很好解决不同维度梯度不同的问题。
调整学习率时分母上的变量 一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。为了解决这一问题,RMSProp算法对AdaGrad算法做了一点小小的修改。
不同于AdaGrad算法里状态变量 是截至时间步 所有小批量随机梯度 按元素平方和,RMSProp算法将这些梯度按元素平方做指数加权移动平均。具体来说,给定超参数0≤ <1,RMSProp算法在时间步 >0计算
和AdaGrad算法一样,RMSProp算法将目标函数自变量中每个元素的学习率通过按元素运算重新调整,然后更新自变量
RMSProp算法和AdaGrad算法的不同在于,RMSProp算法使用了小批量随机梯度按元素平方的指数加权移动平均来调整学习率。
AdaDelta算法也像RMSProp算法一样,使用了小批量随机梯度 按元素平方的指数加权移动平均变量 。在时间步0,它的所有元素被初始化为0。给定超参数 0≤ <1
(对应RMSProp算法中的 ),在时间步 >0,同RMSProp算法一样计算
与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量Δ ,其元素同样在时间步0时被初始化为0。我们使用Δ ?1来计算自变量的变化量:
最后,我们使用Δ 来记录自变量变化量 ′ 按元素平方的指数加权移动平均:
AdaDelta算法与RMSProp算法的不同之处在于使用来替代超参数 。
Adam算法使用了动量变量 和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量 ,并在时间步0将它们中每个元素初始化为0。给定超参数0≤ 1<1,时间步 的动量变量 即小批量随机梯度 的指数加权移动平均:
和RMSProp算法中一样,给定超参数0≤ 2<1, 将小批量随机梯度按元素平方后的项 ⊙ 做指数加权移动平均得到 :
将 0和 0中的元素都初始化为0,在时间步 我们得到=(1? 1)∑=1 ? 1 。将过去各时间步小批量随机梯度的权值相加,得到(1? 1)∑=1 ? 1=1? 1。需要注意的是,当 较小时,过去各时间步小批量随机梯度权值之和会较小。例如,当 1=0.9时 1=0.1 1。为了消除这样的影响,对于任意时间步 ,我们可以将 再除以1? 1,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作偏差修正。在Adam算法中,我们对变量 和 均作偏差修正:
Adam算法使用以上偏差修正后的变量 ? 和 ? ,将模型参数中每个元素的学习率通过按元素运算重新调整:
Adam算法在RMSProp算法的基础上对小批量随机梯度也做了指数加权移动平均。