参考:

  • 《动手做深度学习第一版》优化算法B站视频
  • 《动手做深度学习第一版》书籍

    Mini-Batch 梯度下降

  • BGD(Batch Gradient Descent)- 按数据集迭代,每次对整个数据集计算每个样本的平均loss,然后反向梯度传播,迭代一次。

  • SGD(Stochastic Gradient Descent)- 按样本迭代,每次对单个样本计算loss,然后反向梯度传播,迭代一次。
  • Mini-Batch是一种介于BGD和SGD的中间做法,每次取mini-batch个样本当做一批来进行训练,通常mini-batch是2的倍数,介于2-512之间。相比于BGD,他减少了每次训练使用的样本,增加了迭代速度,相比于SGD,他增加了每次迭代使用的样本,增加了稳定性和鲁棒性。因此,mini-batch通常是对大样本训练的一种较好的处理方法。

    指数加权平均(EMA)

    EMA = Exponential Moving Average

image.png
先来一个例子:
假设有某地近100天中每天的气温,其中第t天的气温用优化算法 - 图2表示,优化算法 - 图3是从1第天到第t天的加权平均温度。

指数加权平均的作用?
指数加权平均是平均数的一种近似,是一种加权平均,第100天的平均温度,以下面的例子来说,就是越近的日期,权重越大。
节省内存的说法我表示不能理解,即使是算平均数,你可以用两个变量,一个存储当前的sum,一个存储当前的个数,一样可以两个变量就可以解决平均数问题。(然而你这是每次都用所有的数据的情况,如果是只用最近N个数据,那么你就要记录最近N个数据的值,因为N是移动窗口,一直在改变的)。

指数加权平均的公式:
优化算法 - 图4
如果看不明白指数在哪里,可以将公式进一步写为:
优化算法 - 图5

为什么优化算法 - 图6代表了最近优化算法 - 图7天的平均温度?
优化算法 - 图8为例,优化算法 - 图9,近似于0.3,或者1/e,同理,如果是
优化算法 - 图10优化算法 - 图11也差不多,所以意思是当权重只有0.3或者更小以后,就基本可以忽略了,没找到明确的数学证明,从《动手做深度学习》的讲解来看,这个基本算是一个共识吧。

偏差修正可以解决最初的计算偏差过大的问题,也就是用

优化算法 - 图12

在t很大时,分子接近于1,在t很小时,可以更好的修正平均值的计算。

额外补充一些其他的平均方法:

  • 移动平均
    • 简单移动平均:选定一个窗口N,每个数据权重相等,计算N个数的平均数。随着时间推移,窗口N跟着推移,例如窗口为7,那么计算10月8日的数据就用10月1-7号,计算10月9日数据就用10.2-8号。这种方法的缺点就是要始终记录最近的N个数据,多占用了一些内存。
    • 加权移动平均:也是选定窗口N,但是权重不一定是相等,一般会按照时间进行衰减。但是N个数据的权重总和还是1。

在移动平均的基础上,又发展出了指数加权平均,也就是我们上面介绍的,这种只需要记录最近一次结果,所以节省了内存。
同时,上面介绍的指数平滑其实是一次指数平滑,相应的还有二次指数平滑和三次指数平滑等。

Momentum - SGD+EMA

假设我们用优化算法 - 图13表示mini-batch的梯度向量,那么动量法的公式为:
优化算法 - 图14
可见,Momentum是融合了EMA,对历史的梯度进行移动加权平均。
示例,假设有2个参数,在SGD时,更新的过程如下图:
image.png
那么我们可以看到,梯度呈现zig-zag现象,在x2维度上,梯度一会是正的,一会是负的,这导致loss收敛的很慢,如果我们加大lr,那么很可能loss直接崩溃了。
image.png
而采用了动量法以后,在x2方向上,因为每次的梯度都会考虑之前的梯度,所以正负被抵消了,而在水平方向上,则不断前进,因此,收敛速度大大加快。结果如下:
image.png

Adagrad - 自适应学习率,梯度方

SGD,Momentum,Nesterov等有一个问题,即对每一个参数,他们的学习率lr是一致的,但有些方向,如上图的x2,每次更新时,就应该用相对较小的lr,而x1方向,就应该用相对较大的lr。Adagrad就是对每个参数采用自适应的lr。
优化算法 - 图18

可见,s是随着迭代次数而不断累加的,因此如果s比较大,那么学习率lr会下降的非常快,因此Adagrad的问题在于,Adagrad在一开始发表时,是针对凸优化问题的,在凸优化的设定下,lr随着迭代次数不断衰减是有利于loss收敛的,但是在深度学习中,大多数是非凸优化问题,那么如果一开始Adagrad经过一定迭代次数依然没有找到最优点时,由于此时lr已经非常小,很难继续找到最优点。

RMSprop(EMA+Adagrad)

针对Adagrad前期梯度下降可能较快,导致当迭代一定次数依然没找到最优点时,参数更新缓慢的问题,有两个算法从不同的角度给出了方法,分别是RMSProp和Adadelta。

优化算法 - 图19

RMSProp的解决方法为,在更新s时,融入EMA思想,因为s初始化为0,所以在融入EMA后,s的变化幅度会相对变小,从而解决早期s过大而导致的lr过小的问题。

Adadelta(没有lr)

Adadelta在RMSprop的基础上,进一步去除了lr,用了一个新的变量来代替。

优化算法 - 图20

Adam(Momentum+RMSprop)

优化算法 - 图21

其中v’, s’的目的是对EMA中的v和s的初始值做偏差修正。
带warmup的adamw通常怎么选择b1,b2

为什么梯度是下降最快的方向?

参考自:梯度的方向为什么是函数值增加最快的方向?
为什么局部下降最快的方向就是梯度的负方向?
为什么梯度反方向是函数下降最快的方向?