Press "Enter" to skip to content

深度学习总结 (六) 优化算法

一、各优化算法简介

 

1. 批量梯度下降(Batch gradient descent,BGD)

 

每迭代一步,都要用到训练集所有的数据。

 

2. 随机梯度下降(Stochastic Gradient Descent,SGD)

 

通过每个样本来迭代更新一次,以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量。

 

缺点:

对于参数比较敏感,需要注意参数的初始化
容易陷入局部极小值
当数据较多时,训练时间长

3. 小批量梯度下降(Mini Batch Gradient Descent,MBGD)

 

为了避免SGD和标准梯度下降中存在的问题,对每个批次中的n个训练样本,这种方法只执行一次更新。

 

4. Momentum

 

在参数更新时,一定程度上保留更新之前的方向。在训练的过程中,参数的更新方向十分依赖当前的batch,因此不稳定。加入momentum后,能够让参数一定程度上按照之前变化方向进行更新,使参数更稳定的更新。

 

优点:

下降初期时,使用上一次参数更新,下降方向一致,乘上较大的μ能够进行很好的加速
下降中后期时,在局部最小值来回震荡的时候,gradient→0,μ使得更新幅度增大,跳出陷阱
在梯度改变方向的时候,μ能够减少更新 总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛

5. Nesterov(NAG)

 

NAG 法则首先(试探性地)在之前积累的梯度方向(棕色向量)前进一大步,再根据当前地情况修正,以得到最终的前进方向(绿色向量)。这种基于预测的更新方法,使我们避免过快地前进,并提高了算法地响应能力,大大改进了 RNN 在一些任务上的表现。

 

momentum项和nesterov项都是为了使梯度更新更加灵活,对不同情况有针对性。但是,人工设置一些学习率总还是有些生硬。

 

6. Adagrad

 

二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种都是以同样的学习率更新参数,但深度神经网络往往包含大量的参数,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解它的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。

 

二阶动量可以度量历史更新频率,二阶动量为迄今为止所有梯度值的平方和:

 

优点:

适合处理稀疏梯度

缺点:

仍依赖于人工设置一个全局学习率
η设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使gradient→0,使得训练提前结束

Adadelta

 

Adadelta法是Adagrad法的一个延伸,它旨在解决它学习率不断单调下降的问题。相比计算之前所有梯度值的平方和,Adadelta 法只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。

 

优点:

不用依赖于全局学习率了
训练初中期,加速效果不错,很快
避免参数更新时两边单位不统一的问题

缺点:

训练后期,反复在局部最小值附近抖动

RMSProp

 

RMSProp可以看做为Adadalta的一个特例,也即上述式子中ρ=0.5,然后再求根的话,就变成RMS(均方根)

 

Adam

 

Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSProp,它利用了梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正(Bias correction,为了修正在训练初期的误差,当t变大后,偏置校正效果减弱)后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
偏置修正(Bias Correction)的效果:
当初始化v0=0v0=0时,v1=0.98v0+0.02θ1v1=0.98v0+0.02θ1(其中θ1θ1为当前时刻的值),可以看到v1v1远小于当前的值θ1θ1,接下来v2=0.98v1+0.02θ=0.98∗0.02θ1+0.02θ2v2=0.98v1+0.02θ=0.98∗0.02θ1+0.02θ2,得到的结果θ2θ2远小于当前时刻的值,因此在训练初期时与真实值会有较大误差(也即初期时绿色线和紫色线的差别)。
因此采用时,当t较小时,vtvt能得到修正偏差,也即下图右边所示,而当t逐渐变大时,由于ββ小于1,则偏置效果减弱。

 

二、优化算法相关知识点补充

 

1. 训练优化器的目的

 

加速收敛 2. 防止过拟合 3. 防止局部最优

 

2. 选用优化器的目的

 

在构建神经网络模型时,选择出最佳的优化器,以便快速收敛并正确学习,同时调整内部参数,最大程度地最小化损失函数。

 

3. 该如何选取优化器

 

Adam在实际应用中效果良好,超过了其他的自适应技术。
如果输入数据集比较稀疏,SGD、NAG和动量项等方法可能效果不好。因此对于稀疏数据集,应该使用某种自适应学习率的方法,且另一好处为不需要人为调整学习率,使用默认参数就可能获得最优值。

 

如果想使训练深层网络模型快速收敛或所构建的神经网络较为复杂,则应该使用Adam或其他自适应学习速率的方法,因为这些方法的实际效果更优。
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠。

 

各优化算法对比

 

 

算法 优点 缺点 适用情况
牛顿法 收敛速度快 靠近极小值时收敛速度减慢,求解Hessian矩阵的逆矩阵复杂,容易陷入鞍点 不适用于高维数据
拟牛顿法 收敛速度快,不用计算二阶导数,低运算复杂度 存储正定矩阵,内存消耗大 不适用于高维数据
批量梯度下降 目标函数为凸函数时,可以找到全局最优值 收敛速度慢,需要用到全部数据,内存消耗大 不适用于大数据集,不能在线更新模型
随机梯度下降 避免冗余数据的干扰,收敛速度加快,能够在线学习 更新值的方差较大,收敛过程会产生波动,可能落入极小值,选择合适的学习率比较困难 适用于需要在线更新的模型,适用于大规模训练样本情况
小批量梯度下降 降低更新值的方差,收敛较为稳定 选择合适的学习率比较困难
Momentum 能够在相关方向加速SGD,抑制振荡,从而加快收敛 需要人工设定学习率 适用于有可靠的初始化参数
Nesterov 梯度在大的跳跃后,进行计算对当前梯度进行校正 需要人工设定学习率
Adagrad 不需要对每个学习率手工地调节 仍依赖于人工设置一个全局学习率,学习率设置过大,对梯度的调节太大。中后期,梯度接近于0,使得训练提前结束 需要快速收敛,训练复杂网络时;适合处理稀疏梯度
Adadelta 不需要预设一个默认学习率,训练初中期,加速效果不错,很快,可以避免参数更新时两边单位不统一的问题。 训练后期,反复在局部最小值附近抖动 需要快速收敛,训练复杂网络时
RMSprop 解决 Adagrad 激进的学习率缩减问题 依然依赖于全局学习率 需要快速收敛,训练复杂网络时;适合处理非平稳目标 – 对于RNN效果很好
Adam 对内存需求较小,为不同的参数计算不同的自适应学习率 需要快速收敛,训练复杂网络时;善于处理稀疏梯度和处理非平稳目标的优点,也适用于大多非凸优化 – 适用于大数据集和高维空间

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注