神经网络训练过程中用到的优化器简介(最主要是SGD)。
用整个训练集数据计算梯度,再一次性更新。以分类问题为例,就是每个epoch
每次迭代考虑全部样本,选出最优的梯度下降方向更新w,这样能保证朝着最优解迈进,但是只适合用于较小的训练集。如果数据集太大,由于每次迭代都要遍历整个数据集找最优,该方法的复杂度将会非常高。
不同于 BGD 的一次用所有数据计算梯度,SGD 每次更新时只对一个样本进行梯度更新。
SGD每次迭代只是考虑让一个样本梯度下降速度最快,而不管其他的样本,这样算法复杂度不高,所以
适合用于较大训练集的case。但是收敛的过程会有震荡,整体效果上,大多数时候它只能接近局部最优解,而无法真正达到局部最优解。
SGD每次考虑一个样本,MSGD(Mini-Batch Stochastic Gradient Descent)每次考虑一个batch大小的样本。
SGD函数一般会用到Momentum参数[^一般取值都默认为0.9],加入的这一项,它可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,也就是说,当前时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定,这样就可以加快收敛并减小震荡 。
SGD是十分常用的优化器,因为深度学习一般都使用大数据集,按batch进行训练。许多大神仍然使用着这个最基础的优化器。
SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法,比如Adam算法。
暂时没时间看他的公式。(一阶动量、二阶动量)
主流的观点认为:Adam等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的SGD(+Momentum)往往能够取得更好的最终结果。