直观理解深度学习中的反卷积、导向反向传播
近期在阅读CNN论文中多次出现反卷积(Deconvolution)的概念,反卷积的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks for mid and high level feature learning)。随着反卷积在神经网络可视化上的成功应用,其被越来越多的工作所采纳比如:场景分割、生成模型等。其中反卷积(Deconvolution)也有很多其他的叫法,比如:Transposed Convolution,Fractional Strided Convolution等等。
本文参考了很多博客和文章,在这里对作者表示感谢,汇总记录下来以防忘记。本文力求以比较直观的方式展示这些容易绕晕的概念,因此不对其背后的数学公示进行展开描述,感兴趣的童鞋可以参看文末的相关参考文献。
先给一张图对反卷积有个直观的理解,从直观上看,卷积使特征图width、height变小进行更进一步的特征提取和抽象,反卷积是反向还原特征图大小的过程,当然实际理解不是这么简单,我们一步步来就一些容易混淆的概念给予解释。
一、上采样(UNSampling)与上池化(UnPooling)
用两张图可以很好的诠释,应该不用过多解释,这两张图借用了博客1中的插图。
二、反卷积、导向反向传播
这里直接借用了Jost Tobias Springenberg发表在ICLR2015的论文3中的插图,插图上我进行了注释,可以很好的阐述区分这两个概念。
三、卷积与矩阵运算之间的关系
这里参考了GitHub中的说明2,以及一篇发表于2018年的论文4。CNN中的卷积可以展开为普通全连接神经网络中的矩阵运算,反之也成立。为简单计,后文的描述均采用以下符号:
定义如下:
- 二维的离散卷积(N=2N=2)
- 方形的特征输入(i1=i2= i)
- 方形的卷积核尺寸(k1=k2=k)
- 每个维度相同的步长(s1=s2=s)
- 每个维度相同的padding (p1=p2=p)
考虑如下一个简单的卷积层运算,其参数为 (i=4,k=3,s=1,p=0),输出 o=2。
对于上述卷积运算,我们把上图所示的3×3卷积核展成一个如下所示的[4,16]的稀疏矩阵C, 其中非0元素Wij表示卷积核的第 i行和第 j 列。
我们再把4×4的输入特征展成[16,1]的矩阵 X,那么 Y=CX则是一个[4,1]的输出特征矩阵,把它重新排列2×2的输出特征就得到最终的结果,从上述分析可以看出卷积层的计算其实是可以转化成矩阵相乘的。值得注意的是,在一些深度学习网络的开源框架中并不是通过这种这个转换方法来计算卷积的,因为这个转换会存在很多无用的0乘操作,Caffe中具体实现卷积计算的方法可参考Implementing convolution as a matrix multiplication5。通过上述的分析,我们已经知道卷积层的前向操作可以表示为和矩阵C相乘,我们很容易得到卷积层的反向传播就是和C的转置相乘。
四、反卷积
重新理一下思路,卷积时候的权重矩阵W为:
展开为4*16的矩阵如第三节所述。
反卷积时采用的是和权重矩阵展开矩阵的转置相乘,即CTY,对于权重矩阵W来说相当于旋转了180度。即:
对应的展开矩阵如下,为卷积时候展开矩阵的逆矩阵:
运算过程借用博客6中的图展示:
关于更深入的卷积公示推算,以及非单位步长,有Padding的卷积与反卷积,在论文arXiv-A guide to convolution arithmetic for deep learning4
中有描述,这里就不再展开。
参考文献:
1.https://blog.****.net/A_a_ron/article/details/79181108
2. https://buptldy.github.io/2016/10/29/2016-10-29-deconv/
3. SJost Tobias Springenberg ,TRIVING FOR SIMPLICITY: THE ALL CONVOLUTIONAL NET,ICLR2015.
4. Vincent Dumoulin1F and Francesco Visin2 .A guide to convolution arithmetic for deep learning,2018.
5. https://buptldy.github.io/2016/10/01/2016-10-01-im2col/
6. https://blog.****.net/u014722627/article/details/60574260