深度学习常用优化算法

最早整理了一些深度学习的基础知识给实验室的师弟师妹看,后来想想还是写个博客大家一起看吧。
批量梯度下降法(Batch Gradient Descent)
在整个数据集上(求出损失函数 J(θ 并)对每个参数 θ 求目标函数 J(θ) 的偏导数:
在这里插入图片描述
在该方法中,每次更新我们都需要在整个数据集上求出所有的偏导数。因此批量梯度下降法的速度会比较慢,甚至对于较大的、内存无法容纳的数据集,该方法都无法被使用。同时,梯度下降法不能以「在线」的形式更新我们的模型,也就是不能再运行中加入新的样本进行运算。
随机梯度下降法(Stochastic Gradient Descent)
相比批量梯度下降法,随机梯度下降法基于蒙特卡洛算法的思想的每次更新,是对数据集中的一个样本(x,y)求出损失函数,然后对其求相应的偏导数:
在这里插入图片描述
因为批量梯度下降法在每次更新前,会对相似的样本求算梯度值,因而它在较大的数据集上的计算会有些冗余(redundant)。而随机梯度下降法通过每次更新仅对一个样本求梯度,去除了这种冗余的情况。因而,它的运行速度被大大加快,同时也能够「在线」学习。但是这种算法可以作为无偏估计,但是方差会无限大。相比批量梯度下降法的收敛会使目标函数落入一个局部极小值,SGD 收敛过程中的波动,会帮助目标函数跳入另一个可能的更小的极小值。另一方面,这最终会让收敛到特定最小值的过程复杂化,因为该方法可能持续的波动而不停止。但是,当我们慢慢降低学习率的时候,SGD 表现出了与批量梯度下降法相似的收敛过程,也就是说,对非凸函数和凸函数,必然会分别收敛到它们的极小值和最小值。
小批量梯度下降法(Mini-Batch Gradient Descent)
小批量梯度下降法集合了上述两种方法的优势,在每次更新中,对 n 个样本构成的一批数据,计算损失函数 J(θ),并对相应的参数求导:
在这里插入图片描述
这种方法,(a) 降低了更新参数的方差(variance),使得收敛过程更为稳定;(b) 能够利用最新的深度学习程序库中高度优化的矩阵运算器,能够高效地求出每小批数据的梯度。有时候我们也会使用随机梯度下降法,来称呼小批量梯度下降法。
面临的挑战
小批量梯度下降法并不能保证良好地收敛,这给我们留下了如下待解决的挑战:

  1. 选择适当的学习率是一个难题。太小的学习率会导致较慢的收敛速度,而太大的学习率则会阻碍收敛,并会引起罚函数在最小值处震荡,甚至有可能导致结果发散;
  2. 我们可以设置一个关于学习率地列表,通过如退火的方法,在学习过程中调整学习率——按照一个预先定义的列表、或是当每次迭代中目标函数的变化小于一定阈值时来降低学习率。但这些列表或阈值,需要根据数据集地特性,被提前定义。
  3. 此外,我们对所有的参数都采用了相同的学习率。但如果我们的数据比较稀疏,同时特征有着不同的出现频率,那么我们不希望以相同的学习率来更新这些变量,我们希望对较少出现的特征有更大的学习率。

在对神经网络最优化非凸的罚函数时,另一个通常面临的挑战,是如何避免目标函数被困在无数的局部最小值中,以导致的未完全优化的情况。Dauphin认为,这个困难并不来自于局部最小值,而是来自于「鞍点」,也就是在一个方向上斜率是正的、在一个方向上斜率是负的点。这些鞍点通常由一些函数值相同的面环绕,它们在各个方向的梯度值都为 0,所以 SGD 很难从这些鞍点中脱开。
动量法
SGD 很难在陡谷——一种在一个方向的弯曲程度远大于其他方向的表面弯曲情况——中找到正确更新方向。而这种陡谷,经常在局部极值中出现。在这种情况下,如图,SGD 在陡谷的周围震荡,向局部极值处缓慢地前进。
在这里插入图片描述
动量项在梯度指向方向相同的方向逐渐增大,对梯度指向改变的方向逐渐减小。由此,我们得到了更快的收敛速度以及减弱的震荡。参数更行规则如下:
在这里插入图片描述
Nesterov 加速梯度法(NAG)
动量法是感性的理解是用过去的趋势(动量)来对参数变化产生一个力的拉动,再加上梯度这个力的拉动,基于矢量加法法则最终得到参数变化的方向。那有没有一种方法,可以基于“未来”来产生一种拉动力呢,我们用t-1时刻的加权变化(即动量项)施加在参数θ上,作为对t时刻参数的估计。这就相当与知道了未来参数的近似,就可以通过计算参数下一个位置的梯度来实现“向前看”。
参数更行规则如下:
在这里插入图片描述
如下图所示,动量法首先计算当前的梯度值(小蓝色向量),然后在更新的积累向量(大蓝色向量)方向前进一大步。但 NAG 法则首先(试探性地)在之前积累的梯度方向(棕色向量)前进一大步,再根据当前地情况修正,以得到最终的前进方向(绿色向量)。这种基于预测的更新方法,使我们避免过快地前进,并提高了算法地响应能力(responsiveness),大大改进了 RNN 在一些任务上的表现。
在这里插入图片描述
Adagrad 法
Adagrad[3] 是一个基于梯度的优化算法,它的主要功能是:它对不同的参数调整学习率,具体而言,对低频出现的参数进行大的更新,对高频出现的参数进行小的更新。因此,他很适合于处理稀疏数据。举个简单的例子,高层某几个卷积核专为某类而激活,恰巧此类样本量很少,则这两个卷积核的参数可能不能得到很好的训练。 adagrad 将学习率η进行了修正,对迭代次数 t,基于每个参数之前计算的梯度值,将每个参数的学习率η按如下方式修正(向量的形式):
在这里插入图片描述
Gt是一个对角阵,其中对角线上的元素是从一开始到t时刻损失函数对于参数θ梯度的平方和。
Adagrad 主要优势之一,是它不需要对每个学习率手工地调节。而大多数算法,只是简单地使用一个相同地默认值如 0.1,来避免这样地情况。
Adagrad 地主要劣势,是他在分母上的项中积累了平方梯度和。因为每次加入的项总是一个正值,所以累积的和将会随着训练过程而增大。因而,这会导致学习率不断缩小,并最终变为一个无限小值——此时,这个算法已经不能从数据中学到额外的信息。
Adadelta 法
Adadelta 法是 Adagrad 法的一个延伸,它旨在解决它学习率不断单调下降的问题。相比计算之前所有历史梯度值的平方和,Adadelta 法仅计算在一个大小为w的时间区间内梯度值的累积和。因为存放 w个梯度非常低效的,所以可以用对先前所有梯度均值(使用RMS即均方根值(将所有值平方求和,求其均值,再开平方,就得到均方根值)实现)的一个指数衰减作为代替的实现方法。即:
原先 Gt-1=(g1^2)+...+( g(t-1)^2)现在用t-1时刻前w个梯度值的均值代替即E[g^2]t-1。
在这里插入图片描述
在这里插入图片描述
在该更新中(在 SGD、动量法或者 Adagrad 也类似)的单位并不一致,也就是说,更新值的量纲与参数值的假设量纲并不一致。为改进这个问题,他们定义了另外一种指数衰减的衰减均值,他是基于参数更新的平方而非梯度的平方来定义的:
在这里插入图片描述
在这里插入图片描述
假设学习率未知,我们用t-1时刻的方均根来代替,终得到了 Adadelta 法的更新规则:
在这里插入图片描述

借助 Adadelta 法,我们甚至不需要预设一个默认学习率,因为它已经从我们的更新规则中被删除了。
RMSprop 法
在这里插入图片描述
Adam
适应性动量估计法(Adam)是另一种能对不同参数计算适应性学习率的方法。
图上也可以写成vt=vt-1+gt.加减是同理的
这里,计算了梯度的指数平均和梯度平方的指数平均(等式1和等式2)。为了得出学习步幅,等式3在学习率上乘以梯度的平均(类似动量),除以梯度平方平均的均方根(类似RMSProp)。等式4是权重更新步骤。Adam 的作者观察到,该方法会有趋向 0 的偏差,尤其是在最初的几步或是在衰减率很小的情况下。
他们使用偏差纠正系数,来修正一阶矩和二阶矩的偏差:
vt^ = vt/(1-β1t)
st^ = st/(1-β2t)
用vt^ 和 st^ 代替式3。

可视化
在这里插入图片描述
我们可以看到,在罚函数的等高线图中,优化器的位置随时间的变化情况。注意到,Adagrad、 Adadelta 及 RMSprop 法几乎立刻就找到了正确前进方向并以相似的速度很快收敛。而动量法和 NAG 法,则找错了方向,如图所示,让小球沿着梯度下降的方向前进。但 NAG 法能够很快改正它的方向向最小指出前进,因为他能够往前看并对前面的情况做出响应。
在这里插入图片描述
上图展现了各算法在鞍点附近的表现。如上面所说,这对对于 SGD 法、动量法及 NAG 法制造了一个难题。他们很难打破」对称性「带来的壁垒,尽管最后两者设法逃脱了鞍点。而 Adagrad 法、RMSprop 法及 Adadelta 法都能快速的沿着负斜率的方向前进。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值