上一章中我们介绍了神经网络的学习,并通过梯度下降法来实现最优参数,但是计算量大,耗费时间,误差反向传播法能够高效计算权重参数。我们先通过计算图来理解这个概念,然后通过数学式加深理解。
局部计算就是不关心之前的 数字是怎么来的,只要把两个数字相加就可以了。
例如我们买了100个苹果,和其他4000元的东西,我们不需要知道4000是怎么来的,把4000和苹果的价钱相加就可。
局部计算把复杂的全局计算分解。
1)局部计算可以简化全局计算
2)可以保存计算过程中的数据
3)也就是今天要引入的反向传播,通过计算图的反向传播来计算导数。
上面是通过链式法则来求得的,什么是链式法则?
之前学过高等数学的时候也讲过这个,
所以乘法节点的反向传播就是乘以另一边的值,也就是对向相乘输出,
1.35=6.5
1.310=13
其中根据乘法的反向传播可以知道1.12=2.2
1.1100=110。
我们可以知道,层是神经网络中的功能单位,如sigmod,Affine,都是用层来进行实现的,所以实现乘法节点的是乘法层,实现加法节点的是加法层。
forward:正向传播
backward:反向传播
将计算图的思想应用到神经网络中,把构成神经网络的层看为一个实现类,先来看激活函数的ReLu层和Sigmoid层
在上面的代码中。如果x<=0就为TRUE,x>0就为False,当为TRUE的时候就输出为0,也就是当x<=0的时候输出为0,当x>0 的时候输出x。
mask.是一个值为TRUE或者FALSE的数组,当x<=0的时候保存为TRUE,当x>0的时候保存为FALSE。
神经网络正向传播的计算称为‘’仿射变换‘’,这里将仿射变换称为Affine层
其实就是神经网络中的隐藏层,
这里要注意
的形状是相同的,这样的话才可以乘积运算。
softmax函数就是将输出正规化后再输出(加起来之和为1),平时不使用,在计算反向传播的时候是要用到的。
因为在这里考虑到损失函数的交叉熵误差,所以称为Softmax-with-Loss层,计算图如下:
上图因为复杂只给出了结果,如图先用softmax将输入值正规化,然后交叉熵层接收,输出损失L。
下面是简化 的计算图。
在反向传播是(y1-t1,y2-t2,y3-t3)这样的结果,其中t是监督数据,在神经网络的学习过程中我们是为了得到最优。也就是使得输出y 接近监督数据t ,这里反向传播就会告诉神经网络的前一层,也就是神经网络的学习。
在上面的过程中不必纠结反向传播的值是怎么得到的,我们只需要知道可以根据yi-ti来计算梯度。
Affine层计算的是隐藏层的梯度,Softmax-with-Loss层计算的是输出层的梯度
神经网络学习的步骤
1)从训练数据中选出一部分数据
2) 计算损失函数各个权重参数的梯度
3)将权重参数沿着梯度的方向进行更新
4)重复1,2,3步骤
之前的微分可以求得梯度函数,也是时间复杂度高,用误差反向传播就可以快速高效的计算梯度。
在这里我们实现神经网络就要用到之前的两层神经网络类:TwoLayerNet
根据字典的顺序逐一计算正向传播值
反向传播的上泳默认为1,然后逐一计算反向传播值。
利用上一节求得的数学公式求解后的梯度(正确)和误差反向传播求解后的梯度值来做一个对比。
计算后的误差几乎为0,所以说反向传播计算的梯度是正确的。
不同的就是通过误差反向传播求梯度这个
先介绍计算图,利用计算图介绍了神经网络中的误差反向传播法,通过各个层的实现来构成一个神经网络,使用层来进行模块化,神经网络中可以自由组装层,构架个性化网络。