基于python手写深度学习网络系列(6)误差反向传播实现手写数字识别网络
基于python手写深度学习网络系列(6)
误差反向传播实现手写数字识别网络
通过计算图进行了解:
计算图就是将计算过程用图形表示出来,图形指的是数据结构图,通过多个节点和边表示。
从左向右传播是正向传播,反过来就是反向传播。
局部计算:无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果。
计算图的优点:通过局部计算,简化各个节点的计算;
计算图可以将中间的计算结果全部保存起来;
最重要的是可以通过反向传播高效计算导数。
反向传播的计算顺序,将信号E乘以节点的局部导数(y关于x的偏导),然后将结果传给下一个节点。
原理是链式法则,链式法则是关于复合函数导数的性质
定义:如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示
加法节点的反向传播:将上游的值原封不动地输出到下游
乘法的反向传播:将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。
用python实现例子,将计算图中乘法节点称为“乘法层”,加法节点称为“加法层”。
买苹果就可以这么写
加上橘子也一样
将计算图的思路应用到神经网络中,把神经网络的层实现为一个类。
首先是ReLU,正向传播输入x大于0,反向传播会将上游的值原封不动地传给下游;若是输入x小于0,则反向传播中传给下游的信号将停在此处。
Copy是针对np数组的深度复制函数
具体的区别如下图所示
接下来对sigmoid函数进行类实现,变成一个层
最终简化成
接下来还要对矩阵的乘法进行改写,神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”,处理成Affline层
变量都是矩阵,上边标了变量的形状
这两者的形状相同
当输入的数据是N个的时候,即批处理的时候
Softmax将输入值正规化(将输出值的和调整为1)之后再输出。
神经网络的推理阶段可能只需要输出一个最大值即可,这个被称为得分,但是在学习阶段,就需要softmax层。
将softmax函数与交叉熵误差结合,反向误差传播的结果是y1-t1……这是故意设计好的;
回归问题中输出层使用恒等函数,损失函数使用“平方和误差”,反向传播得到的误差也是很漂亮的。
传播的值除以批的大小之后,传递给前面的层的是单个数据的误差。
将以上这些结合起来,运用误差反向传播的方法进行二层神经网络的编写。
OrderedDict是有序字典,“有序”是指它可以 记住向字典里添加元素的顺序。因此,神经网络的正向传播只需按照添加元 素的顺序调用各层的forward()方法就可以完成处理,而反向传播只需要按 照相反的顺序调用各层即可。
将数值微分求出的梯度结果与误差反向传播求得的结果进行比较,这一操作叫做梯度确认。
通过层的叠加就可以快速实现神经网络的构建。
这样呢就实现了神经网络的误差反向传播,下一篇文章将采用一些技巧提高寻找最优权重参数的效率!敬请期待!