神经网络基础学习笔记(四)误差反向传播法

目录

误差反向传播

前言:

5.1 计算

5.1.1 用计算图求解

5.2 链式法则

5.2.1 计算图的反向传播

5.2.2 什么是链式法则

5.3 反向传播

5.3.1 加法节点的反向传播

5.3.2 乘法节点的反向传播

5.3.3 苹果的例子

5.4 简单层的实现

5.4.1 乘法层的实现

5.4.2 加法层的实现​

5.5 激活函数层的实现

5.5.2 Sigmoid层

5.6.2 批版本的Affine层

5.7 误差反向传播法的实现

5.7.1 神经网络学习的全貌图

5.7.2 对应误差反向传播法的神经网络的实现

5.7.3 误差反向传播法的梯度确认

5.7.4 使用误差反向传播法的学习

5.8 小结


误差反向传播法

前言:

数值微 分虽然简单,也容易实现,但缺点是计算上比较费时间。本章我们将学习一 个能够高效计算权重参数的梯度的方法——误差反向传播法

正确理解误差反向传播法:一种是基于数学式; 另一种是基于计算图(computational graph)

5.1 计算

5.1.1 用计算图求解

节点用○表示,○中是计算的内容。

神经网络基础学习笔记(四)误差反向传播法_第1张图片

也可以表示为:

神经网络基础学习笔记(四)误差反向传播法_第2张图片

5.2 链式法则

5.2.1 计算图的反向传播

神经网络基础学习笔记(四)误差反向传播法_第3张图片

5.2.2 什么是链式法则

以高数里面的复合函数为励志

z = (x + y) ^2

规则:

如果某个函数由复合函数表示,则该复合函数的导数可以用构成复 合函数的各个函数的导数的乘积表示。

神经网络基础学习笔记(四)误差反向传播法_第4张图片

神经网络基础学习笔记(四)误差反向传播法_第5张图片

5.2.3 链式法则和计算图

我们尝试将式(5.4)的链式法则的计算用计算图表示出来

神经网络基础学习笔记(四)误差反向传播法_第6张图片

有上面的公式运算易得:

神经网络基础学习笔记(四)误差反向传播法_第7张图片

5.3  反向传播

上一节介绍了计算图的反向传播是基于链式法则成立的。下面以+ * 等运算未例子

5.3.1 加法节点的反向传播

z = x + y的导数

神经网络基础学习笔记(四)误差反向传播法_第8张图片

则得到:

神经网络基础学习笔记(四)误差反向传播法_第9张图片

神经网络基础学习笔记(四)误差反向传播法_第10张图片

5.3.2 乘法节点的反向传播

“翻转值”---太直观了吧 就是xy求偏导的时候出现的情况

神经网络基础学习笔记(四)误差反向传播法_第11张图片

5.3.3 苹果的例子

神经网络基础学习笔记(四)误差反向传播法_第12张图片

练习:

神经网络基础学习笔记(四)误差反向传播法_第13张图片

答案:

神经网络基础学习笔记(四)误差反向传播法_第14张图片

5.4 简单层的实现

乘法节点称为“乘法层”(MulLayer),加法节点称为“加法层”

5.4.1 乘法层的实现

神经网络基础学习笔记(四)误差反向传播法_第15张图片

举个栗子:
神经网络基础学习笔记(四)误差反向传播法_第16张图片

实现代码:
神经网络基础学习笔记(四)误差反向传播法_第17张图片

注意: 每一层  要分开

各个变量的导数可由backward()求出

5.4.2 加法层的实现

神经网络基础学习笔记(四)误差反向传播法_第18张图片

加法层的forward()接收x和y两个参数,将它 们相加后输出。

backward()将上游传来的导数(dout)原封不动地传递给下游

神经网络基础学习笔记(四)误差反向传播法_第19张图片

实现代码:
神经网络基础学习笔记(四)误差反向传播法_第20张图片

5.5 激活函数层的实现

们将计算图的思路应用到神经网络中。

我们把构成神经 网络的层实现为一个类。先来实现激活函数的ReLU层和Sigmoid层

5.5.1 ReLU层

神经网络基础学习笔记(四)误差反向传播法_第21张图片

在神经网络的层的实现中,一般假定forward() 和backward()的参数是NumPy数组。

实现代码:

神经网络基础学习笔记(四)误差反向传播法_第22张图片

实现代码:

神经网络基础学习笔记(四)误差反向传播法_第23张图片

关于(x<=0)的解释

神经网络基础学习笔记(四)误差反向传播法_第24张图片

如果正向传播时的输入值小于等于0,则反向传播的值为0。 因此,反向传播中会使用正向传播时保存的mask,将从上游传来的dout的 mask中的元素为True的地方设为

5.5.2 Sigmoid层

实现sigmoid函数。sigmoid函数由式(5.9)表示

计算图表示式(5.9)的话,则如图5-19所示

神经网络基础学习笔记(四)误差反向传播法_第25张图片

出现了新的“exp”和“/”节点,分别进行y = exp(x),y=1/x

接下来计算他的方向传播

分为四个步骤,上书本的图比较直观

步骤1:

神经网络基础学习笔记(四)误差反向传播法_第26张图片

反向传播时,会将上游的值乘以−y 2 (正向传播的输出的 平方乘以−1后的值)后,再传给下游。

神经网络基础学习笔记(四)误差反向传播法_第27张图片

步骤2

“+”节点将上游的值原封不动地传给下游。计算图如下所示。

神经网络基础学习笔记(四)误差反向传播法_第28张图片

步骤3

神经网络基础学习笔记(四)误差反向传播法_第29张图片

步骤4

乘法的话就只需要做一下翻转就可以了

神经网络基础学习笔记(四)误差反向传播法_第30张图片

最后我们可以的得到:

神经网络基础学习笔记(四)误差反向传播法_第31张图片

因此,我们发现,我们通过正向传播的x和y就可以求出这个公式的数值

简洁版的计算图可以省略反向传播中的计算过程,因此计算效率更高

,可以不用在意Sigmoid层中琐碎的细节,而只需要 专注它的输入和输出

神经网络基础学习笔记(四)误差反向传播法_第32张图片

图5-21所表示的Sigmoid层的反向传播,只根据正向传播的输出 就能计算出来

神经网络基础学习笔记(四)误差反向传播法_第33张图片

神经网络基础学习笔记(四)误差反向传播法_第34张图片

5.6 Affine/Softmax层的实现

神经网络的正向传播中,为了计算加权信号的总和,使用了矩阵的乘 积运算

神经网络基础学习笔记(四)误差反向传播法_第35张图片

神经元的加权和可以用Y = np.dot(X, W) + B

X和W 的乘积必须使对应维度的元素个数一致。

注意这里不是2行矩阵相乘法的意思

神经网络基础学习笔记(四)误差反向传播法_第36张图片

神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”A。因此,这里将进行仿射变换的处理实现为“Affine层”。

np.dot(X, W) + B的运算可用图5-24 所示的计算图表示出来

神经网络基础学习笔记(四)误差反向传播法_第37张图片

之前我们见到的计算图中各个节点间流动的是标量,而这个例子中各个节点 间传播的是矩阵

神经网络基础学习笔记(四)误差反向传播法_第38张图片

神经网络基础学习笔记(四)误差反向传播法_第39张图片

为什么要注意矩阵的形状呢?因为矩阵的乘积运算要求对应维度的元素 个数保持一致,通过确认一致性,就可以导出式(5.13)。

神经网络基础学习笔记(四)误差反向传播法_第40张图片

5.6.2 批版本的Affine层

在我们考虑N 个数据一起进行正向传播的情况,也就是批版本的Affi ne层。

