多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。 对于表格数据,我们寻找的模式可能涉及特征之间的交互,但是我们不能预先假设任何与特征交互相关的先验结构。此时,多层感知机可能是最好的选择,然而对于高维感知数据,这种缺少结构的网络可能会变得不实用。
例如,在之前猫狗分类的例子中:假设我们有一个足够充分的照片数据集,数据集中是拥有标注的照片,每张照片具有百万级像素,这意味着网络的每次输入都有一百万个维度。 即使将隐藏层维度降低到1000,这个全连接层也将有 $10^6 * 10^3 = 10^9 $ 个参数。 想要训练这个模型将不可实现,因为需要有大量的GPU、分布式优化训练的经验和超乎常人的耐心。
然而,如今人类和机器都能很好地区分猫和狗:这是因为图像中本就拥有丰富的结构,而这些结构可以被人类和机器学习模型使用。
假设我们想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。 因此我们可以使用一个“目标物体检测器”扫描图像。 该检测器将图像分割成多个区域,并为每个区域包含目标物体的可能性打分。 卷积神经网络正是将空间不变性(spatial invariance)的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。
卷积神经网络(Convolutional Neural Networks,CNN)
在卷积神经网络中,卷积层(输入层和输出层不再是全链接)会对输入的数据进行过滤和降维处理。首先对原始输入按着特定的方式划分为多个区域,然后使用卷积核对每个区域进行特征提取实现降维。
卷积是一种数学运算,它描述了两个函数相互作用的过程。在深度学习中,卷积通常用于处理图像、声音等数据。通过卷积操作,我们可以有效地提取数据中的局部特征,从而实现更高层次的抽象表示(即降维)。
在认识卷积神经网络之前,我们先来了解什么是卷积。同时也了解以下另一个概念,互相关运算。这部分数学概念可以帮助我们更好的理解卷积神经网络的技术内核。
卷积层
卷积
泛函分析中,卷积(Convolution)是通过两个函数 $f$ 和 $g$ 生成第三个函数的一种数学运算,其本质是一种特殊的积分变换,表征函数 $f$ 与 $g$ 经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是“滑动平均”的推广。
定义:卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列 $x(n)$ 和 $h(n)$,则卷积的结果
$$y(n)=\sum_{m=-\infty}^{\infty}x(m)h(n-m) =x(n)h(n)$$
其中星号 $$ 表示卷积。当时序 $n=0$ 时,$h(-i)$ 是 $h(i)$ 的时序 $i$ 取反的结果;时序取反使得 $h(i)$ 以纵轴为中心翻转180度,所以这种相乘后求和的计算法称为卷积和,简称卷积。另外,n 是使$h(-i)$位移的量,不同的 n 对应不同的卷积结果。
互相关运算
卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按对应元素相乘并求和,得到输出数组中相应位置的元素。
$$y_{fh}(n)=\sum_{m=-\infty}^{\infty}f^(m)h(m+n) =x(n)h(n)$$
卷积和互相关的运算区别
互相关运算示例

我们对图像中的蓝色区域进行Cross-correlation(互相关运算),互相关运算是按顺序滑动窗口,针对每个窗口按着对应关系,顺序积分求和的过程
那么在点E处的计算方式就是:$G[3,3]=a∗A+b∗B+c∗C+d∗D+e∗E+f∗F+g∗G+h∗H+i∗I $
我们可以看到,。
卷积示例
还是上面的图像,我们对蓝色区域进行卷积,卷积是按顺序滑动窗口,针对每个窗口,逆序(一维)积分求和,若是二维,则是相当于对卷积核进行了原定对称后,在进行了互相关运算的过程。
即在点E处的计算为:$G[3,3]=a∗I+b∗H+c∗G+d∗F+e∗E+f∗D+g∗C+h∗B+i∗A$
那么这就相当于将‘filter翻转’了,即先上下翻转、再左右翻转,然后进行cross-correlation运算,如下所示:

区别
所以在这同时我们可以看到,卷积运算和互相关运算的关系。他们都是一个函数对另一个函数的积分,区别时积分的过程,卷积时 $f(x)g(n-x)$, 互相关是 $f(x)g(n+x)$,在二维图像处理中 $g(n-x)$和g(n+x)是一个关于远端对称,后经过2n平移的矩阵。
互相关运算是顺序积分求和的过程,互相关运算时逆序积分求和。当我们的输入数据时固定的时候,由于我们的卷积核时学习获取的,所以互相关运算和卷积运算在某种意义上来讲是一样的。通过互相关运算的得到的
考虑,一张图如下,我们进行互相关运算,得到的结果如下:
如果将上面换成真实点的图
我们看到得到的结果就像是filter,只不过翻转了下(原点对称)。因此如果我们将filter翻转了一次再进行cross-correlation,那再加上上面的这次翻转就是两次翻转了,得到的图像就也就不变了。
于是卷积就有了下面的性质
Identity:E=[…0,0,1,0,0…],F*E=F(你可以想下cross-correlation行不行)

