卷积神经网络(convolutional neural network, CNN)

252 阅读6分钟

1.卷积运算

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

现在假设我们的传感器含有噪声。为了得到飞船位置的低噪声估计,我们对得到的测量结果进行平均。显然,时间上越近的测量结果越相关,所以我们采用一种加权平均的方法,对最近的测量结果赋予更高的权值,我们可以采用一个加权函数w(a) 来实现,其中 a 表示测量结果据当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作,就得到了对于飞船位置的连续估计函数 ss(t)=x(a)w(ta)das(t)=\int_{-\infty }^{\infty } x(a)w(t-a)da

激光传感器能够在任意时刻给出测量结果的想法是不现实的。一般地,当我们用计算机处理数据时,时间会被离散化,传感器会给出特定时间间隔的数据。所以比较现实的的假设是传感器每秒给出一次测量结果,这样,时间 t 只能取整数值。如果我们假设 x 和 w 都定义在整数时刻 t 上,就得到了离散形式的卷积:s(t)=a=x(a)w(ta)s(t)=\sum_{a=-\infty }^{\infty } x(a)w(t-a)

卷积是对两个实值函数(real-valued function)的一种数学运算。 (实值函数:值域在实数范围内的函数)

卷积运算公式:s(t)=(xw)(t)s(t)=(x*w)(t)

连续形式的卷积:s(t)=x(a)w(ta)das(t)=\int_{-\infty }^{\infty } x(a)w(t-a)da

离散形式的卷积:s(t)=a=x(a)w(ta)s(t)=\sum_{a=-\infty }^{\infty } x(a)w(t-a)

在卷积神经网络的术语中,卷积运算公式s(t)=(xw)(t)s(t)=(x*w)(t),第一个参数 x 叫做输入 (input),第二个参数 w 叫做核函数 (kernel function)。输出有时被称作特征映射 (feature map)

在机器学习的应用中,输入通常是高维数据数组,而也是由算法产生的高维参数数组。我们把这种高维数组叫做张量。我们经常假设在存储了数据的有限点集以外,这些函数的值都为。这意味着在实际操作中,我们可以统一地把无限的求和当作对有限个数组元素的求和来用。

我们有时对多个维度进行卷积运算。例如,如果把二维的图像 I 作为输 入,我们也相应的需要使用二维的核 KS(i,j)=(IK)(i,j)=mnI(m,n)K(im,jn)S(i,j)=(I ∗ K)(i,j)=\sum_{m}^{} \sum_{n}^{} I(m,n)K(i − m,j − n)

通过翻转核,我们也可以得到等价式子S(i,j)=(KI)(i,j)=mnI(im,jn)K(m,n)S(i,j)=(K ∗ I)(i,j)=\sum_{m}^{} \sum_{n}^{} I(i-m,j-n)K(m,n), 该式子在机器学习库中更常见。

许多神经网络库会实现一个相关的函数,称为互相关函数 (cross-correlation),和卷积运算几乎一样但是并不翻转核:S(i,j)=(IK)(i,j)=mnI(i+m,j+n)K(m,n)S(i,j)=(I ∗ K)(i,j)=\sum_{m}^{} \sum_{n}^{} I(i+m,j+n)K(m,n)

离散卷积可以看作矩阵的乘法,一个 2 维卷积的例子(核没有翻转)如下图

2022-12-25_135156.png

2.卷积出现的动机

卷积运算通过三个重要的思想来帮助改进机器学习系统:稀疏交互 (sparse interactions)参数共享 (parameter sharing)等变表示 (equivariant representations)

①稀疏交互: 传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。如果有 m 个输入和 n 个输出,那么矩阵乘法需要 m × n 个参数并且相应算法的时间复杂度为 O(m × n)。(下图) 当 s 是由矩阵乘法产生时,连接不再是稀疏的,所以所有的输出都会受到 输入单元x3 的影响。

2022-12-25_151823.png

卷积神经网络具有稀疏交互 (sparse interactions)/稀疏连接 (sparse connectivity) /稀疏权重 (sparse weights) 的特征。这通过使得核的规模远小于输入的规模来实现。举个例子,当进行图像处理时,输入的图像可能包含百万个像素点,但是我们可以通过只占用几十到上百个像素点的核来探测一些小的有意义的特征,例如图像的边缘。这意味着我们需要存储的参数更少,不仅减少了模型的存储需求,而且提高了它的统计效率。如果我们限制每一个输出拥有的连接数为 k,那么稀疏的连接方法只需要 k × n 个参数以及 O(k × n) 的运行时间。(下图)当 s 是由核宽度为 3 的卷积产生时,只有三个输出受到 输入单元 x3 的影响。

2022-12-25_151833.png

②参数共享: 指在一个模型的多个函数中使用相同的参数。

2022-12-25_155148.png

等变表示: 对于卷积,参数共享的特殊形式使得神经网络层具有对平移等变 (equivariance) 的性质。如果一个函数满足输入改变输出也以同样的方式改变这一性质,我们就说它是等变的。特别地,如果函数 f(x) 与 g(x) 满足 f(g(x)) = g(f(x)),我们就说 f(x) 对于变换 g 具有等变性。对于卷积来说,如果令 g 是输入的任意平移函数,那么卷积函数对于 g 具有等变性。举个例子,令 I 表示图像的明亮度函数(取值为整数),g 表示图像函数的变换函数使得 I′ = g(I),其中 I′(x,y) = I(x−1,y),这个函数把 I 中的每个像素向右移动一格。先对 I 进行这种变换然后进行卷积操作所得到的结果,与先对 I 进行卷积然后再对输出使用平移函数 g 得到的结果是一样的。

3. 池化

卷积神经网络的卷积层通常包含三级。

2022-12-26_115925.png

在第一级中,卷积层并行地进行多个卷积运算来产生一组线性激活函数。

在第二级中,非线性的激活函数如整流线性单元函数等作用在第一级中的每一个线性输出上。这一级有时也被称为探测级 (detector stage)。

在第三级中,我们使用池化函数 (pooling function) 来更进一步地调整卷积层的输出。

池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。 例如,最大池化 (max pooling) 函数给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩形区域内的平均值、L 2 范数以及依靠据中心像素距离的加权平均函数。

不管采用什么样的池化函数,当输入作出少量平移时,大多数通过池化函数的输出值并不会发生改变

以下图的最大池化函数为例,下方的网络相对于上方的网络,输入右移了一个像素,但上面一行只有一半的值发生了改变,这是因为最大池化单元只对周围的最大值比较敏感,而不是对精确的位置。

2022-12-26_121721.png

在很多任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像进行分类时,分类层的输入必须是固定的大小,而这通常通过调整池化区域的偏置大小来实现,这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。例如,最终的池化层可能会输出四组综合统计特征,每组对应着图像的一个象限,而与图像的大小无关。

参考

《Deep Learning》Ian Goodfellow & Yoshua Bengio