前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解卷积

理解卷积

作者头像
花落花飞去
发布2018-01-29 20:34:41
2.1K0
发布2018-01-29 20:34:41
举报
文章被收录于专栏:人工智能人工智能

原文作者:Christopher Olah

原文地址:http://colah.github.io/posts/2014-07-Understanding-Convolutions/

之前的文章中,我们在没有提及任何高深数学的前提下,初步认识了卷积神经网络。不过更进一步的,我们需要去理解卷积。

如果我们只是想了解卷积神经网络,那么大致理解卷积便已足矣。但这个系列的目的是要引领我们走到卷积神经网络的前沿,并进一步探索新的选择。要做到这一点,我们需要非常深入地去理解卷积。

借助一些例子,我们能让卷积变得通俗易懂。

落球的启迪

假设我们从某一高度扔一个小球到地上,小球在地上只能在一个维度上移动。如果球落下后,再从落点上方把球扔下,那么球总计移动的距离c是多少?

让我们分解这个问题。在首次下落后,小球会以概率f(a)落在距离起点a单位远的地方,其中f是概率分布。

之后我们重新拾起并从另一高度抛出小球,那么其落在距起点b单位远的概率为g(b),鉴于其从不同的高度落下,g可能是一个不同的概率分布。

如果我们固定第一次下落的结果,即我们知道了小球移动的确切距离a,那么第二次移动的距离b也被固定了下来,因为总距离c=a+b是确定的。并且该事件发生的概率是f(a)\cdot g(b)1

来看一个离散情况下的具体例子。我们想让总距离c=3。如果第一次小球滚了a=2,那么第二次必定是b=1,因为必须满足总距离a+b=3。那么该情况发生的概率是f(2)\cdot g(1)

31203ab3

上述情况的概率分别为f(1)\cdot g(2)f(0)\cdot g(3)

要找到总距离为c的总可能性,我们不能只考虑某一种得到c的方式,而是要考虑所有的将c划分为a,b两次下落的方式,并将各种方式的可能性累加起来。

...~~ f(0)\cdot g(3) ~+~ f(1)\cdot g(2) ~+~ f(2)\cdot g(1)~~...

我们已经知道每种a+b=c对应的概率为f(a)\cdot g(b),所以只需累加所有可能的a+b=c的情况,便可得到如下的总可能性:

\sum_{a+b=c} f(a) \cdot g(b)

原来我们所做的正是卷积!特别的,fg的卷积在c处被定义为

(f\ast g)(c) = \sum_{a+b=c} f(a) \cdot g(b)

如果代入b=c-a,我们就能得到

(f\ast g)(c) = \sum_a f(a) \cdot g(c-a)

这便是卷积的标准定义2。

为了更具体地说明上式,我们可以从小球的落点来考虑。在第一次下落后,小球先会以概率f(a)落在一个中途位置a。既然其先落在了a,那么它之后落在c的概率便是g(c-a)

为了得到卷积,我们需要考虑所有的中途位置。

可视化卷积

有一个不错的小技巧可以帮助人们更容易地思考卷积。

首先假设一个球落到距起点x处的概率为f(x),那么其从落点x处返回到起点的概率为f(-x)

如果我们知道小球在第二次下落后落到c处,那么其之前在a处的概率是多少呢?

故之前位置为a的概率是

g(-(a-c)) = g(c-a)

如果球最终落到c,现在来考虑所有可能的中途位置的概率。我们已经知道小球第一次下落到中途位置a的概率是f(a),也知道从a出发最终落到c的概率是g(c-a)

累加所有的a,我们便得到了卷积。

这种方法的好处在于,我们能够用图画来可视化一个卷积在c处的求值过程。这能帮助我们从整体上去理解卷积。

例如,我们可以看到,当两个分布对齐时,卷积达到最大值

以及随着分布间交集的减少,卷积也会变小

若在动画中应用该技巧,则能够可视化地来理解卷积。

如下示的动画,我们能够可视化两个框函数的卷积。

来自维基百科
来自维基百科

持有这个观点的话,很多事情都会变得更加直观。

