模型训练与测试---梯度下降与牛顿法与优化器·2.

常用的拟牛顿算法:DFP算法和BFGS算法

https://blog.csdn.net/nickkissbaby_/article/details/81066643

优化器学习思路

为什么这么多种优化器,因为我们的用的是一阶导数,本身具有一定的不确定性,导致下降有时候不太好。所以我们需要一些技巧,用这些优化器让模型本身更好的梯度下降。

下面的文章思路:
1.基本的优化器,BGD 和 SGD,后面的都是基于他们来修改的

2.累加的优化器,先明白一个数学概念,滑动平均EWA,滑动平均的作用是为了更好的计算累加。第一次累加是带有Momemtum的优化器,第二次的累加是为了根据自动调整学习率的优化器adagrad和RMSPROP,两次都会用到了滑动平均。同时都是先累加后修正的这个就是Nesterov Acceleration:还有特例将一阶导数模拟二阶导数的adalelta。

3.最终合成优化器,就是将上面提到了全部结合再一次,除了二阶导数那一步,这个就是adam。

基本的优化器:

经典收录:

  1. 讨论其他优化算法的时候,我们回到原点,也就是为什么一开始要说梯度下降的东西了。原点能让我们知道为何我们要使用这些优化算法,这些优化算法考什么来影响整个过程的。

优化器的核心就是通过学习率等来改变梯度的下降方式,从而改变参数的变化,从而找到最佳值。这是一个值得反思的问题,好的优化器可以找到全局,数据里面的最优值,也是我们为什么会着力研究不同的优化器的变形。

2.原点是是:
在这里插入图片描述

---- BGD 到 SGD — 梯度下降方式改变为主

批梯度下降法 BGD
在这里插入图片描述
SGD 不涉及mini-batch的情况

这里的SGD不是带有mini-batch
在这里插入图片描述

SGD :Mini-batch gradient descent

每一次迭代计算mini-batch的梯度,然后对参数进行更新,这是常见的优化方法了。也就是 SGD没有动量的概念所以上面的第二步直接去掉,但是有每个minibatch的概念。所以主要是第二步不同于其他了。
在这里插入图片描述
在这里插入图片描述
所以学习率在这里也是比较关键的,也就是允许当前batch的梯度多大程度影响参数的更新。

缺点呢?
a:每个mini-batch都会影响,所以学习率的选择比较关键,

b:对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了。不具有自适应的功能。就是不能每个参数单独一个合适的学习率

c:每个batch的影响都有,容易动荡,头疼,难在你怎么知道每个batch的处理呢?每个batch情况都不一样。有的容易学习,有的不好。所以他的下降趋势就是非常动荡的。如果学习率选的太大还会把动荡变大
在这里插入图片描述

对于一个矩阵而言,若数值为零的元素远远多于非零元素的个数,且非零元素分布没有规律时,这样的矩阵被称作稀疏矩阵;与之相反,若非零元素数目占据绝大多数时,这样的矩阵被称作稠密矩阵。

到上面为止,其实就是基本的优化器的演变,其中SGD就是基本优化器的最终演变形态,但是目前的SGD还有一些问题,所以下面就是通过不同的角度对SGD进行改造,比如加了动量进行加速并且减少动荡,比如每个参数都自适应,比如动量都对应每个参数自适应等等。也是目前主流会使用的SGD的形态。

什么时候用批下降,什么时候用minibatch minibatch的size多大的一些建议。数据量少于2000批下降不错,minibatch的话2的N次方,最后要看我们GPU和CPU的性能。
在这里插入图片描述

----- 方向性累加的优化器,更加的平滑的梯度

滑动平均

谈SGD的改变之前我们需要明确一个概念,滑动平均。这个概念其实我第一次遇到是在云从科技的笔试题里面BN层的时候涉及到的了滑动平均,这个概念。而在下面的SGD-Momentum的概念中,我们再一次使用了滑动平均的概念。

在深度学习优化算法,如:Momentum、RMSprop、Adam中都涉及到指数加权平均这个概念。为了系统的理解上面提到的三种深度学习优化算法,先着重理解一下指数加权平均(exponentially weighted averages)。

