目录链接:吴恩达Deep Learning学习笔记目录
1.从DNN前向传播和BP后向传播说起
2.CNN前向传播和BP后向传播
注:为减小书写、计算量,文中推导都忽略了偏置b。
1. 从DNN前向传播和BP后向传播说起
之前所学的DNN是一个全连接的网络,采用BP算法来计算各参数的梯度,只需要采用链式法则将误差求导传递到每个神经元的每个参数上即可。特别是,将数据向量化后,求解梯度过程较为简单。但对于CNN来说,CNN涉及到了卷积和池化,在进行后向传播计算时,仅采用矩阵乘法、元素级乘法(对应元素相乘)根本无法进行传递计算。那么CNN的BP算法是如何实现的呢?首先从CNN的BP算法说起。
DNN符号约定:
①小写字母代表一个值,大写字母代表向量或矩阵
②输入数据维度为(n,m)表示n个特征,m个样本
③上标[l]:第l层,如A[l],表示第l层激活值
④下标n:某一层第n个神经元,如果是输入数据X,则代表第n个特征,如a[l]1,表示第l层第1个激活值
⑤w[l]ij:表示l层参数,连接了l层第i个神经元和第l-1层第j个神经元
⑥向量化导数符号:dZ即代表最终误差对Z的梯度
⑦δ[l]即dZ[l],两个是一个东西,只是描述不一样
注:A、Z、W、b求导后应该维持维度不变,所以上述向量化表达的式子中含有矩阵的转置操作。
2. CNN前向传播和BP后向传播
卷积层前向传播如下图所示(步长为1),l-1
层的输出,高=3、宽=3、通道数=3,shape=(3,3,3)
;l
层一共有两个卷积核,每个卷积核shape=(2,2,3)
;l
层输出shape=(2,2,2)
。
①l-1
层的通道数与l
层卷积核通道数相同,所以在进行卷积时,是同一个卷积核的各通道对应l-1
层的通道输出A去卷积;②卷积后,在通道维度上进行叠加,一个卷积核最后只输出一个通道的数据;③卷积核的数量决定了该层输出的通道数量,激活后维度不变。因此,维度变化为:(m,n_h_pre,n_w_pre,n_c_pre)
→(f,f,n_c_pre,n_c)
→ (m,n_h,n_w,n_c)
而在池化层中(在此将卷积层和池化都当作单独的一层),由于kernel没有参数
w
,只有单个卷积核,kernel的通道数可以视为1
或者n_c
(因为它没有参数w
),池化前后,通道数不变,高和宽改变。下图为一个池化过程,池化时,kernel移动的步长为2。①
单通道卷积时是局部连接,而不是全连接,也就是说一个z值将不再和上一层所有a值关联,那么dW的值要怎么求?当然,如果将式子一个列出来求dW,一个个求比较简单,单计算量较大,如何实现类似DNN向量化批量的求解才是我们要关心的;
②
由于向前卷积时,相当于将A[l-1]复制了n_c份(卷积核数量或下一层输出通道数),卷积输出n_c个通道,这n_c个通道的数据之间没有权重关系,那么向后传播时,A[l-1]每个通道都将接收n_c个通道传递回来的误差,此时这n_c维的数据如何传递回一个通道?(如convolving图中紫色线);
③
池化过程,高和宽缩减,原有信息已经丢失,反向传递时,如何将小尺寸误差传递回大尺寸数据(如pooling图中,如何将4个格子的数据传递回16个格子);
④
池化层没有激活函数,这个好解决,激活后等于其本身就行。
2.1 卷积层向后传播
根据DNN的经验,要求dW
,那么需要先求出dZ
、dA
,在此假设已知当前l
层dZ
。
(1)求dA
首先解决第①个问题。如上图所示,是一个单通道的数据经过单个单通道卷积核,输出单通道数据(将卷积连接展开后如图左所示)。对于多通道输入、单个多通道卷积核、单通道输出来说,计算方式一样。已知dZ,求dA的链式求导公式如下:
l
层某一通道(假设通道x)上的dZ
要传递回l-1
层的某一通道(假设通道y)的dA
,只需要将y通道对应的单个卷积核的通道y的权重矩阵,水平、垂直方向都翻转180°,dZ
padding 0
,直接卷积即得到dA
。有点绕,看一下前面convolving
图,将前向传播的红绿蓝三根带箭头的线,反向传递就明白了。第①个问题解决。l-1
层dA
计算公式为:l
层的每个通道,假设x个)都要将误差传递给l-1
层,那么l-1
层的一个通道都要接收x个数据,但卷积核之间又没有联系,根据吴恩达deep learning
课程作业里的做法是将这x个数据累加起来,作为l-1
层一个通道的dA
。emm...,第②个问题解决了。(2)求dZ
根据
前述已知
l
层dZ
和l-1
层dA
,根据卷积层各参数的求导推导公式如下:
2.2 池化层向后传播
由于池化向前传播时,会使得h、w两个维度缩减,丢失掉部分信息,那么在后向传播时,如何将尺寸小的矩阵还原到原来大小?一般,池化分为最大池化和平均池化,两种池化后向传播时处理的方式略有不同。
(1)最大池化后向传播
在此将池化当作一层,假设已知l
层dZ=dA
(池化无激活函数,视激活后等于本身),求l-1
层dZ=dA
,下面对一个通道数据进行举例:
平均池化的后向传播是将
l
层dZ=dA
求局部区域大小的平均值(被池化时的区域),填充到各个位置即可:参考资料:
卷积神经网络(CNN)反向传播算法
CNN的反向传播
Convolutional Neural Networks: Step by Step