现在让我们思考一个非概率性的例子。卷积有时也被用于音频处理。比如我们可以用一个双尖峰函数来创造回声效果。当这个双尖峰函数滑动的时候,一个尖峰会首先到达某个时间点,并将该处信号添加到声音输出中,而另一个尖峰也随之到达并输出带有延迟的信号副本。

高维卷积

卷积是一个极其常见的想法,当然我们也能在更高的维度上使用卷积。

让我们再来看看小球掉落的例子。现在,当小球掉落时,其在地面上可以有两个维度的位置变化。

那么还是像之前那样做卷积

(f\ast g)(c) = \sum_{a+b=c} f(a) \cdot g(b)

唯一不同的是,现在a,b,c都是向量;写得更详细一点就是

(f\ast g)(c1, c2) = \sum_{\begin{array}{c}a1+b1=c1\\a2+b2=c2\end{array}}f(a1,a2) \cdot g(b1,b_2)

或者是按照标准定义的写法

(f\ast g)(c1, c2) = \sum_{a1, a2} f(a1, a2) \cdot g(c1-a1,~ c2-a_2)

就像一维的卷积那样,我们可以把二维卷积理解成一个函数在另一个函数上滑动,然后相乘并累加。

二维卷积的一个常见应用便是图像处理,因为我们可以把一张图片视为一个二元函数。很多重要的图像变换都是将图像和一个小的局部函数(称为核,kernel)做卷积来实现的。

来自River Trail文档 http://intellabs.github.io/RiverTrail/tutorial/
来自River Trail文档 http://intellabs.github.io/RiverTrail/tutorial/

核函数滑动到原图的每个位置,并加权累加其所覆盖的像素值来作为新的像素点。

比如通过对3\times 3区域内的像素取平均值,我们能够模糊一幅图像。而要做到这一点,核函数对区域内每个像素的取值为1/9

Gimp文档 http://docs.gimp.org/en/plug-in-convmatrix.html
Gimp文档 http://docs.gimp.org/en/plug-in-convmatrix.html

我们还知道,通过在两个相邻的像素点上取值-11,而在另外置0,可以实现边缘检测。这相当于我们在对两个相邻的像素点做减法,当相邻的像素相似的时候,得到的结果接近零;但在垂直于边缘的方向上,相邻的像素差别会变得很大。

Gimp文档 http://docs.gimp.org/en/plug-in-convmatrix.html
Gimp文档 http://docs.gimp.org/en/plug-in-convmatrix.html

gimp文档中还有很多其他的例子

卷积神经网络

所以卷积到底是怎么和卷积神经网络扯上关系的呢?

让我们考虑一个一维卷积层,其输入\{x_n\}输出\{y_n\},就和我们在之前那篇文章中讨论过的那样:

就像我们看到的那样,我们能够用输入项来表示输出

y_n = A(x_{n}, x_{n+1}, ...)

一般来说,A会是一个多神经元,不过这里暂时先把它当做是个单神经元。

回忆一下,神经网络中一个典型的神经元是长这样的:

\sigma(w_0x_0 + w_1x_1 + w_2x_2 ~...~ + b)

其中x_0,x_1,...是输入,而权重w_0,w_1,...则描述了神经元是如何连接到输入的。负权重意味着输入抑制了神经元的发射,而正权重则激励其发射。权重是神经元的核心,其控制着后者的行为3。当我们说多重神经元是一样的,等价于说他们的权重是一样的。

这便是神经元的连线,其描述了所有的权重以及相同性,而这些都会通过卷积来处理。

通常来讲,我们会一次性去描述某一层上全部的神经元,而不是单个地去分别描述。技巧在于使用权重矩阵W

y = \sigma(Wx + b)

比如,我们有

y_0 = \sigma(W_{0,0}x_0 + W_{0,1}x_1 + W_{0,2}x_2 ...)\\y_1 = \sigma(W_{1,0}x_0 + W_{1,1}x_1 + W_{1,2}x_2 ...)

矩阵的每一行都描述了一个神经元到其输入的权重

回到卷积层上来看,因为存在着同一神经元的多个拷贝,所以很多权重都出现在了多个位置上。

这等价于方程:

y_0 = \sigma(W_0x_0 + W_1x_1 -b)\\y_1 = \sigma(W_0x_1 + W_1x_2 -b)

