在上一篇文章中我们算出了各个层的误差,现在是时候利用这些误差来指导链接权重的修改了。那么该如何修改?
**暴力枚举:**对于一个三层的神经网络,每层有3个神经元结点,有两个3 × 3 3\times 33×3的链接权重矩阵,共有18个权重值。假设每个权重在1和-1之间共有1000种取值,那么我们有100 0 18 1000^{18}1000
18
种权重组合,这个数字已经很大了。但是,如果是每层有500个结点呢?那么权重数将达到2 × 500 × 500 = 500000 2\times 500\times 500 = 5000002×500×500=500000个,将会有100 0 500000 1000^{500000}1000
500000
种组合。想要遍历这么些种可能得等到人类灭绝…
可见,暴力枚举并不能实际地解决我们的问题。
**新的思路:**让我们再次明确下我们的最终目的,让误差值降到最小。试着将其转化成数学上的求函数最小值问题。先前我们知道,误差是所有链接权重的函数:
现在我们需要额就是找出该函数的最小值。但由于真正的误差函数的自变量太多,先举个简单的例子:
假设误差函数只有一个自变量(链接权重):
可以将其想象成一个连绵的山脉,有山峰也有山谷。设想将一个小球至于山腰,那么在重力的作用下它必定沿着所在位置的斜率方向向下滚动直到山谷。但是很明显,我们并没有重力帮忙,因此必须人为指定“滚动方向”。
不难发现,当斜率为正时应向左滚动(x–),斜率为负时应向右滚动(x++)。这种方法在数学上被称为梯度下降(gradient descent)。 可能的意外情况: 我们可能会碰到这种情况:当小球的起始位置为左侧山腰时,其很有可能最终会在局部最小值(左侧的山谷)停下,这可不是我们所希望的结果。因为我们的目的是把误差降到最小,那里显然不是最小的地方。
为了避免上述情况,我们应从选择不同的其实位置对神经网络进行多次训练,以确保其并不总是终止于错误的地方。而不同的其实位置意味着不同的链接权重。
可选项:
我们选用方差形式,因为其具有很多优点:
上述表达式表示了当权重w j , k w误差E 是如何改变的。这是误差函数的斜率,也就是我们希望使用梯度下降的方法达到最小值的方向。
计算梯度:
因此,我们得到了以下表达式:
又由于我们只关心误差函数斜率的方向,因此可以将公式中的常数2省略,并不影响正负号
之前提到过,权重的改变方向与梯度的方向相反。因此我们规定权重的改变方式为:
到此,所有的前期工作都已完成。