「卷积」这个概念是「卷积神经网络」最为关键的概念之一,理解了卷积就相当于完成了八成的工作,再结合起神经网络就算吃透了「卷积神经网络」。但是网上很多人对「卷积」的解释过于佶屈聱牙,甚至很多人对「卷积神经网络」中的「卷积」一知半解就写了个回答,于是在此重新理解、总结「卷积神经网络」中的「卷积」。

卷积

Conv CV Simulation

卷积(Convolution)这一概念在图像处理、信号处理中广泛运用,在此引用《深度学习》一书的概念定义,再结合自己的理解来描述一遍。

假设我们正在用激光传感器追踪一艘宇宙飞船的位置。我们的激光传感器给出一个单独的输出 $x(t)$ ,表示宇宙飞船在时刻 $t$ 的位置。 $x$ 和 $t$ 都是实值的,这意味着我们可以在任意时刻从传感器中读出飞船的位置。

现在假设我们的传感器受到一定程度的噪声干扰。为了得到飞船位置的低噪声估计,我们对得到的测量结果进行平均。 显然,时间上越近的测量结果越相关,所以我们采用一种加权平均的方法,对于最近的测量结果赋予更高的权重。

我们可以采用一个加权函数 $w(a)$ 来实现,其中 $a$ 表示测量结果距当前时刻的时间间隔。 如果我们对任意时刻都采用这种加权平均的操作,就得到了一个新的对于飞船位置的平滑估计函数 $s$ :
$$s(t) = \int x(a)w(t-a)da$$
这种运算就叫做卷积。 卷积运算通常用星号表示:
$$s(t) = (x*w)(t)$$
卷积的本质是 加权平均 ,卷积的第一个参数(在这个例子中,函数 $x$ )通常叫做输入,第二个参数(函数 $w$ )叫做核函数。

内容来源:卷积网络 - 《深度学习》

放在计算机视觉,对于图像的卷积而言,如本节题图所示:将 卷积核图像 按规则相乘,得到卷积核处理过后的矩阵。

对于图像而言,我们会发现「滤波」和「卷积」十分相像,都是有一个卷积核(Filter),都要图像和卷积核进行操作,但是具体的实现有着细微的不同。比较明显的区别是,滤波的输入输出尺寸不变,而卷积的输出一般会小于输入。更加详细的可以看这篇图像卷积和滤波的区别博客,里面的解释很透彻。

对于图像的卷积,这里必须要引用一下 cs231n 的课程资料。很多人对卷积过程不理解,其实很大的原因是不清楚 卷积核输入输出 的关系。


cs231n 常规

我们可以看到输入是 7x7x3 的矩阵,然后有两个 Filter 分别是 W0 和 W1,每一个 Filter 有三层 Feature Map,最后输出是 3x3x2 的矩阵。

我们可以从这个例子中总结出:

  • 一个卷积核可能不止一层 feature map
  • 卷积核的 层数输入通道数 一致
  • 卷积核的 个数输出通道数 一致

理解了卷积核是一个立体的概念,一个卷积核除了 width, height 也有 depth 。
虽然每次卷积得到的是一个值,但是是从 Input ChannelsFeature Maps 中叠加得到的。

常规卷积

Normal Conv

我们理解了卷积的过程,那么我们就要动手对卷积的参数量进行计算,更加深刻的用数学语言去理解卷积的变化过程。在此,我们会对比 padding 的两种方式 samevalid ,进行对比记忆。


Udacity Course

注:因为 same 的输入输出长宽是一样的,所以只探讨的是 valid 的情况。

输入层(input layer)维度值为 W, 滤波器(filter)的维度值为 F (height * width * depth), stride 的数值为 S, padding 的数值为 P, 下一层的维度值可用如下公式表示: (W − F + 2P) / S + 1

1
2
new_height = (input_height - filter_height + 2 * P) / S + 1
new_width = (input_width - filter_width + 2 * P) / S + 1

例:H = height, W = width, D = depth

  • 我们有一个输入维度是 32x32x3 (HxWxD)
  • 20 个维度为 8x8x3 (HxWxD) 的卷积核
  • 高和宽的stride(步长)都为 2。(S)
  • padding 大小为 1 (P)
1
2
new_height = (32 - 8 + 2 * 1) / 2 + 1 = 14
new_width = (32 - 8 + 2 * 1) / 2 + 1 = 14

输出矩阵的深度与卷积核的数量一致,即 20
则参数量为 (8 * 8 * 3 + 1) * 20 = 3840(权值) + 20(偏置) = 3860 。(权值共享)

空洞卷积

Atrous Conv

一般在卷积之后我们会加一个「池化层」(Pooling)用于降低数据维度、减少参数计算量,同时可以增大后面神经元的感受野。但是由于池化过于简单粗暴,如最大值池化(MaxPooling)、均值池化(AvgPooling)等,因此传递到后面的信息有一定的失真,于是空洞卷积就应运而生了。

利用「空洞卷积核」进行「空洞卷积」(Atrous Convolution),在参数量不变的情况下扩大感受野面积,且不是简单粗暴的取极值或者均值。

卷积的过程和常规卷积一致,只是卷积核的不同。这种卷积方式不仅可以减少计算量加快运算,也可以代替池化层对数据进行更加友好地提取。

数据类型

我们理解了卷积的过程以及几种卷积方式,那么我们就要开始知道对什么数据进行卷积。下面的表格是我们用于卷积的数据类型,按照「维度」和「通道」对数据类型进行划分。

维度 单通道 多通道
1 维 音频波形:卷积的轴对应于时间。我们将时间离散化并且在每个时间点测量一次波形的振幅。 骨架动画 (skeleton animation) 数据:计算机渲染的 3D 角色动画是通过随时间调整「骨架」的姿势而生成的。在每个时间点,角色的姿势通过骨架中的每个关节的角度来描述。我们输入到卷积模型的数据的每个通道,表示一个关节关于一个轴的角度。
2 维 已经使用傅立叶变换预处理过的音频数据:我们可以将音频波形变换成 2 维张量,不同的行对应不同的频率,不同的列对应不同的时间点。在时间轴上使用卷积使模型等效于在时间上移动。在频率轴上使用卷积使得模型等效于在频率上移动,这使得在不同八度音阶中播放的相同旋律产生相同的表示,但处于网络输出中的不同高度。 彩色图像数据:其中一个通道包含红色像素,另一个包含绿色像素,最后一个包含蓝色像素。在图像的水平轴和竖直轴上移动卷积核,赋予了两个方向上平移等变性。
3 维 体积数据:这种数据一般来源于医学成像技术,例如 CT 扫描等。 彩色视频数据:其中一个轴对应着时间,另一个轴对应着视频帧的高度,最后一个对应着视频帧的宽度。

内容来源:卷积网络 - 《深度学习》

总结

对于「卷积」这个概念而言,工程实现上我们只需要理解这么多就可以了,足够我们使用。但是要对卷积过程进行优化和改进,我们必须要理解其公式,从而理解卷积核的训练过程。

比如 MSRA 通过在卷积公式中加一个可以学习的 $\delta p$ ,让卷积核有了自适应变形的效果,从而提升了模型的准确度(性能)。

参考资料

  1. Convolution Network - cs231n
  2. 可变形卷积网络:计算机新“视”界 - MSRA
  3. 变形卷积核、可分离卷积?卷积神经网络中十大拍案叫绝的操作。 - 知乎专栏
  4. Rethinking the Inception Architecture for Computer Vision
  5. Deformable Convolutional Networks
  6. Convolution arithmetic - Github