Advertisement

梯度下降原理及理解

阅读量:

梯度下降是神经网络中最常用的求极值点(鞍点)的方法,本文以BP神经网络为例,介绍梯度下降的数学原理及推广。

代价函数

为了量化我们神经网络的拟合效果,我们定义一个代价函数:

我们训练算法的目的,就是最小化权值和偏置的代价函数C(w,b)

针对代价函数,我们试着回答以下两个问题:

  1. 为什么不直接采用分类(识别)正确的数量作为评价指标呢?

这是因为在神经网络中,被正确分类的图像数量所关于权值和偏置的函数并不是一个平滑的函数。

大多数情况下,对权值和偏置的微小变动完全不会影响被正确分类的图像数量,这让我们很难去解决如何改变权重和偏置来取得进改进的性能。

  1. 为什么要用二次函数呢?

代价函数并不是唯一的,不同的代价函数的评价指标也是不同的。但二次函数是使用得最广泛的,并且具有特殊的语义–均方误差(MSE)。我们接下来还会看到更多的代价函数,在计算时就会知道二次函数的优越性了。

为什么要梯度下降?

我们现在的目标是想要找到C的全局最小值。当然,对于简单的二次型函数,我们很快就能找到最小值。但回想一下我们是怎么做的呢?

一种方法就是直接用偏导去找极值点。但如果变量很多,比如神经网络至少有上千个变量和偏置,计算非常复杂。

另外一种方法是使用梯度下降。考虑我们目前有两个变量v_1,v_2,当我们在v_1和v_2方向分别移动一个很小的量(沿着梯度方向),这时候会发生如下变化:

我们需要使用一种方法选择\Delta v_1和\Delta v_2使得\Delta C为负,这样我们就可以使得不断减小,逼近最小值。我们用\nabla C来表示梯度向量,即:

因此可以被重写为:

这个式子有着很重要的意义:我们发现将v的变化关联为的变化,正如我们期望的用梯度表示。并且,我们知道了如何选取\Delta v才能让为负数。假设我们选取:

这里的\eta是一个很小的正数,我们称为学习速率 。方程告诉我们,\Delta C\approx \nabla C \cdot \Delta v = -\eta ||\nabla C||^2。由于 ||\nabla C||^2 \ge0,这保证了\Delta C \le 0。即,如果我们按照方程的规则去改变,那么会一直减小,不会增加。因此我们可以计算,来移动点的位置:

然后我们用它再次更新来计算下一次移动,因此我们迭代进行,就可以获得一个全局的最小值。

思考:

由上面的公式,是不是我们增大学习速率,就能使变得更小,使得梯度下降速率更快呢?

​ 可惜不是的。当过大时,上面的等式\Delta C\approx \nabla C \cdot \Delta v就不再成立,因此要选择合适的学习速率尤其重要。

Batch gradient descent(BGD)

在神经网络中如何引用梯度下降算法去学习呢?我们很容易得到以下方程:

注意,我们的代价函数为C = \frac {1}{n} \sum _x C_x ,它是遍历每个样本代价C_x = \frac {||y(x - a)||^2}{2}的平均值。因此,我们需要为每个训练样本输入单独计算梯度值\nabla C_x,然后求平均值。但当训练输入的数量过大时会花费很长时间,这样会使得学习变得相当缓慢。

但是,在输入样本不太大时,这种方法(BGD)是经常被采用的。

Stochastic gradient descent(SGD)

随机梯度下降 的算法能加速学习。其思想就是通过选取小量训练输入样本来计算,进而估算。通过计算少量样本的平均值我们可以快速得到一个对于实际梯度很好的估算,这有助于加速梯度下降,进而加速学习过程。

例如我们可以随机选取小量的m个训练输入来工作。我们将这些训练输入记做X_1,X_2,...X_m,并称为mini-batch。假设样本数量足够大,我们期望\nabla C_{X_j}的平均值大致相当于整个的平均值,即:

实验证明这种方法(Mini-batch BGD)能较快的收敛到一个较小的值。

欢迎关注我的个人博客

全部评论 (0)

还没有任何评论哟~