4  第四章

MLP虽然逼近能力很强,但也不是无所不能的,例如对于图片数据,如果是一张电脑屏幕截屏,分辨率通常为1920 * 1080,那么像素个数就是2073600个。如果这两百多万个点都作为一个网络的输入,那这个网络参数数量可能就直接爆炸了。而且图像具有极强的局部相关性,一个像素点附近的像素存在很多重复信息,因此新的结构需要被引入,让网络变得更聪明。

4.1 一维卷积

一维卷积通常有如下定义(假设下标从1开始),对于序列\(x[n]\)(长度为\(N\))和卷积核\(h[k]\)(长度为\(K\)),卷积\(y[n]\)为:

\[ \begin{aligned} y[n]=x[n] * h[n] &= \sum_{k=1}^{K}h[k]·x[n-k+1] \\ &= \sum_{n=1}^{N}x[n]·h[k-n+1] \end{aligned} \tag{4.1}\]

以图示的形式展示,卷积就是滑动相乘的过程:

图 4.1: 一维卷积滑动相乘

然后这个过程也等价于移位相乘相加:

图 4.2: 一维卷积移位相乘相加

对于一维卷积,最直观的理解就是声音里的回声效果,正如 图 4.2 展示的那样,声音满足线性叠加性质,声音经过周围环境反射后,会有延迟和幅度衰减,分别对应着0填充和系数\(h_i\)

图 4.3: 原始音频与卷积处理后的波形对比

原始音频:

卷积后的声音:

描述一个卷积核通常有以下三个维度:卷积核大小、步长和膨胀率。

步长就是卷积核每次移动的距离,膨胀率是卷积核内元素的距离。

图 4.4: 卷积三要素

卷积的膨胀率是个很有意思的参数,可以把它理解为某种观察尺度,在保持参数和计算量不变的情况下,可以让卷积的感受视野(某层神经元能感受的输入范围)变大,获得更多的“全局视角”。

在卷积时,一个序列可以使用多个卷积核,这叫多通道卷积,每个卷积核可能承担不同的任务,例如卷积核1只关注局部信息,卷积核2通过设置膨胀率关注更大范围的信息,为了保证卷积后序列长度保持不变,通常使用一种叫填充的方法,填充就是在序列两端自动补0,防止越卷积序列长度越小。

图 4.5: 多通道卷积

4.2 二维卷积

一维序列通过多通道卷积后会变成二维序列,其列数也就是通道数等于卷积核的个数。而对于图片来说图片本身就是一个二维序列,它的值为每个像素点的大小。

同样二维卷积核大小也是二维的:

图 4.6: 二维卷积核

二维卷积的参数和一维卷积是一样的:卷积核大小、步长和膨胀率。二维卷积的顺序和人阅读文字一样,先从左上角对齐开始,根据步长向右开始卷积,当一行的卷积完成后,会根据步长向下移动到左下角下一次开始位置,重复这个过程直到完成所有行的卷积。

步长 S:
填充 P:
膨胀率 d:
输入 X (7×7) 卷积 S=1, P=0, d=1 输出 Y (5×5)
图 4.7: 二维卷积扫描过程(支持调节步长 \(S\)、填充 \(P\) 与膨胀率 \(d\)

图 4.7 中,可以清晰地观察到二维卷积在不同参数组合下的滑动行为。由此可以总结出二维卷积在输入图片长宽为 \((H_{\text{in}}, W_{\text{in}})\)、卷积核长宽为 \((K_h, K_w)\) 时的输出图片尺寸满足:

\[ \begin{aligned} H_{\text{out}} &= \left\lfloor \frac{H_{\text{in}} + 2P_h - K_{\text{eff}, h}}{S_h} \right\rfloor + 1 \\ W_{\text{out}} &= \left\lfloor \frac{W_{\text{in}} + 2P_w - K_{\text{eff}, w}}{S_w} \right\rfloor + 1 \end{aligned} \tag{4.2}\]

当引入膨胀率 \(d\) 时,等效卷积核跨度为 \(K_{\text{eff}} = K + (K - 1)(d - 1)\)

值得注意的是公式中的向下取整符号 \(\lfloor \cdot \rfloor\):当卷积核滑动到图像最右侧或最底部时,如果剩余的像素宽度不足以容纳一个完整的卷积核,标准卷积不会自动补零而是直接舍弃这块不完整区域。只有在明确指定了填充圈数 \(P\) 时,才会在边界显式补0参与计算。

那如果图片是彩色的呢,彩色图片有RGB三个颜色的通道,所以它有3个轴,但方法还是一样的,也是用一个立体的卷积核去卷积(同样也是按元素相乘),最后加总在一起得到一个卷积结果:

图 4.8: RGB图像卷积

同样二维卷积也可以多通道卷积,例如三个卷积核的三通道卷积:

图 4.9: 三通道卷积

多通道卷积后的东西是啥呢?其实可以看出是某种“特殊的图片”,虽然 图 4.9 卷积后看起来像是个RGB图片,但卷积允许四、五、六…任意数量通道的卷积。

那多通道卷积后的结果再想卷积怎么办呢?可以类比着上图的卷积核,只是厚度变成当前通道数。

4.3 卷积层

前面两个章节介绍的只是卷积运算,卷积层在卷积运算的基础上,也就是计算出卷积结果后还会再经过一个激活函数:

图 4.10: 卷积层

如果不加激活函数,无论堆叠10层还是100层,数学上都可以被合并等价为单层的一个超大线性卷积核,网络将彻底丧失深度带来的复杂特征抽取能力。

那卷积为什么有效呢?首先卷积能缩小尺寸,图片可以越卷越小,这对于计算量的减少有很大的贡献,其次就是卷积确实能提取特征,例如垂直或水平方向的纹理特征: \[ K_{\text{垂直}} = \begin{bmatrix} -1 & 0 & +1 \\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{bmatrix}, \quad K_{\text{水平}} = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ +1 & +2 & +1 \end{bmatrix} \]

以垂直卷积核为例,由于其左列为负、右列为正,在平坦区域加权求和相互抵消为 0;而当遇到“左暗右亮”或“左亮右暗”的纵向分界线时,就会产生剧烈的响应值。

图 4.11: 使用垂直与水平卷积核提取图像方向纹理特征

一般在卷积层之后,人们会进行一次池化操作然后才进行下一次的卷积,池化层的作用在于挑出最强烈的信号,丢弃周围无用的冗余。池化操作类似于卷积操作,它也有一个池化核。

例如平均池化和最大池化,平均池化会计算核内均值,最大池化提取核内最大值:

图 4.12: 平均池化核最大池化

但是和卷积层不同的是,池化层是对每个通道单独池化,池化后保持通道数不变(卷积的通道数与卷积核的个数有关),而且池化的默认步长通常是池化核的大小,以保证不重复池化。

池化和卷积另一个不同是,池化核是固定的,当选择平均池化或最大池化后,池化核就不变了,但是卷积核是通过优化算法学习来的,通过迭代过程可以让网络自己学习到最佳表征的卷积核。

4.4 连接到MLP层

还有个问题,就是卷积后的多通道特征要怎么接入全连接层?因为至少他俩在维度上看起来就不一样,一个是二维的图像,另一个是一维的向量。目前常用的方法有两个,分别是展平和全局平均池化。

展平就是假设每个通道的尺寸是\(H \times W\),那每个通道展平后就有\(H·W\)个向量,如果一共有\(N\)个通道,就让这些通道的所有展平的向量按顺序连接,就会产生一个长为\(N·H·W\)的一维向量,然后把这个向量输入到全连接层。

全局平均池化就是取每个通道的均值作为输入,\(N\)个通道只会产生长度为\(N\)的一维向量,然后把这个向量输入到全连接层。

图 4.13: 展平与全局平均池化