acecase 发表于 2021-12-22 15:21

神经网络优化器的选择

机器学习的本质就是最小化损失,在定义了损失函数后,就可以利用优化器对参数进行优化,深度学习参数优化的方法一般是梯度优化,优化的目标是网络模型的参数(是一个数组集合)。
我们设,一般的线形回归函数的假设函数是:

https://www.zhihu.com/equation?tex=h_%7B%5Ctheta%7D%3D%5Csum_%7Bj%3D0%7D%5E%7Bn%7D+%5Ctheta_%7Bj%7D+x_%7Bj%7D
对应的损失函数为(MSE):

https://www.zhihu.com/equation?tex=J_%7B%5Coperatorname%7Btrain%7D%7D%28%5Ctheta%29%3D1+%2F%282%29+%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%28h_%7B%5Ctheta%7D%5Cleft%28x%5E%7B%28i%29%7D%5Cright%29-y%5E%7B%28i%29%7D%5Cright%29%5E%7B2%7D

的更新


常见的三个优化器(BGD,SGD,MBGD)
批量梯度下降(Batch Gradient Descent)
批量梯度下降法是最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行梯度的更新。

https://www.zhihu.com/equation?tex=%5Cfrac%7B%5Cpartial+J%5Cleft%28%5Ctheta_%7B0%7D%2C+%5Ctheta_%7B1%7D%5Cright%29%7D%7B%5Cpartial+%5Ctheta_%7Bj%7D%7D%3D%5Cfrac%7B1%7D%7Bm%7D+%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%28h_%7B%5Ctheta%7D%5Cleft%28X%5E%7B%28i%29%7D%5Cright%29-Y%5E%7B%28i%29%7D%5Cright%29+X_%7Bj%7D%5E%7B%28i%29%7D
相应的更新表达式为:

https://www.zhihu.com/equation?tex=%5Ctheta_%7Bj%7D%3D%5Ctheta_%7Bi%7D-%5Calpha+%5Cfrac%7B1%7D%7Bm%7D+%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%28h_%7B%5Ctheta%7D%5Cleft%28X%5E%7B%28i%29%7D%5Cright%29-Y%5E%7B%28i%29%7D%5Cright%29+X_%7Bj%7D%5E%7B%28i%29%7D
推导过程:

https://www.zhihu.com/equation?tex=%5Ctheta_%7Bi%7D%3A%3D%5Ctheta_%7Bi%7D-%5Calpha+%5Cfrac%7B%5Cpartial+J%28%5Ctheta%29%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D

https://www.zhihu.com/equation?tex=%5Cbegin%7Baligned%7D+%26%5Cfrac%7B%5Cpartial+J%28%5Ctheta%29%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D%3D%5Cfrac%7B%5Cpartial%5Cleft%5B%5Cfrac%7B1%7D%7B2%7D%5Cleft%28H_%7B%5Ctheta%7D%28X%29-Y%5Cright%29%5E%7B2%7D%5Cright%5D%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D+%5C%5C+%26%5Cfrac%7B%5Cpartial+J%28%5Ctheta%29%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D%3D2+%2A+%5Cfrac%7B1%7D%7B2%7D%5Cleft%28H_%7B%5Ctheta%7D%28X%29-Y%5Cright%29+%2A+%5Cfrac%7B%5Cpartial%5Cleft%28h_%7B%5Ctheta%7D%28X%29-Y%5Cright%29%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D+%5C%5C+%26%5Cfrac%7B%5Cpartial+J%28%5Ctheta%29%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D%3D%5Cleft%28h_%7B%5Ctheta%7D%28X%29-Y%5Cright%29+%2A+%5Cfrac%7B%5Cpartial%5Cleft%28%5Ctheta_%7B0%7D+X_%7B0%7D%2B%5Cldots%2B%5Ctheta_%7Bn%7D+X_%7Bn%7D-Y%5Cright%29%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D+%5C%5C+%26%5Cfrac%7B%5Cpartial+J%28%5Ctheta%29%7D%7B%5Cpartial+%5Ctheta_%7Bi%7D%7D%3D%5Cleft%28H_%7B%5Ctheta%7D%28X%29-Y%5Cright%29+%2A+X_%7Bi%7D+%5Cend%7Baligned%7D
最后我们就得到了表达式:


