总结整理之深度学习中的最优化方法

最优化问题在机器学习/深度学习中是经常遇到的问题,也是很重要的一个问题。学习算法的本质都是建立优化模型,通过最优化方法对目标函数(或损失函数)进行优化,从而训练出最好的模型。常见的最优化方法主要有以下几种。

一、梯度下降法

1.1 标准梯度下降法(Batch Gradient Descent)

参数更新:
在这里插入图片描述
其中:
总结整理之深度学习中的最优化方法_第1张图片
梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。
总结整理之深度学习中的最优化方法_第2张图片
总结整理之深度学习中的最优化方法_第3张图片
优点:
代价函数若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值。
缺点:
(1)靠近极小值时收敛速度减慢
(2)可能会“之字形”地下降
(3)训练数较多时,需要较大内存
(4)不允许在线更新模型
也就是说梯度下降法在接近最优解的区域收敛速度明显变慢,利用梯度下降法求解需要很多次的迭代。而且是先计算所有样本汇总误差,然后根据总误差来更新权值,这样无疑是比较慢的。批量梯度下降最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。

1.2 随机梯度下降法(Stochastic Gradient Descent)

参数更新:
在这里插入图片描述
随机梯度下降随机抽取一个样本来计算误差,然后更新权值。所以如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将参数迭代到最优解了。
随机梯度下降法是最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。
优点:
(1)算法收敛速度比Batch Gradient Descent算法快
(2)可以在线更新
(3)有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优
缺点:
容易收敛到局部最优,并且容易被困在鞍点。

1.3 Mini-batch Gradient Descent

参数更新:
在这里插入图片描述
mini-batch Gradient Descent的方法是在上述两个方法中取折衷, 每次从所有训练数据中取一个子集(mini-batch) 用于计算梯度,然后更新参数。
优点:
(1)收敛速度比上述两个都快
(2)收敛较为稳定
缺点:
(1) 因为要兼顾整个神经网络中所有参数的训练效果, 因此对学习率的选择比较敏感
(2) 容易收敛到局部最优, 并且在某些情况下容易被困在鞍点, 需要使用合适的初始化和步长
(3) 参数的更新仅仅依赖于当前 batch 中的数据, 当数据波动大时, 更新往往不够稳定
但是整体性能还是强于上述两个,因此现在说梯度下降法一般都是指的是Mini-batch Gradient Descent。

1.4 TensorFlow中

loss=........    #定义代价函数
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)   #设置学习率,最小化代价函数

具体配置
总结整理之深度学习中的最优化方法_第4张图片

二、Momentum(动量)

2.1 Momentum

参数更新:
总结整理之深度学习中的最优化方法_第5张图片
其中:
总结整理之深度学习中的最优化方法_第6张图片
当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样
可以加快小球的向下的速度。
Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。
Momentum算法会观察历史梯度 v t − 1 v_{t−1} vt1,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。一种形象的解释是:我们把一个球推下山,球在下坡时积聚动量,在途中变得越来越快,γ可视为空气阻力,若球的方向发生变化,则动量会衰减。
优点:
(1)下降初期时,使用上一次参数更新,下降方向一致,乘上较大的 γ γ γ能够进行很好的加速;
(2)下降中后期时,在局部最小值来回震荡的时候,梯度趋近于0, γ γ γ使得更新幅度增大,跳出陷阱(局部最优);
(3)在梯度改变方向的时候, γ γ γ能够减少更新。
总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛。

2.2 Nesterov Momentum

参数更新:
总结整理之深度学习中的最优化方法_第7张图片
在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误,所以我们需要一个更聪明的小球,这个小球提前知道它要去哪里,它还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。 γ ∗ v t − 1 γ * v_{t-1} γvt1会用来修改 θ θ θ的值,计算 θ − γ ∗ v t − 1 θ-γ * v_{t-1} θγvt1可以表示小球下一个位置大概在哪里。从而我们可以提前计算下一个位置的梯度,然后使用到当前位置。
Nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度。Nesterov的改进就是让之前的动量直接影响当前的动量。所以,加上Nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。
也就是是:注意到 momentum 方法,如果只看 γ ∗ v γ * v γv 项,那么当前的 θ θ θ经过 momentum 的作用会变成 θ − γ ∗ v θ-γ * v θγv。因此可以把 θ − γ ∗ v θ-γ * v θγv这个位置看做是当前优化的一个”展望”位置。所以,可以在 θ − γ ∗ v θ-γ * v θγv求导, 而不是原始的 θ θ θ
优点:
站在下一步的位置看看, 再进行更新, 使得梯度更新方向更具前瞻性
缺点:
增加了计算量
对比

总结整理之深度学习中的最优化方法_第8张图片
总结整理之深度学习中的最优化方法_第9张图片
Momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),Nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色向量)。
Nesterov Momentum在凸优化中有较强的理论保证收敛。并且,在实践中Nesterov Momentum也比单纯的 Momentum 的效果好。
Momentum项和Nesterov项都是为了使梯度更新更加灵活,对不同情况有针对性。

2.3 TensorFlow中

