DL 入门:再次理解「卷积」过程
「卷积」这个概念是「卷积神经网络」最为关键的概念之一,理解了卷积就相当于完成了八成的工作,再结合起神经网络就算吃透了「卷积神经网络」。但是网上很多人对「卷积」的解释过于佶屈聱牙,甚至很多人对「卷积神经网络」中的「卷积」一知半解就写了个回答,于是在此重新理解、总结「卷积神经网络」中的「卷积」。
卷积
卷积(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 的课程资料。很多人对卷积过程不理解,其实很大的原因是不清楚 卷积核
和 输入输出
的关系。
我们可以看到输入是 7x7x3 的矩阵,然后有两个 Filter 分别是 W0 和 W1,每一个 Filter 有三层 Feature Map,最后输出是 3x3x2 的矩阵。
我们可以从这个例子中总结出:
- 一个卷积核可能不止一层 feature map
- 卷积核的
层数
和输入通道数
一致 - 卷积核的
个数
和输出通道数
一致
理解了卷积核是一个立体的概念,一个卷积核除了 width, height 也有 depth 。
虽然每次卷积得到的是一个值,但是是从 Input Channels
个 Feature Maps
中叠加得到的。
常规卷积
我们理解了卷积的过程,那么我们就要动手对卷积的参数量进行计算,更加深刻的用数学语言去理解卷积的变化过程。在此,我们会对比 padding 的两种方式 same
和 valid
,进行对比记忆。
注:因为 same
的输入输出长宽是一样的,所以只探讨的是 valid
的情况。
输入层(input layer)维度值为 W
, 滤波器(filter)的维度值为 F (height * width * depth)
, stride 的数值为 S
, padding 的数值为 P
, 下一层的维度值可用如下公式表示: (W − F + 2P) / S + 1
。
1 | new_height = (input_height - filter_height + 2 * P) / S + 1 |
例:H = height, W = width, D = depth
- 我们有一个输入维度是 32x32x3 (HxWxD)
- 20 个维度为 8x8x3 (HxWxD) 的卷积核
- 高和宽的stride(步长)都为 2。(S)
- padding 大小为 1 (P)
1 | new_height = (32 - 8 + 2 * 1) / 2 + 1 = 14 |
输出矩阵的深度与卷积核的数量一致,即 20
。
则参数量为 (8 * 8 * 3 + 1) * 20 = 3840
(权值) + 20
(偏置) = 3860 。(权值共享)
空洞卷积
一般在卷积之后我们会加一个「池化层」(Pooling)用于降低数据维度、减少参数计算量,同时可以增大后面神经元的感受野。但是由于池化过于简单粗暴,如最大值池化(MaxPooling)、均值池化(AvgPooling)等,因此传递到后面的信息有一定的失真,于是空洞卷积就应运而生了。
利用「空洞卷积核」进行「空洞卷积」(Atrous Convolution),在参数量不变的情况下扩大感受野面积,且不是简单粗暴的取极值或者均值。
卷积的过程和常规卷积一致,只是卷积核的不同。这种卷积方式不仅可以减少计算量加快运算,也可以代替池化层对数据进行更加友好地提取。
数据类型
我们理解了卷积的过程以及几种卷积方式,那么我们就要开始知道对什么数据进行卷积。下面的表格是我们用于卷积的数据类型,按照「维度」和「通道」对数据类型进行划分。
维度 | 单通道 | 多通道 |
---|---|---|
1 维 | 音频波形:卷积的轴对应于时间。我们将时间离散化并且在每个时间点测量一次波形的振幅。 | 骨架动画 (skeleton animation) 数据:计算机渲染的 3D 角色动画是通过随时间调整「骨架」的姿势而生成的。在每个时间点,角色的姿势通过骨架中的每个关节的角度来描述。我们输入到卷积模型的数据的每个通道,表示一个关节关于一个轴的角度。 |
2 维 | 已经使用傅立叶变换预处理过的音频数据:我们可以将音频波形变换成 2 维张量,不同的行对应不同的频率,不同的列对应不同的时间点。在时间轴上使用卷积使模型等效于在时间上移动。在频率轴上使用卷积使得模型等效于在频率上移动,这使得在不同八度音阶中播放的相同旋律产生相同的表示,但处于网络输出中的不同高度。 | 彩色图像数据:其中一个通道包含红色像素,另一个包含绿色像素,最后一个包含蓝色像素。在图像的水平轴和竖直轴上移动卷积核,赋予了两个方向上平移等变性。 |
3 维 | 体积数据:这种数据一般来源于医学成像技术,例如 CT 扫描等。 | 彩色视频数据:其中一个轴对应着时间,另一个轴对应着视频帧的高度,最后一个对应着视频帧的宽度。 |
内容来源:卷积网络 - 《深度学习》
总结
对于「卷积」这个概念而言,工程实现上我们只需要理解这么多就可以了,足够我们使用。但是要对卷积过程进行优化和改进,我们必须要理解其公式,从而理解卷积核的训练过程。
比如 MSRA 通过在卷积公式中加一个可以学习的 $\delta p$ ,让卷积核有了自适应变形的效果,从而提升了模型的准确度(性能)。