深度学习入门学习--第五章 误差反向传播法

前面学习了神经网络。并通过数值微分计算了神经网络的权重参数的梯度(严格来说,是损失函数关于权重参数的梯度)。数值微分虽然简单,但缺点是计算上比较费时间。
本章我们将学习一个能够高效计算权重参数的梯度的方法–误差反向传播法。
本章任务:通过计算图,直观的理解误差反向传播法,然后再结合实际的代码加深理解。
1.计算图
计算图将计算过程用图形表示出来。这里说的图形是数据结构图,通过多个节点和边表示(连接结点的直线称为“边”)。
(1)用计算图求解
本节尝试用计算图解简单的问题。
综上所述,用计算图解题的情况下,需要按如下流程进行:
1)构建计算图;
2)在计算图上,从左向右进行计算;
这里第2步“从左向右进行计算”是一种正方向上的传播,简称为正向传播。正向传播是从计算图出发点到结束点的传播。反向传播从图上看是从右到左的反向的传播,在接下来的导数计算中发挥重要作用。
(2)局部计算
计算图的特征是可以通过传递“局部计算”获得最终结果。“局部”这个词的意思是“与自己相关的某个小范围”。局部计算是指,无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果。换言之,各个节点处只需进行与自己有关的计算,不用考虑全局。
综上,计算图可以集中精力于局部计算。无论全局的计算有多么复杂,各个步骤所要做的就是对象节点的局部计算。虽然局部计算非常简单,但是通过传递它的计算结果,可以获得全局的复杂计算的结果。
(3)为何用计算图解题
计算图优点:
1)局部计算;
2)利用计算图可以将中间的计算结果全部保存起来;
实际上,使用计算图最大的原因是,可以通过反向传播高效计算导数。
计算图的优点是,可以通过正向传播和反向传播高效的计算各个变量的导数值。
2.链式法则
本节将介绍链式法则,并阐明它是如何对应计算图上的反向传播的。
(1)计算图的反向传播
反向传播的计算顺序是,将信号E乘以节点的局部导数,然后将结果传递给下一个节点。这里所说的的局部导数是指正向传播函数的导数,把这个局部导数乘以上游传过来的值,然后传递给前面的节点。
通过这样的计算,可以高效的求出导数的值,这是反向传播的要点。
(2)什么是链式法则
复合函数是由多个函数构成的函数。
链式法则是关于复合函数的导数的性质,定义如下:如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。
(3)链式法则和计算图
将链式法则的计算用计算图表示出来。
3.反向传播
(1)加法节点的反向传播
加法节点的反向传播将从上游传过来的导数乘以1,然后传向下游。也就是说,因为加法节点的反向传播只乘以1,所以输入的值会原封不动地流向下一个节点。
(2)乘法节点的反向传播
乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。
另外,加法的反向传播只是将上游的值传给下游,并不需要正向传播的输入信号。但是,乘法的反向传播需要正向传播时的输入信号值。因此,实现乘法节点的反向传播时,要保存正向传播的输入信号。
4.简单层的实现
用Python实现购买苹果的例子。这里,我们把要实现的计算图的乘法节点称为“乘法层”(MulLayer),加法节点称为“加法层”(AddLayer)
下一节,我们将把构建神经网络的“层”实现一个类。这里所说的“层”是神经网络中功能的单位。比如,负责sigmoid函数的Sigmoid、负责矩阵乘积的Affine等,都以层为单位进行实现。因此,这里也以层为单位来实现乘法节点和加法节点。
(1)乘法层的实现
层的实现中有两个共通的方法(接口)forward()和backward(),分别对应正向传播和反向传播。