loss=........    #定义代价函数
train_step = tf.train.MomentumOptimizer(0.9).minimize(loss)     #动力设置为0.9,使用Momentum
train_step = tf.train.MomentumOptimizer(0.9,use_nesterov=True).minimize(loss)  #动力设置为0.9,使用 NesterovMomentum

具体配置
总结整理之深度学习中的最优化方法_第10张图片

三、Adagrad

3.1 Adagrad

参数更新:
总结整理之深度学习中的最优化方法_第11张图片
或者这样:
总结整理之深度学习中的最优化方法_第12张图片
其中:
总结整理之深度学习中的最优化方法_第13张图片
Adagrad算法其实是对学习率进行了一个约束,能够在训练中自动的对learning rate进行调整。
它的核心思想是对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。因此,Adagrad非常适合处理稀疏数据。
优点:
(1)在整个更新期间学习率不是固定的, 会随着训练过程变化
(2)适合处理稀疏梯度
(3)前期 g t g_t gt较小的时候,约束项较大,能够放大梯度;后期 g t g_t gt较大的时候,约束项较小,能够约束梯度
缺点:
(1)仍然依赖于一个人工设置的全局学习率
(2)学习率设置过大的话,会使约束项过于敏感,对梯度的调节过大
(3)中后期, 分母上的梯度放平累加和会越来越大, 使得更新提早停滞, 训练提前结束

3.2 TensorFlow中

loss=........    #定义代价函数
train_step = tf.train.AdagradOptimizer(0.2).minimize(loss)     #学习率设置为0.2

具体配置
总结整理之深度学习中的最优化方法_第14张图片

四、AdaDelta

4.1 AdaDelta

参数更新:
总结整理之深度学习中的最优化方法_第15张图片
其中:
总结整理之深度学习中的最优化方法_第16张图片
Adadelta是对Adagrad的扩展, 和 Adagrad 相比, 其改进是将分母约束项换成了过去的梯度平方的衰减平均值, 相当于梯度的均方根(root mean squared, RMS)。Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。
使用Adadelta我们甚至不需要设置一个默认学习率,在Adadelta不需要使用学习率也可以达到一个非常好的效果。
优点:
(1)对 Adagrad 的扩展, 约束项不容易产生太大值而使得更新提早结束
(2)无需人工设置学习率
(3)训练速度很快
缺点:
训练后期会反复在局部最小值附近抖动

4.2 TensorFlow中

具体配置:
总结整理之深度学习中的最优化方法_第17张图片

五、RMS(均方根)prop

5.1 RMSprop

参数更新:
总结整理之深度学习中的最优化方法_第18张图片
其中:
总结整理之深度学习中的最优化方法_第19张图片
RMSprop是Geoff Hinton提出的一种自适应学习率方法。Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
RMSprop借鉴了一些Adagrad的思想,不过这里RMSprop只用到了前 t − 1 t-1 t1次梯度平方的平均值加上当前梯度的平方的和的开平方作为学习率的分母。这样RMSprop不会出现学习率越来越低的问题,而且也能自己调节学习率,并且可以有一个比较好的效果。

优点:
Adadelta 的特例(动力为0.5时), 也是对学习率添加约束, 适合处理非平稳目标, 对 RNN 效果较好。
缺点:
依然需要依赖于全局学习率。

5.2 TensorFlow中

具体配置:
总结整理之深度学习中的最优化方法_第20张图片

六、Adam

6.1 Adam

参数更新:
总结整理之深度学习中的最优化方法_第21张图片
其中:
总结整理之深度学习中的最优化方法_第22张图片
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。
就像Adadelta和RMSprop一样Adam会存储之前衰减的平方梯度,同时它也会保存之前衰减的梯度。经过一些处理之后再使用类似Adadelta和RMSprop的方式更新参数。
在数据比较稀疏的时候,adaptive的方法能得到更好的效果,例如Adagrad,RMSprop, Adam 等。Adam 方法也会比 RMSprop方法收敛的结果要好一些, 所以在实际应用中 ,Adam为最常用的方法,可以比较快地得到一个预估结果。
优点:
(1)结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
(2)对内存需求较小
(3)为不同的参数计算不同的自适应学习率
(4)也适用于大多非凸优化
(5) 适用于大数据集和高维空间
(6)经过偏置校正后, 每一次迭代学习率都有一个确定的范围, 使得参数更新比较平稳

6.2 TensorFlow中

具体配置:
总结整理之深度学习中的最优化方法_第23张图片

七、Adamax

参数更新:
公式部分变化:
总结整理之深度学习中的最优化方法_第24张图片
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。
优点
学习率的边界范围更简单

八、Nadam

Nadam类似于带有Nesterov动量项的Adam。
参数更新:
总结整理之深度学习中的最优化方法_第25张图片
可以看出,Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

九、总结

9.1对比图

总结整理之深度学习中的最优化方法_第26张图片
总结整理之深度学习中的最优化方法_第27张图片

9.2 选择经验

(1)对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值。
(2)SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠。
(3)如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
(4)Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
(5)在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

你可能感兴趣的