简介
在传统的机器学习算法的实践中,优化总是重头戏,也是最考验功底的部分。深度学习得益于传统的有效方式,往往普通的随机下降优化算法就能取得不错的训练效果,优化的重要性相比于传统机器学习要弱一些,大部分从业者主要聚焦于应用或模型创新,而优化部分更多的工作只是调参。
实际上,深度学习优化方面的研究非常多,很多方法也非常有效,尤其在数据量比较大的时候,所以有必要掌握一些常见的优化算法。
1、SGD(Stochastic Gradient Descent, SGD)
随机梯度下降(Stochastic Gradient Descent, SGD)每次训练样本随机抽取一个样本计算loss和梯度并对参数进行更新,由于每次不需要遍历所有的数据,所以每次迭代速度快;但是这种优化算法比较弱,往往容易走偏,反而会增加很多次的迭代。随机梯度下降法有时可以用于在线学习(Online Learning)系统,可使系统快速学习到新的变化。
与随机梯度下降算法对应的还有批量梯度下降(Batch Gradient Descent,BGD),每次使用整个训练集合计算梯度,这样计算的梯度比较稳定,相比随机梯度下降法不那么容易振荡,但是因为每次都需要更新整个数据集,所以批量梯度下降法非常慢,而且无法放在内存中计算,更无法应用于在线学习系统。
介于随机梯度下降法和批量随机梯度下降法之间的是小批量随机梯度下降法(Mini-Batch Gradient Descent),即每次随机抽取m个样本,以它们的梯度均值作为梯度的近似估计值。
为了使得随机梯度下降获取更好的性能,学习率需要取值合理,并根据训练过程动态调整。如果学习率过大,模型就会收敛过快,最终离最优值较远;如果学习率较小,迭代次数就会很多,导致模型长时间不能收敛。
2、Momentum
动量(Momentum)是来自物理学中的定义,是力的时间积累效应的度量。动量的方法在随机梯度下降的基础上,加上了上一步的梯度:
其中γ是动量参数且γ∈[0,1]。动量的优化方法也可以写成如下的形式:
由于上面两种的表达方式是一致的,所以选择第一种的表达方式。
相比于随机梯度下降,动量会使相同方向的梯度不断累加,而不同方向的梯度则相互抵消,因而可以一定程度上客服“Z”字形的振荡,更快到达最优点。
3、NAG(Nesterov Accelerated Gradient,NAG)
Nesterov 加速梯度于动量类似,也是考虑最近的梯度的情况,但是NAG相对超前一点,它先使用动量mt计算参数θ下一个位置的近似值θ+ηmt,然后在近似位置上计算梯度:
NAG与动量法的区别就是,NAG算法会计算本轮迭代时动量到达的位置的梯度,可以说成“未来”的梯度。如果未来的梯度存在一定的规律,那么这些梯度就会有更好的利用价值。
在实际的应用中,为了前向、后向计算统一,引入以下爱的变量:
将上面的两个公式代入,可以得到:
将上面的第一个公式代入第二个公式,就可以得到:
整理可以得到:
这样梯度计算就可以解决计算不一致的问题。
4、Adagrad
Adagrad是一种自适应的梯度下降法,它能够针对参数更新的频率调整它们的更新幅度——对于更新频繁且更新量大的参数,适当减小他们的步长;对于更新不频繁的参数,适当增大它们的步长。这种方法的思想很适合一些数据分布不均匀的任务。
具体的方法就是在之前的梯度下降法的基础上增加一个梯度的累积项作为分母,之前的梯度下降法的更新公式为:
而Adagrad变成:
其中⊙表示向量之间元素级的乘法,Gt就是Adagrad增加的内容。它是所有轮迭代的梯度平方和:
从公式可以看出,加入这一下项以后,参数的更新确实得到了一定的控制。对于经常更新的参数,Gt项的数值会比较大,因而它的参数更新量会得到控制;对于不经常更新的参数,由于Gt项的数值比较小,它的参数更新量会变大。
从算法里面可以看出,Adagrad依然存在一些缺陷,如果模型的参数数值保持稳定,那么参数的梯度值总体不会有太大的波动,而分母上的梯度积累项一直在积累,因此分母会不断变大,因此从梯度的趋势上分析,梯度总值会不断减小。虽然在实际训练中一般也会将学习率调小,但两者变小的程度不同,因此Adagrad可能会出现更新量太小而不易优化的情况。
5、RMSProp
RMSProp利用滑动平均的方法来解决Adagrad算法中的问题。它的思路是让梯度积累值G不要一直变大,而是按照一定的比例衰减,这样其含义就不再是梯度的积累项了,而是梯度的平均值:
因为此时的G更像是梯度的平均值甚至期望值,因此在很多文献中会将G写成E[g2]。