神经网络关于优化器的选择问题(Optimizer)

最近在优化自己的循环神经网络时,用到了很多优化算法,所以在这里梳理一下,也算是总结。

关于优化器:
其实机器学习训练过程中的本质就是在最小化损失,而在我们定义了损失函数后,优化器就派上了用场,在深度学习中,我们通常就是对于梯度优化,优化的目标就是网络模型里的参数θ(是一个集合,θ1、θ2、θ3 ……)。
(我们设,一般的线形回归函数的假设函数是:
这里写图片描述
对应的损失函数是:
这里写图片描述

**

1. 常见的三个优化器(BGD,SGD,MBGD)

**

(1): Batch Gradient Descent (BGD)
批量梯度下降法,也是梯度下降法最基础的形式,算法的思想是在更新每个参数的时,都使用所有样本进行更新:
数学形式如下:
神经网络关于优化器的选择问题(Optimizer)_第1张图片
上述也说到了,批量梯度下降每迭代一步,是需要用到训练集的所有数据,如果样本数目很大,速度就会很慢,所有随机梯度下降(SGD)也就顺理成章的引入。
所以关于BGD的优缺点总结如下:
优点:全局最优解;易于并行实现;从跌代次数上来说,BGD
的迭代次数比较少。
缺点:当样本数目很多时,训练过程会很慢

神经网络关于优化器的选择问题(Optimizer)_第2张图片
(2)Stochastic Gradient Descent (SGD)
随机梯度下降法(SGD),与SGD相比,SGD每次更新时对每个样本进行梯度更新,数学表达如下:
神经网络关于优化器的选择问题(Optimizer)_第3张图片
随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
优点:训练速度快;
缺点:准确度下降,并不是全局最优;不易于并行实现。从迭代次数来看,SGD迭代次数较多,在解空间的搜索过程看起来很盲目。

(3)Mini-Batch Gradient Descent (MBGD)
小批量梯度下降法,是中和了BGD,SGD二者的优缺点,即算法的训练过程较快,而且也要保证最终参数的准确率,MBGD在每次更新参数时候,使用b个样本(b一般为50~256)
关于MBGD的优缺点:
优点:收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
缺点:关于学习率的选择,如果太小,收敛速度就会变慢,如果太大,loss function就会在极小值处不停的震荡甚至偏离。
神经网络关于优化器的选择问题(Optimizer)_第4张图片
但无论是BGD,SGD,MBGD都会面临俩大问题:
1.不过 Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)
2.SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。
神经网络关于优化器的选择问题(Optimizer)_第5张图片

针对问题一,提出了以下俩个优化器方案:Momentum,Nesterov Accelerated Gradient

(1).Momentum
momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。
Momentum中包含以下参数(学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α)
其数学表达大致如下:
神经网络关于优化器的选择问题(Optimizer)_第6张图片
Momentum最好情况下能够将学习速率加速1/(1−α)倍.一般α的取值有0.5,0.9,0.99这几种,分别表示最大速度2倍,10倍,100倍于SGD的算法。.当然,也可以让α的值随着时间而变化,一开始小点,后来再加大.不过这样一来,又会引进新的参数.
特点: 
 - 前后梯度方向一致时,能够加速学习 
 - 前后梯度方向不一致时,能够抑制震荡

(2).Nesterov Momentum(又叫Nesterov Accelerated Gradient)
这是对传统momentum方法的一项改进
具体实现需要:学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α
每步迭代过程:
从训练集中的随机抽取一批容量为m的样本{x1,…,xm},以及相关的输出yi
计算梯度和误差,并更新速度v和参数θ:
神经网络关于优化器的选择问题(Optimizer)_第7张图片
注意在估算梯度g的时候,参数变成了θ+αv而不是之前的θ,与Momentum唯一区别就是,计算梯度的不同,Nesterov先用当前的速度v更新一遍参数,在用更新的临时参数计算梯度。
其基本思路如下图(转自Hinton的coursera公开课lecture 6a):

神经网络关于优化器的选择问题(Optimizer)_第8张图片
蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。

针对挑战2,以下几个优化器被提出(Adagrad,RMSProp,Adam(Adaptive Moment Estimate))

(1).Adagrad (Adaptive gradient algorithm)
Adagrad可以自动变更学习速率,只是需要设定一个全局的学习速率ϵ,但是这并非是实际学习速率,实际的速率如下公式所示:
神经网络关于优化器的选择问题(Optimizer)_第9张图片
所以Adagrad可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性
具体实现:
需要:全局学习速率 ϵ, 初始参数 θ, 数值稳定量δ
中间变量: 梯度累计量r(初始化为0)
每步迭代过程:
从训练集中的随机抽取一批容量为m的样本{x1,…,xm},以及相关的输出yi
计算梯度和误差,更新r,再根据r和梯度计算参数更新量:
神经网络关于优化器的选择问题(Optimizer)_第10张图片
优点: 能够实现学习率的自动更改。如果这次梯度大,那么学习速率衰减的就快一些;如果这次梯度小,那么学习速率衰减的慢一些。对于每个参数,随着其更新的总距离增多,其学习速率也随之变慢。
缺点: 任然要设置一个变量ϵ ,经验表明,在普通算法中也许效果不错,但在深度学习中,深度过深时会造成训练提前结束。

(2).RMSProp
rmsprop算法不再孤立地更新学习步长,而是联系之前的每一次梯度变化情况,具体如下。
rmsprop算法给每一个权值一个变量MeanSquare(w,t)用来记录第t次更新步长时前t次的梯度平方的平均值。然后再用第t次的梯度除上前t次的梯度的平方的平均值,得到学习步长的更新比例。根据此比例去得到新的学习步长。如果当前得到的梯度为负,那学习步长就会减小一点点;如果当前得到的梯度为正,那学习步长就会增大一点点。
这样看来,rmsprop算法步长的更新更加缓和。
这些算法并不能完全解决局部最小值问题,只是使得参数收敛的速度更快。针对是否能收敛到全局最优解,还与模型的初始化有关。

(3).Adam:Adaptive Moment Estimation
这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:
神经网络关于优化器的选择问题(Optimizer)_第11张图片
如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:
神经网络关于优化器的选择问题(Optimizer)_第12张图片

梯度更新规则:
神经网络关于优化器的选择问题(Optimizer)_第13张图片
超参数设定值:
建议 β1 = 0.9,β2 = 0.999,ϵ = 10e−8
实践表明,Adam 比其他适应性学习方法效果要好。

你可能感兴趣的:(神经网络)