由于卷积核是我们基于数据计算获得的,因此单纯计算卷积核的过程,卷积和互相关就没有实际区别(卷积和互相关计算得到的两个卷积核是一个中心对称的矩阵)。所以一般的计算中实际使用的更多的是互相关运算。
卷积层参数
像前面介绍的,卷积(实际执行的都是互相关运算,后文如无特殊说明卷积都是指的互相关运算),卷积进行过滤降维的过程,其实就是用核函数对输入数据进行降维过滤的过程,这是因为我们一般使用的核函数通常是宽度和高度都大于 1 所导致的。但是除了核函数,填充和步幅也会影响我们的输出矩阵的大小,
填充层(Padding Layer)
在卷积的过程中,输出特征图的大小由输入特征图的大小、内核的大小和步长决定。如果我们简单地将内核应用于输入特征图,那么输出特征图将小于输入。这可能会导致输入特征图边界处的信息丢失。由于我们通常使用小卷积核,因此对于任何单个卷积,我们可能只会丢失几个像素。在应用多层卷积时,随着我们应用许多连续卷积层,累积丢失的像素数就多了。 解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是(0))。而这个处理过程就是通过填充层实现。
- 通过使用填充层,我们可以防止输入图像在多层卷积处理中不断缩小,甚至可以在某些情况下实现特征增加。
如下图,我们将 $33$ 的输入数据填充成一个 $55$ 的输入,这样我们得到的输出就从 $22$变为 $44$ 从而可以避免边缘信息丢失。
通常,如果我们添加(p_h)行填充(大约一半在顶部,一半在底部)和(p_w)列填充(左侧大约一半,右侧一半),则输出形状将为
[(n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1)。]
这意味着输出的高度和宽度将分别增加(p_h)和(p_w)。
在许多情况下,我们需要设置(p_h=k_h-1)和(p_w=k_w-1),使输入和输出具有相同的高度和宽度。 这样可以在构建网络时更容易地预测每个图层的输出形状。假设(k_h)是奇数,我们将在高度的两侧填充(p_h/2)行。 如果(k_h)是偶数,则一种可能性是在输入顶部填充(\lceil p_h/2\rceil)行,在底部填充(\lfloor p_h/2\rfloor)行。同理,我们填充宽度的两侧。
卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
此外,使用奇数的核大小和填充大小也提供了书写上的便利。对于任何二维张量X,当满足: 1. 卷积核的大小是奇数; 2. 所有边的填充行数和列数相同; 3. 输出与输入具有相同高度和宽度 则可以得出:输出Y[i, j]是通过以输入X[i, j]为中心,与卷积核进行互相关计算得到的。
计算互相关时,卷积窗口从输入张量的左上角开始,向下、向右滑动。 在前面的例子中,我们默认每次滑动一个元素。 但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。
每次滑动元素的数量称为步幅(stride)。到目前为止,我们只使用过高度或宽度为(1)的步幅,那么如何使用较大的步幅呢?
通常,当垂直步幅为(s_h)、水平步幅为(s_w)时,输出形状为
[\lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor.]
如果我们设置了(p_h=k_h-1)和(p_w=k_w-1),则输出形状将简化为(\lfloor(n_h+s_h-1)/s_h\rfloor \times \lfloor(n_w+s_w-1)/s_w\rfloor)。 更进一步,如果输入的高度和宽度可以被垂直和水平步幅整除,则输出形状将为((n_h/s_h) \times (n_w/s_w))。
- 步长为1:

- 步长为2:

汇聚层/池化层(pooling layer)
我们通常希望这些特征保持某种程度上的平移不变性。例如,如果我们拍摄黑白之间轮廓清晰的图像X,并将整个图像向右移动一个像素,即Z[i, j] = X[i, j + 1],则新图像Z的输出可能大不相同。而在现实中,随着拍摄角度的移动,任何物体几乎不可能发生在同一像素上。所以引入了池化层,来消除像素平移带来的影响。
卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。 然而,不同于卷积层中的输入与卷积核之间的互相关计算,汇聚层不包含参数。 相反,池运算是确定性的,我们通常计算汇聚窗口中所有元素的最大值或平均值。这些操作分别称为最大汇聚层(maximum pooling)和平均汇聚层(average pooling)。
在这两种情况下,与互相关运算符一样,汇聚窗口从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚层还是平均汇聚层。
输出张量的高度为,宽度为。这四个元素为每个汇聚窗口中的最大值:
max(0,1,3,4) = 4,
max(1,2,4,5)=5,
max(3,4,6,7)=7,
max(4,5,7,8)=8
汇聚窗口形状$pq$为的汇聚层称为$pq$汇聚层,汇聚操作称为$p*q$汇聚。
卷积神经网络的特性:
- 局部连接:卷积层中的神经元仅与输入数据的一个局部区域连接,这有助于减少参数数量。神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。
- 权重共享:卷积核在输入数据的不同位置使用相同的权重和偏置,这进一步减少了参数数量。
- 平移不变性:由于卷积操作的特性,CNN对图像中的平移变换具有一定的鲁棒性。不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应。
卷积的作用
- 图像处理
在图像处理中,卷积可以用于实现边缘检测、模糊、锐化等功能。通过将图像与特定的卷积核进行卷积操作,我们可以突出或抑制图像中的某些特征,从而达到处理的目的。 - 信号处理
在信号处理中,卷积用于分析和处理信号。例如,通过卷积可以消除噪声、平滑信号,从而提高信号的质量。
