https://zhuanlan.zhihu.com/p/77634533?from_voters_page=true
前言
本文是本人所写的NLP基础任务——文本分类的【深入TextCNN】系列文章之一。 【深入TextCNN】系列文章是结合PyTorch对TextCNN从理论到实战的详细教程。
本文适合阅读的对象:
- 对深度学习、卷积神经网络和PyTorch有一定的基础
- 对卷积神经网络用于文本分类有一定实践经验的读者
- 在拥有上面基础的同时想进一步提高自己、增加对TextCNN的理解的读者
本文的重点部分是:
- 结合PyTorch函数对一、二和三维卷积过程的详细解释;
- 可能是全网最详细的解释TextCNN过程的文章;
文章很长,读者若耐心读完,必将对TextCNN的理解提升一个层次。建议按计划分几次读完。本文并不适合毫无基础的新手。另外,本文列出了非常详尽的参考文档/参考论文,是每位对相关知识点感兴趣的读者的绝佳知识拓展,可以好好利用一下。
本人才疏学浅,有不足之处请各位不吝赐教,共同探讨!本文会不定期更新,不断修正里面的疏漏内容,增加新理解和新体会。
一、卷积神经网络原理
(一)卷积神经网络的特点:
1. 稀疏交互(sparse interactions): 也叫稀疏权重(sparse weights)、稀疏连接(sparse connectivity)
在传统神经网络中,网络层之间输入与输出的连接关系可以由一个权值参数矩阵来表示。对于全连接网络,任意一对输入与输出神经元之间都产生交互,形成稠密的连接结构。这里面的交互是指每个单独的参数值,该参数值表示了前后层某两个神经元节点之间的交互。
在卷积神经网络中,卷积核尺度远小于输入的维度,这样每个输出神经元仅与前一层特定局部区域内的神经元存在连接权重(即产生交互),我们称这种特性为稀疏交互。
稀疏交互的物理意义:通常图像、文本、语音等现实世界中的数据都具有局部的特征结构, 我们可以先学习局部的特征, 再将局部的特征组合起来形成更复杂和抽象的特征。
2. 参数共享(parameter sharing)
参数共享是指在同一个模型的不同模块中使用相同的参数。卷积运算中的参数共享让网络只需要学一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。
参数共享的物理意义:使得卷积层具有平移等变性。在第三个特点中会谈到。
显然,我们可以看到,卷积神经网络在存储大小和统计效率方面极大地优于传统的使用矩阵乘法的神经网络。
3. 等变表示(equivariant representations)
假如图像中有一只猫,那么无论它出现在图像中的任何位置,我们都应该将它识别为猫,也就是说神经网络的输出对于平移变换来说应当是等变的。特别地,当函数f(x)与g(x)满足f(g(x))=g(f(x))时,我们称f(x)关于变换g具有等变性。在猫的图片上先进行卷积,再向右平移l像素的输出,与先将图片向右平移l像素再进行卷积操作的输出结果是相等的。
(二)卷积(convolution)操作及相关PyTorch重要类解析
卷积运算实际是分析数学中的一种运算方式,在卷积神经网络中通常是仅涉及离散卷积的情形。因卷积运算的作用就类似于滤波,因此也称卷积核为filter即滤波器的意思。滤波器可以从原始的像素特征中抽取某些特征,如:边缘、角度、形状等。而在实际上,在卷积神经网络中我们并不会手工设计卷积核中的每个卷积核点值,而是通过学习算法自动学得卷积核中每个位置的值。
单个卷积核只能提取一种类型的特征,那么我们若想使卷积层能够提取多个特征,则可以并行使用多个卷积核,其中每个卷积核提取一种特征。feature map 特征图是卷积层的输出的别名。
另外,必须要说明一下,现在大部分的深度学习教程中都把卷积定义为图像矩阵和卷积核的按位点乘。实际上,这种操作应该是互相关(cross-correlation),而卷积需要把卷积核顺时针旋转180度(即翻转)然后再做点乘。互相关是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现。互相关和卷积的区别仅仅在于卷积核是否进行翻转,因此互相关也可以称为不翻转卷积。
必须要注意的是,卷积神经网络使用的数据可以是一维、二维和三维的,对于这三种数据,每种都可以是单通道或者是多通道的(可以参见《深度学习》花书p219页表9.1)。下面我们介绍不同维数据的情况下通道数不同的卷积操作。
1. 一维卷积 Conv1d
CLASS torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
在由多个输入平面组成的输入信号上应用1D卷积。
例子:
二、卷积神经网络在文本分类上的应用
(一)TextCNN中的卷积操作
卷积神经网络的核心思想是捕捉局部特征,对于文本来说,局部特征就是由若干单词组成的滑动窗口,类似于N-gram。卷积神经网络的优势在于能够自动地对N-gram特征进行组合和筛选,获得不同抽象层次的语义信息。
图1是论文[1]中用于文本分类的卷积神经网络模型架构。
图1 双通道的TextCNN结构
图2 用于文本分类任务的TextCNN结构描述 这里详细解释TextCNN架构及词向量矩阵是如何做卷积的。
第(2)部分是重点,理解好卷积过程是关键。
总结
本文主要讲清楚了一维、二维和三维卷积,和文本分类中卷积操作的具体过程。不同维的卷积使用是根据卷积输入的数据来定,另外,当数据有多个channel时,也要进行相应处理。在文本分类中,主要是要注意一下和CV场景中不同的情况,卷积核不是一个正方形,是一个宽和word embedding相同、长表示n-gram的窗口。一个卷积层会使用多个不同大小的卷积核,往往是(3, 4, 5)这种类型。每一种大小的卷积核也会使用很多个。