目录
习题5-5 对于一个二维卷积, 输入为3 × 3, 卷积核大小为2 × 2, 试将卷积操作重写为仿射变换的形式. 参见公式(5.45) .
附加题 阅读 “5.3.1 卷积神经网络的反向传播算法”,举例说明推导过程.
习题 5-7 忽略激活函数, 分析卷积网络中卷积层的前向计算和反向传播(公式(5.39)) 是一种转置关系.
习题5-8 在空洞卷积中, 当卷积核大小为𝐾, 膨胀率为𝐷时, 如何设置零填充𝑃 的值以使得卷积为等宽卷积 .
解决残留问题:
对于为什么不加x网络会发生退化我不太理解,所以这里进行解析,如下图:(这里截的老师PPT上的图)
由于非线性激活函数ReLU的存在,导致输入输出不可逆,造成了模型的信息损失,更深层次的网络使用了更多的ReLU函数,导致了更多的信息损失,这使得浅层特征随着前项传播难以得到保存
参考:【精选】ResNet(残差网络模型)原理解读-包括residual block与BN原理介绍_resnet原理-CSDN博客
习题5-2 证明宽卷积具有交换性, 即公式(5.13).
通过证明公式(1.3)等式两边相等来证明宽卷积具有交换性:
将代入,计算可得:
习题5-4 对于一个输入为100 × 100 × 256的特征映射组, 使用3 × 3的卷积核, 输
出为100 × 100 × 256的特征映射组的卷积层, 求其时间和空间复杂度. 如果引入
一个1 × 1卷积核, 先得到100 × 100 × 64的特征映射, 再进行3 × 3的卷积, 得到
100 × 100 × 256的特征映射组, 求其时间和空间复杂度.
这里先说明计算方法:
卷积神经网络整体的时间复杂度:
空间复杂度:
(参考:卷积神经网络的复杂度分析 - 知乎 (zhihu.com))
计算时间空间复杂度:
3*3:
时间复杂度:
空间复杂度:
其中,
1*1:
时间复杂度:
空间复杂度:
可以看出加入1*1卷积核后降低了时间复杂度,但是同时也增大了空间复杂度。
(参考:NNDL 作业7:第五章课后题(1×1 卷积核 | CNN BP)-CSDN博客)
习题5-5 对于一个二维卷积, 输入为3 × 3, 卷积核大小为2 × 2, 试将卷积操作重
写为仿射变换的形式. 参见公式(5.45) .
书上的例子:
老师给出的例子:
输入X:
卷积核W:
步长为1:
对于将卷积操作重写为仿射变换形式的过程,我的理解是:
用卷积核W对输入X进行卷积,仿射变换的每一行对应着输入X中的所有元素(顺序为从上到下,从左到右),卷积核卷积到的部分就填写上卷积核对应位置的数值,没有卷积到的部分就填写为0。
对于本题就是输入X是3*3的,所以仿射变换的结果是9列,一共卷积4次,所以是4行,每一行都按照 的顺序进行填写,卷积核卷积到的位置填写卷积核对应位置的数字,为卷积到的填0。
附加题 阅读 “5.3.1 卷积神经网络的反向传播算法”,举例说明推导过程.
神经网络参数更新规则都是梯度下降方法,这里也不例外,可以通过链式法则求出任意参数的梯度,下面给出反向传播总公式:
我们将利用这个公式和链式法则反向传播实现参数更新计算。
为了方便中间计算和理解,我们定义一个中间项,误差δ:
其中上面标示全连接层误差,下面标示卷积层的误差。
4.1、全连接层误差公式
由链式法则我们可以将其写为:
或者表示成:
4.2、全连接层向池化层反向传递公式
由之前给的池化层到全连接层的前向传递公式:
所以得到:
写成矩阵形式为:
4.3、池化层到卷积层的误差公式
在反向传播时,我们首先会把池化层梯度的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是最大池化,则把池化层梯度的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置。如果是Average,则把池化层梯度的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做upsample。
用一个例子可以很方便表示:假如我们的池化区域大小是2×2,步长也为2,第i个子特征矩阵为:
(1)如果是最大值池化,假设我们之前在前向传播时记录的最大位置分别是左上、右下、右上、左下则转换后的矩阵为:
(2)如果是平均池化,则进行平均,转换后的矩阵为
这样我们就得到了卷积层的误差公式:
由池化层的结果向前一层传播的话,由于池化层没有参数需要学习,但是由于池化操作造成了数据维度的变化,所以需要有一个数据的上采样过程,上采样过程跟池化的方法有关。
上述公式写成矩阵形式为:
4.4、卷积层之间的误差传递
根据链式规则我们可以得到:
所以这里主要是求第二项的值,但是这里又跟全连接网络不一样,不是简单的权重的转置,下面来分析:
首先我们通过一个例子看一下有什么规律,假设l层的输出有:
卷积核为:
l+1层输入:
其有下列运算关系:
误差传递公式:
我们可以发现,其实a11在左上角,只参与了卷积运算1次,赋值给了z11;a12参与了两次卷积运算分别赋值给了z11和z12;等等。那么我们求z对于a的偏导自然就是这种规则:求对a11的偏导我们就只需要求z11处误差对其的偏导;求对a12的偏导我们就需要求对z11和z12处误差对其的偏导和,也就是要对其两个做运算,其它以此类推,这时你回想下上面提到过的运算,是的,这是否也可以用卷积操作来实现呢?由规律来看自然其卷积核大小也是2×2,但是单独对l+1层的误差矩阵做卷积肯定不会得到a矩阵的3×3大小,而且也要符合刚才运算规律,所以我们需要对l+1层误差矩阵做一些变换,将其周围添加宽度为n-1的0(这里假设卷积核长宽相等,其中n为卷积核的尺寸)如下:
但是我们又发现,如果直接这样与w卷积核做卷积,我们发现和z11项误差相乘的是w22,与公式中w11矛盾,其实这里也需要对卷积核做一些变换,我们这用的是180°旋转变换,将其变换为:
最后误差传递方程可以写成这样:
经过验证是正确的,自此我们就总结出对于卷积层之间的运算规则:先要将对于上一层z的误差矩阵周围用0扩展,扩展尺寸为卷积核的大小n减1,然后将卷积核旋转180°,最后就是跟卷积层前向传播一样的卷积操作,所以最后反向传播公式可以写成下面表达式:
将上式写成矩阵形式表达式为:
至此,误差在卷积神经元之间的传播就完成了。
4.5、参数w和b的梯度公式
还是老方法,根据反向传播的链式法则求参数w和b的梯度可以由下面式子给出:
所以,要求上面的式子,主要就是第二部分,而这可以通过之前给的前向传播过程中卷积层之间的传递公式来计算,下面给出之前公式,来找出其关系:
对于参数b,我们其实可以很简单的看出来其关系,其梯度直接为:
而对于参数w其实不难得出:
看到这个式子你是否觉得有点眼熟,是的,这个式子跟之前前向传播卷积层之间的传递公式类似,只不过累加号下标变成了j,k而之前的是s,m,n。其中m,n代表卷积核的参数,那么我们回到现在这个式子,我们是否可以将下标j,k看做是新的卷积核的参数,也就是说其实现在这个式子也是卷积操作,只不过卷积核变成了(j,k)也就是l+1层第i个特征向量的输入,事实是可以这样考虑的,我们可以发现,当卷积步长为1时,式子可以变成:
我们可以发现这和之前给的卷积运算公式是一样的,这里的卷积核已经变成了以(j,k)大小的第l+1层的误差δi,但是对于步长不为1的情况,我们看公式可以知道,它其实是对a水平和竖直方向隔了d-1个而进行卷积,这里我们可以转换一下思维,如果对a是隔了d-1个值进行卷积,其实也可以说是将δ进行一个变换,在每行与每列之间插入d-1个数值为0的值,这样直接与a进行卷积就可以保证在这些为0值的位置的a可以不被累加进去,实现了卷积运算,当步长为2时,具体变换例子如下:
这样我们就可以直接使用卷积的公式进行计算了:
所以我们可以直接用上述公式代表所有情况,当d等于1时,也就是不做插值处理。
所以模型参数的梯度对应的矩阵形式的运算为:
习题 5-7 忽略激活函数, 分析卷积网络中卷积层的前向计算和反向传播(公式
(5.39)) 是一种转置关系.
在第层时:净输入为, 反向传播的误差项为
当在第l + 1 l+1l+1层时:净输入为,而反向传播的误差项为
因此,忽略激活函数下前向计算和反向传播是一种转置关系。
另外,我觉得用仿射变换来说明更加形象一些:
因此,忽略激活函数下前向计算和反向传播是一种转置关系。
习题5-8 在空洞卷积中, 当卷积核大小为𝐾, 膨胀率为𝐷时, 如何设置零填充𝑃 的
值以使得卷积为等宽卷积 .
下面是普通的卷积:
kernel_size=3, stride=1, padding=0
下面是空洞卷积:
kernel_size = 3, dilated_ratio = 2, stride = 1, padding = 0
(来源:空洞卷积(膨胀卷积)的相关知识以及使用建议(HDC原则)_膨胀卷积和空洞卷积-CSDN博客)
在空洞卷积中,当卷积核大小为 K,膨胀率为 D 时,要使得卷积为等宽卷积,需要设置适当的零填充 P 的值。
等宽卷积的定义是,在进行卷积操作后,输出特征图的宽度应该与输入特征图的宽度相同。
对于空洞卷积,输出特征图的宽度可以通过以下公式计算:
输出特征图的宽度 = (输入特征图的宽度 + 2P - (K - 1) * (D - 1) - 1) / S + 1
其中,S 表示卷积的步长。
要使得卷积为等宽卷积,即输出特征图的宽度与输入特征图的宽度相同,可以设置以下条件:
(输入特征图的宽度 + 2P - (K - 1) * (D - 1) - 1) / S + 1 = 输入特征图的宽度
解出上述方程中的零填充 P 的值即可。
下面写一下老师上课提到的问题:
1. 和相同吗?
(我没有搜到相关的内容,于是问了一下文心一言,以下是文心一言的回答)
Σij 和 ΣiΣj 并不相同。
首先,我们需要理解这两个符号的含义。
Σ 是求和符号,i 和 j 分别代表两个不同的变量。Σij 表示对所有可能的 i 和 j 的组合进行求和。
ΣiΣj 则表示首先对 i 进行求和,然后再对 j 进行求和。也就是先对 i 的所有可能值求和,得到一个新的值,再对这个新的值进行 j 的求和。
举个例子,假设 i 和 j 都是从 1 到 3 的整数,那么 Σij = 11+ 12 + 13 + 21 + 22 + 23 + 31 + 32 + 33,而 ΣiΣj = (1+2+3)(1+2+3)。
显然,这两种求和方式得到的结果是不同的。
2. 转置卷积与反向传播有什么关系?
转置卷积与反向传播的关系是,转置卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算。卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。因为卷积层的前向反向计算分别为乘和,而反卷积层的前向反向计算分别为乘和,所以它们的前向传播和反向传播刚好交换过来。
总结:
通过这次作业,我对卷积交换性的证明有了进一步的了解,参考老师给出的证明过程,有了大概框架,自己证明了一遍。学会了如何计算卷积神经网络的时间空间复杂度。对于仿射变换有了自己的理解:
对于将卷积操作重写为仿射变换形式的过程,我的理解是:
用卷积核W对输入X进行卷积,仿射变换的每一行对应着输入X中的所有元素(顺序为从上到下,从左到右),卷积核卷积到的部分就填写上卷积核对应位置的数值,没有卷积到的部分就填写为0。(如有错误,请斧正)
参考链接:
【23-24 秋学期】NNDL 作业8 卷积 导数 反向传播-CSDN博客
卷积神经网络(CNN)反向传播算法 - 刘建平Pinard - 博客园 (cnblogs.com)
Backpropagation In Convolutional Neural Networks | DeepGrid (jefkine.com)