原文:A Step by Step Backpropagation Example
声明
最近在复习神经网络方面的知识。
在听这节Andrew NG的机器学习公开课的时候,对于BP神经网络里的错误反向传播的一个公式(类似这样的)不是特别明白。感觉和我之前看的不太一样。就在网上找到了这篇带样例的文章。
为了方便分享这篇文章的实质内容,我并没有逐字逐句地翻译这篇文章,而是按照我觉得更易理解的方式进行的。同时,这里面所包含的一些数学知识在这里也没有详细解释,需要大家自学。
背景
反向传播(回馈,backpropagation)是一种训练神经网络的常见方法。网上有大量的文章尝试解释反向传播的工作原理,但却很少有代入数值来说明的。这篇文章的作者就用了一个具体的例子来解释反向传播。
前言
这个教程中,作者使用了结构如下的神经网络:
它包含有两个输入、两个隐藏、两个输出结点。其中输入层和隐藏层都包含一个偏置结点(b1, b2)。
初始化
初始化包括两个方面,一个是给网络中的权重矩阵初始化赋值;另一方面给一组包含输入输出的训练数据。如下图:
反向传播的目的
反向传播的目的是为了优化网络中的权重,从而将任意的输入映射到相应的输出。
前向传播
- 计算h1的输入与权重矩阵的乘积
- 将步骤一的结果放入激活函数(sigmoid函数)得到h1的输出
- 重复上面的过程,我们得到h2的输出(其输入与权重矩阵乘积的值为:0.3925)
- 由h1、h2的输出作为输入,计算出o1、o2的输出。如o1的计算过程如下:
同理得到o2(其输入与权重矩阵乘积的值为:1.2249214039)
计算总体错误
作者使用了下面的公式(这个也是比较能用的公式)来计算总体错误:
同理:
总体错误为:
反向传播
反向传播的目的是为了更新权重参数,使得下次计算出来的结果更接近训练样本所提供的目标值。
更新w5、w6、w7、w8
下面以总体错误对w5的偏导为例。
计算偏导
通过下面这个图来看上面的公式是怎么来的:
1. 计算总体错误对o1输出的偏导
2. 计算o1输出对o1输入的偏导
3. 计算o1输入对权重w5的偏导
4. 得到总体错误对w5的偏导
扩展
作者在这里提到了计算偏导的另外一种形式,就是Andrew NG在这节公开课里用到的delta rule。其实是同一公式,只不过Andrew没有在视频里推导公式,而是直接用了简化的表达式,然后我就卡在这了。。。
更新权重w5
下面这个公式涉及学习率的概念(可以参考这里)。
同理更新同一层的其它权重
注意,反向传播的过程中,这些权重暂并不更新,整个反向传播过程结束之后才对这个权重更新。
更新w1、w2、w3、w4
下面以w1为例。
注意,更新w1与更新w5有一些差别。
但是,
看下面的图
也就是说,(推广到其它多层网络)随着反向传播的推进,错误传播的网络也在交织进行着。
下面看一下详细过程:
其中等于
代入公式得:
同理可得:
所以,
现在计算和
因为,
同时
代入公式:
然后就可以更新w1
及w2、w3、w4。
总结一下
如果有一定的高数基础,把上面的公式推导一下,就很容易理解了。有时间可以用python亲自动手实现一下!