3.2 神经网络计算
神经网络计算主要有前向传播和反向传播,本节将通过一些实例介绍具体计算过程。
3.2.1 前向传播和反向传播
前向传播(Forward Propagation,FP)作用于每一层的输入,通过逐层计算得到输出结果。
反向传播(Backward Propagation,BP)作用于网络的输出,通过计算梯度由深到浅更新网络参数。
接下来参照图示来理解其计算过程。
前向传播示意图如图3-8所示。
图3-8 前向传播示意图
假设上一层的i,j,k,…等节点与本层的节点w有连接,那么节点w的值怎么计算呢?就是通过上一层的i,j,k,…等节点及其对应的连接权重进行加权和运算,其结果再加上一个偏置项(图中省略了),然后再通过一个非线性函数(即激活函数),如Relu、sigmoid等,最后得到的结果就是本层结点w的输出。
最终不断地通过这种方法一层层地运算,得到输出层结果。
反向传播示意图如图3-9所示。
图3-9 反向传播示意图
以分类为例,由于前向传播最终得到的结果,最终总是有误差的,那么怎么减少误差呢?当前应用广泛的一个算法就是梯度下降算法,但是求梯度就要求偏导数,下面以图中字母为例讲解一下。
假设最终误差为E且输出层的激活函数为线性激活函数,那么E对于输出节点yl的偏导数是yl-tl,其中tl是真实值,是指上面提到的激活函数,zl是上面提到的加权和,那么这一层的E对于zl的偏导数为。同理,下一层也这么计算,只不过计算方法变了,梯度值一直反向传播到输入层,最后有。然后调整反向传播过程中的权重,再不断进行前向传播和反向传播,最终得到一个比较好的结果。
3.2.2 如何计算神经网络的输出
神经网络输出计算示意图如图3-10所示。
图3-10 神经网络输出计算示意图
如上图所示,输入层有3个节点,编号依次为1、2、3;隐含层有4个节点,编号依次为4、5、6、7;最后输出层的2个节点编号为8、9。比如,隐含层的节点4,它和输入层的3个节点1、2、3之间都有连接,其连接上的权重分别为w41、w42、w43。
为了计算节点4的输出值,必须先得到其所有上游节点(也就是节点1、2、3)的输出值。节点1、2、3是输入层的节点,所以,他们的输出值就是输入向量本身。按照图3-10画出的对应关系,可以看到节点1、2、3的输出值分别是x1、x2、x3。
其中w4b是节点4的偏置项。
同样,可以继续计算出节点5、6、7的输出值a5、a6、a7。
计算输出层的节点8的输出值y1:
其中w8b是节点8的偏置项。
同理,我们还可以计算出y2。这里我们也看到,输出向量的维度和输出层神经元个数相同。
3.2.3 如何计算卷积神经网络输出值
假设有一个5×5的图像,使用一个3×3的滤波器(Filter)进行卷积,想得到一个3×3的特征图,如图3-11所示。
图3-11 待计算图像和卷积核
假设xi,j表示图像第i行第j列元素。wm,n表示滤波器第m行第n列权重。wb表示滤波器的偏置项。ai,j表示特征图第i行第j列元素。f表示激活函数,这里以Relu函数为例。
卷积计算公式如下:
当步长为1时,计算特征图元素a0,0:
其计算过程如图3-12所示。
图3-12 当步长为1时,特征图元素a0,0过程图示
以此类推,计算出全部的特征图,结果如图3-13所示。
图3-13 当步长为1时,全部的特征图计算结果
当步长为2时,特征图计算如图3-14所示。
图3-14 当步长为2时,全部的特征图计算结果
注:图像大小、步长和卷积后的特征图大小是有关系的。它们满足下面的关系:
其中,W2是卷积后特征图的宽度;W1是卷积前图像的宽度;F是滤波器的宽度;P是Zero Padding的数量,Zero Padding是指在原始图像周围补几圈0,如果P的值是1,那么就补1圈0;S是步长;H2是卷积后特征图的高度;H1是卷积前图像的宽度。
举例:假设图像宽度W1=5,滤波器的宽度F=3,Zero Padding的数量P=0,步长S=2,卷积后特征图的宽度W2为:
说明特征图宽度是2。同样,我们也可以计算出特征图高度也是2。
如果卷积前的图像深度为D,那么相应的滤波器的深度也必须为D。深度大于1的卷积计算公式为:
其中,D是深度;F是滤波器的大小;wd,m,n表示滤波器的第d层第m行第n列权重;ad,i,j表示特征图的第d层第i行第j列像素。
每个卷积层可以有多个滤波器。每个滤波器和原始图像进行卷积后,都可以得到一个特征图。卷积后特征图的深度(个数)和卷积层的滤波器个数相同。图3-15显示了包含两个滤波器的卷积层的计算示意图。输入为7×7×3,经过两个3×3×3滤波器的卷积(步长为2),得到了3×3×2的输出特征图。图中的Zero Padding是1,也就是在输入元素的周围补了一圈0。
以上就是卷积层的计算方法。这里面体现了局部连接和权重共享:每层神经元只和上一层的部分神经元相连(卷积计算规则),且滤波器的权重对于上一层所有神经元都是一样的。对于包含两个3×3×3的滤波器的卷积层来说,其参数数量仅有(3×3×3+1)×2=56个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。
图3-15 包含两个滤波器的卷积层的计算示意图
3.2.4 如何计算池化层输出值
池化层主要的作用是下采样,通过去掉特征图中不重要的样本,进一步减少参数数量。池化的方法很多,最常用的是最大池化。最大池化实际上就是在n×n的样本中取最大值,作为采样后的样本值。2×2最大池化计算示意图如图3-16所示。
图3-16 2×2最大池化计算示意图
计算池化层输出值除了最大池化,常用的还有平均池化,即取各样本的平均值。需要注意的是,对于深度为D的特征图,各层独立做池化,池化后的深度仍然为D。
3.2.5 反向传播实例
一个典型的三层神经网络如图3-17所示。
图3-17 典型的三层神经网络示意图
其中L1层是输入层,L2层是隐含层,L3层是输出层。
假设输入数据集为D=x1,x2,x3,…,xn,输出数据集为y1,y2,…,yn。
如果输入和输出一样,即为自编码模型。如果原始数据经过映射,就会得到不同于输入的输出。
假设有如图3-18所示的网络层。
图3-18 网络层示意图
输入层包含神经元i1、i2,偏置b1;隐含层包含神经元h1、h2,偏置b2,输出层为o1、o2,wi为层与层之间连接的权重,激活函数为sigmoid函数。对以上参数取初始值,即初始化图3-18所示的网络层,如图3-19所示。
图3-19 初始化图3-18所示的网络层
其中:
输入数据i1=0.05,i2=0.10;
输出数据o1=0.01,o2=0.99;
初始权重w1=0.15,w2=0.20,w3=0.25,w4=0.30,w5=0.40,w6=0.45,w7=0.50,w8=0.55。
目标:给出输入数据i1=0.05、i2=0.10,使输出尽可能与原始输出o1=0.01、o2=0.99接近。
首先来看前向传播是如何计算的。
(1)从输入层计算输出层
计算神经元h1的输入加权和:
神经元h1的输出o1(此处用到的激活函数为sigmoid函数):
同理,可计算出神经元h2的输出o2:
(2)从隐含层计算输出层。
计算输出层神经元o1和o2的值:
同理计算可得,这样前向传播的过程就结束了,我们得到输出值为[0.75136079,0.772928465],与实际值[0.01,0.99]相差还很远,现在我们对误差进行反向传播,更新权重,重新计算输出。
再来看反向传播是如何计算的。
(1)计算总误差。
总误差(这里使用平方误差):
因为有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:
(2)进行隐含层输出层的权重更新。
以权重参数w5为例,如果想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导得出(链式法则):
通过图3-20可以更直观地看清楚误差是怎样反向传播的。
图3-20 误差反向传播示意图
3.2.6 神经网络更“深”的意义
首先说一下此命题的前提是:在一定范围内。在一定范围内,使用更“深”的网络表达,主要有以下原因。
(1)在神经元数量相同的情况下,深层网络结构具有更大容量,分层组合带来的是指数级的表达空间,能够组合成更多不同类型的子结构,这样可以更容易地学习和表示各种特征。
(2)隐含层增加则意味着只要由激活函数带来的非线性变换的嵌套层数更多,就能构造更复杂的映射关系。