首先我们看到了我们当前也是由前一个得来的,前一个的0.9,加上当前的0.1.
在这里插入图片描述
如果是选择前面的0.98 后面的0.02的话没那么,我们的线就是绿的线,也就是我们的momentum的数值越接近1,那么我们的线就越光滑。从EWA我们可以知道了为什么加了Momentum的SDG可以减少动荡,以及为什么我们在训练模型的时候只要有用到Momentum的优化器比如SGD的,我们会让我们Mometum的参数选择在0.90
而且也可以看到这个等式的表达的是约等于1/1-beita个时刻的平均值beita越接近1,过去的时刻积累的就越多。
在这里插入图片描述
上面提到了是过去的多少时刻的平均值,下面就是距离,假设我们的beita是0.9 那么就是过去10是天,为什么是过去十天因为 ,0.9的话10天后那么就是下降到原来的1/e,这是一个标准,已经很小了所以不会有影响了,加入我们的beita是0.98 那么就是过去的50天。也就是50天之前的都对当前有影响。如果把下面的换成了我们的参数的下降,那么这就是带有Momentum的SGD了,看似是临近的时刻的计算,但是通过层层递推,其实适合前面多少个时刻有关系的。

这样就即可节省内存,也可以让过去的进行累加了。节省内存体现:我们只需要现在一个的和过去一个的,进行累加体现:过去一个的,其实能够代表过去多个的。 比如0.98 相当去累加了过去的50个梯度下降。

而且加上了之前的数值以及这样的处理,其实当前的数值影响会比小,而且整体的数值都会比较小,这样在垂直方向上的突变会小,但是在水平方向上会前进的更快,更加接近最优值。
在这里插入图片描述
所以我们说滑动平均的提出,是为了更好的计算过去的累加,后面Momentum会用到累加,然后Adagrad也会用到了累加,所以会有两次滑动平均出现,同时都是先累加,后修正,所以会有两次 Nesterov Acceleration出现,最终合成的话就是adam这个优化器了。

Momentum

其实上面我们可以看出没有Momentum的SGD其实有点垃圾,因为每次梯度更新都完全依赖于当前的batch,更新非常不稳定。会涂来涂去,也就是我们提到的动荡,但是如果用了EWA的Momentum就让上面的首先可以减少动荡。 因为累加的话会让梯度朝着下降最快的方向不断的累加,而其他时好时坏的方向对梯度下降的影响被抵消了,这样就可以防止梯度下降的来回波动了。

在这里插入图片描述

momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留了之前更新的方向,同时利用当前的batch的梯度微调最终的更新方向,很明显就是现在的梯度加点之前的梯度了。

在这里插入图片描述
SGD with Momentum 又平滑又快,

该加速时加速,该减速时减速,更快的下降,更好的跑过最低点。图片里面提到了一阶动量是各个时刻的梯度方向的指数移动平均 ExponentialMovingAverage (EMA)。
在这里插入图片描述
在这里插入图片描述

总结:SGD with Momentum 就是基于EWA的积累思想:上一时刻和本时刻的梯度就等于过于到某个时刻的梯度的平均值,再加上方向的积累,可以让梯度下降朝着某个方向不断的下降积累,而其他波动的方向因为积累被抵消,所以梯度更加稳定,更加的平滑。**

往前走走看的SGD with Nesterov Acceleration

动量积累先,然后再微调,而不是先微调再动量积累。这一个的话就是先预测我们会梯度下降的位置,然后在位置上面进行微调修正,最终得到我们准确的位置。通过预先知道,看看会不会走出最小值,然后进行微。
在这里插入图片描述

因为是微雕,所以就是基于上面的情况,减去我们的累加。
在这里插入图片描述
当前的会带来突变,而之前的可以加快速度。先走一大步,然后用当前的进行修正

上面讲的都是SGD的一些变种,而且从原点的角度看我们也有了第二步骤。但是第二步骤中我们用了一阶动量。

我们同样也想要使得我们的更新能够适应每一个单独参数,以根据每个参数的重要性决定大的或者小的更新。这就是自适应优化器的核心,适应每个参数的自我调整。

----- ADA系列, 大小的累加更加适合数据不平衡的优化器