深度学习入门学习--第五章 误差反向传播法_第1张图片
深度学习入门学习--第五章 误差反向传播法_第2张图片
(2)加法层的实现
深度学习入门学习--第五章 误差反向传播法_第3张图片
深度学习入门学习--第五章 误差反向传播法_第4张图片
5.激活函数层的实现
将计算图的思路应用到神经网络中。这里,我们把构成神经网络的层实现为一个类。先实现激活函数的ReLU层和Sigmoid层。
(1)ReLU层
激活函数ReLU,根据表达式,以及导数式,如果正向传播时的输入x大于0,则反向传播会将上游的值原封不动地传给下游。反过来,如果正向传播时的x小于等于0,则反向传播中传给下游的信号将停在此处。
实现ReLU层。
在神经网络的层的实现中,一般假定forward()和backward()的参数是NumPy数组。
深度学习入门学习--第五章 误差反向传播法_第5张图片
ReLU类有实例变量mask。这个变量mask是由True/False构成的NumPy数组,它会把正向传播时的输入x的元素中小于等于0的地方保存为True,其他地方(大于0的元素)保存为False。
如果正向传播时的输入值小于等于0,则反向传播的值为0。因此,反向传播中会使用正向传播时保存的mask,将从上游传来的dout的mask中的元素为True的地方设为0。
ReLU层的作用就像电路中的开关一样。正向传播时,有电流通过的话,就将开关设为ON;没有电流通过的话,就将开关设为OFF。反向传播时,开关为ON的话,电流会直接通过;开关为OFF的话,则不会有电流通过。
(2)Sigmoid层
深度学习入门学习--第五章 误差反向传播法_第6张图片
深度学习入门学习--第五章 误差反向传播法_第7张图片
6.Affine/Softmax层的实现
(1)Affine层
神经网络的正向传播中,为了计算加权信号的总和,使用了矩阵的乘积运算(NumPy中是np.dot())。
神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”。因此,这里将进行仿射变换的处理实现为“Affine层”。
将求矩阵的乘积与偏置的和的运算用计算图表示出来。
深度学习入门学习--第五章 误差反向传播法_第8张图片
这个计算图的各个节点之间传播的是矩阵,接着考虑这个计算图的反向传播。
以矩阵为对象的反向传播,按矩阵的各个元素进行计算时,步骤和以标量为对象的计算图相同。
(2)批版本的Affine层
前面介绍的Affine层的输入X是以单个数据为对象的。现在我们考虑N个数据一起进行正向传播的情况,也就是批版本的Affine层。
先给出批版本的Affine层的计算图。
深度学习入门学习--第五章 误差反向传播法_第9张图片
深度学习入门学习--第五章 误差反向传播法_第10张图片
正向传播时,偏置会被加到每一个数据(第1个、第2个……)上。因此,反向传播时,各个数据的反向传播的值需要汇总为偏置的元素。
(3)Softmax-with-Loss层
输出层的softmax函数,会将输入值正规化之后再输出。
神经网络中进行的处理有推理和学习两个阶段。神经网络的推理通常不使用Softmax层。神经网络中未被正规化的输出结果有时被称为“得分”。也就是说,当神经网络的推理只需要给出一个答案的情况下,因为此时只对得分最大值感兴趣,所以不需要Softmax层。不过,神经网络的学习阶段则需要Softmax层。
实现Softmax层,考虑到这里也包含作为损失函数的交叉熵误差(cross entropy error),所以称为“Softmax-with-Loss层”。在计算图种,softmax函数记为Softmax层,交叉熵误差记为Cross Entropy Error层。这里假设要进行3类分类,从前面的层接收3个输入(得分)。Softmax层将输入(a1,a2,a3)正规化,输出(y1,y2,y3)。Cross Entropy Error层接收Softmax层的输出(y1,y2,y3)和教师标签(t1,t2,t3),从这些数据中输出损失L。
Softmax层反向传播得到了(y1-t1,y2-t2,y3-t3)这样的结果(因为使用“平方和误差”作为“恒等函数”的损失函数)。由于(y1,y2,y3)是Softmax层的输出,(t1,t2,t3)是监督数据,所以(y1-t1,y2-t2,y3-t3)是Softmax层的输出和教师标签的差分。神经网络的反向传播会把这个差分表示的误差传递给前面的层,这是神经网络学习中的重要性质。
神经网络学习的目的就是通过调整权重参数,使神经网络的输出(Softmax的输出)接近教师标签。因此,必须将神经网络的输出与教师标签的误差高效的传递给前面的层。刚刚的(y1-t1,y2-t2,y3-t3)正是Softmax层的输出和教师标签的差,直截了当地表示了当前神经网络的输出与教师标签的误差。
Softmax-with-Loss层的实现。

深度学习入门学习--第五章 误差反向传播法_第11张图片
7.误差反向传播法的实现
通过像组装乐高积木一样组装上一节中实现的层,可以构建神经网络。
(1)神经网络学习的全貌图
神经网络学习的四个步骤:
步骤一(mini-batch):从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
步骤二(计算梯度):为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
步骤三(更新参数):将权重参数沿梯度方向进行微小更新。
步骤四(重复):重复前面三个步骤。

之前介绍的误差反向传播法会在步骤2中出现。这一章将使用误差反向传播法快速高效的计算梯度,替代上一章使用的数值微分法。
(2)对应误差反向传播法的神经网络的实现

深度学习入门学习--第五章 误差反向传播法_第12张图片
深度学习入门学习--第五章 误差反向传播法_第13张图片
代码中将神经网络的层保存为OrderedDict。OrderedDict是有序字典,“有序”是指它可以记住向字典里添加元素的顺序。因此,神经网络的正向传播只需按照添加元素的顺序调用各层的forward()方法就可以处理完成,而反向传播只需要按照相反的顺序调用各层即可。因为Affine层和ReLU层的内部会正确处理正向传播和反向传播,所以这里要做的事情仅仅是以正确的顺序连接各层,再按顺序(或者逆序)调用各层。
像这样通过将神经网络的组成元素以层的方式实现,可以轻松的构建神经网络。
(3)误差反向传播法的梯度确认
在两种求梯度的方法中,数值微分的计算很耗费时间,而且如果有误差反向传播法(正确的)实现的话,就没有必要使用数值微分的实现了。但实际上,在确认误差反向传播法的实现是否正确时,是需要用到数值微分的。
数值微分的优点是实现简单,因此,一般情况下不太容易出错。而误差反向传播法的实现很复杂,容易出错。所以,经常会比较数值微分的结果和误差反向传播法的结果,以确认误差反向传播法的实现是否正确。
确认数值微分求出的梯度结果和误差反向传播法求出的结果是否一致(非常接近)的操作称为梯度确认。

你可能感兴趣的:(深度学习入门学习--第五章 误差反向传播法)