量子计算9 发表于 2022-1-25 10:03

详解深度学习和神经网络优化器

Introduction

深度学习和神经网络算法一般是由模型、损失函数、优化器三部分构成。
算法的训练流程如下:1)数据输入到模型中进行正向传播;2)通过损失函数定量计算出模型概率与真实概率之差;3)由优化器进行参数更新,实现反向传播。
优化算法

深度神经网络的优化器即优化算法一般是梯度下降法,其发展路径分为两类:1)调整学习率,使得优化更稳定;2)梯度估计修正,优化训练速度。
公式: https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%7D+%3D%5Ctheta_%7Bt-1%7D-%5Ceta%2A%5Cfrac%7B%5Cpartial+J%28%5Ctheta_%7Bt-1%7D%29+%7D%7B%5Cpartial+%5Ctheta_%7Bt-1%7D%7D%3D%5Ctheta_%7Bt-1%7D-%5Ceta%2Ag_%7Bt%7D++ , https://www.zhihu.com/equation?tex=%5Ctheta 是要更新的参数,是学习率, https://www.zhihu.com/equation?tex=J%28%5Ctheta%29 是损失函数。
这里给出一个简单概念,想象自己站在一个山坡上,梯度就相当于方向,而学习率是步长,梯度下降法就是找到当前下降最快的方向(梯度的反方向),走一步,步长的大小是学习率。
批量梯度下降、随机梯度下降、小批量梯度下降

除了上面提到的学习率和梯度估计修正外,另外一种影响模型优化的因素是批量大小batch size。
批量梯度下降(Batch gradient descent):batch size为数据集的所有样本个数。遍历全部样本算一次损失函数,然后计算函数对各个参数的梯度,更新梯度。 这种方式计算开销大,计算速度慢,但训练比较稳定。



随机梯度下降(Stochastic gradient descent):batch size为1。输入一个样本就算下损失函数,然后求梯度更新参数。这种方式计算速度比较快,但收敛性能不好,目标函数震荡比较剧烈。



为了克服上面两种方法的缺点,现在一般采用的是折中的小批量梯度下降(mini-batch gradient decent)。batch size一般取512、1024、2048等。这种方法把数据分为若干批,按批来更新参数。这样,一个批中的一组数据共同决定了本次梯度的方向,不容易跑偏,减少了随机性。另外因为一批中的样本数与整个数据集相比小了很多,计算量也不是很大。



学习率与批量大小的关系:学习率通常随着批量大小的增大而相应增大。一个简单有效的方法是线性缩放规则(Linear Scaling Rule),当批量大小增加m倍时,学习率也增加m倍。
现在我们用pai平台训练模型时,batch size一般设为1024,基于你用的worker数来确定初始学习率,比如用7个worker,lr设为0.0007,用12个worker,lr则为0.0012。这里也体现了线性缩放规则的应用。
AdaGrad

AdaGrad优化算法对梯度下降法的发展在于可以自适应地调整每个参数的学习率。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。
算法流程:
1)在模型训练的第t次迭代中,先计算此参数从初始到现在的迭代的梯度平方的累加值:
https://www.zhihu.com/equation?tex=G_%7Bt%7D%3D%5Csum_%7Bc%3D1%7D%5E%7Bt%7Dg_%7Bc%7D%5E2 , https://www.zhihu.com/equation?tex=g_%7Bc%7D 是第c次迭代时的梯度。
2)参数更新:,是初始学习率, https://www.zhihu.com/equation?tex=%5Cepsilon 是为了保持数值稳定性而设置的非常小的常数。
AdaGrad算法中,如果某个参数的偏导数累计比较大,其学习率相对较小;相反,如果参数偏导数累计较小,学习率相对较大。整体上随着迭代次数的增加,学习率逐渐缩小。
缺点:经过一定次数的迭代依然没有找到最优点时,由于学习率已经非常小了,参数很难再更新了。
RMSprop

