卷积神经网络CNN理论到实践(4)
写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养整个行业的知识产权意识。我可以和您建立更多的联系,并且在相关领域提供给您更多的资料和技术支持。
手机扫一扫,即可:
1.导读
在上一篇博文中,我们全面介绍了CNN的各种形式,如:
standard convolution,valid convolution, same convolution,full convolution,unshared convolution,tiled convolution等等。
本节博文将要探讨以下几个问题:
首先,在前面的博文中,我们不止一次的提到卷积与矩阵乘法的联系,但是都只是模糊的给出了一个解释,相信大家也许还并没有搞清楚这其中的细节,因此在本篇博文中,我们将详细探讨卷积与矩阵乘法的关系。
在此基础上,我们会介绍CNN中的其他操作,其中最重要的,是反卷积操作。
2. 卷积与矩阵乘法
在前面的博文中,我们不止一次的提到卷积与矩阵乘法的联系,但是都只是模糊的给出了一个解释,相信大家也许还并没有搞清楚这其中的细节,因此在本篇博文中,我们将详细探讨卷积与矩阵乘法的关系。
卷积与矩阵乘法究竟有什么样的关系?我们先从最简单的卷积说起,即我们上一节说的no padding情况:
在这种情况下,我们注意到,kernel(
(作图很辛苦,if you feel good, donate me:) )
在上面这张图中,阴影表示的是kernel,按理说我们展开kernel应该是9个元素。但是在这里,我们展开kernel的方式是,把kernel放在input上,按照input的尺寸展开。这样以来,空余的部分(就是图2.2展开后的kernel中浅蓝色没有加阴影的部分)就写成0。0与任何数乘积为0。这样每一步的卷积,相当于展开后的kernel的对应的一行与展开的input的矩阵乘积。
令展开后的kernel矩阵为
这样,矩阵卷积可以写成:
上标
那么,对于有填充的卷积,该怎么办呢?
事实上,对于有填充的卷积,相当于对input进行了扩展,得到了
在很多计算平台中,例如tensorflow,matlab等,我们就是通过矩阵乘法来计算卷积的。基本原理就是上面说的东西,只是在具体的实现中,还需要处理一些细节上的问题(这已经超出了我们的讨论范围,在此不再赘述)。
在上面的这个
我们看到每一个子块
刚才我们研究的是二维情况,接下来,我们看看一维情况(显然,理解了二维,一维就更easy了)。
加入
这时,对应的
这个矩阵也是一个循环矩阵,但是,除此之外,我们还注意到,它与对角线平行的每一条线上的元素都是相同的。我们把这样的矩阵叫做托普勒斯矩阵(Toeplitz matrix)
总结一下:
离散卷积可以被认为是矩阵的乘法。只是,这个矩阵的元素是有限制的。例如,对于一维卷积而言,矩阵的每一行元素与上一行错位一个位置。这种矩阵叫做托普勒斯矩阵(Toeplitz matrix)。在二维卷积中,对应的则是双块循环矩阵(doubly block circulant matrix)。这些矩阵的一些元素受到相等的约束。除此之外,我们也看到这些矩阵是很稀疏的(大多数位置是0)。原因是我们的kernel通常要比input小很多。把卷积用矩阵乘法的视角来解读似乎对我们实现卷积没什么帮助,但是对我们理解卷积和设计神经网络却很有意义。例如,加入有一个神经网络算法运用了矩阵乘法,并且对矩阵的结构没有特别的要求,那么我们也可以用卷积来替代这个矩阵乘法而不需要改动神经网络。当然,为了更高效的处理大规模的input,我们也许需要对标准的卷积做一些特殊处理,但从理论的角度上看,并不是非常必要。例如在很多计算平台中,例如tensorflow,matlab等,我们就是通过矩阵乘法来计算卷积的。基本原理就是上面说的东西,只是在具体的实现中,还需要处理一些细节上的问题(这已经超出了我们的讨论范围,在此不再赘述)。
3.反卷积
我们还是看一下这个图:
这个卷积的过程,其实相当于将
我们现在想做的是,在保证这个卷积网络连接模式不变的情况下,可不可以将
这个操作叫做反卷积。
反卷积有过很多的英文名:transposed convolution,backward convolution(直观上看,这似乎也是一个向后卷的过程,因此也有人称其为),deconvolution,fractionally strided convolutions.
需要注意的是,transposed convolution这个词很容易让人望文生义,翻译成“转置卷积”。事实上,反卷积一开始叫做deconvolution,但这个词容易让人理解为“卷积的逆”。因此实在很纠结,最后人们普遍使用transposed convolution来表述反卷积。
我们首先回顾一下上一节的矩阵
对于一个卷积网络,信息的流动是从输入层传到卷积层,这个过程叫做前向传播。与此同时,为了训练模型,我们也会将卷积层的输出产生的误差,沿着路径往回传,传到输入层,这个过程叫做后向传播。
结合式子
因此这个卷积网络对应的结构如下图2.5所示(为了方便观查,我们这里只对输出的一个节点的边进行了表示,其他边没有画出来):
我们把
很显然,式子
这样一来,我们对于后向传播的计算就很清晰了:
首先我们已经从更深层的网络中得到误差:
这样,后向传播过程可以写为:
综合式
其中
所谓的反卷积,其实就是把原来的前向传播当做自己的后向传播,把原来的后向传播当做自己的前向传播。为了表明正常卷积与反卷积的关系,我们保持两个卷积的节点字母统一。这样正卷积与反卷积的关系可以用下图2.6表示:
但是区别是正卷积还是反卷积,
我们则是看它是如何计算自己的前向过程和后向过程。
两者之间的差异如图所示
(画图很辛苦,打赏需谨慎:))
在这幅图中,为了让你能够对应好,我们的字母都是唯一的。但是希望你能够知道,反卷积中求得的
3.小结
本篇博文主要向大家详细介绍了离散卷积与矩阵乘法的关系,再次基础上,我们详细探讨了反卷积的操作。期间我们穿插了对前向传播和后向传播的介绍。并且用从图示到公式,从直观到逻辑,都对相关概念做了非常透彻的讲解。
welcome!
[email protected]
http://blog.****.net/github_36326955
Welcome to my blog column: Dive into ML/DL!
I devote myself to dive into typical algorithms on machine learning and deep learning, especially the application in the area of computational personality.
My research interests include computational personality, user portrait, online social network, computational society, and ML/DL. In fact you can find the internal connection between these concepts:
In this blog column, I will introduce some typical algorithms about machine learning and deep learning used in OSNs(Online Social Networks), which means we will include NLP, networks community, information diffusion,and individual recommendation system. Apparently, our ultimate target is to dive into user portrait , especially the issues on your personality analysis.
All essays are created by myself, and copyright will be reserved by me. You can use them for non-commercical intention and if you are so kind to donate me, you can scan the QR code below. All donation will be used to the library of charity for children in Lhasa.
手机扫一扫,即可: