1. 误差反馈

1.1 误差反馈校正权重矩阵

可以理解,输出和误差都是多个节点共同作用的结果,那么该如何更新链接权重?

神经网络更新权重流程 神经网络 权重更新_神经网络更新权重流程


思考一下,得到误差后,该怎么分配?平均分的话是否会有失公平?毕竟我们在之前的学习中了解到,前一层每个节点的贡献都是不一样的。考虑极端情况,当某权重为0时,它对下一个节点的贡献为0;这时如果误差仍然平均分配显然是不那么合适的。

但我们很容易想到这个标准:较大链接权重的连接分配更多的误差。

神经网络更新权重流程 神经网络 权重更新_斜率_02


将同样的思想扩展到多个节点。如果我们拥有100个节点链接到输出节点,那么我们要在这100条链接之间,按照每条链接对误差所做贡献的比例(由链接权重的大小表示),分割误差。

我们使用权重,将误差从输出向后传播到网络中。我们称这种方法为反向传播。

1.2 多个输出节点反向传播误差

神经网络更新权重流程 神经网络 权重更新_斜率_03


第一个输出节点的误差标记为e1 = ( t1 - o1)。

按照所连接链接的比例,也就是权重w 1,1 和w2,1 ,对误差e 1 进行分割。同理,按照权重w 1,2 和w 2,2 的比例分割e2 。

神经网络更新权重流程 神经网络 权重更新_权重_04


神经网络更新权重流程 神经网络 权重更新_python_05

1.3 反向传播误差到更多层中

神经网络更新权重流程 神经网络 权重更新_斜率_06


将输出误差标记为eoutput ,将在输出层和隐藏层之间的链接权重标记为who 。通过将误差值按权重的比例进行分割,我们计算出与每条链接相关的特定误差值。采用与隐藏层节点相关联的这些误差ehidden ,再次将这些误差按照输入层和隐藏层之间的链接权重wih 进行分割。

神经网络更新权重流程 神经网络 权重更新_python_07


如果神经网络具有多个层,那么我们就从最终输出层往回工作,对每一层重复应用相同的思路。

神经网络更新权重流程 神经网络 权重更新_权重_08


神经网络更新权重流程 神经网络 权重更新_权重_09


具有实际数字的3层网络中,误差如何向后传播:

神经网络更新权重流程 神经网络 权重更新_斜率_10


进一步向后工作:

神经网络更新权重流程 神经网络 权重更新_斜率_11

1.神经网络通过调整链接权重进行学习。这种方法由误差引导,误差就是训练数据所给出正确答案和实际输出之间的差值。
2.简单地说,在输出节点处的误差等于所需值与实际值之间的差值。
3.与内部节点相关联的误差并不显而易见。一种方法是按照链路权重的比例来分割输出层的误差,然后在每个内部节点处重组这些误差。

1.4 使用矩阵乘法进行反向传播误差

计算的起始点是在神经网络最终输出层中出现的误差。

神经网络更新权重流程 神经网络 权重更新_权重_12


为隐藏层的误差构建矩阵。

神经网络更新权重流程 神经网络 权重更新_python_13


可以观察到,最重要的事情是输出误差与链接权重wij 的乘法。这些分数的分母是一种归一化因子。如果我们忽略了这个因子,那么我们仅仅失去后馈误差的大小。也就是说,可以使用简单得多的

e1* w1,1 来代替e1* w1,1/ ( w1,1 + w2,1)。

神经网络更新权重流程 神经网络 权重更新_神经网络_14


神经网络更新权重流程 神经网络 权重更新_权重_15


因此,我们得到所希望的矩阵,使用矩阵的方法来向后传播误差:

神经网络更新权重流程 神经网络 权重更新_权重_16

反向传播误差可以表示为矩阵乘法。
无论网络规模大小,这使我们能够简洁地表达反向传播误差。
前向馈送信号和反向传播误差都可以使用矩阵计算而变得高效。

2.更新权重

2.1 梯度下降法

目前我们已经完成了让误差反向传播到网络的每一层,我们的目的是要使用误差来指导如何调整链接权重,从而使得神经网络更适合这个样本集,输出更准确的答案。

如果我们将复杂困难的函数当作网络误差,那么找到最小值就意味着最小化误差。这样我们就可以改进网络输出。如此我们就可以理解要用梯度下降法来更新权重的意义所在了。

可以从梯度的物理意义上直观理解,就像是在三维地形中,在曲面的任意一点放置一个静止的小球,在重力作用下小球会向下滚动,那么初始时刻,小球滚动的方向一定是该点周围下降最明显的地方,即负梯度方向。但最终小球会在摩擦力和重力作用下停下,可以想象,这必是一个“凹谷”,也就是这个三维曲面的(局部)极小值。

神经网络更新权重流程 神经网络 权重更新_神经网络更新权重流程_17

但如果这个地形非常复杂,我们掉入的仅仅是这个点周围某个“凹谷”,而非整个地形中最低(即我们所要求的最小值)呢?该如何解决这个问题?

神经网络更新权重流程 神经网络 权重更新_神经网络_18


首先,采用梯度下降法,我们必须选择一个起点。

神经网络更新权重流程 神经网络 权重更新_权重_19


