在机器学习领域,数理统计、概率论和优化理论等知识是必不可少的,尤其是以优化理论最为重要。机器学习经常会把问题抽象为一个优化问题,比如最大化回报奖赏、最小化分类错误带来的损失或者最大化似然等等,而如何求解这些问题就必须有相应的优化算法。
本文将主要介绍几个常见的优化算法:
- 随机梯度下降(Stochastic Gradient Descent, SGD)
- 改进的迭代尺度算法(Improved Iterated Scaling, IIS)
- 牛顿法(Newton) & 拟牛顿法(Quasi-Newton)
- DFP
- BFGS & L-BFGS
文章主要参考了李航老师的《统计学习方法》里面相关的介绍。
A. SGD
本文首先介绍SGD,这是最简单的优化方法,也是最为常用的方法。在深度学习里面,一般都会使用SGD或其变种进行优化,也是反向传播算法的核心。
那么对于SGD,假设优化目标为:
使用以上权重更新之后的目标值更新的结果为:
可以看出目标值是下降的。其中
一般来说,梯度下降法最为简单实用,但收敛速率有点慢。随机梯度下降则是基于批处理(Mini-Batch)的梯度下降,即函数的梯度信息是通过一个Mini-Batch的数据计算得到的,而不是所有的数据的梯度。
在深度学习领域,SGD是最为常用的优化方法,因为深度网络所拟合的函数是非线性、非凸的,很难求解最优解,与其耗费很多功夫设计一个优化算法,倒不如使用最为简单、通用的SGD。SGD会有很多变种,包括Momentum、AdaGrad、RMSProp、Adam等等。
经常会有这么一个问题:为什么深度学习里面的学习率都是固定的或者固定步长衰减?而不用这种线性搜索寻找最优的学习率呢?这是因为在深度网络里面,主要要求的是速度,正如深度网络不使用二阶优化(二阶优化需要大量的存储和计算时间)的目的一样,使用线性搜索带来的代价比较大。此外,由于深度网络里面都是使用的Mini-Batch的形式,计算的梯度只是真实梯度的一个近似,使用精确的线性搜索的结果不一定是最优的,所以倒不如直接固定学习率了。
如果将待优化的参数记为
- SGD采用MiniBatch数据计算出来的梯度作梯度下降。
- Momentum计算梯度时综合考虑了当前步梯度和上一步梯度的信息,一方面,由于动量
的影响,梯度方向不会大幅度震荡,尽量和上一次更新的方向保持一致;另一方面,当陷入平缓区域时,近乎为0,但此时由于有动量在