Understanding Convolutions


卷积神经网络:Understanding Convolutions

译自:http://colah.github.io/posts/2014-07-Understanding-Convolutions/

写在前面

       卷积运算是一个产生滤波效果的计算,能够有效的提取图像的各类特征,比如边缘,颜色,纹理等等。更促进了神经网络的发展,卷积神经网络应运而生。我们不必再搞特征工程来为BP神经网络提供输入而绞尽脑汁,而是直接通过卷积算子来学习哪些特征是对神经网络任务有用的,这也是深度学习和传统机器学习的一个区别。卷积运算很简单,怎么理解卷积的原理呢?偶然发现了一篇博客,让我有种醍醐灌顶的感觉,我翻译了原文章并结合了自己的理解,写了这篇博客。

1 一维抛球的概率问题

  想象一下我们把一个小球从某个高度抛下,让它在一维的轴上移动。如果你抛下小球两次,小球有多大的可能性落在距离原始位置cc个单位的距离呢?

  我们分解下两次抛球的过程,第一次抛球,它落在了距离原始位置aa单位的距离,相应的概率为f(a)f(a)ff是概率分布函数。

  基于第一次抛球的结果,在小球第一次落在的位置,我们捡起小球拿到某个高度再次抛下,距离上次落在位置为bb个单位的距离的概率为g(b)g(b),其中g可能是一个不同与ff的概率分布函数,因为两次抛球的高度可能不一样,所以小球下落位置的概率是和抛下的高度相关的概率分布函数。

  如果我们固定第一次下落的结果,已知第一次小球落下的距离就是aa个单位,那么为了让小球能够跑到距离为cc个单位的位置,假设第二次抛球的结果也是固定的b个单位距离,那么 a+b=ca+b=c。所以这个事件发生的概率就是 f(a)g(b)f(a) \cdot g(b)

  我们思考一个离散的随机事件,我们想让球落在距离c=3的位置。如果我们第一次抛球的距离是a=2a=2,那么为了让总距离a+b=3a+b=3,第二次抛球的距离就是b=1,这个事件的概率就是 f(2)g(1)f(2) \cdot g(1)

  然而这个事件发生是为了让最终小球的落点cc距离为3的一种情况而已,小球也可以第一次抛下的距离为1,第二次抛下距离为2,或者第一次抛下距离为0,第二次抛下的距离为3,都能够满足两次小球抛下的距离为3的事件发生,那么这两个事件发生的概率就是 f(1) cdotg(2)f(1) \ cdot g(2)f(0)g(3)f(0) \cdot g(3)

  为了发现小球两次抛下达到距离c的全部可能性,我们不能只考虑其中的一种情况。我们应该考虑小球两次下抛到达距离c的所有可能的情况。

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

  既然我们已经知道了每种情况a+b=ca+b=c相应的概率是f(a)g(b)f(a) \cdot g(b),那么对于所有的a+b=ca+b=c的情况我们可以用一个求和的公式来表示事件发生总体的概率。

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

  其实这里就是一个概率卷积运算!详细的说,这个卷积运算是由表征函数ff和表征函数gg用来估计函数cc的,可能有人对概率卷积不是很熟悉,其实可以理解为通过两个函数依照一定的概率生成第三个函数的运算过程,定义如下:

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

  我们用b=cab=c-a,便可以得到标准的卷积定义:

(fg)(c)=a+b=cf(a)g(ca)(f*g)(c)=\sum_{a+b=c}{f(a) \cdot g(c - a)}

  更具体一点的,我们可以考虑参照小球下落的每一个可能的位置。第一次抛下之后,小球在中间过程下落的位置为aa的概率是f(a)f(a),如果小球的落点是aa,那么第二次小球落在cc的概率就是g(ca)g(c-a)了。

  为了得到概率卷积,我们推广到中间结果(小球第一次下落的结果)的所有情况。

