卷积神经网络

1.1 卷积层和池化层

在机器学习中,计算机视觉是一个重要的子领域,主要用于处理与图像有关的数据,包括图像检测、图像识别、视频理解等实际应用场景。在计算机中,图像是一种典型的二维信号,并且具有平移不变性、旋转不变性等特点。例如,对图像的平移或轻微旋转不会改变其类别,如图11-1所示。

图11-1

图像的诸多特点催生出了一种重要的神经网络——卷积神经网络(Convolutional Neural Networks,CNN),它是多层神经网络的一个特例。同时,卷积神经网络独具特点,这些特点使它在图像处理速度和效果方面与多层神经网络相比有较大的提升。

在计算机领域,图像识别是一种应用极其广泛的技术。例如,识别0~9的手写数字图像,如图11-2所示。

图11-2

在图11-2中,每幅黑白图像在计算机中都存储为一个 28×28×1 的矩阵(分别对应于图像的长、宽、通道数)。图像的通道数是指一个位置特征的维度。

黑白图像的通道数为1,即每个像素点只有灰度值。在黑白图像(单通道)中,矩阵中的

元素 P_(i,j)(i∈[1,28],j∈[1,28])表示当前位置的灰度值,P_(i,j)∈[0,255],0表示黑色,255表

示透明,中间的数值表示深浅不一的灰色。

彩色图像的通道数一般为3。彩色图像每个像素点的颜色都由R、G、B(红、绿、蓝)三种基础元素组成,对应于一个3维的向量(R、G、B分别代表红、绿、蓝三种颜色,R∈[0,255],G∈[0,255],B∈[0,255])。

根据以上分析,在黑白手写数字图像中,可以将一个 28×28×1=784 维的向量作为图像的特征,向量元素和图像位置一一对应,元素值对应于相应位置的灰度值。将特征向量输入逻辑回归、SVM、DNN等模型,就可以完成多分类任务。

上述方法貌似可行,但仔细想想,就会发现很多问题。

手写数字的平移、轻微旋转、笔迹变化等因素,会导致图像中某些位置的像素值发生剧烈变化——虽然类别没有发生变化,但784维特征会发生剧烈变化。其几何表现是:在784维的高维空间中,同一类别的样本分散在空间的各个区域,每个区域都对应于同一个数字的图像的不同位置和笔迹,不同类别的数据点在高维空间中犬牙交错地分布。虽然DNN等模型具备非线性处理能力,但如此复杂的线性不可分数据点会给分类器带来极大的压力。

此外,784维的图像其实是比较小的,常见的彩色图像的维度是 225×225×3=151875 甚至更大(例如超高清图片)。大尺寸图像在高维空间中的分布极其复杂,如果使用DNN等全连接网络来处理,则运算量非常大且需要大量训练样本,而这往往是很难被满足的。

综上所述,我们需要针对图像的特点专门设计模型,这个模型要对平移、轻微旋转、笔迹变化等扰动进行处理,使上述变化不敏感且参数较少。CNN有效解决了DNN在图像处理方面的痛点,使图像领域的研究水平和工程质量上了一个台阶。

图像识别对人类来说是一件非常简单的事情—— 一个三岁的孩子就能准确地识别常见的物体。人类之所以能够快速识别图像中的物体,是因为人类不会纠结于图像中每个位置的像素值,而把重点放在由区域像素点组成的几何形状,以及这些几何形状的相对位置和搭配上。例如,手写数字0对应的通常是一个椭圆形,手写数字8对应的通常是上下排列的两个椭圆形。每个人的笔迹都是不同的,尽管不同的人写出的文字的形状未必完美和整齐划一,但从整体看并不影响其分类。同时,人类在识别图像时对位置并不敏感。例如,把数字5写在纸的左上角和右下角,不会影响人类对其类别的判断。CNN在进行图像识别时就借鉴了上述的人类思考方式。

在一幅图片中,形状(纹理)是一种局部特征,它往往是由几何位置相邻的一些像素一起决定的。卷积神经网络不是从像素上进行特征提取的,而是将图像划分成若干子区域,在这些子区域中进行特征提取的。这些子区域称为“感受野”。如图11-3所示是一个 3×3 的感受野。

