从优化器的发展历程一个看出,优化方向
梯度下降法的核心思想:
负梯度是使得函数值下降最快的方向,因此我们的目标就是求取目标函数的负梯度。
在梯度下降法中,每次都遍历完整的数据集,能保证结果全局最优(优点),但是也因为我们需要对每一个参数求导,且在对每个参数求导的过程中还需要遍历一次,当训练集很大时,计算费时(缺点)。
随机梯度下降法:
为了解决梯度下降法的耗时问题,即每次从训练集中随机抽取一个数据来计算梯度。速度快,但结果不一定是全局最优的。
波动的存在可能会使得优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样便可能对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。
缺点:由于是抽取,不可避免,梯度有误差,因此学习率需要逐渐减小,否则无法收敛,每次迭代受抽样影响,有较大的噪声。容易陷入局部最优解或者说难以稳定的收敛于一点。无法进行并行运算,浪费资源。
Momentum随机梯度下降法:
借用了物理中的动量概念,即前一次的梯度也会参与运算。为了表示动量,引入一阶动量m。m是之前梯度的累加,但是每次都有一定的衰减。
- 在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡;
- 在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。
总而言之,momentum能够加速SGD收敛,抑制震荡。并且动量有机会逃脱局部极小值(鞍点)
Nesterov动量型随机梯度下降法
在momentum更新梯度时加入对当前梯度的矫正,让梯度“多走一步”,可能跳出局部最优解。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
上面的优化方法固定学习率的。而后面的优化方法开始围绕自适应学习率进行改进。
Adagrad法
引入二阶动量,根据训练轮次的不同,对学习率进行了动态调整。
缺点:仍然需要人为的指定一个合适的全局学习率,同时网络训练到一定轮次以后,分母上梯度累加过大使得学习率为0而导致训练提前结束。
RMSProp法
为解决以上问题,该优化方法做了一点改进,RMSprop使用指数衰减只保留过去给定窗口大小的梯度。可以看出分母不是一味增加,它会重点考虑距离它较近的梯度(指数衰减的结果)。
优点:只用了部分梯度加和,而不是所有,这样避免了梯度累加过大使得学习率为0而导致训练提前结束。
Adam法
本质上是带有动量项的RMSprop方法,利用梯度的一阶矩估计和二阶矩估计动态的调整每个参数的学习率。
Adam法主要的优点在于经过偏置校正后,每一次迭代学习率都有一个确定范围,这样可以使得参数更新比较平稳。
Batch的大小如何选择,过大的batch和过小的batch分别有什么影响
优点:提高了内存利用率以及矩阵乘法的并行化效率;
减少了跑完一个epoch所需要的迭代次数,加快了对相同数据量的处理速度。
缺点:提高了内存利用率,但是内存容量可能不足。
跑完一次epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加,从而对参数的修正也就显得更加缓慢。
Batch_size增大到一定程度,其确定的下降方向已经基本不再变化。