卷积神经网络CNN理论到实践(4)


写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养整个行业的知识产权意识。我可以和您建立更多的联系,并且在相关领域提供给您更多的资料和技术支持。

赏金将用于拉萨儿童图书公益募捐

手机扫一扫,即可:
卷积神经网络CNN理论到实践(4)

附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助


1.导读

在上一篇博文中,我们全面介绍了CNN的各种形式,如:
standard convolution,valid convolution, same convolution,full convolution,unshared convolution,tiled convolution等等。

本节博文将要探讨以下几个问题:
首先,在前面的博文中,我们不止一次的提到卷积与矩阵乘法的联系,但是都只是模糊的给出了一个解释,相信大家也许还并没有搞清楚这其中的细节,因此在本篇博文中,我们将详细探讨卷积与矩阵乘法的关系。
在此基础上,我们会介绍CNN中的其他操作,其中最重要的,是反卷积操作。


2. 卷积与矩阵乘法

在前面的博文中,我们不止一次的提到卷积与矩阵乘法的联系,但是都只是模糊的给出了一个解释,相信大家也许还并没有搞清楚这其中的细节,因此在本篇博文中,我们将详细探讨卷积与矩阵乘法的关系。


卷积与矩阵乘法究竟有什么样的关系?我们先从最简单的卷积说起,即我们上一节说的no padding情况:

卷积神经网络CNN理论到实践(4)
图2.1: no padding

在这种情况下,我们注意到,kernel(3×3)与input(4×4)其实只做了四次操作:
卷积神经网络CNN理论到实践(4)
图2.2:卷积可以写成矩阵乘法
(作图很辛苦,if you feel good, donate me:) )

在上面这张图中,阴影表示的是kernel,按理说我们展开kernel应该是9个元素。但是在这里,我们展开kernel的方式是,把kernel放在input上,按照input的尺寸展开。这样以来,空余的部分(就是图2.2展开后的kernel中浅蓝色没有加阴影的部分)就写成0。0与任何数乘积为0。这样每一步的卷积,相当于展开后的kernel的对应的一行与展开的input的矩阵乘积。

令展开后的kernel矩阵为C,那么C用数学的表达方式写成:

卷积神经网络CNN理论到实践(4)

这样,矩阵卷积可以写成:
(IK)flat=CIflat(2.1)

上标flat表示将矩阵展平为一维向量。

那么,对于有填充的卷积,该怎么办呢?
事实上,对于有填充的卷积,相当于对input进行了扩展,得到了inputextend,然后我们对inputextendkernel再次运用上面的原理进行计算。

在很多计算平台中,例如tensorflow,matlab等,我们就是通过矩阵乘法来计算卷积的。基本原理就是上面说的东西,只是在具体的实现中,还需要处理一些细节上的问题(这已经超出了我们的讨论范围,在此不再赘述)。

在上面的这个C矩阵中,我们可以做这样的一个分割:

卷积神经网络CNN理论到实践(4)

我们看到每一个子块Hi都是一个循环矩阵(circulant matrix),而整个矩阵则是这些子块的循环矩阵。因此我们把这样的矩阵叫做双块循环矩阵(doubly block circulant matrix)


刚才我们研究的是二维情况,接下来,我们看看一维情况(显然,理解了二维,一维就更easy了)。
加入input1×4kernel1×2:

卷积神经网络CNN理论到实践(4)
图2.3

这时,对应的C矩阵为:
ω000ω1ω000ω1ω000ω1

这个矩阵也是一个循环矩阵,但是,除此之外,我们还注意到,它与对角线平行的每一条线上的元素都是相同的。我们把这样的矩阵叫做托普勒斯矩阵(Toeplitz matrix)

总结一下:
离散卷积可以被认为是矩阵的乘法。只是,这个矩阵的元素是有限制的。例如,对于一维卷积而言,矩阵的每一行元素与上一行错位一个位置。这种矩阵叫做托普勒斯矩阵(Toeplitz matrix)。在二维卷积中,对应的则是双块循环矩阵(doubly block circulant matrix)。这些矩阵的一些元素受到相等的约束。除此之外,我们也看到这些矩阵是很稀疏的(大多数位置是0)。原因是我们的kernel通常要比input小很多。把卷积用矩阵乘法的视角来解读似乎对我们实现卷积没什么帮助,但是对我们理解卷积和设计神经网络却很有意义。例如,加入有一个神经网络算法运用了矩阵乘法,并且对矩阵的结构没有特别的要求,那么我们也可以用卷积来替代这个矩阵乘法而不需要改动神经网络。当然,为了更高效的处理大规模的input,我们也许需要对标准的卷积做一些特殊处理,但从理论的角度上看,并不是非常必要。例如在很多计算平台中,例如tensorflow,matlab等,我们就是通过矩阵乘法来计算卷积的。基本原理就是上面说的东西,只是在具体的实现中,还需要处理一些细节上的问题(这已经超出了我们的讨论范围,在此不再赘述)。


3.反卷积

我们还是看一下这个图:

卷积神经网络CNN理论到实践(4)
图2.4: no padding

这个卷积的过程,其实相当于将input4×4=16)通过kernel(3×3)映射到了feature maps(2×2)。
我们现在想做的是,在保证这个卷积网络连接模式不变的情况下,可不可以将2×2的输出在映射回到4×4的输入?
这个操作叫做反卷积
反卷积有过很多的英文名:transposed convolution,backward convolution(直观上看,这似乎也是一个向后卷的过程,因此也有人称其为),deconvolutionfractionally strided convolutions.

需要注意的是,transposed convolution这个词很容易让人望文生义,翻译成“转置卷积”。事实上,反卷积一开始叫做deconvolution,但这个词容易让人理解为“卷积的逆”。因此实在很纠结,最后人们普遍使用transposed convolution来表述反卷积。


我们首先回顾一下上一节的矩阵C.
对于一个卷积网络,信息的流动是从输入层传到卷积层,这个过程叫做前向传播。与此同时,为了训练模型,我们也会将卷积层的输出产生的误差,沿着路径往回传,传到输入层,这个过程叫做后向传播
结合式子(2.1),我们不难理解,假如输出展开为向量记为Y(列向量),输入展开为向量记为X(列向量),那么卷积网络的前向传播为:

Y=CX(2.2)

因此这个卷积网络对应的结构如下图2.5所示(为了方便观查,我们这里只对输出的一个节点的边进行了表示,其他边没有画出来):

卷积神经网络CNN理论到实践(4)
图2.5

我们把C矩阵再写一遍,防止你忘记:
卷积神经网络CNN理论到实践(4)

很显然,式子(2.2)就是矩阵乘法,而C中的每一个元素,对应的是卷积网络中,对应位置边的权重。例如,Ci,j表示图2.4中第i个输出结点与第j个输入结点之间的边的权重。权重为0表示这两点之间没有边。这样我们不难理解:
Ci,j=yixj

你问我为什么?因为:
yi=jxjCi,j


这样一来,我们对于后向传播的计算就很清晰了:
首先我们已经从更深层的网络中得到误差:Lossy⃗ ,注意这是一个向量。

Lossy⃗ =Lossy1Lossy2Lossyn

这样,后向传播过程可以写为:
Lossxj=iLossyiyixj=iLossyiCi,j=Lossy⃗ TC:,j=CT:,jLossy⃗ (2.3)

Lossx⃗ =Lossx1Lossx2Lossxn=CT:,1Lossy⃗ CT:,2Lossy⃗ CT:,nLossy⃗ =CT:,1CT:,2CT:,nLossy⃗ =CTLossy⃗ (2.4)


综合式(2.2,2.4)得到前向传播和后向传播公式分别为:

Y=CX(2.5)

LossX=CTLossY(2.6)

其中Y,X分别为输出和输入矩阵铺展(flat)后的列向量。


所谓的反卷积,其实就是把原来的前向传播当做自己的后向传播,把原来的后向传播当做自己的前向传播。为了表明正常卷积与反卷积的关系,我们保持两个卷积的节点字母统一。这样正卷积与反卷积的关系可以用下图2.6表示:

卷积神经网络CNN理论到实践(4)

图2.6:kernel 定义了特定的卷积,
但是区别是正卷积还是反卷积,
我们则是看它是如何计算自己的前向过程和后向过程。
两者之间的差异如图所示
(画图很辛苦,打赏需谨慎:))

在这幅图中,为了让你能够对应好,我们的字母都是唯一的。但是希望你能够知道,反卷积中求得的X与diret convolution中的X不是严格相等的,而是近似。这个道理是很显然的,无需多做解释。


3.小结

本篇博文主要向大家详细介绍了离散卷积与矩阵乘法的关系,再次基础上,我们详细探讨了反卷积的操作。期间我们穿插了对前向传播和后向传播的介绍。并且用从图示到公式,从直观到逻辑,都对相关概念做了非常透彻的讲解。


卷积神经网络CNN理论到实践(5)


welcome!

Xiangguo Sun
[email protected]
http://blog.****.net/github_36326955

卷积神经网络CNN理论到实践(4)

Welcome to my blog column: Dive into ML/DL!

卷积神经网络CNN理论到实践(4)

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:

卷积神经网络CNN理论到实践(4)

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.


赏金将用于拉萨儿童图书公益募捐
社会公益,听IT人的声音

手机扫一扫,即可:
卷积神经网络CNN理论到实践(4)

附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助