RMSprop算法是对AdaGrad的一种改进,也是一种自适应学习率的方法。
算法流程:
1)计算每次迭代梯度平方的指数加权平均:
https://www.zhihu.com/equation?tex=G_%7Bt%7D+%3D+%5Cbeta+G_%7Bt-1%7D%2B%281-%5Cbeta%29g_%7Bt%7D%5E2+%3D+%281-%5Cbeta%29%5Csum_%7Bc%3D1%7D%5E%7Bt%7D%5Cbeta%5E%7Bt-c%7Dg_%7Bc%7D%5E2 , https://www.zhihu.com/equation?tex=%5Cbeta 为衰减率,一般取值为0.9。
该公式等于每一次迭代的梯度乘以对应的指数衰减函数值和前面的参数权重 https://www.zhihu.com/equation?tex=1-%5Cbeta ,再求和。
2)RMSprop优化算法的参数更新:
指数加权平均是理解优化算法非常重要的一个概念。
定义:指数式递减加权的移动平均,各数值的加权随时间而指数式衰减,越近期的数据加权越重。
参考链接:https://zhuanlan.zhihu.com/p/29895933 相比于AdaGrad,RMSprop优化算法的计算由累加方式变成了指数衰减移动平均。在迭代的过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大。
Momentum(动量法)

算法思想:参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向。即通过积累之前的动量来替代真正的梯度。
算法流程:
1)在第t次迭代时,计算梯度的加权移动平均:
https://www.zhihu.com/equation?tex=M_%7Bt%7D%3D%5Crho+M_%7Bt-1%7D%2B%5Ceta+g_%7Bt%7D%3D%5Ceta%5Csum_%7Bc%3D1%7D%5E%7Bt%7D%5Crho%5E%7Bt-c%7Dg_%7Bc%7D
注意:这里不是标准的指数加权平均公式,前面的参数是学习率而不是 https://www.zhihu.com/equation?tex=1-%5Crho 。
2)参数更新:
当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。



Nesterov

Nesterov加速梯度算法也是一种梯度估计修正方法,是一种对动量法的改进。
算法流程:
1) https://www.zhihu.com/equation?tex=%5Chat%5Ctheta+%3D+%5Ctheta_%7Bt-1%7D-%5Crho+M_%7Bt-1%7D
2) https://www.zhihu.com/equation?tex=M_%7Bt%7D%3D%5Crho+M_%7Bt-1%7D%2B%5Ceta+g_%7Bt%7D%28%5Chat%5Ctheta%29
3)
是在参数的基础上基于之前积累的动量更新的参数,后面求梯度区别于动量法,不是基于计算,如图所示,而是向前一步,对计算梯度。之后才是更新当前次参数 https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%7D 。



Adam

Adam可以看作是RMSprop算法和动量法的结合。不仅使用动量作为参数更新方向,而且可以自适应调整学习率。
算法流程:
1) https://www.zhihu.com/equation?tex=M_%7Bt%7D%3D%5Cbeta_%7B1%7DM_%7Bt-1%7D%2B%281-%5Cbeta_%7B1%7D%29g_%7Bt%7D%2CG_%7Bt%7D%3D%5Cbeta_%7B2%7DG_%7Bt-1%7D+%2B+%281-%5Cbeta_%7B2%7D%29g_%7Bt%7D%5E2
Adam算法一方面计算梯度的指数加权平均(一阶动量),另一方面计算梯度平方 https://www.zhihu.com/equation?tex=g_%7Bt%7D%5E2 的指数加权平均(二阶动量)。
2) https://www.zhihu.com/equation?tex=%5Chat+M_%7Bt%7D%3D%5Cfrac%7BM_%7Bt%7D%7D%7B1-%5Cbeta_1%5Et%7D%2C%5Chat+G_%7Bt%7D%3D%5Cfrac%7BG_%7Bt%7D%7D%7B1-%5Cbeta_2%5Et%7D+
如果和被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的和来抵消这些偏差。
3)参数更新: https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%7D%3D%5Ctheta_%7Bt-1%7D-%5Cfrac%7B%5Ceta%7D%7B%5Csqrt%7B%5Chat+G_%7Bt%7D%2B%5Cepsilon%7D%7D+%5Chat+M_%7Bt%7D
Ps: 建议 β1 = 0.9,β2 = 0.999, = 10e8
参考:

    https://mp.weixin.qq.com/s/s8VTpirL3C_auEnW14yRuw
《神经网络与深度学习》邱锡鹏

Zephus 发表于 2022-1-25 10:08

看也看不懂,过来点个赞

kirin77 发表于 2022-1-25 10:11

Adam的公式2)中的小写g_t应该是G_t。

Baste 发表于 2022-1-25 10:13

以修改,谢谢
页: [1]
查看完整版本: 详解深度学习和神经网络优化器