神经网络基础学习笔记(四)误差反向传播法_第41张图片

与刚刚不同,现在输入X的形状是(N, 2)。之后就和前面一样,在 计算图上进行单纯的矩阵计算。

神经网络基础学习笔记(四)误差反向传播法_第42张图片

由于正向传播时,偏置会被加到每一个数据(第1个、第2个……)上。反向传播时,各个数据的反向传播的值需要汇总为偏置的元素。

神经网络基础学习笔记(四)误差反向传播法_第43张图片

这个例子中,假定数据有2个(N = 2)。偏置的反向传播会对这2个数据 的导数按元素进行求和

这里使用了np.sum()对第0轴(以数据为单位的轴,axis=0)方向上的元素进行求和

实现考虑了输入数据为张量(四维数据)的情况,与这里介绍的稍有差别

神经网络基础学习笔记(四)误差反向传播法_第44张图片

5.6.3 Softmax-with-Loss 层

softmax函数,比如手写数字数字识别的时候:

神经网络基础学习笔记(四)误差反向传播法_第45张图片

因为手写数字识别要进行10类分类,所以向Softmax层的输 入也有10个。

注意:

神经网络中进行的处理有推理(inference)学习两个阶段。神经网 络的推理通常不使用 Softmax层。也就是说,当神经网络的推理只需要给出一个答案 的情况下,因为此时只对得分最大值感兴趣,所以不需要 Softmax层。 不过,神经网络的学习阶段则需要 Softmax层。

考虑到这里也包含作为损失函数的交叉熵误 差(cross entropy error),所以称为“Softmax-with-Loss层”。Softmax-withLoss层(Softmax函数和交叉熵误差)的计算图如图5-29所示。

神经网络基础学习笔记(四)误差反向传播法_第46张图片

图5-29的计算图可以简化成图5-30

softmax函数记为Softmax层,交叉熵误差记为 Cross Entropy Error层。这里假设要进行3类分类,从前面的层接收3个输 入(得分)。如图5-30所示,Softmax层将输入(a1, a2, a3)正规化,输出(y1, y2, y3)。Cross Entropy Error层接收Softmax的输出(y1, y2, y3)和教师标签(t1, t2, t3),从这些数据中输出损失L。

神经网络基础学习笔记(四)误差反向传播法_第47张图片

Softmax层的反向传播得到了 (y1 − t1, y2 − t2, y3 − t3)这样“漂亮”的结果。由于(y1, y2, y3)是Softmax层的 输出,(t1, t2, t3)是监督数据,所以(y1 − t1, y2 − t2, y3 − t3)是Softmax层的输 出和教师标签的差分

神经网络学习的目的就是通过调整权重参数,使神经网络的输出(Softmax 的输出)接近教师标签。

必须将神经网络的输出与教师标签的误差高 效地传递给前面的层

具体例子:

如思考教师标签是(0, 1, 0),Softmax层 的输出是(0.3, 0.2, 0.5)的情形。因为正确解标签处的概率是0.2(20%),这个 时候的神经网络未能进行正确的识别。此时,Softmax层的反向传播传递的 是(0.3, −0.8, 0.5)这样一个大的误差。因为这个大的误差会向前面的层传播, 所以Softmax层前面的层会从这个大的误差中学习到“大”的内容。

注意:

使用“平 方和误差”作为“恒等函数”的损失函数,反向传播才能得到(y1 − t1, y2 − t2, y3 − t3)这样“漂亮”的结果。

再举一个例子,比如思考教师标签是(0, 1, 0),Softmax层的输出是(0.01, 0.99, 0)的情形(这个神经网络识别得相当准确)。此时Softmax层的反向传播 传递的是(0.01, −0.01, 0)这样一个小的误差。这个小的误差也会向前面的层 传播,因为误差很小,所以Softmax层前面的层学到的内容也很“小”。

Softmax-with-Loss层的实现

