一、梯度下降法介绍
梯度下降法(Gradient Descent Algorithm,GD)是以负梯度方向求解目标函数的全局最小值的一种迭代方法。
参数更新的步骤:
- 随机初始化一组参数
- 将目标函数分别对每个参数求偏导
- 每个参数的更新,是在对所有样本点都求得对该参数的偏导之后,求和取平均,作为该参数梯度更新的方向
- 每轮中对每个参数都要求偏导和更新
示例:
每个样本是一个的向量,即$X=[x^1,x^2,x^3,…,x^n],每个向量代表一个特征,每个参数对应一个特征的权重,所以每个样本对应的参数也是n维的。
对参数的更新:
对参数的更新:
二、批量梯度下降法
参数的每次更新,需要 计算全部数据集的样本的负梯度方向,取均值作为下一次梯度下降的方向。
特点:
计算量大,参数更新慢,对内存的要求很高,不能以在线的形式训练模型,也就是运行时不能加入新样本
理论上讲,可以得到全局最优解,参数更新比较稳定,收敛方向稳定
三、随机梯度下降法
每次只选择一个样本来求得偏导,进行参数的更新。
特点:
运算速度很快,同时能够在线学习
随机梯度下降参数更新的过程震荡很大,目标函数波动剧烈,参数更新方向有很大的波动
其较大的波动可能收敛到比批量梯度下降更小的局部极小值,因为会从一个极小值跳出来
目标函数下降很波动:
梯度更新的方向
示例:
对参数的更新:
四、小批量梯度下降法(mini-batch GD)
该方法集合了批量梯度下降和随机梯度下降两者的优势,每次的参数更新利用一小批数据来完成。
特点:
- 降低了更新参数的方差,使得收敛过程更加的稳定
- 能够利用高度优化的矩阵运算,很高效的求得每小批数据的梯度
上述方法面临的主要挑战:
选择合适的学习率较为困难,太小的学习率会导致收敛缓慢,太大的学习率导致波动较大,可能跳出局部最小值
目前可采用的方法是在训练过程中调整学习率的大小,例如模拟退火法:预定义一个迭代次数m,每次执行完m次训练便减小学习率,或者当损失函数的值低于一个阈值时,减小学习率,迭代次数和损失函数的阈值必须事先定义。
上述方法中,每个参数的学习率都是相同的,但这种方法是不合理的,如果训练数据是稀疏的,并且不同特征的出现频率差异较大,那么比较合理的做法是对于出现频率较低的特征设置较大的学习率,对于出现频率较大的特征设置较小的学习率。
近期研究表明,深层网络之所以比较难以训练,并不是因为容易进入局部最优,因为网络结构十分复杂,即使进入了局部最优也可以得到很好的效果,难以训练的原因在于学习的过程很容易落入鞍点,也就是在一个维度是极小值,另一个维度却是极大值的点,而这种情况比较容易出现在平坦区域,在这种区域中,所有方向的梯度几乎都是0,但有的方向的二阶导小于0,即出现极大值。
五、动量法(Momentum)
SGD(一般指小批量梯度下降)的一个缺点在于,其更新的方向完全依赖于当前batch计算出的梯度,因而十分不稳定。
Momentum算法借用了物理中的动量的概念,模拟物体运动时候的惯性,即在更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度对之前的梯度进行微调,这样一来,可以在一定程度上增加稳定性,从而学习的更快,并且有一定的摆脱局部最优的能力。
更新后的梯度 = 动量项 / 折损系数(gamma) x 更新前的梯度+当前的梯度
上图中,红色为SGD+momentum,黑色为SGD,
注意:
-
动量项是表示在多大程度上保留原来的更新方向,值在0~1之间,是自己设置的超参数,训练开始时,由于梯度可能会很大,所以初始值一般选为0.5,当梯度慢慢减小的时候,改为0.9。
刚开始的时候,梯度方向变化很大,原始梯度起的作用较小,当前时刻的梯度方向减弱,则动量项较小,动量小则步长小
后面的时候,梯度方向变化较小了,原始梯度起的作用大,当前时刻的梯度方向增强,则动量项较大,动量大则步长大
学习率,当前batch的梯度以多大的程度加到之前的梯度上去
动量项的解释:物体运动都是有惯性的,随机梯度下降和批量梯度下降的梯度之和本时刻的梯度有关,可以立刻改变方向,但如果加上动量的话,方向不可能骤转。
当动量项分别设置为0.5,0.9,0.99的时候,分别表示最大速度2倍、10倍、100倍于SGD的算法
六、Nesterov Momentum
但当一个小球从山谷滚落的时候,盲目的沿着斜率方向前行,其效果并不令人满意,我们需要有一个更聪明的小球,能够知道往哪里前行,并知道斜率再度上升的时候减速。
在预测参数下一次的位置之前,我们已有当前的参数和动量项,先用作为参数下一次出现位置的预测值,虽然不准确,但是大体方向是对的,之后用我们预测到的下一时刻的值来求偏导,让优化器高效的前进并收敛。
Momentum更新方式:
计算当前的梯度值(小蓝色方向向量)在更新后的累积方向上前进一大步
Nesterov Momentum更新方式:
按照原来的更新方向更新一步(棕色线)
然后在该位置计算梯度值(红色线)
利用该梯度值修正最终的更新方向(绿色线)
七、Adagrad法
该方法是基于梯度的优化方法,其主要功能是:对于不同的参数使用不同的学习率,适合于处理稀疏数据。
对低频出现的参数进行大的更新
对高频出现的参数进行小的更新
对迭代次数为时,对参数求目标函数的梯度:
Adagrad将学习率进行了修正,对迭代次数t,基于每个参数之前计算的梯度值,将每个参数的学习率按如下方式修正:
其中, 为对角矩阵,每个对角线位置为对应参数 从第1轮到第t轮梯度的平方和。是平滑项,用于避免分母为0,一般取值1e−8。
特点:
Adagrad的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大,从而梯度趋近于0,使得训练提前结束。
对于每个参数而言,随着其更新的总距离增多,其学习速率也随之变慢。
存在的问题:
学习率是单调递减的,后期的学习率非常小
需要手工设置一个全局的初始学习率
更新时,左右两边的单位不统一
八、Adadelta
Adadetla是Adagrad的一个延伸,它旨在解决Adagrad学习率不断单调下降的问题,Adagrad是利用之前所有梯度的平方和,Adadelta法仅计算在一个时间区间内的梯度值的累积和。
此处的梯度累积和定义为:关于过去梯度值的衰减均值,当前时间的梯度均值是基于过去梯度的均值好当前梯度值平方的加权平均,是类似于动量项的权重。
Adagrad 法中的参数更新规则如下:
Adadelta法的参数更新如下,将上面的对角矩阵利用基于过去的梯度平方的衰减均值替换:
Adadelta方法不用预设学习率
九、RMSprop
RMSprop是Geoff Hinton提出的一种自适应学习率方法。Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
十、Adam法
适应性动量估计法,是能对不同参数进行适应性学习率的方法,Adam存储了:
-
指数衰减的过去梯度的平方均值(一阶矩)
-
也存储了指数衰减的过去梯度的均值(二阶矩)
使用偏差纠正系数,来修正一阶矩和二阶矩的偏差,可以近似为对期望的无偏估计:
参数的更新:
算法的提出者建议β 1 的默认值为0.9,β 2 的默认值为.999,ϵ默认为10 −8 。
特点:经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
Adam 算法的提出者描述其为两种随机梯度下降扩展式的优点集合,即:
适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。
均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。
Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。
移动均值的初始值和 beta1、beta2 值接近于 1(推荐值),因此矩估计的偏差接近于 0。该偏差通过首先计算带偏差的估计而后计算偏差修正后的估计而得到提升。
十一、如何选择优化器
1、如果你的输入数据较为稀疏(sparse),那么使用适应性学习率类型的算法会有助于你得到好的结果。
2、Adam 也许是总体来说最好的选择