在机器学习中,为了优化目标函数,就需要设计合适的优化算法,来即准确又有效率的实现最优化。常用的有一阶优化算法梯度下降法,二阶的优化算法有牛顿法等。
而对于神经网络,特别深度神经网络,由于其结构复杂,参数众多等等。比起传统的机器学习方法,优化起来十分困难,因此人们就提出了各种神经网络的优化算法。
神经网络中优化中最重要的思想就是梯度信息的反向传播。具体的步骤就是:先通过正向传播,由输入得到预测结果,然后把预测结果和真实结果之间的残差(可以是均方差、交叉熵等),根据链式求导法则,将梯度反向传导到各个参数中,来对参数进行更新。
最常用的就是随机梯度下降(SGD)的方法,如下面的公式所示:
参数更新的方式就是当前值减去学习率乘以当前参数的梯度。
随机梯度下降这种方式更新方式简单直接,在小数据集以及简单的网络结构中常常使用。但是对于复杂网络如CNN、RNN等,SGD的方法会导致优化时波动很大,收敛的速度很慢,而且容易陷入局部最优。这时就需要对其进行进一步的改进和优化。
主要从两方面来优化:自适应的学习率以及更准确的梯度方向。
1.更准确的梯度
就好比一个小球在向下滚动的过程中(即参数优化的过程),如果遇到平坦的地方,不会马上停下来,而是还会向前继续滚动。Momentum的方法不仅有助于加快学习速度,也可以有效避免落入局部最优点如鞍点。
但是基于动量的更新方式,容易错过最优点,因为其动能会导致其在最优点附近反复的震荡,甚至直接越过最优点。因此人们又提出了改进的方法就是NesterovMomentum。
其改进的地方就是,在Momentum的基础上,让小球先试探性地,靠着已有的动能向前一动一步,然后计算出移动后的梯度,用这个梯度来更新当前的参数。从而使得小球拥有了提前感知周围环境的信息。这样靠近最优点的时候,就能让小球放慢速度。
2.自适应学习率
因为不同的参数,其重要性和每次更新幅度不同。对于不常变化的参数,需要其学习率大一些,能够从个别样本中学习到更多的信息;而对于频繁更新变化的参数,已经积累了大量关于样本的信息,不希望它对单个样本过于敏感,因此希望更新幅度小一些。
最经典的就是Adagrad,利用了历史梯度的平方和,来调整参数的学习率,使得频繁更新的参数学习率更低;而少更新的参数学习率高。
但是Adagrad又一个缺陷就是随着Vt逐步累积增大,会导致学习率越来越小,最终停止更新。因此又提出了改进的RMSprop。同Momentum方法类似,为了防止出现学习率过小,只计算出各个时刻梯度的滑动平均值,窗口大小为1/(1-beta2)
在总结上述算法的基础上,就出现了Adam算法,即结合了RMSprop和Momentum的优化方法: