一、原理简介
除了RNN能用于时间序列的处理,CNN(Convolutional Neural Networks,卷积神经网络),也能够处理文本分类问题。卷积神经网络一般用于处理图像数据,从开始时最简单的卷积层,到后面加入了池化、BN、drop_out、padding等层后,网络变得更加精细。随着时间的发展,人们相继提出了Google net,Alex net,以及后来在图像识别领域最为著名的ResNet网络,这一网络的出现使得神经网络对图像的分类准确率超过了人类水平。可见,卷积神经网络具有优越的特征提取和分类能力。因此,我们可以尝试把文本视为一维图像,用CNN来对文本进行分类。
二、数据处理
数据选取与数据处理步骤与我之前发布的博文《一文看懂LSTM》是一模一样的,此处不再赘述。本文是情感分析的另一种模型实现。
三、textCNN模型构建
3.1 一维卷积
在介绍模型前我们先来解释一维卷积层的工作原理。与二维卷积层一样,一维卷积层使用一维的互相关运算。在一维互相关运算中,卷积窗口从输入数组的最左方开始,按从左往右的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。如图10.4所示,输入是一个宽为7的一维数组,核数组的宽为2。可以看到输出的宽度为 7 − 2 + 1 = 6 7-2+1=6 7−2+1=6,且第一个元素是由输入的最左边的宽为2的子数组与核数组按元素相乘后再相加得到的: 0 × 1 + 1 × 2 = 2 0\times1+1\times2=2 0×1+1×2=2。
下面我们将一维互相关运算实现在corr1d函数里。它接受输入数组X和核数组K,并输出数组Y。
def corr1d(X, K):
w = K.shape[0]
Y = torch.zeros((X.shape[0] - w + 1))
for i in range(Y.shape[0]):
Y[i] = (X[i: i + w] * K).sum()
return Y
多输入通道的一维互相关运算也与多输入通道的二维互相关运算类似:在每个通道上,将核与相应的输入做一维互相关运算,并将通道之间的结果相加得到输出结果。下图展示了含3个输入通道的一维互相关运算,其中阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: 0 × 1 + 1 × 2 + 1 × 3 + 2 × 4 + 2 × ( − 1 ) + 3 × ( − 3 ) = 2 0\times1+1\times2+1\times3+2\times4+2\times(-1)+3\times(-3)=2 0×1+1×