卷积的含义
正态分布
高尔顿板是弗朗西斯·高尔顿发明的一个很精巧的装置,用来描述正态分布,也称作梅花机(Quincunx),或者高尔顿钉板。工作原理是从入口处放进一个直径略小于两颗钉子之间的距离的小圆玻璃球,当小圆球向下降落过程中,碰到钉子后皆以1/2的概率向左或向右滚下,于是又碰到下一层钉子。如此继续下去,直到滚到底板的一个格子内为止。把许许多多同样大小的小球不断从入口处放下,只要球的数目相当大,它们在底板将堆成近似于正态分布(也称钟型分布)的密度函数图形。
卷积
以上面的高尔顿板为例,假设我们从高处放下一个小球,它下落后走出距离c的概率为多少呢?我们将这个行为进行分解(如下图),如果小球下落后首先走出距离a,然后以这个为起点再进行一次下放,小球走出了距离b,那么两次操作后小球总共走的距离为a+b=c,所以得到距离c的概率应该为 f(a)⋅g(b)(两个独立事件)。
让我们列举更具体的示例,假设我们想要的距离是3,第一次下落走了a=1,第二次下落走了b=2,所以总距离为3的概率为f(1)⋅g(2);但这种情况并非是唯一能达到总距离为3的情况,我们只要简单想想就能知道达到总距离为3的情况其实还有很多种,比如第一次a=0,第二次b=3,如下图:
但还有很多其它的可能,所以要得到距离为3的概率,我们需要考虑到所有可能的情况,然后加总起来:
... f(0)⋅g(3) + f(1)⋅g(2) + f(2)⋅g(1) ...
这其实就是多项式求和,如果以向量表示就是求向量的内积(或称点积),到这里我们就会发现往下推导出来的公式其实就是卷积的标准公式了;卷积其实与积分很类似,本质都是一种求和。
卷积在图像处理中的作用
卷积公式同样适用于高维数据,图像数据可以看成是一个二维函数,许多图像处理操作都用到卷积,将图像中某个区域的像素数据与一个称为卷积核的函数进行卷积,就能对该区域进行一些特殊处理。
模糊化图像
例如对图像数据平均乘以1/9,可以将图像模糊化,使用以下卷积核:
找轮廓(定位边界)
又例如通过对相邻的像素点取反,而清零其它区域,可以用来检测和定位图像中的轮廓,使用以下卷积核:
CNN中的卷积运算
卷积网络结构
上图我们可以看到卷积神经网络的结构,卷积层中由多个特征矩阵堆叠构成,卷积层进行的处理就是卷积运算,也相当于图像处理中的“滤波器运算”,进行特征提取。卷积层的每个特征矩阵我们称为深度切片,如果在一个深度切片中的所有权重都使用同一个权重向量,那么卷积层的前向传播在每个深度切片中可以看做是在计算神经元权重和输入数据体的卷积(这就是“卷积层”名字由来)。这也是为什么总是将这些权重集合称为滤波器(filter)(或卷积核(kernel)),因为它们和输入进行了卷积。如下图为对输入图像数据进行的卷积处理操作:
卷积与矩阵运算之间的关系
用矩阵乘法实现:卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。在神经网络中为了快速地进行卷积层运算,卷积层的常用实现方式就利用了点积的特点,将卷积层的前向传播变成一个巨大的矩阵乘法:
-
对输入数据的处理
在输入数据上,根据卷积核大小,将图像数据三个通道依次展开为一维数组,然后再连接为一个长的一维数组,再根据步幅,将输入数据中每个应用卷积核的地方都生成一个一维数组:
- 对卷积核的处理
- 矩阵计算
输入图像的局部区域被im2col操作拉伸为行。比如,如果输入是[227x227x3],要与尺寸为11x11x3的滤波器以步长为4进行卷积,就取输入中的[11x11x3]数据块,然后将其拉伸为长度为11x11x3=363的行向量。重复进行这一过程,因为步长为4,所以输出的宽高为(227-11)/4+1=55,所以得到im2col操作的输出矩阵X_col的尺寸是[363x3025],其中每行是拉伸的感受野,共有55x55=3,025个。注意因为感受野之间有重叠,所以输入数据体中的数字在不同的行中可能有重复。
卷积层的权重也同样被拉伸成列。举例,如果有96个尺寸为[11x11x3]的滤波器,就生成一个矩阵W_row,尺寸为[96x363]。
现在卷积的结果和进行一个大矩阵乘np.dot(W_row, X_col)是等价的了,能得到每个滤波器和每个感受野间的点积。在我们的例子中,这个操作的输出是[96x3025],给出了每个滤波器在每个位置的点积输出。
结果最后必须被重新变为合理的输出尺寸[55x55x96]。