图11-3

我们分析一下这个 3×3 的感受野。如果机器想知道该子区域是否为形状“|”,就可以针对形状“|”设计一个矩阵模板(这个模板称为卷积核),模板的大小和感受野一致,是一个 3×3 的矩阵,示例如下。

[■(1&-2&1@1&-2&1@1&-2&1)]

可以看出,矩阵中“-2”的位置组成的形状和“|”类似。

在这里只是为了帮助读者理解卷积运算而特别设计了一个模板。在使用CNN时,无须特别设计卷积核,卷积核中的元素(在本例中,共计 3×3+1=10 个待学习参数,1为偏置项)均为待学习参数,可以通过模型训练自动得到。

将图片感受野(3×3)的像素值与卷积(3×3)按位相乘并求和后加上偏置,使用非线性函数(通常是ReLU函数)将计算结果激活。这种运算称为卷积运算。

分别在两个感受野上使用同一个卷积核进行卷积运算,如图11-4所示。

图11-4

可以发现,在模板中“-2”的位置上,感受野的像素值越小(颜色越深),卷积结果就越大。卷积结果可以被认为是感受野形状和卷积核的匹配程度。如果感受野和卷积核的对应形状差异过大,就说明该感受野中没有我们所关心的形状(使用ReLU函数直接输出0)。

在一幅图像上滑动卷积核,以识别图像中各个位置的形状。卷积核滑动的长度称为步长(stride)。对一幅尺寸为 n×n 的图像,使用 k×k 的卷积核以 stride=1 进行卷积,输出为 (n-k+1)×(n-k+1)。以输入 4×4 的图像(这里只是为了讲解方便,实际的图像尺寸要比这个尺寸大得多)为例,使用 3×3 卷积核,stride=1,激活函数为ReLU,输出图像的尺寸为 2×2,卷积运算过程如图11-5所示。

图11-5

可以看出,卷积运算结果也是一幅单通道“图像”,只不过该“图像”的数值不再表示像素值,而表示与特定形状(卷积核)的匹配程度。这种图像称为特征图(Feature Map)。

在进行卷积运算时,输出图像会被裁减至 (n-k+1)×(n-k+1)。要想保证输出图像的尺寸不变,可以在进行卷积前在图像四周补0,如图11-6所示。

图11-6

在使用卷积的场景中,为了方便计算,若无特别说明,均对输入图像进行补0操作,以确保卷积后图像大小不变。对图像使用卷积的完整流程,如图11-7所示。

为了简化,使用如图11-8所示的形式表示卷积操作。

图11-7

图11-8

卷积核也称为滤波器(Filter),这是因为原始图像经过卷积操作,输出的都是特定形状的强度值,而与形状无关的感受野所对应的卷积结果趋近于0。

在本节前面的例子中,我们对通道数为1的黑白图像进行了卷积操作。当通道数不为1(例如,彩色图像的通道数为3)时,卷积核的通道数就要扩充为3,如图11-9所示。

图11-9

卷积操作就是立方体的按位相乘再相加,如图11-10所示。需要注意的是,使用一个卷积核对多通道图像进行卷积操作的结果仍是单通道图像,这一点和黑白图像无异。

图11-10

那么,如何识别一个圆形?圆形和竖线的区别在于:竖线是一个相对简单的形状,其局部形状和整体形状是一致的;圆形是一个相对复杂的形状,是由一系列小圆弧组成的(这是一个相对宏观的特征)。根据卷积运算的特点,对圆形的识别有以下两种方案。

使用一个圆形的卷积核。因为圆形是一个相对宏观的形状,所以 3×3 这种小尺寸的卷积核无法满足需求,需要使用 10×10 的大尺寸卷积核。

由于圆形是由一系列小圆弧组成的,所以,可以先使用多个不同的卷积核并行识别这些小圆弧,再通过小圆弧的相对位置来识别圆形。

在图像识别领域,有很多复杂的图像需要识别,例如“耳朵”“尾巴”。如果每个复杂图像都对应于一个卷积核,那么卷积核会非常大。复杂图像的特征相对宏观,需要使用大尺寸的卷积核来提取特征,而这会导致参数过多。另外,复杂图像虽然形状各异,但基本元素的种类不多,大都包含直线、弧形等——不同复杂图像的区别主要是基本元素的组合方式不同。因此,CNN使用多个不同的小尺寸卷积核进行基本形状的提取,如图11-11所示。

图11-11

使用 n 个不同的卷积核进行运算,得到的结果的尺寸都是 28×28×1。因此,可以把所有的输出图像均看成一个 28×28 的 n 通道图像(特征图),即 28×28×n。

多卷积核的运算流程可以简化为如图11-12所示的形式。输入图片通过 n 个卷积核转换成 28×28×n 的“图像”,“图像”各通道的每个位置上的数值都表示局部感受野和特定形状的吻合程度。

图11-12

当然,卷积后的“图像”还有简化的空间。简化目标如下。

由于“图像”相邻感受野所对应形状的差异不会太大,所以存在一定的信息冗余现象。消除信息冗余现象可以降低后续处理的复杂度。

提取的特征对“图像”的轻微移动不敏感。

“图像”的尺寸可以缩减,以便提取更加宏观的特征、降低后续的运算量。

可以通过池化操作实现上述三个目标。池化操作很简单。例如,最大池化操作就是对每个感受野选取最大值作为输出(可以看出,池化操作没有要学习的参数)。不过,池化操作和卷积操作有以下几点不同。

池化操作在各个通道上独立进行。卷积操作一般对同一感受野中的所有通道的特征进行计算。

池化操作的步长设置一般会参考感受野的尺寸。例如,感受野的尺寸为 2×2,则 stride=2。因此,通过池化操作,图像的尺寸将会缩减。

当步长和感受野的尺寸相同时,各感受野之间没有交集。

池化操作一般不进行边缘补0。

以 4×4 的图像为例,子区域为 2×2,在一个通道上的最大池化过程如图11-13所示。

图11-13

输入图像的尺寸为 28×28×n,选取 2×2 的感受野,以步长2进行最大池化操作,共进行 14×14×n 次池化。池化后,图像尺寸变为 14×14×n,如图11-14所示。

图11-14

2×2 就是池化感受野的尺寸。池化感受野的尺寸除了可以设置为 2×2,还可以设置为 3×3 等,但一般为正方形,步长一般为感受野的宽或高。池化操作的步长和感受野越大,对图像的缩减尺度就越大,提取出来的特征就越宏观。小尺寸池化更关注细节特征,图像缩减尺度较小。

选取区域内最大值的池化称为最大池化。除了最大池化,将区域内所有数值的平均值作为输出也是常见的池化操作,称为平均池化。一般来说,最大池化的特征提取能力较强,但容易被噪声干扰,平均池化相对稳定、对噪声不敏感。

池化操作有一个优点,就是在提取特征时能够抗扰动。例如,对于子区域 [■(1&2@3&4)],最大

池化的输出是4,平均池化的输出是2.5。改变该子区域,使其变成 [■(4&3@2&1)],最大池化的输出

依然是4,平均池化的输出依然是2.5。因为池化操作对子区域内的轻微改变不敏感,所以能克服图像平移、轻微旋转等带来的影响。从广义的注意力机制(详见第14章)的角度看,池化操作会让网络后层只关注该区域内最具代表性的信息(平均池化或最大池化),因此,池化操作是一种自下而上的注意力机制。

卷积操作一般配合池化操作使用。池化操作的一个重要作用就是增大后续卷积操作的感受野,从而提取更加宏观的特征。例如,对图像进行 2×2 的池化操作,输出图像中的每个像素都对应于输入图像的 2×2 的感受野,如果此时对输出图像进行 3×3 卷积,那么卷积后每个像素所对应的原始图像的视野为 6×6,如图11-15所示。

如果不进行池化,只对输出图像进行 3×3 卷积,那么卷积后每个像素所对应的原始图像的视野为 3×3,如图11-16所示。

通过池化操作,我们对图像尺寸进行了缩减,克服了图像轻微变形带来的影响,并间接增大了后续卷积的感受野。

图11-15

图11-16

在CNN中,卷积层和池化层一般是成对出现的,称为“卷积—池化层”。池化操作完成后,输入变成了 14×14×n 的“图像”,整体操作如图11-17所示。

图11-17

1.2 卷积神经网络在图像处理中的应用

CNN使用不同的卷积核发现图像中的特定形状,配合池化操作可进一步缩减图像尺寸、稳定特征。通过一次“卷积—池化操作”,图像中简单的形状(例如弧线、竖线)就能被提取出来。我们同样可以对低级特征进行卷积运算,运算的结果是相对高级的特征(例如,交替出现的横线和竖线构成楼梯的形状,四个方向的圆弧组成圆形)。

对图像进行多次卷积—池化操作,提取出来的形状会变得复杂和宏观(例如,可以提取“狗尾巴”“狗脸”等高层次的特征),如图11-18所示。

图11-18

在使用多层卷积—池化操作时,更靠后的特征对应于更复杂的图像形状。从这个角度看,多层卷积—池化操作和DNN一样,都是通过层层堆叠提取复杂特征的。不过,与DNN的全连接操作相比,卷积—池化操作更符合图像本身的特点。另外,在使用多层卷积—池化网络时,通常每一层的卷积核的通道数应与上一层输出图像的通道数相匹配。

在进行图像分类时,最后一层的激活函数通常是Softmax,而Softmax函数的输入应该是一个向量,这与卷积—池化操作的输出为一个多通道2维特征不符。因此,可以对多通道2维特征进行Flatten操作,将其转换成向量。Flatten是一个没有参数的操作,可将具有多通道2维特征的数据排成一列,例如一个 7×7×10 的多通道2维特征对应于一个490维的向量。以 2×2 的特征为例,Flatten操作如图11-19所示。

图11-19

图像经过多层卷积—池化操作,再由Flatten操作拉平,从而转换成向量。这个向量经过Softmax激活函数即可输出对应的类别(0~9),如图11-20所示。

图11-20

神经网络构建完成后,可使用梯度下降法进行训练。在这里,待训练的参数是各个卷积核的参数。因此,卷积核提取的形状并不需要人为指定,而是由任务驱动的(自动找到符合分类的形状特征)。

彩色图像识别的步骤和黑白图像识别的步骤大致相同,只不过输入的图像由黑白图像的单通道(每个位置只有一个灰度值)变成了彩色图像的3通道(每个位置都有R、G、B三种颜色的数值)。

另外,一个CNN只能识别一种尺寸的图像。例如,上例中的网络只能处理 28×28 的图像。当实际图像的尺寸和网络所要求的尺寸不同时,需要提前将图像缩放至符合网络要求的尺寸。

卷积神经网络在图像识别上的效果非常好(远超DNN等),原因之一是卷积操作特别符合人类观看图像的方式,即类别是由基础形状及它们之间的组合决定的,与它们的具体位置无关。池化操作屏蔽了图像平移、轻微旋转等扰动的影响,这进一步说明,模型和场景的吻合能让图像识别事半功倍。

另外,对于 28×28×1 的输入图像,如果下一个隐藏层的神经元数量为 28×28×1 个(图像大小不变)且采用全连接,那么将有 28×28×1×28×28×1=614656‬ 个权值参数。这个参数量非常大,对训练样本数量和机器性能的要求都比较高。采用 3×3 卷积,可以理解成隐藏层的每个神经元只与输入层的9个神经元相连,其他连接都被剪枝,并且,各个位置的连接参数是共享的,即只需要9个参数就可以完成任务。因此,CNN是通过权值共享和局部感受野(相当于剪枝)对全连接DNN进行简化的。

最后,有一点需要特别说明。在真实的项目中,卷积层往往很深。为了防止数值溢出和激活函数饱和造成梯度消失和梯度爆炸等,一般会将输入图像各个像素的值归一化至 [0,1]。

1.3 卷积神经网络中的批标准化

