深度学习丨卷积神经网络CNN
多层感知机适合用来处理表格数据,但当数据维度提升,多层感知机会丢失数据的结构特征。例如,我们在进行图片处理时,需要满足两条性质:
- 平移不变形。不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应。例如在手写体识别中,无论数字出现在图片的哪个角落,我们都应该能够准确识别它。
- 神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系。最终,可以聚合这些局部特征,以在整个图像级别进行预测。
很显然,多层感知机已经无法满足我们的需要。
卷积层
卷积层的主要作用是进行特征提取。它通过使用一组可学习的滤波器(或称卷积核、权重矩阵)对输入图像进行滑动窗口式的操作,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值。然后将结果汇总形成一个特征图(或称为特征映射、激活图)。这个过程可以捕获图像中的局部空间关系和特征,比如边缘、角点、颜色纹理等。例如:
在上图中,0×0+1×1+3×2+4×3=19,依次类推计算出其余位置的值,组成输出矩阵。
可以观察到,只要卷积核大小大于1,输出的矩阵大小便会小于输入,为了避免矩阵不断变小,我们可以对矩阵边缘进行填充。除此之外,我们在移动卷积核时,每次不一定只能移动一格,我们将每次移动的长度称为步长。
步长:控制滤波器在图像上移动的步幅。
填充:在输入图像边缘添加额外的像素来控制输出特征图的大小和保持某些空间信息。
当我们使用一个二维卷积核对一张图片进行运算,我们可以理解为抽取出图片的某种特征,例如边缘、纹理等。很显然,我们处理一张图片需要分析它的多种特征。当我们需要实现多输入多输出时,便引入了通道的概念。
例如,当我们需要实现n个输入时,我们可以给每个输入分配一个x*y大小的卷积核,这n个卷积核并在一起,便形成一个n×x×y大小的三维卷积核。同理,当我们需要实现m个输出,便可创建一个m×n×x×y的卷积核。其中m称为输出通道数,n称为输入通道数。我们可以使用1×1大小的卷积核来改变通道数。
随着卷积层的堆叠加深,每一层能够捕获越来越复杂和抽象的特征,从底层的边缘、线条到高层的物体部件、整体形状乃至语义概念。
卷积层相较于全连接层的优势在于参数共享(每个滤波器在整个图像上重复使用)、稀疏连接(只考虑局部区域而不是全局连接),这大大减少了模型所需的参数数量,并且增强了模型对于平移不变性的学习能力。
池化层
池化层是CNN中的一个重要组成部分,它的作用可以被通俗理解为“降采样”或“特征抽样”。在图像处理的上下文中,池化层通过执行一种称为池化操作的过程,对上一层(通常是卷积层)输出的特征图进行下采样。
具体来说,池化层会在输入的特征图上滑动一个固定大小的窗口(比如2x2),并在每个窗口内执行某种聚合操作,最常见的是最大值池化和平均值池化:
最大值池化:取窗口内所有数值的最大值作为该窗口的输出。这样做的好处是可以保留最重要的激活信息,忽略掉不那么显著的特征。
平均值池化:取窗口内所有数值的平均值作为输出。这有助于保持背景信息或局部区域的整体灰度水平。
通过池化层的操作,特征图的尺寸会减小,同时保持住关键的、不变形的特征表达。这样做有几个主要的好处:
减少计算量:降低后续层需要处理的数据量。
控制过拟合:通过减少参数数量和引入某种程度的平移不变性来提高模型的泛化能力。
增加鲁棒性:由于池化层对小范围内的变化不敏感,它可以帮助模型在一定程度上抵御微小的位置变化带来的影响。
ResNet
随着深度学习模型层数的增加,传统的深度神经网络往往会遇到梯度消失或梯度爆炸的问题,这使得训练极深的网络变得非常困难。
为了解决这个问题,残差网络引入了一种叫做“残差块”的设计。在残差块中,除了常规的前馈路径(即输入经过一系列卷积层和非线性激活函数),还引入了“跳跃连接”。跳跃连接直接将输入信号传递到较深的网络层,然后将这个原始输入与经过多层非线性变换后的输出相加。这样一来,网络可以更容易地学习残差映射,也就是从输入到输出之间的变化,而不是直接学习输入到输出的整体映射。
数学上,对于一个残差块,假设我们想要学习的映射是H(x),那么网络实际优化的是F(x) = H(x) - x,这样就简化为了学习一个残差F(x),而网络的输出则变为x + F(x)。通过这种设计,即使F(x)近似于零,信息也能顺利通过网络,避免了梯度消失问题。
由于残差网络的这一创新设计,模型可以有效地训练超过100层甚至更深的网络,而且不会出现明显的退化现象,反而随着网络深度的增加,准确率能够进一步提升,这让残差网络成为图像分类、物体检测、语义分割等多个计算机视觉任务中的标准模型之一。