智能优化算法,神经网络的优化算法有哪些?


时间:

在机器学习中,为了优化目标函数,就需要设计合适的优化算法,来即准确又有效率的实现最优化。常用的有一阶优化算法梯度下降法,二阶的优化算法有牛顿法等。

而对于神经网络,特别深度神经网络,由于其结构复杂,参数众多等等。比起传统的机器学习方法,优化起来十分困难,因此人们就提出了各种神经网络的优化算法。

神经网络中优化中最重要的思想就是梯度信息的反向传播。具体的步骤就是:先通过正向传播,由输入得到预测结果,然后把预测结果和真实结果之间的残差(可以是均方差、交叉熵等),根据链式求导法则,将梯度反向传导到各个参数中,来对参数进行更新。

最常用的就是随机梯度下降(SGD)的方法,如下面的公式所示:


参数更新的方式就是当前值减去学习率乘以当前参数的梯度。

随机梯度下降这种方式更新方式简单直接,在小数据集以及简单的网络结构中常常使用。但是对于复杂网络如CNN、RNN等,SGD的方法会导致优化时波动很大,收敛的速度很慢,而且容易陷入局部最优。这时就需要对其进行进一步的改进和优化。

主要从两方面来优化:自适应的学习率以及更准确的梯度方向。

1. 更准确的梯度

首先是基于动量的方法(Momentum):其思想很简单,就是对SGD优化时,高频微小的波动进行平滑,从而加速优化过程。方法就来源于物理中的动量,将参数的优化过程中,累计了一定的动能,因此不容易改变更新的方向,最终的更新方向和大小是由过去的梯度和当前梯度共同决定的。



就好比一个小球在向下滚动的过程中(即参数优化的过程),如果遇到平坦的地方,不会马上停下来,而是还会向前继续滚动。Momentum的方法不仅有助于加快学习速度,也可以有效避免落入局部最优点如鞍点。

但是基于动量的更新方式,容易错过最优点,因为其动能会导致其在最优点附近反复的震荡,甚至直接越过最优点。因此人们又提出了改进的方法就是Nesterov Momentum。

其改进的地方就是,在Momentum的基础上,让小球先试探性地,靠着已有的动能向前一动一步,然后计算出移动后的梯度,用这个梯度来更新当前的参数。从而使得小球拥有了提前感知周围环境的信息。这样靠近最优点的时候,就能让小球放慢速度。



2. 自适应学习率

因为不同的参数,其重要性和每次更新幅度不同。对于不常变化的参数,需要其学习率大一些,能够从个别样本中学习到更多的信息;而对于频繁更新变化的参数,已经积累了大量关于样本的信息,不希望它对单个样本过于敏感,因此希望更新幅度小一些。

最经典的就是Adagrad,利用了历史梯度的平方和,来调整参数的学习率,使得频繁更新的参数学习率更低;而少更新的参数学习率高。


但是Adagrad又一个缺陷就是随着Vt逐步累积增大,会导致学习率越来越小,最终停止更新。因此又提出了改进的RMSprop。同Momentum方法类似,为了防止出现学习率过小,只计算出各个时刻梯度的滑动平均值,窗口大小为1/(1-beta2)


在总结上述算法的基础上,就出现了Adam算法,即结合了RMSprop和Momentum的优化方法:


可以参照各大深度学习框架里的优化器。比如我常用的tensorflow

貌似基本上都是基于梯度下降吧,梯度下降,随机剃度下降,动量剃度下降,牛顿法,拟牛顿法。。。好多呢,基本上都是为了解决避免收敛与局部极小值点,或者是自适应学习速率,才衍生出这么多算法的吧。。。我不专业。。。。