首页 > 编程知识 正文

常见的优化器,路径优化研究

时间:2023-05-04 18:45:08 阅读:173623 作者:1654

梯度下降法是最原始、最基础的算法。

加载所有数据集,计算所有坡度并执行决策。 也就是说,在斜率的相反方向上更新权重)

优点是凸函数可以收敛到最小值。 但显而易见,这种方法计算量太大了。 如果我们的数据集很大,普通的GPU完全不能执行。 另一种说法是无法从鞍点逃脱,也容易收敛到局部最小值(即极小值)。

静态梯度设计

参照:

3359 zhanlan.zhi Hu.com/p/27609238 (没有学习过jldcjl矩阵) ) ) ) ) ) ) ) ) ) ) ) ) )。

3359 blog.csdn.net/bvl 10101111/article/details/72615621 (momentum ) )。

随机坡度下降法与BGD相比,计算坡度时所依据的数据不同。 SGD基于整个数据集的随机一部分。 (网上介绍每个样品都是emmm,但现在采用的是随机样品的一部分。

也就是说,更新的速度比较频繁。 我们随机选择的小批量数据(mini-batch )不是很多,所以计算过程也不是很复杂。 与BGD相比,我们在同一时间更新的次数多得多,自然可以更快收敛。

但是,还有缺点。 一个是CS231n提到的:

虽然这里不太清楚,但它与jldcjl矩阵有关。 原话假设在二维的例子中,损失函数向某个方向变化得很快,但向另一个方向变化得很慢时,SGD会向变化较慢的方向往复,在变化较快的方向上不会出现大的幅度。

但是,我认为看到一个例子就很形象。 位于https://Zhan.zhi Hu.com/p/21486826。 那个如下。

类比:

玩滑板的时候,如果你的起点在两边的边缘,你经常能想象到你下降的方向不是左右,而是斜着向下。 这样的话,我们权重更新的方向也会一样。

另一个是噪音相对变大。 这个很容易理解。 更新的梯度利用了训练集中的一部分,因为它应用于整个训练集中的模型。 但是,在网上寻找资料时,https://Zhan.zhi Hu.com/p/36816689讲述了噪音如何帮助SGD鞍点逃脱的问题。

但是,CS231n用别的方法使SGD克服了上述缺点。 比如说。 就是加上动量。

可以看出,当前更新SGD的梯度不仅仅是计算出的梯度,也必须增加上一步骤的梯度。 但是,有 这个参数,可以调整前面的坡度所占的比重。

让我们看看如何克服上面的问题。 无法逃避上述鞍点和极小值(在两个方向上损失都很大)是因为坡度为0,因此处于停滞状态。 但是,由于Momentum的出现,每个地方都有一定的坡度,所以我们的网络可以继续更新。 关于那个之字形,我画了图。

如果标记的蓝点不带有Momentum,则更新方向为蓝色向量。 但是,因为我们添加了前一步骤,也就是绿色的矢量,所以现在我们更新的矢量是黄色的。 也就是说,不是垂直方向,而是水平方向。 这在一定程度上克服了上述缺点。

Nesterov图像来自https://blog.csdn.net/tsyccnh/article/details/76673073。 (有时也会讨论不同的优化程序。 )

Momentum:

Nesterov:

其实这个制图有点混乱。 因为这样看的话,它们看起来像是更新的梯度。 其实不是。 在第二张图中,C走到D是根据C那个点的梯度,还有作者连接BD说这是b点的实际坡度下降的方向。 所以,我们必须弄清楚! 它们不一样。

每一个字符表示对应点的参数,g(a )g(a )-a )表示a )-a )的斜率,其:

Momentum:g(b )=#x03C1; g(a ) g ) b ) g ) b ) #x2032;=b#x2212; #x03B1; #x22C5; g(b ) Nesterov:g(b ) b )=#x03C1; g(a ) g ) g(b#x2212; #x03B1; #x22C5; #x03C1; g(a ) )=#x03C1; g(a ) g ) c ) g ) b ) #x2032;=b#x2212; #x03B1; #x22C5; g(b ) role=(presentation ) Momentum:g ) b ) b ) ) nesterov:g ) b ) g ) b ) )=g ) a ) b ) bg ) b )

(b)Momentum:g(b)=ρg(a)+g(b)g(b)′=b−α⋅g(b)Nesterov:g(b)=ρg(a)+g(b−α⋅ρg(a))=ρg(a)+g(c)g(b)′=b−α⋅g(b)

当然,也有人认为Nesterov只是多算了一次梯度,但事实并不是这样。
有位大神在http://www.360doc.com/content/16/1010/08/36492363_597225745.shtml最下面推理了过程,可以得出结论为:

结论:在原始形式中,Nesterov Accelerated Gradient(NAG)算法相对于Momentum的改进在于,以“向前看”看到的梯度而不是当前位置梯度去更新。经过变换之后的等效形式中,NAG算法相对于Momentum多了一个本次梯度相对上次梯度的变化量,这个变化量本质上是对目标函数二阶导的近似。由于利用了二阶导的信息,NAG算法才会比Momentum具有更快的收敛速度。

AdaGrad

我们累计每一次梯度的平方,接着让学习率除以它的开方。这个的作用是为了改变不同参数的学习率。假如一个参数的梯度一直很大,那么通过这个约束,它改变的就越少。假如一个参数的梯度一直很小,那么通过这个约束它,它变化的也就越快。这里的 1e−7 1 e − 7 是防止分母为0。

但问题是,因为是一直在累积的,这个grad_squared一定会变得越来越大,最后的结果是,权重更新的步长也会不可避免的变得很小。为了克服这个问题,有了RMSpro。

RMSprop

可以看出来,它只是改变了grad_squared。添加了一个衰减率(一般0.9或者0.99),可以使得grad_squared的变化不会因为时间的累积而变得太大。

但也由于衰减的问题,grad_squard是可能导致我们训练一直在变慢的。(我理解是后面累积的梯度太少了,但因为前面的梯度太多,没有办法加速,当然,我没有找到资料,但斯坦福课程上面Johnson是这样说的)

PS:有些人将RMSprop和Nesterov结合起来。

Adam

可以看出来,红色的部分是类似与Momentum的方法,而蓝色的部分则是利用了RMSprop的衰减。因此这个算法是很好的结合了这两个的优点。

之所以有绿色方框的Bias Correction是因为想要避免一个情况:一开始的梯度太小,因此学习率除以second_moment的值太大,步长太大容易跑到一个奇怪的地方。导致收敛之后的效果不好。因此我们有了Bias correction,学习率也是除以second_unbias。

Adam一般来说是收敛最快的优化器,所以被用的更为频繁。当然,它还有变体AdamMax,但知道了Adam再去看其它也不是很难了。

总览



图片来自: https://blog.csdn.net/u010089444/article/details/76725843
图片作者:Alec Radford

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。