批标准化除了可以用在DNN中,其在CNN中的表现也非常好。在CNN中,每一层都是多通道图像,每个通道代表的特征都是同一类型的(同一个卷积核计算出来的结果)。因此,在进行批标准化时,同一个通道的各个位置都会参与统计。

如图11-21所示,假设一个batch中有 N 个样本,图像的尺寸是 128×128×10(即通道数为10)。分别在10个通道上统计10组均值和方差,每个通道的批标准化需要计算的数据量为 128×128×N。

将层标准化添加到CNN中,通过实验发现,层标准化破坏了通过卷积学到的特征,模型无法收敛。所以,在CNN中一般使用批标准化。

图11-21

1.4 TextCNN的原理及应用

CNN诞生于计算机视觉领域并取得了成功。但是,CNN的应用并不局限于计算机视觉领域,它在自然语言处理领域也取得了不错的成绩。

在自然语言处理领域,最常见的场景是文本分类,而在进行分类时最重要的特征是语义。在文本分类任务中,连续出现的多个词可以在一定程度上表达语义,这是一种局部特征——CNN的核心思想正是捕获局部特征。

CNN能够自动对局部词的特征进行组合以提取语义信息,并通过池化操作获取语义最强的信息用于分类。例如,外卖平台需要自动识别用户对商家的评价,评价通常可以分为“正面”“中性”“负面”,如果用户输入“虽然排队时间很长,但剁椒鱼头非常好吃”,就需要用模型识别其为“正面”评价——这是一个典型的分类任务。

下面我们讨论一下如何使用CNN进行文本分类。

首先,对“虽然排队时间很长,但剁椒鱼头非常好吃”进行分词,结果为“虽然”“排队”“时间”“很长”“但”“剁椒”“鱼头”“非常”“好吃”(现在市面上有很多成熟的商业中文分词器,这里不再赘述)。

一般来说,神经网络的输入都是向量,很难直接将文本字符串作为输入,因此,可以让每个词对应于一个 k 维的embedding。在这里,k=4,和Word2vec使用的embedding相同。可以对embedding进行随机初始化,然后通过训练进行更新;也可以直接将Word2vec得到的embedding作为初始值,然后在分类任务中进行更新(再次学习)。因此,输入可以转换成如图11-22所示的形式。

在文本识别领域,很多重要的语义无法通过单个词获得,而相邻的词能更准确地表达语义。例如,“非常”和“好”相邻为正面评价,“非常”和“慢”相邻则为负面评价。依次对相邻的两个词所对应的向量进行卷积操作,结果为这两个词所表达的综合语义。卷积过程如图11-23所示。

图11-22

图11-23

在这里,有几点和图像的卷积操作不同。

卷积核不再是正方形的,而是长方形的,即 C×k。其中,C 为该卷积考虑的相邻词的个数(在本例中为2),k 为词所对应的向量的长度(在本例中为4)。

窗口只会从上往下滑动,不会从左往右滑动,因此,输入为2维特征,输出为一个向量。这个过程就是1维卷积运算,也就是在进行卷积操作时只关注列(窗口只会从上往下滑动)。

卷积的步长仍为1,但不再对边缘进行补0操作。因此,输入为 n×k(n 为词的个数,k 为embedding的长度)。卷积后的特征尺寸为 (n-C+1)×1。

需要注意的是,在使用卷积操作提取句子的特征时,网络对词的顺序是敏感的(所以,不是词袋模型)。

可以多次进行 2×4 卷积,从句子中提取不同角度的语义特征。例如,有的 2×4 卷积提取的特征偏向“排队”“时间”“很长”这类相对客观的评价,有的则提取“非常”“好吃”这种主观感受。也可以通过 3×4 卷积、4×4 卷积进行特征提取,以考虑更多领域的词的语义特征。

提取特征的过程,如图11-24所示,其中 2×4、3×4、4×4 卷积都进行了两次。

图11-24

每次卷积操作所提取的特征都对应于一个向量,该向量蕴含了特定的语义(与具体的卷积核有关)在不同位置上的表现。

通过最大池化抽取向量中语义最强的信息,如图11-25所示。

