一般神经网络的训练过程大致分为两个阶段:
第一个阶段先通过前向传播算法计算得到预测值,并将预测值和真实值作比较,得出两者之间的差距;
第二个阶段,通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。
应用了反向传播的前馈神经网络依然是前馈的。
- 基于梯度的优化
如果损失函数非常复杂,比如含有许多不是最优的全局极小点,或者存在多个局部极小点混淆我们的判断,亦或存在许多鞍点等,所有的这些可能性都将使优化变得困难 。因 此 ,我们通常寻找使 J(w) 非常小的点,将这一 点作为一个近似最小点 。
无论是一维输入的函数还是多维输入的函数,梯度下降算法总会存在以下两个问题。
- 梯度下降算法并不能保证被优化的非凸函数达到全局最优解。
- 梯度下降算法的计算时间太长。在实际训练时,参与训练的数据往往很多,并且损失函数J(w) 是在所有训练数据上的损 失和 ,这样计算出所有训练数据的损 失函数是非常 消耗时间的 。
加快每一轮参数更新的速度可以使用随机梯度下降算法( Stochastic Gradient Descent, SGD ) 。随 机梯度下降相比于梯度下降算法进步的地方在于 ,这个算法并不会对全部训 练数据上的损失函数进行优化,而是在每一轮迭代中随机选择某一个或多个训练数据上的损失函数进行梯度下降优化。
- 随机梯度下降
几乎所有的深度学习算法都对随机梯度下降算法有所应用 ,它可以看作是梯度下降算法的一个扩展。
随机梯度下降算法是在大规模数据上训练大型线性模型必须要用到的方法,但是它也存在一些问题,即在某些训练数据上损失函数更小并不代表在全部训练数据上损失函数更小 。
为了保持平衡梯度下降算法和随机梯度下降算法的性能,在实际应用中一般会每次计算一 小部分 训 练数据的总损失函数,这一 小部分数据就是一个 batch。 使用 每次在一个 batch上优化神经网 络参数 的方法并不会比每次优化单个数据慢太多,此外还可以大大减少收敛所需要的迭代次数,最终的结果更加接近梯度下降的效果。
- 自适应学习率算法
在使用基本的梯度下降法优化算法时,会遇到一个常见的问题一一要优化的参数对于目标函数的依赖各不相同 。形象地说,对于某些参数,通过算法已经优化到了极小值附近 , 但是有的 参数仍然有着很大的梯度,这就是使用统一的全局学习率可能出现的问题。如果学习率太小,则梯度很大的参数会有一个很慢的收敛速度;如果学习率太大,则己经优化得差不多的参数可能会出现不稳定的情况 。
为了更有效地训练模型,比较合理的 一 种做法是,对每个参与训练的参数设置不同的学习率,在整个学习的过程中通过一些算法自动适应这些参数的学习率。
1. AdaGrad
AdaGrad 算法(由伯克利加州大学Jhon Duchi 博士于 2011 年提出)能够独立地适应所有模型参数的学习率,当参数的损失偏导值比较大时,它应该有一个较大的学习率;而当参数的损失偏导值比较小时,它应该有一个较小的学习率。AdaGrad 算法在某些深度学习模型上能获得很不错的效果,但这并不能代表该算法能够适用于所有的模型。因为算法在训练开始时就对梯度平方进行累积,在一些实验中,会发现这样的做法容易导致学习率过早和过量地减小。
2. RMSProp
3. Adam