上一篇文章中的神经网络还没有学习能力,这好比如说该网络只接收外部输入并输出结果,却没有反馈机制没有对结果进行正确性分析,让我们以小明与老师之间的对话来比喻这种情况:
可以发现,当小明给出答案后老师并没有给于他反馈。因此小明可能某一次猜中了正确答案,但只是凑巧而已,他不具备学习能力。 现在让老师给点反馈:
这样子,小明学会了1+5=6.
我们的神经网络也需要具备这样的学习能力。 也就是说,当网络输出错误的结果时要有一个改变下一次输出的机制。想要改变输出,可以改变哪些量呢? 观察输出函数:
显然,我们不可能去左右网络的输入值,因为那是网络要求解的问题,不可能以改变问题的方式改变答案。那么改变激活函数sig如何?这太麻烦了,试想那么多的神经元每一个都不同的激活函数会对运算造成大麻烦,将无法采用简洁的矩阵运算。 因此,改变链接权重会是一个好办法。
我们已经知道可以通过改变链接权重来改变网络的输出值,使其符合预期。那么问题又来了:
改变权重的目的是让输出值与期望值越接近越好(误差值越小越好),因此误差就是依据。所谓误差就是期望值与网络输出值的差:
我们知道输出层的误差为:
但是其他层结点的误差是不知道的,因为其他层并没有一个输出期望值
不难发现,最终输出层造成的误差是所有层共同作用的结果,所以可以将总误差分摊给其他层。
如上图误差为
因为链接权重越大说明对该误差的影响越大,因此以链接权重来决定每条链路所分摊误差的大小:
反向传播误差到更多层中:
隐藏层结点的误差值:
上述矩阵乘法太过复杂,无法通过简单的矩阵运算求解。观察上式可知,最重要的事情是输出误差链接权重
的乘法。较大的权重携带较大的误差给隐藏层,这些分数的分母是一种归一化因子。如果我们忽略掉这个因子,我们仅仅只是失去了后馈误差的真实值大小,但并没有失去其表示的真正含义(影响力),也就是说反馈误差始终是以链接权重的强度来分配的。因此上式可以简化为:
不难发现,隐藏层至输出层的链接权重矩阵
因此:
到此我们得到了用矩阵来传播误差的算法:
到此,我们已经做了大量的工作了。我们计算出了所有层的误差,接下来的工作就是根据误差来调整链接权重了。