2 卷积可视化

  可视化卷积是一个非常不错的技巧来帮助我们更容易的思考卷积,首先我们先观察下图,假设一个小球落下的位置距离xx的发生概率是f(x)f(x),然后我们从距离原始位置xx处抛下小球,那么它落回到原点的概率为f(x)f(-x)

  如果我们已知小球在第二次下落的距离是cc是一个事件CC,那么如何得到第一次小球下落的位置是aa的条件下事件CC发生的概率呢?这是我们这个环节讨论的重点。

  显然在第一次小球下落位置为aa的条件下,事件CC发生的概率为g((ac)=g(ca))g(-(a-c)=g(c-a))

  现在我们剖析一下整个事件CC的过程,我们考虑事件CC每一种可能出现的中间情况,我们知道第一次小球下落到位置aa的概率为f(a)f(a),我们也知道从aa位置开始进行第二次下落时候的概率为g(ca)g(c-a),而事件CC发生的概率为f(a)g(ca)f(a)g(c-a)

  对所有的第一次小球下落的结果aa进行求和,我们就得到了概率卷积。

  这样做的一个好处是我们能够在一副图上看到一个卷积的估计值cc的过程。通过固定上半部分,移动下半部分,我们能够估计值cc,也能让我们理解整个概率卷积的过程。

  两个分布对齐的时候我们能够很清楚的看到他们的峰值,也就是概率最大值的位置。这里所谓的分布对齐其实就是小球两次下落后的位置为00的事件。

  当缩小两个分布的交集的时候,我们会得到整个事件更小的概率。也就是在小球实验中我们的距离cc特别大,导致整个CC事件发生的概率也特别小。

  总结一下小球实验的结论和相应的思考,首先小球实验说明了如何用两个分布函数f(x)f(x)g(x)g(x)来估计cc值的过程,这个过程我们能够直观的发现两个分布如果交集越多,那么CC事件发生的概率相应的也就越大,因为小球每次下落概率最大的位置其实是和原来位置相同的,也就是分布的均值位置,位置越远相应的概率也就越小。这时再来思考卷积,f(x)f(x)可以理解为卷积核,而g(x)g(x)可以理解为图像,而CC事件就是我们得到相应的feature map,概率最大位置就是卷积核要提取的特征,当然图像卷积是二维的,接下来我们就介绍高维度的卷积运算。

  下面我们来看一下通过两个盒子函数做卷积的过程,也能够帮助我们理解卷积在特征提取过程中是如何发挥作用的。

  通过观察上图,很多的事情就变的更加直观了。
  现在我们考虑一个非概率的例子,卷积有时候被用在语音的处理。例如一个方程有两个峰值,其他的都是0,用来创造声音。当我们用这个双峰值函数滑动时,一个峰值首先击中一个点,将该信号添加到输出声音中,然后,另一个尖刺紧随其后,添加第二个延迟复制,就会产生魔音效果。

3 更高维度的卷积

  卷积是一个很广泛的概念。我们也能够在更高的维度上使用卷积。
  让我们思考一个二维平面抛小球的例子,现在小球下落的位置不是一维的,而是一个二维的平面。

  高维卷积的定义和之前一维卷积的定义大体是一致的:

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

  但是现在的aabbcc是向量了,所以更准确的定义:

(f*g)(c_{1},c_{2})=\sum_{a_{1}+b_{1}=c_{1} \atop a_{2}+b_{2}=c_{2}}{f(a_{1},a_{2}) \cdot g(b_{1},b_{2})}

  转化为标准的卷积定义为:

(fg)(c1,c2)=a1,a2f(a1,a2)g(c1a1,c2a2)(f*g)(c_{1},c_{2})=\sum_{a_{1},a_{2}}{f(a_{1},a_{2}) \cdot g(c_{1} - a_{1},c_{2}-a_{2})}

  和一维卷积的思路一样,我们可以想象二维卷积作为一个函数滑动在另一函数上面,乘积并做和。
  一个普遍的卷积应用就是图像处理技术,还有卷积神经网络的特征提取层。我们可以把图像想象成一个二维的函数。很多重要的图像变换都是卷积运算的结果,可以通过一个很小的叫做“kernel”的函数来对图像做卷积操作。

  这个卷积核会在图像的每个位置进行滑动运算并且对每个位置计算出一个相应于卷积核区域的像素值相乘相加得到一个新的像素值,由这些像素值组成的新图像就是featureMap。

  例如,通过一个3x3的均值像素块,我们可以实现对一个图像的模糊。我们先要构造一个3x3的卷积核,每个值是1/9。

  我们也可以通过改变卷积核相邻元素的值为1和-1并且其他值都为0来检测图像的边缘。这样的卷积运算相当于计算两个临近元素的差值。当两边的像素值是相似的时候,计算结果会接近于0。而在垂直方向的边缘值是非常不同的。

4 卷积神经网络

  所以卷积运算和卷积神经网络有着怎样的渊源呢?

  先考虑一个输入时xn{x_{n}}并且输出是yn{y_{n}}的一维卷积层。

  基于我们之前的理解,我们可以描述输入和输出的关系。

