

优化算法系列(3):SGD改进之梯度估计修正
source link: https://allenwind.github.io/blog/8383/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

优化算法系列(3):SGD改进之梯度估计修正
在SGD中,我们提到过每次选取批量样本计算梯度和实际的梯度存在误差,这个梯度误差的直观体现是损失曲线呈现震荡下行。于是,为了缓解这个SGD中梯度误差我们可以通过最近一段时间内的平均梯度来代替当前时刻的梯度,进而缓解梯度带来的随机性。文本就从这个方向着手解决问题。
搜索梯度估计(Gradient Estimation)相关的资料,发现梯度估计还真是个大领域,很多理论性很强的内容,目前还没有遇到这样的需要,因此这里深入不了这个领域,而是谈谈优化算法中梯度估计的思想。
我们在SGD中提到,用训练集的子集来计算梯度和真实的梯度有差异,那么我们肯定会想到能否有些什么技巧来减少这个计算的差异吧。由于这个误差是随机的,因此减缓差异的方式就是降低估计梯度和真实梯度的方差。一个很好的思路是加权平均。拿全量数据的子集进行梯度估计,为让估计更稳定,利用历史数据拟合(修正)当前的梯度。
在展开此讨论之前,我们先谈谈梯度截断。
梯度估计最容易让人想到的是梯度截断(有称梯度裁剪),它不需要特别的迭代技巧。当然,它的目的性也是很强的,如为缓解梯度爆炸问题而截断梯度。
当梯度的模大于一定阈值时,梯度截断方法对梯度按一定规则进行截断。比如按值截断,期望梯度的取值限制在区间[a,b][a,b]内,那么截断方法为,
gt=max(a,min(gt,b))gt=max(a,min(gt,b))类似地,按模截断,当梯度大于某个值是,截断gt=ηgt|gt|gt=ηgt|gt|,具体地,
gt=⎧⎪⎨⎪⎩gt if ∥gt∥≤ηηgt∥gt∥ if ∥gt∥>ηgt={gt if ‖gt‖≤ηηgt‖gt‖ if ‖gt‖>η代入到梯度下降中,
θn=θn−1−γgn(θn−1)θn=θn−1−γgn(θn−1)直观理解,梯度裁剪能假设训练过程。因为训练过程中梯度突然增大,反而容易让更新参数远离局部最优点,进而导致梯度路径曲折迂回。不过,这只是直观理解,并没有数学上的证明。
SGDM = SGD + Momentum,所谓Momentum即趋势,沿着某个方向运动的趋势。
加权移动平均
我们来看看加权移动平均的计算方式,
St={Y1,t=1αYt+(1−α)⋅St−1,t>1St={Y1,t=1αYt+(1−α)⋅St−1,t>1展开来看,
St=α[Yt+(1−α)Yt−1+(1−α)2Yt−2+⋯⋯+(1−α)kYt−k]+(1−α)k+1St−(k+1)St=α[Yt+(1−α)Yt−1+(1−α)2Yt−2+⋯⋯+(1−α)kYt−k]+(1−α)k+1St−(k+1)迭代式和展开式在数学上是等价的,不过在实践上,展开式的实现需要更大的存储空间的记录窗口内的权重,这时迭代的形式就发挥优势了。由于1−α<11−α<1,因此,当离当前时刻越远的取值获得的权重也就越少,因此加权移动平均可以理解成是一种遗忘策略。
SGD加Momentum
SGDM实际上就是SGD加Momentum。这里Momentum是借用物理上的动量概念,指物体的运动在其原有的方向上保持趋势。其实我们可以不太关注其真实的物理意义,只需要知道Monentum对应的数学操作就是对历史梯度进行加权移动平均,而这个平均的结果作为当前时刻的梯度。类比下,我们看K线波动总是很大,而均值趋势线却很平稳,梯度也是这个效果。
由于客观条件限制,无法使用全量数据计算梯度,那就估计吧。拿全量数据的子集进行梯度估计,为让估计更稳定,利用历史数据拟合(修正)当前的梯度。加权平均更新梯度的方式如下,
θn=θn−1−γn∑i=1βn−igiθn=θn−1−γ∑i=1nβn−igi第ii个梯度gigi的权重为βt−iβt−i,动量因子β<1β<1,所以离当前越近的梯度重要性越大。不过你会发现,在工程实现上,记录一个时间窗口内的梯度并不实际,因此这需要的内存或显存太大了。为此,以上方式我们可以改为如下为迭代的形式,
θn+1=θn+gn+1gn+1=αgn−γ∇θLRi(θn)θn+1=θn+gn+1gn+1=αgn−γ∇θLRi(θn)α≥0α≥0称为动量因子,当然不同材料以上的表述不一定相同,能够表达其加权移动平均即可,当动量因子取0时,退化成普通的SGD算法。
在Keras中,SGD中使用Momentum只需要把momentum参数改为大于0即可,
keras.optimizers.SGD(
learning_rate=0.01, momentum=0.0, nesterov=False, name='SGD', **kwargs
)
可以看到,每个模型参数的实际值都是时间窗口内梯度的加权平均。这样可以平滑某个时刻的参数异常:
- 在一个时间窗口内,某个参数的梯度方向不一致时, 在加权平均作用下其真实的参数更新幅度变小
- 在一个时间窗口内,相对以上情况,参数更新幅度变更大,起到加速的作用
Nesterov Accelerated Gradient
Nesterov Acceleration Gradient,简称NAG,对Momentum法的改进。SGDM表明,当前的参数的更新方向Δθn+1Δθn+1为上一步参数更新方向αgnαgn与当前梯度的反方向叠加−γ∇θLRi(θn)−γ∇θLRi(θn),第二步的更新其实不太合理,应该改为参数上的梯度,因此有,
gn+1=αgn−γ∇θL(θn+αgn)θn+1=θn+gn+1gn+1=αgn−γ∇θL(θn+αgn)θn+1=θn+gn+1取θn←θn+αgnθn←θn+αgn容易改为如下形式,
gn+1=αgn−γ∇θL(θn)θn+1=θn+αgn+1−γ∇θL(θn)gn+1=αgn−γ∇θL(θn)θn+1=θn+αgn+1−γ∇θL(θn)NAG的思路不是来自加权平均历史梯度来降方差,而是出于对SGDM梯度更新不合理的改进。
随机梯度下降为,
θn+1=θn−γ∇θLRi(θn)θn+1=θn−γ∇θLRi(θn)引入Momentum后,改为,
gn+1=αgn−γ∇θL(θn)θn+1=θn+gn+1gn+1=αgn−γ∇θL(θn)θn+1=θn+gn+1称为SGDM,直观来说是用平滑的梯度gn+1gn+1来替代梯度进行参数更新。
引入Nesterov加速后,改为,
gn+1=αgn−γ∇θL(θn)θn+1=θn+αgn+1−γ∇θL(θn)gn+1=αgn−γ∇θL(θn)θn+1=θn+αgn+1−γ∇θL(θn)改进SGDM参数更新的不合理。
Recommend
-
38
感谢阅读「美图数据技术团队」的第 11 篇原创文章,关注我们持续获取美图最新数据技术动态。 平时我们说的训练神经网络就是最小化损失函数的过程,损失函数的值衡量了模型在给定数据集下的表现(拟合)能力。
-
45
梯度下降是一种寻找函数极小值的优化方法,在深度学习模型中常常用来在反向传播过程中更新神经网络的权值。 在这篇文章中,我会总结应...
-
34
基于改进的点对特征的6D位姿估计 ...
-
24
点击上方“3D视觉工坊”,选择“星标”干货第一时间送达本文转载自「计算机视觉工坊」,该公...
-
5
优化算法系列(1):梯度下降算法与推导深度学习(机器学习)算法 = 模型表征 + 模型评估 + 优化算法,而基本上所有的机器学习算法都在损失函数下转化为某种形式的优化问题,可以说模型训练就是一个数值优化过程。 当前,常见的深度学习优化算...
-
6
优化算法系列(2):深入讨论SGD及其改进思路从机器学习角度来看,一个完整的任务包括模型、评估、优化,本系列谈的就是优化。机器学习模型的训练其实就是参数学习,通常是通过一定的优化算法来寻找一组可以最小化结构风险的参数。而最常见的优化算法...
-
3
自适应学习率调整的方法,常见包括AdaGrad、RMSprop、AdaDelta等。 学习率调整在凸优化中,使用梯度下降算法时,通常期望学习率在一开始要保持大些以便提高收敛速度,但到最优点附件时为避免来回震荡,学习率应该小一些。也就是说,我们期望学...
-
2
Mr.Feng BlogNLP、深度学习、机器学习、Python、Go优化算法系列(5):SGD改进之Adam一个综合方案和派生(更新)本文已经更新了Adam的派生方案。 梯度估...
-
5
常用的梯度下降优化算法 发表于 2018-10-01 更新于 2021-03-07 ...
-
7
1、岗位、赛道、企业及工作地点的确定1.1 求职岗位的确定求职准备期首要的目标是确定岗位!大体而言分为技术岗和非技术岗,而其下又有各种分支技术岗包括:研发、 算法、测试。研发包...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK