序言
在深度学习的浩瀚星空中,卷积神经网络( Convolutional Neural Networks, CNNs \text{Convolutional Neural Networks, CNNs} Convolutional Neural Networks, CNNs)无疑是最为璀璨的一颗星,其诞生与崛起深刻改变了图像识别、视频处理乃至自然语言处理等多个领域的面貌。 CNN \text{CNN} CNN的动机源于对生物视觉系统的深刻洞察与计算机视觉任务的迫切需求。自然界中,生物视觉系统通过层次化的信息处理方式,从简单的边缘检测到复杂的物体识别,展现出惊人的效率与准确性。受此启发,研究者们设计出了卷积神经网络,旨在模拟这一过程,以自动学习并提取图像中的层级特征,从而实现高效的图像识别与理解。
动机
-
卷积运算通过三个重要的思想来帮助改进机器学习系统:稀疏交互 ( sparse interactions \text{sparse interactions} sparse interactions)、参数共享 ( parameter sharing \text{parameter sharing} parameter sharing)、等变表示 ( equivariant representations \text{equivariant representations} equivariant representations)。
-
另外,卷积提供了一种处理大小可变的输入的方法。我们下面依次介绍这些思想。
-
传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。其中,参数矩阵的每一个独立的参数都描述了每一个输入单元与每一个输出单元间的交互。这意味着每一个输出单元与每一个输入单元都产生交互。
-
然而,卷积神经网络具有稀疏交互 ( sparse interactions \text{sparse interactions} sparse interactions)(也叫做稀疏连接 ( sparse connectivity \text{sparse connectivity} sparse connectivity) 或者稀疏权重 ( sparse weights \text{sparse weights} sparse weights))的特征。这通过使得核的规模远小于输入的规模来实现。
-
举个例子,当进行图像处理时,输入的图像可能包含百万个像素点,但是我们可以通过只占用几十到上百个像素点的核来探测一些小的有意义的特征,例如图像的边缘。这意味着我们需要存储的参数更少,不仅减少了模型的存储需求,而且提高了它的统计效率。这也意味着为了得到输出我们只需要更少的计算量。这些效率上的提高往往是很显著的。如果有 m m m个输入和 n n n个输出,那么矩阵乘法需要 m × n m × n m×n个参数并且相应算法的时间复杂度为 O ( m × n ) \Omicron(m\times n) O(m×n)对于每一个例子)。如果我们限制每一个输出拥有的连接数为 k k k,那么稀疏的连接方法只需要 k × n k × n k×n个参数以及 O ( k × n ) \Omicron(k\times n) O(k×n)的运行时间。在很多应用方面,只需保持 k k k的数量级远小于 m m m,就能在机器学习的任务中取得好的表现。
-
稀疏连接的图形化解释如图例1和图例2所示。
-
在深度卷积网络中,处在深层的单元可能不直接地与绝大部分输入连接,如图例3所示。这允许网络可以通过只描述稀疏交互的基石来高效地描述多个变量的复杂交互。
-
参数共享 ( parameter sharing \text{parameter sharing} parameter sharing) 是指在一个模型的多个函数中使用相同的参数。
- 在传统的神经网络中,当计算一层的输出时,权值矩阵的每一个元素只使用一次,当它乘以输入的一个元素后就再也不会用到了。
- 作为参数共享的同义词,我们可以说一个网络含有绑定的权值 ( tied weights \text{tied weights} tied weights),因为用于一个输入的权值也会被绑定在其他的权值上。
- 在卷积神经网络中,核的每一个元素都作用在输入的每一位置上(除了一些可能的边界像素,取决于对于边界的决策设计)。
- 卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的时间(仍然是 O ( k × n ) \Omicron(k\times n) O(k×n)),但它显著地把模型的存储需求降低至 k k k个参数,并且 k k k通常是远小于 m m m的数量级。因为 m m m和 n n n通常规模很接近, k k k在实际中相对于 m × n m × n m×n是很小的。
- 因此,卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。图例4演示了参数共享是如何实现的。
-
作为前两条原则的一个实际例子,图例5说明了稀疏连接和参数共享是如何显著地提高用于图像边缘检测的线性函数的效率的。
-
对于卷积,参数共享的特殊形式使得神经网络层具有对平移等变 ( equivariance \text{equivariance} equivariance) 的性质。
- 如果一个函数满足输入改变,输出也以同样的方式改变这一性质,我们就说它是等变 ( equivariant \text{equivariant} equivariant) 的。
- 特别地,如果函数 f ( x ) f(x) f(x)与 g ( x ) g(x) g(x)满足 f ( g ( x ) ) = g ( f ( x ) ) f(g(x)) = g(f(x)) f(g(x))=g(f(x)),我们就说 f ( x ) f(x) f(x)对于变换 g g g具有等变性。
- 对于卷积来说,如果令 g g g是输入的任意平移函数,那么卷积函数对于 g g g具有等变性。
- 举个例子,令 I I I表示图像的明亮度函数(取值为整数), g g g表示图像函数的变换函数(把一个图像函数映射到另一个图像函数的函数)使得 I ′ = g ( I ) I′ = g(I) I′=g(I),其中 I ′ ( x , y ) = I ( x − 1 , y ) I′(x,y) = I(x − 1,y) I′(x,y)=I(x−1,y)。
- 这个函数把 I I I中的每个像素向右移动一格。
- 如果我们先对 I I I进行这种变换然后进行卷积操作所得到的结果,与先对 I I I进行卷积然后再对输出使用平移函数 g g g得到的结果是一样的 2 2 2。
- 当处理时间序列数据时,卷积产生一条用来表明输入中出现不同特征的某种时间轴。如果我们把输入中的一个事件向后延时,在输出中也会有完全相同的表示,只是时间延时了。
- 图像与之类似,卷积产生了一个 2 2 2维映射来表明某种属性在输入的什么位置出现了。
- 如果我们移动输入中的对象,它的表示也会在输出中移动同样的量。
- 当处理多个输入位置时,一些作用在邻居像素的函数是很有用的。例如在处理图像时,在卷积神经网络的第一层进行图像的边缘检测是很有用的。
- 相同的边缘或多或少地散落在图像的各处,所以应当对整个图像进行参数共享。但在某些情况下,我们并不希望对整幅图进行参数共享。
- 例如当我们在处理人脸图像(图像已经被剪裁成人脸在中心)时,我们可能会希望在不同的部位探测出不同的特征(处理人脸上部的网络需要去搜寻眉毛,处理人脸下部的网络就需要去搜寻下巴了)。
-
卷积对其他的一些变换并不是天然等变的,例如对于图像尺度或者角度的变换,需要其他的一些机制来处理这些变换。
-
最后,一些不能被传统的由(固定大小的)矩阵乘法定义的神经网络处理的特殊数据,可能通过卷积神经网络来处理,我们将在篇章:卷积神经网络 - 数据类型中进行讨论。
-
图例1:稀疏连接,对每幅图从下往上看。
-
稀疏连接,对每幅图从下往上看
-
说明:
- 稀疏连接,对每幅图从下往上看。我们强调了一个输入单元 x 3 x_3 x3以及在 s \boldsymbol{s} s中受该单元影响的输出单元。
- (上图) 当 s \boldsymbol{s} s是由核宽度为 3 3 3的卷积产生时,只有三个输出受到 x \boldsymbol{x} x的影响。
- (下图) 当 s \boldsymbol{s} s是由矩阵乘法产生时,连接不再是稀疏的,所以所有的输出都会受到 x 3 x_3 x3的影响。
-
-
图例2:稀疏连接,对每幅图从上往下看。
-
稀疏连接,对每幅图从上往下看
-
说明:
- 对每幅图从上往下看。我们强调了一个输出单元 s 3 s_3 s3以及 x \boldsymbol{x} x中影响该单元的输入单元。这些单元被称为 s 3 s_3 s3的接受域。
- (上图) 当 s \boldsymbol{s} s是由核宽度为 3 3 3的卷积产生时,只有三个输入影响 s 3 s_3 s3。
- (下图) 当 s \boldsymbol{s} s是由矩阵乘法产生时,连接不再是稀疏的,所以所有的输入都会影响 s 3 s_3 s3。
-
-
图例3:处于卷积网络更深的层中的单元,它们的接受域要比处在浅层的单元的接受域更大。
-
处于卷积网络更深的层中的单元,它们的接受域要比处在浅层的单元的接受域更大
-
说明:
- 如果网络还包含类似步幅卷积或者池化之类的结构特征,这种效应会加强。
- 这意味着在卷积网络中即使是直接连接都是很稀疏的,处在更深的层中的单元可以间接地连接到全部或者大部分输入图像。
-
-
图例4:参数共享。
-
参数共享
-
说明:
- 黑色箭头表示在两个不同的模型中使用了特殊参数的连接。
- (上图) 黑色箭头表示在卷积模型中 3 3 3元素核的中间元素的使用。因为参数共享,这单个参数被用于所有的输入位置。
- (下图) 这单个黑色箭头表示在全连接模型中权重矩阵的中间元素的使用。这个模型没有使用参数共享,所以参数只使用了一次。
-
-
图例5:边缘检测的效率。
- 边缘检测的效率
- 说明:
- 右边的图像是通过获得原始图像中的每个像素并减去左边相邻像素的值而形成的。
- 这给出了输入图像中所有垂直方向上的边缘的强度,这对目标检测是有用的操作。
- 两个图像都是 280 280 280像素的高度。输入图像宽 320 320 320像素,而输出图像宽 319 319 319像素。这个变换可以通过包含两个元素的卷积核来描述,并且需要 319 × 280 × 3 = 267 , 960 319 × 280 × 3 = 267,960 319×280×3=267,960个浮点运算(每个输出像素需要两次乘法和一次加法)。
- 为了用矩阵乘法描述相同的变换,需要 320 × 280 × 319 × 280 320 × 280 × 319 × 280 320×280×319×280个或者说超过 80 80 80亿个元素的矩阵,这使得卷积对于表示这种变换更有效 40 40 40亿倍。直接运行矩阵乘法的算法将执行超过 160 160 160亿个浮点运算,这使得卷积在计算上大约有 60 , 000 60,000 60,000倍的效率。
- 当然,矩阵的大多数元素将为零。如果我们只存储矩阵的非零元,则矩阵乘法和卷积都需要相同数量的浮点运算来计算。矩阵仍然需要包含 2 × 319 × 280 = 178 , 640 2 × 319 × 280 = 178,640 2×319×280=178,640个元素。
- 将小的局部区域上的相同线性变换应用到整个输入上,卷积是描述这种变换的极其有效的方法。照片来源: Paula Goodfellow \text{Paula Goodfellow} Paula Goodfellow。
- 边缘检测的效率
总结
卷积神经网络以其独特的卷积层、池化层等结构,巧妙地解决了传统图像处理中特征提取复杂、计算量大等问题。通过局部连接、权值共享和池化操作, CNN \text{CNN} CNN不仅减少了模型参数,提高了计算效率,还增强了模型的泛化能力,使得其在处理大规模图像数据时展现出卓越的性能。从手写数字识别到复杂场景下的物体检测与分割, CNN \text{CNN} CNN的应用不断拓宽,成为深度学习领域不可或缺的一部分。展望未来,随着算法的不断优化与硬件性能的提升,卷积神经网络有望在更多领域发挥更大的作用,推动人工智能技术的进一步发展。