1、BGD,批量梯度下降算法
适用于小样本集高精度任务。
是梯度下降法最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行更新。负梯度方向是使函数值下降最快的方向。
(1)推导(以线性函数的损失函数为例,下同):
对损失函数求偏导:
由于是风险最小化函数,所以按照每个参数θ的梯度负方向来更新每个θ
(2)优点
当目标函数为凸函数时,得到的是全局最优解,利用矩阵进行操作,易于并行实现。
(3)缺点
对整个数据集计算梯度,计算量大且慢
对于大数据集样本,可能会有相似样本,出现冗余
更稳定的误差梯度可能导致模型过早收敛于一个不是最优解的参数集
2、SGD,随机梯度下降
适合用于低精度的任务!样本较多时!
为了解决BGD的缺点而提出,最基本的随机梯度下降是通过每个样本来迭代更新一次。
在每个epoch(迭代的次数)中,通过shuffle操作充分混洗数据,然后依次计算每一个样本对每个权重参数的偏导并直接更新。
(1)优点:在每轮迭代中,随机优化某一条训练数据上的损失函数,训练速度更快,避免了梯度更新过程中的计算冗余问题,对于很大的数据集也能很快收敛。波动的存在可能会使得优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样便可能对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。
(2)缺点:由于是抽取,不可避免,梯度有误差,因此学习率需要逐渐减小,否则无法收敛,每次迭代受抽样影响,有较大的噪声。容易陷入局部最优解或者说难以稳定的收敛于一点。无法进行并行运算,浪费资源。
(3)为什么SGD的速度快于BGD
这里我们假设有30W个样本,对于BGD而言,每次迭代需要计算30W个样本才能对参数进行一次更新,需要求得最小值可能需要多次迭代(假设这里是10);而对于SGD,每次更新参数只需要一个样本,因此若使用这30W个样本进行参数更新,则参数会被更新(迭代)30W次,而这期间,SGD就能保证能够收敛到一个合适的最小值上了。也就是说,在收敛时,BGD计算了10×30W 次,而SGD只计算了 1×30W 次。
(4)momentum的好处
为了模拟物体运动时的惯性。更新的时候在一定程度上保留之前更新的方向,同时利用当前的梯度微调最终的更新方向。
3、MBGD,小批量随机梯度下降
每次迭代时考虑使用 ** batch_size** 个样本来对参数进行更新。是对上述两种方法的折中。
(1) 优点:
通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(比如上例中的30W,设置batch_size=100时,需要迭代3000次,远小于SGD的30W次)
可实现并行化。
(2)缺点:
batch_size的不当选择可能会带来一些问题。
(3) batch_size选择的影响
在合理的范围内,增大batch_size的好处:
a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大batch_size的坏处:
a. 内存利用率提高了,但是内存容量可能撑不住了。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。更多的epoch
c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
插曲:移动指数加权平均
根据同一个移动段内不同时间的数据对预测值的影响程度,分别给予不同的权数,然后再进行平均移动以预测未来值。下方法均用到了此策略。
4、Adagrad,适应性梯度算法
根据⾃变量在每个维度的梯度值的⼤小来调整各个维度上的学习率,从⽽避免统一的学习率难以适应所有(参数)维度的问题。 每个自变量的学习率是不同的。对于出现次数较少的特征,采用更大的学习率,对于出现次数较多的特征,采用较小的学习率。适合处理稀疏数据。
(1)推导:
其中是学习率,
是为了维持数值稳定性⽽添加的常数。
(2)缺点:由于一直在累加按元素平方的梯度,⾃变量中每个元素的学习率在迭代过程中⼀直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到⼀个有用的解。
5、RMSProp,均方根反向传播
与Adagrad的不同在于st的计算
p是衰减速率。
6、Momentum,动量梯度下降
主要是基于梯度的移动指数加权平均。
在上面的公式中vdw和vdb分别是损失函数在前t−1轮迭代过程中累积的梯度动量,β是梯度累积的一个指数。dW和db分别是损失函数反向传播时候所求得的梯度。
可以解决mini-batch SGD优化算法更新幅度摆动大的问题,同时可以使得网络的收敛速度更快
6、Adam
是SGD的改良。是将Momentum算法和RMSProp算法结合起来使用的一种算法。
以上内容均来源于各个版主、牛客网总结