神经网络基础学习笔记(四)误差反向传播法_第48张图片

请注意反向传播时,将要传播 的值除以批的大小(batch_size)后,传递给前面的层的是单个数据的误差

5.7 误差反向传播法的实现

5.7.1 神经网络学习的全貌图

神经网络的学习分为下面4个步骤

神经网络基础学习笔记(四)误差反向传播法_第49张图片

的误差反向传播法会在步骤2中出现

在上一节的实验,我们采用数值微分的方法进行实现,虽然简单,但是消耗时间过长。

5.7.2 对应误差反向传播法的神经网络的实现

这里我们要把2层神经网络实现为TwoLayerNet

神经网络基础学习笔记(四)误差反向传播法_第50张图片

与上一章非常类似

神经网络基础学习笔记(四)误差反向传播法_第51张图片

不同点主要在于这里使用了层。通过使用层,获得识别结果 的处理(predict())和计算梯度的处理(gradient())只需通过层之间的传递就能完成。

只截取不同的部分:

神经网络基础学习笔记(四)误差反向传播法_第52张图片

神经网络基础学习笔记(四)误差反向传播法_第53张图片

神经网络基础学习笔记(四)误差反向传播法_第54张图片

神经网络基础学习笔记(四)误差反向传播法_第55张图片

请注意这个实现中的粗体字代码部分,尤其是将神经网络的层保存为 OrderedDict这一点非常重要。OrderedDict是有序字典,“有序”是指它可以 记住向字典里添加元素的顺序。神经网络的正向传播只需按照添加元 素的顺序调用各层的forward()方法就可以完成处理,而反向传播只需要按 照相反的顺序调用各层即可。

因为Affine层和ReLU层的内部会正确处理正 向传播和反向传播,所以这里要做的事情仅仅是以正确的顺序连接各层,再 按顺序(或者逆序)调用各层

只需像组装乐高 积木那样添加必要的层就可构件一个较大的神经网络。

5.7.3 误差反向传播法的梯度确认

两种求梯度的方法:

一种是基于数值微分的方 法,另一种是解析性地求解数学式的方法。后一种方法通过使用误差反向传 播法,即使存在大量的参数,也可以高效地计算梯度。使用误差反向传播法求梯度。

在确认误差反向传播法的实现是否正确时,是需要用到数值微分的。

确认数值 微分求出的梯度结果和误差反向传播法求出的结果是否一致(严格地讲,是 非常相近)的操作称为梯度确认(gradient check)。

神经网络基础学习笔记(四)误差反向传播法_第56张图片

神经网络基础学习笔记(四)误差反向传播法_第57张图片

这里误差的计 算方法是求各个权重参数中对应元素的差的绝对值,并计算其平均值。运行 上面的代码后,会输出如下结果

神经网络基础学习笔记(四)误差反向传播法_第58张图片

比如,第1层的偏置的误差是9.7e-13(0.00000000000097)。这样一来, 我们就知道了通过误差反向传播法求出的梯度是正确的,误差反向传播法的 实现没有错误。

5.7.4 使用误差反向传播法的学习

我们来看一下使用了误差反向传播法的神经网络的学习的实现。 和之前的实现相比,不同之处仅在于通过误差反向传播法求梯度这一点。

使用部分,与上一张的不同点只在于:

神经网络基础学习笔记(四)误差反向传播法_第59张图片

5.8 小结

使用计算图,介绍了神 经网络中的误差反向传播法,并以层为单位实现了神经网络中的处理,我们 学过的层有ReLU层、Softmax-with-Loss层、Affine层、Softmax层等,这 些层中实现了forward和backward方法,通过将数据正向和反向地传播,可 以高效地计算权重参数的梯度。通过使用层进行模块化,神经网络中可以自 由地组装层,轻松构建出自己喜欢的网络。

 

 

你可能感兴趣的:(Python,机器学习,神经网络)