图11-25

例如,对“很多朋友说这里菜还不错,但是我觉得味道好吃到爆”使用最大池化,就能很好地提取语句中感情色彩最强的特征“好吃到爆”。

对所有卷积操作的结果进行最大池化,将池化结果拼接成一个向量(这个向量的长度和卷积核的个数相同),然后将池化结果送入Softmax层,输出分类。这项技术叫作TextCNN,具体流程如图11-26所示。

图11-26

TextCNN在文本分类任务中有广泛的应用,主要得益于它的以下优点。

能够有效捕捉句子中的局部相关信息,并通过最大池化找到语义最强的部分。

有抗干扰能力。如果评论中出现“今天”“和朋友一起”之类与评价倾向无关的词,那么提取出来的语义将偏弱(数值较小),这些词所对应的信息在进行最大池化操作时会被过滤。

多卷积核可以从不同的角度提取语义特征。

不同于LDA这类词袋模型完全忽视词的相对位置,TextCNN对词的顺序和相对位置敏感。例如,分词后,“上菜慢,不好吃”和“上菜不慢,好吃”表达的情感完全相反。如果使用LDA,则这两句话的特征没有区别;如果使用TextCNN,就能捕捉相邻词的组合语义(“上菜”和“慢”),对这两句话进行有效的区分。

虽然在理论上TextCNN可以接收任意长度的文本,但是,主流的深度学习框架(例如TensorFlow、Keras)为了保证计算效率,通常要求输入的文本长度一致。因此,对实际应用中的变长文本,通常要设置一个标准长度。当文本长度小于标准长度时,需要在文本后面补充占位词(自行创建一个真实样本中不会出现的字符串)。当文本长度大于标准长度时,需要对文本进行截断操作。

在对大规模中文语料使用TextCNN时,由于常见的中文词超过20万个,所以会给模型带来以下困扰。

在模型的预测阶段,经常会遇到一些训练样本中不存在的词(未登录词)。如何寻找未登录词的对应向量?一般的处理方法是直接忽略未登录词。但是,这样做会损失不少信息。

词数过多。例如,包含50万个词的embedding对应于 500000×k 个待训练参数,这对机器性能和样本数量都是不小的挑战。大量长尾词的出现次数极少,它们所对应的embedding无法得到充分的训练。

目前还未出现100% 准确的商用中文分词器,市面上常见的分词器都存在一定程度的误差,而如果分词出现错误,那么TextCNN的准确率很难得到保证。特别是在一些2C平台上,顾客的评论口语化现象严重,分词器非常容易出现错分。

有些词表达的意思是相同的。例如,“很好”“极好”的关键语义都是“好”,前面的那个字是用来修饰程度的。然而,在以词为单位的输入中,这两个词是作为独立的词训练的,忽视了它们共同拥有的“好”字。

鉴于上述问题,目前工业界开始尝试以字为单位输入TextCNN。因为不需要进行分词,所以自然避免了分词器带来的错误。常见汉字约为8000个,因此,embedding的参数量大大减少了。尽管未登录词常见,但未登录字很少出现,所以,预测阶段的未登录词问题也得到了一定程度的解决。这样,“很好”“极好”这两个词的信息就可以通过卷积核提取出来了(因为它们有相同的字和类似的修饰,所以卷积结果相近)。

如果以字作为TextCNN的输入,那么同一句话的序列将会变长,因此,需要相应地增加标准长度。另外,需要相应地增加卷积核的宽度,以便在每次进行卷积操作时考虑更多的字,达到与以词作为输入相同的提取效果。


(由于平台稿件格式问题,公式格式不能正确写上;如若读写困难可后台私信我要完整电子版)

对机器学习感兴趣的读者可以去主页关注我;本人著有《速通深度学习》以及《速通机器学习数学基础》二书,想要完整版电子档可以后台私信我;实体版已出版在JD上有售,有兴趣的同学可以自行搜索了解

想一起学习机器学习的话也可以后台私信,本人所做机器学习0基础教程已有60余章还未公开;想了解的话也是后台私信或者评论区留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值