加速梯度下降的技巧

在用梯度下降的方法训练神经网络时,如果误差曲面本身并不是凸的,那么这个曲面可能包含许多独立于全局最小值的局部最小值,很有可能在局部最小值时训练就停止了,造成结果不佳。另外,即便我们的网络达到了全局最小值也有可能出现过拟合,不能保证模型有很好的泛化性能。下面介绍几种梯度下降的方法。

1.随机和小批量随机梯度下降

标准的梯度下降每次迭代更新所有的训练数据的子集,SGD是每一次迭代中使用每个样本更新一次权重,二mini-batch SGD将使用预定义的一部分样本更新一次权重,通常这部分样本远小于训练样本的总数。因为每次迭代中只使用一部分数据集,所以在训练过程中的计算量将会大大减少,我们的训练速度将会加快。同时,这样随机选取一部分数据集的方法使得优化过程中能够避免局部最小值,并且使用小部分数据集能够有效的防止过拟合,所以能够带来更好的表现。
这里写图片描述

2.正则

正则是通过向损失函数中增加一个表示模型复杂度的值来惩罚模型的复杂性来减少过拟合。在神经网络中,它惩罚较大的权重,因为这可能表明该网络对该权重对应的训练数据过拟合。
使用L2正则化我们可以重写损失函数,将原始神经网络的损失函数表示为L(y, t),正则化常数表示为 λ
  L n e w ( y , t ) = L ( y , t ) + .5 j i W i j 2
正则化将网络中每个权重的平方和添加到损失函数中,惩罚那些给每个连接赋予过多的权重模型,来减少过拟合。
这里写图片描述

3.动量

动量是将过去权重更新量的一小部分增加到当前的权重更新,这有助于防止模型陷入局部最小值。即使当前的梯度为0,上一个梯度可能不是0,所以很容易卡住。通过使用动量,沿着误差表面的运动总体上也更加平滑,并且网络可以在整个运动中更快的移动。

用简单的动量我们可以将权重更新的方式改写成如下式子:
ω t + 1 := ω t + ( Δ ω ) t + 1 + α ( Ω ω ) t

4.学习率变化

学习效率可能会随着训练过程而退化并且下降,而不是在整个训练过程中使用恒定的学习速率。最常见的学习率变化具有如下的关系,其中T和   m u 0 是超参数,   m u 是当前的学习速率,学习速率的公式如下:
μ = μ 0 1 + t T
这通常被称为先搜索后收敛的模式,直到t达到T,网络处于搜索阶段学习速率没有太大下降。此后,学习速率减慢并且网络达到收敛阶段。一开始我们优先搜索空间并拓展我们对空间的总体认识,随着时间的推移,我们转而利用我们已经找到的搜索领域中的优势并将其缩小到特定的最小值。

以上是改进标准梯度下降算法的部分方法,当然,这些方法中的每一种都会为模型添加超参数,从而增加训练所花费的时间。最近,adam, adagrad和adadelta等算法通过使用部分上述的技术以及其他新技术,在实践过程中往往能够更快更好的工作,但是实施起来要困难的多。下图展示了几种梯度下降方法的收敛情况:
这里写图片描述

reference
https://towardsdatascience.com/improving-vanilla-gradient-descent-f9d91031ab1d

猜你喜欢

转载自blog.csdn.net/Katherine_hsr/article/details/80048954