我们要不断重复这一步直到算法收敛,也就是对参数不断更新,直到梯度为0。但是,我们的每次迭代更新,都要对所有的m个样本数据进行求和。
那么我们如何检测是否已经收敛了呢?一种是检验两次迭代,如果两次迭代中,是否改变了很多,如果在两次迭代中没怎么改变,我们或许就可以说算法有可能收敛了。另一种,更常用的方法是,检验的值,如果你试图最小化的量不再发生很大的改变时,你也许就可以认为它收敛了。
优点:
(1)一次迭代是对所有样本进行计算,此时利用矩阵进行运算,实现了并行。
(2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,批量梯度下降一定能够得到全局最优解。
缺点:
(1)有时我们会遇到样本数目 m 很大的训练集合,如果有几十上百万,甚至上亿的训练样本。这意味着我们每执行一次批梯度下降算法,都要对m个样本进行求和。我们的程序也就需要检测这上百万的样本,甚至我们完成值下降的第一步都十分困难。这样会导致,训练过程很慢,花费很长的时间。
那么,当我们遇到这样非常大的数据集的时候怎么办呢?我们应该使用另一种梯度下降算法——随机梯度算法。
(2)随机梯度下降(Stochastic Gradient Descent)
它的具体思路是:算法中对的每次更新不需要再全部遍历一次整个样本,只需要查看一个训练样本进行更新,之后再用下一个样本进行下一次更新,像批梯度下降一样不断迭代更新。
优点:
(1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
缺点:
(1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
(2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
(3)不易于并行实现
三、小批量梯度下降(Mini-Batch Gradient Descent)

小批量梯度下降,是对批量梯度下降以及随机梯度下降的一个折中办法。其具体思路是:每次迭代使用 **batch_size** 个样本来对参数进行更新。它克服上面两种方法的缺点,又同时兼顾两种方法的优点。
优点:
(1)通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
(2)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(比如上例中的30W,设置batch_size=100时,需要迭代3000次,远小于随机梯度下降的30W次)
(3)可实现并行化。
缺点:
batch_size的不当选择可能会带来一些问题。小批量的梯度下降可以利用矩阵和向量计算进行加速,还可以减少参数更新的方差,得到更稳定的收敛。在小批梯度下降中,学习速率一般设置的比较大,也就是 https://www.zhihu.com/equation?tex=%5Calpha ,着训练不断进行,可以动态的减小学习速率,这样可以保证一开始算法收敛速度较快。实际中如果目标函数平面是局部凹面,传统的随机梯度下降往往会在此震荡,因为一个负梯度会使其指向一个陡峭的方向,目标函数的局部最优值附近会出现这种情况,导致收敛很慢,这时候需要给梯度一个动量(momentum),使其能够跳出局部最小值,继续沿着梯度下降的方向优化,使得模型更容易收敛到全局最优值。
自适应优化

四、AdaGrad

针对简单的SGD及Momentum存在的问题,2011年John Duchi等发布了AdaGrad优化算法(Adaptive Gradient,自适应梯度),它能够对每个不同的参数调整不同的学习率,对频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新。
https://www.zhihu.com/equation?tex=%5Cbegin%7Baligned%7D+%26g_%7Bt%7D%3D%5Cnabla_%7B%5Ctheta%7D+J%5Cleft%28%5Ctheta_%7Bt-1%7D%5Cright%29+%5C%5C+%26%5Ctheta_%7Bt%2B1%7D%3D%5Ctheta_%7Bt%7D-%5Calpha+%5Ccdot+g_%7Bt%7D+%2F+%5Csqrt%7B%5Csum_%7Bi%3D1%7D%5E%7Bt%7D+g_%7Bt%7D%5E%7B2%7D%7D+%5Cend%7Baligned%7D
gt表示第t时间步的梯度(向量,包含各个参数对应的偏导数,gt,i表示第i个参数t时刻偏导数)
gt2表示第t时间步的梯度平方(向量,由gt各元素自己进行平方运算所得,即Element-wise)
AdaGrad能够自动为不同参数适应不同的学习率(平方根的分母项相当于对学习率α进进行了自动调整,然后再乘以本次梯度),大多数的框架实现采用默认学习率α=0.01即可完成比较好的收敛。
优势:在数据分布稀疏的场景,能更好利用稀疏梯度的信息,比标准的SGD算法更有效地收敛。
缺点:主要缺陷来自分母项的对梯度平方不断累积,随之时间步地增加,分母项越来越大,最终导致学习率收缩到太小无法进行有效更新。

五、RMSProp

RMSProp是Geoffrey Hinton教授在教案中提到的算法,结合梯度平方的指数移动平均数来调节学习率的变化。能够在不稳定(Non-Stationary)的目标函数情况下进行很好地收敛。
优势:能够克服AdaGrad梯度急剧减小的问题,在很多应用中都展示出优秀的学习率自适应能力。尤其在不稳定(Non-Stationary)的目标函数下,比基本的SGD、Momentum、AdaGrad表现更良好。
六、Adam优化器

2014年12月,Kingma和Lei Ba两位学者提出了Adam优化器,结合AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长。

主要包含以下几个显著的优点:

1. 实现简单,计算高效,对内存需求少
2. 参数的更新不受梯度的伸缩变换影响
3. 超参数具有很好的解释性,且通常无需调整或仅需很少的微调
4. 更新的步长能够被限制在大致的范围内(初始学习率)
5. 能自然地实现步长退火过程(自动调整学习率)
6. 很适合应用于大规模的数据及参数的场景
7. 适用于不稳定目标函数
8. 适用于梯度稀疏或梯度存在很大噪声的问题

综合Adam在很多情况下算作默认工作性能比较优秀的优化器。



四、梯度下降算法的调优方法(目的:加快收敛速度)

4.1 学习速率(Learning Rate)调优
4.2选取最优的初始值
4.3特征数据归一化处理
页: [1]
查看完整版本: 神经网络优化器的选择