实现神经网络番外:利用Excel实现神经网络和BP算法

主旨

本文通过电子表格展示如何基于具体数据计算神经网络的输出值和如何根据BP算法计算损失函数对每个参数的梯度,实现网络训练功能。

索引

本文是本系列第四篇,本系列介绍见Python实现神经网络Part 1: 实现forward和BP算法的神经元

动机

在自己编程实现神经网络的过程中,最大的困难在于如何检查实现结果是否正确。单纯的Code Review显然无法有效发现所有Bug,从网上也没有查到公开的测试用例,因此只能自己想办法。

从软件工程的角度,测试用例需要清晰的定义出程序的输入和预期输出。进一步,为了方便Debug,仅仅知道输入和预期输出还不够,还需要运算中重要中间结果量,以便程序输出结果与预期不符时,通过检查不同阶段的中间变量定位出问题的Root Cause。

基于上述考虑,我想到了通过电子表格计算出神经网络前向和反向的每一步结果,一方面可以作为自己写的神经网络程序的单元测试例;另一方面也在计算的过程中更加形象的理解神经网络。

和前一篇一样,本文中BP算法参考斯坦福大学的BP算法教材。文中每一步计算都对应于教材中描述的步骤,可以互相参照。

实现方法

1. 网络结构
我们定义一个包含一个输入层、一个输出层,一个隐层的神经网络,每一层包含2个节点,网络结构为全连接网络,激活函数为sigmoid函数。
在Excel中我用如下格式描述这个网络,表格里src表示源节点,dst表示目标节点,src和dst交叉位置的系数就是这条边的权重,bias节点与dst节点的交叉位置表示dst节点的bias偏置量
实现神经网络番外:利用Excel实现神经网络和BP算法_第1张图片

2. 前向计算
我们假定输入数据为(1,2),而训练目标是一个线性分类器,即 x1>=x2 时,标签为(1,0); 否则,标签为(0,1)

根据神经网络的定义,我在表格中分层计算每一层的激活值,计算公式如下所示。其中第2层激活值就是神经网络的输出
实现神经网络番外:利用Excel实现神经网络和BP算法_第2张图片

3. 计算Loss
根据前述教材,选用如下函数作为损失函数

J(w,b;x,y)=12hW,b(x)y2

表格中计算公式如下
实现神经网络番外:利用Excel实现神经网络和BP算法_第3张图片

4. 计算逐点误差和梯度
逐点误差这个概念也来自于前述教材,记为 δ
实现神经网络番外:利用Excel实现神经网络和BP算法_第4张图片

基于逐点误差,可以进一步算出梯度表格
实现神经网络番外:利用Excel实现神经网络和BP算法_第5张图片

5. 更新参数
走到这一步,就可以根据学习率,沿着梯度下降方向调整参数了,调整后的参数和前向计算结果如下
实现神经网络番外:利用Excel实现神经网络和BP算法_第6张图片
从上述结果看,经过一次参数更新,Loss值在下降,说明训练的步骤是正确的

Excel文件下载地址

本文中截图展示的Excel文件可以从以下地址获得
https://github.com/wangyaobupt/SimpleNeuralNetwork/tree/master/unitTestDoc

你可能感兴趣的:(深度学习)