尽管通常来讲,一个权重矩阵会通过不同的权重来将每个神经元连接到其输入

W = \left[\begin{array}{ccccc} W_{0,0} & W_{0,1} & W_{0,2} & W_{0,3} & ...\\W_{1,0} & W_{1,1} & W_{1,2} & W_{1,3} & ...\\W_{2,0} & W_{2,1} & W_{2,2} & W_{2,3} & ...\\W_{3,0} & W_{3,1} & W_{3,2} & W_{3,3} & ...\\... & ... & ... &... & ...\\ \end{array}\right]

但像之前所说的卷积层矩阵却看起来很不一样。相同的权重出现在了很多位置上;以及由于单个神经元并没有连接很多的输入,所以矩阵中有很多零

W = \left[\begin{array}{ccccc} w_0 & w_1 & 0 & 0 & ...\\ 0 & w_0 &w_1 & 0 & ...\\ 0 & 0 & w_0 & w_1 & ...\\ 0 & 0 & 0 & w_0 & ...\\... & ... & ... & ... & ...\\ \end{array}\right]

与如上所示的矩阵相乘等价于和[...0, w_1, w_0, 0...]做卷积,这个在不同位置上滑动的函数对应着这些位置上的神经元。

那么二维卷积层又是如何呢?

一个二维卷积层上的连线对应着一个二维卷积。

回想下之前用卷积来检测图像边缘的例子,我们通过滑动内核来将其应用于每一小块覆盖的图像上。就像这样,一个卷积层能够把一个神经元应用到图像上的每一块覆盖。

结论

在这篇文章中,我们介绍了很多数学工具,尽管我们从中的收获可能并不明显。卷积显然是概率论和计算机图形学中的一个有用工具,但我们用卷积能从卷积神经网络中获得些什么呢?

第一个好处在于我们能有一些很强大的语言来描述网络的连线。我们目前处理的例子还不够复杂到足以清晰地体现出这个好处,但卷积确实能够为我们摆脱掉大量的簿记工作。

此外,卷积在实现上有着显著的优势,很多库都提供了高效率的卷积例程。更进一步的,尽管卷积表面上看起来是O(n^2)的,但通过一些深入的数学分析,可以将其优化到O(n\log(n))的实现复杂度。我们会在以后的文章中更详细地讨论这个问题的细节。

事实上,GPU上高性能并行卷积的实现,对于计算机视觉领域的最新进展至关重要的。

本系列的下一篇文章

本文是“卷积神经网络及其推广”系列的一部分。前两篇文章对于熟悉深度学习的人来说,不过是个小小回顾;不过之后的文章应该能够引发所有人的兴趣。要想获得最新资讯,请订阅作者的RSS摘要!

请在下方或旁边留言,想要pull requests可以到github

致谢

我十分感激Eliana Lorch对卷积的广泛讨论和对本文写作的帮助

我也很感谢Michael Nielsen和Dario Amodei的评论和支持。

1:

我们想要得到求第一次滚动a单位和第二次滚动b单位的概率。概率分布 P(A)=f(a)P(b)=g(b)是独立的,且分布都以0为中心,故P(a,b)=P(a)\ast P(b)=f(a)\cdot g(b)

2:

我以前从来没见过这个看起来不错非标准定义。在之后的文章中,我们会发现这种定义非常有用,因为其能推广到新的代数结构。并且它还使得卷积的很多代数性质变得十分明显。

比如说,卷积遵循交换律,即f\ast g = g \ast f,为什么呢?

\sum_{a+b=c} f(a) \cdot g(b) ~~=~ \sum_{b+a=c} g(b) \cdot f(a)

卷积还遵循结合律,即(f\ast g)\ast h = f\ast (g\ast h),因为

\sum_{(a+b)+c=d} (f(a) \cdot g(b)) \cdot h(c) ~~=~ \sum_{a+(b+c)=d} f(a) \cdot (g(b) \cdot h(c))

3:

关于神经元的触发条件还存有偏颇,但这里的解释更为简单,以及我不想把它混在这一节中来讨论

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 落球的启迪
  • 可视化卷积
  • 高维卷积
  • 卷积神经网络
  • 结论
  • 本系列的下一篇文章
  • 致谢
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档