------ AdaGrad 将每一个参数的每一次迭代的梯度取平方累加再开方,累加了历史梯度的平方的开放,其实也就是梯度下降的数值的大小,如果说Momentum的概念是梯度下降的方向,那么Ada开始的话则是从大小出发。关键就是让训练多的,处于一个大的数让他的学习率减少,如果训练少的,让他除以一个学习率变大一点。除的这个数就是过去的梯度的平方和。这就是Ada的作用。
在这里插入图片描述
二阶动量是啥呢?迄今为止所有梯度值的平方和的开根号,如果是看了李宏毅的课应该这个概念会更加清晰。adagrad只用了二阶动量来限制学习率的变化。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上面这段话就可以达到了我们想好好训练稀疏矩阵的效果,如果某个参数更新多了,那么他的积累就越来越大,那么他的分母也就越来越大,所以他的学习率就越来越小。同理如果更新少的他的学习率就会大。

缺点是:
中后期的时候,分母上梯度平方的累加将会越来越大,使得训练提前结束。

---- ** EWA 思想带来的RMSProp** 不是累加历史平方梯度,而是转化为固定窗口的带下。用滑动平均来替代累积,而且可以实现窗口化,还记得我们选取0.98 其实就是过去50个的累积嘛。这样可以避免adagrad那样越来越大。
在这里插入图片描述
在这里插入图片描述
---- Adadelta EWA梯度平方的滑动平均替代全部历史平方和

可以说RMSPROP是ADADELTA 的一个特例,AdaDelta基本思想是用一阶的方法,近似模拟二阶牛顿法。https://www.cnblogs.com/neopenx/p/4768388.html

两个主要的改变,第一个改为过去一段时间,而不是过去的全部,所以过去的一段时间我们就可以用滑动平均。滑动平均就是计算过去一段时间的梯度下降的和。但是这里的滑动平均是指数的。到这里生成就是对应上面的Rmsprop

在这里插入图片描述

第二个部分:统一量岗的计算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Adam :考虑Momemtum,考虑了Nesterov Acceleration,考虑了不同参数的学习率,考虑了两次累加都是用了滑动平均,所以就有两个不同的beilta,还记得我们的滑动平均,beitla的作用嘛,就是体现了过去的累积多少。既有动力也可以自己的调整。

这里我们区分一下,Momemtum的话是记录了变化最大的方向,但是到了Rmsprop的话是记录的是幅度,因为这里是开平方,就是没有了方向,所以前者是方向后者是大小。这就是一阶动量和二阶动量的区别。一阶动量是正负的关系,二阶动量的话是只关注你的大小。所以adam就是集合了这两个,既要下降的快和稳还要有限制的去更新。方向性的改变用了一阶动量,衰减的方向问题换成了一阶动量,而自适应更新的幅度转化为二阶动量的大小。前者更加稳定,后者更加自适应。两个参数代表了积累过去世间多少的。

如果说一阶动量的出现是利用惯性更快的下滑,而二阶动量的出现以及固定窗口则是提供了自适应性。

  1. 为每个参数计算出不同学习率 Rmsprop;

  2. 也计算了动量项momentum SGD with momentum;

  3. 防止学习率衰减或梯度消失等问题的出现。

在之前的方法中计算了每个参数的对应学习率,但是为什么不计算每个参数的对应动量变化并独立存储呢?这就是Adam算法提出的改良点。

也就是Adam,不仅利用了一阶动量,也用了二阶动量,而且二阶动量的每个参数化,在这里也让一阶动量参数化。二阶动量在这里就是梯度平方的移动平均来替代全部历史梯度的平方和。一阶动量就是梯度的移动平均。前者是大小后者是方向,前者可以根据参数的更新来调节学习率后者则是让梯度沿着下降的方向不同的积累。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

adam总结:也就是Adam,不仅利用了一阶动量,也用了二阶动量,而且二阶动量的每个参数化,在这里也让一阶动量参数化。二阶动量在这里就是梯度平方的移动平均来替代全部历史梯度的平方和。一阶动量就是梯度的移动平均。前者是大小后者是方向,前者可以根据参数的更新来调节学习率后者则是让梯度沿着下降的方向不同的积累。

总结来说 优化器的变化过程就是:

一堆数据优化,到一批数据优化,到带有一阶动量的方向优化(EWA滑动平均了),到先动量后调整的变化,然后就是历史梯度更新的平方和实现了每个参数的更新,到梯度平方的滑动平均来替代历史梯度的全部平方和,最终就是将上面全部结合在一起,得到了Adam。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值