yn=A(xn,xn+1,...)y_{n}=A(x_{n}, x_{n+1}, ...)

  通常来说,A可以是多个神经元。但是现在假设A是一个单个神经元。

  回想一下在一个神经网络中一个典型的神经元可以被以如下形式表述:

σ(w0x0+w1x1+w2x2...+b)\sigma(w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2}... + b)

  其中x0x_{0}x1x_{1}…是输入。权重值,w0w_{0}w1w_{1}, … 表述了神经元是如何与输入进行连接的。如果权重是一个负值那表示这个输入被神经元抑制了,而一个正值的权重就是激活了这个输入,权重值是神经元的核心,控制着神经元的行为。说多个神经元是相同的等于说就是权重值是相同的。
权重是神经元的连接,表述全部的权重值并且哪些是一致的,卷积神经网络会帮我们解决这个问题。
比起一个一个的描述单个神经元,我们可以在一个神经网络层中一次描述全部的神经元,这个技巧是构建一个权重矩阵,WW

y=σ(Wx+b)y=\sigma(Wx+b)

  例如,我们有:

y0=σ(W0,0x0+W0,1x1+W0,2x2...)y_0=\sigma(W_{0,0}x_0+W_{0,1}x_1+W_{0,2}x_2...)

y1=σ(W1,0x0+W1,1x1+W1,2x2...)y_1=\sigma(W_{1,0}x_0+W_{1,1}x_1+W_{1,2}x_2...)

  矩阵WW的每一行代表连接输入和一个神经元的权重。

  回到卷积层,我们发现很多相同的神经元会被多次复制,许多权重在多个位置出现,这些权重是相同的,这也就是卷积神经网络中权值共享的概念。

  用公式表示:

y0=σ(W0x0+W1x1b)y_0=\sigma(W_{0}x_0+W_{1}x_1-b)

y1=σ(W0x1+W1x2b)y_1=\sigma(W_{0}x_1+W_{1}x_2-b)

  所以,正常来说一个连接所有输入到每个不同权值的神经元的权重矩阵是这样的(每个神经元都与所有的输入连接):

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

  下面的矩阵是一维卷积的权值分布,权值矩阵和上面看到的完全不同。相同的权重值出现在一串位置上。由于神经元和许多输入没有连接,所以权值矩阵很多位置都是0,对应上面的一维卷积示意图。

W=[W0W100...0W0W10...00W0W1...000W0..................]W=\left[ \begin{matrix} W_{0} & W_{1} & 0 & 0 & ...\\ 0 & W_{0} & W_{1} & 0 & ...\\ 0 & 0 & W_{0} & W{1} & ...\\ 0 & 0 & 0 & W{0} & ...\\ ... & ... & ... & ... & ... \end{matrix} \right]

  上面的矩阵代表了同样的卷积运算重复多次,每行代表一次卷积运算,对应的卷积核就是[...0,w1,w0,0...][...0,w_1,w_0,0...]。这个卷积核(函数)滑动到不同的位置表示在那些位置有神经元与输入连接。

  二维卷积是什么样子呢?

  二维卷积的卷积层相应的需要一个二维的卷积核函数。

  思考一个用卷积核检测图像边缘的例子,像上图一样,通过滑动卷积核并且在每个块上进行计算。同样的,卷积层将应用一个二维的神经元(卷积核)应用在图像的每一块上。

5 结论

  在这篇博客文章里面我们介绍了很多数学的机理,但是我们可能不会明显的感觉到获得了什么。卷积在概率理论和计算机图形学显然是一个有用的工具,但是就卷积神经网络而言,卷积的优势是什么呢?

  第一个优势就是我们有一些非常有力的语言来描述网络的连接。到目前为止,我们所处理的例子还不够复杂,不足以明显的体会到这种好处,但是卷积将使我们摆脱大量令人不快的簿记工作。

  其次,卷积带来了显著的实现优势。许多库提供了高效的卷积实现例程。此外,原生的卷积运算的复杂度为O(n2)O(n^2),使用一些相当深刻的数学见解后可以让卷积以O(nlog(n))的时间复杂度来执行。

  实际上,在GPU上执行高效的卷积并行运算对于计算机视觉的发展来说是很有必要的。

6 参考

[1]http://colah.github.io/posts/2014-07-Conv-Nets-Modular/

Big things have small beginnings.