神经网络更新权重流程 神经网络 权重更新_权重_20


这一次,我们所在之处的斜率为正,因此我们向左移动。

为了避免超调,避免在最小值的地方来回反弹,就要改变步子大小,这是一个必要的优化。

神经网络更新权重流程 神经网络 权重更新_斜率_21


回想刚刚的问题,如果恰好掉入了错误的山谷怎么办?记得我们刚刚讲的随机选择起点吗?我们可以随机取,并且多次取,尽可能地,把错误的结果过滤掉。多次训练神经网络,确保并不总是终止于错误的山谷。

不同的起始点意味着选择不同的起始参数,在神经网络的情况下,这意味着选择不同的起始链接权重。

神经网络更新权重流程 神经网络 权重更新_神经网络_22


像这样的尝试,终究会带领我们走进正确的山谷。

2.2 误差函数

那么,梯度下降法所作用的误差函数应该如何构造呢?像我们之前那样,目标值 - 真实值 = 误差?但这种情况下的误差会有正负,一旦我们求和,就有可能得到非常趋近于0的结果,这会让我们误以为误差很小。

误差函数如何构造?看下表:

神经网络更新权重流程 神经网络 权重更新_神经网络更新权重流程_23

第三种选择是差的平方,即(目标值-实际值)^ 2 。我们更喜欢使用第三种误差函数,而不喜欢使用第二种误差函数,原因有以下几点:

  • 使用误差的平方,我们可以很容易使用代数计算出梯度下降的斜率。
  • 误差函数平滑连续,这使得梯度下降法很好地发挥作用——没有间断,也没有突然的跳跃。
  • 越接近最小值,梯度越小,这意味着,如果我们使用这个函数调节步长,超调的风险就会变得较小。

下图显示了两个链接权重,这次,误差函数是三维曲面,这个曲面随着两个链接权重的变化而变化。

神经网络更新权重流程 神经网络 权重更新_神经网络_24


神经网络更新权重流程 神经网络 权重更新_python_25


这个表达式表示了当权重wj,k 改变时,误差E是如何改变的。这是误差函数的斜率,也就是我们希望使用梯度下降的方法到达最小值的方向。下为推导过程:

神经网络更新权重流程 神经网络 权重更新_python_26


神经网络更新权重流程 神经网络 权重更新_神经网络_27

神经网络更新权重流程 神经网络 权重更新_权重_28


第一部分就是(目标值-实际值)。在sigmoid中的求和表达式也很简单,就是进入最后一层节点的信号,我们可以称之为ik ,这样它看起来比较简单。这是应用激活函数之前,进入节点的信号。最后一部分是前一隐藏层节点j的输出。

同理,得到输入层和隐藏层之间权重调整:

神经网络更新权重流程 神经网络 权重更新_神经网络更新权重流程_29


权重改变的方向与梯度方向相反,我们用数学的形式来表达这个因子。

神经网络更新权重流程 神经网络 权重更新_神经网络更新权重流程_30

(和之前在线性分类器里学到的是不是原理相同?

神经网络更新权重流程 神经网络 权重更新_斜率_31


new A = old A + ΔA)更新后的权重wj,k 是由刚刚得到误差斜率取反来调整旧的权重而得到的。正如我们先前所看到的,如果斜率为正,我们希望减小权重,如果斜率为负,我们希望增加权重,因此,我们要对斜率取反。符号α是一个因子,这个因子可以调节这些变化的强度,确保不会超调。我们通常称这个因子为学习率。同理,这个表达式不仅适用于隐藏层和输出层之间的权重,而且适用于输入层和隐藏层之间的权重。

由于学习率只是一个常数,并没有真正改变如何组织矩阵乘法,因此我们省略了学习率α。

神经网络更新权重流程 神经网络 权重更新_斜率_32

1.神经网络的误差是内部链接权重的函数。
2.改进神经网络,意味着通过改变权重减少这种误差。
3.直接选择合适的权重太难了。另一种方法是,通过误差函数的梯度下降,采取小步长,迭代地改进权重。所迈出的每一步的方向都是在当前位置向下斜率最大的方向,这就是所谓的梯度下降。
4.使用微积分可以很容易地计算出误差斜率。

2.3 误差更新成功范例

神经网络更新权重流程 神经网络 权重更新_神经网络_33


更新隐藏层和输出层之间的权重w1,1 。当前,这个值为2.0。

神经网络更新权重流程 神经网络 权重更新_斜率_34

  1. 第一项(tk-ok )得到误差e 1 = 0.8。
  2. S函数内的求和Σj wj,k oj 为(2.0×0.4)+(3.0 * 0.5)= 2.3。
  3. sigmoid 1/(1 + e-2.3) 为0.909。中间的表达式为0.909 *(1-0.909)=0.083。
  4. 由于我们感兴趣的是权重w1,1 ,其中j=1,因此最后一项oj 也很简单,也就是oj = 1 。此处,oj 值就是0.4。
  5. 将这三项相乘,最后我们得到-0.0265。

如果学习率为0.1,那么得出的改变量为- (0.1 * -0.02650)= +0.002650。因此,新的w1,1 就是原来的2.0加上0.00265等于2.00265。