在文本分类时,可以使用卷积层进行文本特征抽取,模型结构如图:
首先利用卷积层和池化层,捕获序列特征,然后根据特征用softmax进行分类。
这里面主要涉及到两个操作,卷积操作和池化操作。
卷积操作
卷积神经网络的特点:
- 稀疏交互(sparse interactions): 也叫稀疏权重(sparse weights)、稀疏连接(sparse connectivity)
在传统神经网络中,网络层之间输入与输出的连接关系可以由一个权值参数矩阵来表示。对于全连接网络,任意一对输入与输出神经元之间都产生交互,形成稠密的连接结构。这里面的交互是指每个单独的参数值,该参数值表示了前后层某两个神经元节点之间的交互。
在卷积神经网络中,卷积核尺度远小于输入的维度,这样每个输出神经元仅与前一层特定局部区域内的神经元存在连接权重(即产生交互),我们称这种特性为稀疏交互。
稀疏交互的物理意义:通常图像、文本、语音等现实世界中的数据都具有局部的特征结构, 我们可以先学习局部的特征, 再将局部的特征组合起来形成更复杂和抽象的特征。
- 参数共享(parameter sharing)
参数共享是指在同一个模型的不同模块中使用相同的参数。卷积运算中的参数共享让网络只需要学一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。
参数共享的物理意义:使得卷积层具有平移等变性。在第三个特点中会谈到。
显然,我们可以看到,卷积神经网络在存储大小和统计效率方面极大地优于传统的使用矩阵乘法的神经网络。
- 等变表示(equivariant representations)
假如图像中有一只猫,那么无论它出现在图像中的任何位置,我们都应该将它识别为猫,也就是说神经网络的输出对于平移变换来说应当是等变的。特别地,当函数f(x)与g(x)满足f(g(x))=g(f(x))时,我们称f(x)关于变换g具有等变性。在猫的图片上先进行卷积,再向右平移l像素的输出,与先将图片向右平移l像素再进行卷积操作的输出结果是相等的。
(二)卷积(convolution)操作
卷积运算实际是分析数学中的一种运算方式,在卷积神经网络中通常是仅涉及离散卷积的情形。因卷积运算的作用就类似于滤波,因此也称卷积核为filter即滤波器的意思。滤波器可以从原始的像素特征中抽取某些特征,如:边缘、角度、形状等。而在实际上,在卷积神经网络中我们并不会手工设计卷积核中的每个卷积核点值,而是通过学习算法自动学得卷积核中每个位置的值。
单个卷积核只能提取一种类型的特征,那么我们若想使卷积层能够提取多个特征,则可以并行使用多个卷积核,其中每个卷积核提取一种特征。
另外,必须要说明一下,现在大部分的深度学习教程中都把卷积定义为图像矩阵和卷积核的按位点乘。实际上,这种操作应该是互相关(cross-correlation),而卷积需要把卷积核顺时针旋转180度(即翻转)然后再做点乘。互相关是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现。互相关和卷积的区别仅仅在于卷积核是否进行翻转,因此互相关也可以称为不翻转卷积。
下面将说明卷积层的参数含义:
在textCNN模型中,我们通常使用的是一维卷积,涉及到的以下几个参数(以keras中为例):
filters:卷积核数目,对于每一种尺寸的卷积核都会有这么多个相同的,因为每个卷积核只能够提取某一个特征。
kernel_size:卷积核尺寸,一个整数值,因为是一维卷积核,所以卷积核的尺寸就只有一个参数,比如卷积核的kernel_size是3,那就表示该卷积核可以捕获序列窗口为3的相关信息,由于是一维卷积,所以卷积核会将embedding维度看做channel,所以实际的卷积核是3*embed_size大小。
strides: 步长,表示卷积核在序列维度上每次移动的距离。
padding: b是否有padding操作,有两个取值,same和vaild,vaild就是不填充,same是填充,填充多少回根据其余参数自动选择。
了解一个结构的功能,可以从tensor的输入和输出入手,我们假设输入的shape为[batch_size,seq_len,embed_size],那我们在经过一维卷积之后,[batch_size,new_len,filters]
这里的new_len是和本身参数有关的,如果padding参数是vaild,则一般可以由如下计算得到:
如果padding参数是same,则
池化(pooling)操作
池化也叫做亚采样、下采样(downsampling)或子采样(subsampling),主要针对非重叠区域,包括均值池化(mean pooling)、最大池化(max pooling)。池化操作的本质是降采样。例如,我们可以利用最大池化将4×4的矩阵降采样为2×2的矩阵。
均值池化通过对邻域内特征数值求平均来实现,能够抑制由于邻域大小受限造成估计值方差增大的现象,特点是对背景的保留效果更好。均值池化是求窗口中元素的均值。
最大池化则通过取邻域内特征的最大值来实现,能够抑制网络参数误差造成估计均值偏移的现象,特点是更好地提取纹理信息。最大池化是求窗口中元素的最大值。
特殊的池化方式还包括相邻重叠区域的池化以及空间金字塔池化。池化操作除了能显著降低参数量外,还能够保持对平移、伸缩、旋转操作的不变性。这里就不展开细讲了。
添加池化层的作用:
降维。这点很好理解,就是经过池化操作后,图像"变小"了。在图像处理中,把图像缩小就称为下采样或降采样,由此可窥见池化操作的降维性质。
不变性(invariance)。包括平移不变性(translation invariance),旋转不变性(rotation invariance),尺度不变性(scale invariance)。简单来说,池化操作能将卷积后得到的特征图中的特征进行统一化。另外,平移不变性,是指一个特征,无论出现在图片的哪一个位置,都会识别出来(也有人说平移不变性是权值共享带来的?)。
定长输出。比如我们的文本分类的例子中就是使用到了这个特性。无论经过卷积后得到的特征图有多大,使用池化操作后总能得到一个scalar,再将这些scalar拼接在一起,就能得到一个定长的向量。
下面依然从参数的角度来说明最大池化的含义:
pool_size:池化范围,因为是一维池化,所以这个范围也是一个整数值
strides: 步长,同理,每次池化窗口移动的步长
padding:填充模式
承接上面卷积层的输出为
(batch_size, new_steps, filters)
那经过池化之后就是
(batch_size, downsampled_steps, filters)
其中downsampled_steps就是和上面计算方式一样,如果是same
如果是vaild,
我们这里可以将pool_size设置为new_step,这样对于每个卷积核就只会有一个输出
所以最终所有尺寸的卷积核为经过转换后就(batch_size,filters*len_filter_size)
举例说明,如果pool_size是2,embedding_size是10,那么对两个词的最大池化是选择其中两个词在各embedding维度的最大值,比如两个词的embedding是[1,4,5]和[2,3,7],那么进行最大池化就是[2,4,7]