《Deep Pyramid Convolutional Neural Networks for Text Categorization》论文阅读笔记
本篇论文发布于2017年的ACL。DPCNN论文链接
文章目录
-
1. Abstract
-
2. Introduction
-
3. DPCNN原理
-
- 3.1 model结构
-
4.DPCNN模型的使用
-
- 4.1 二分类问题
-
- 实验结果展示
-
5.1 大规模数据测试
-
5.2 计算时间分析
-
5.3 对比分析:非金字塔结构
-
5.4 小规模数据验证
-
6. 总结
-
7. 参考资料
1. Abstract
本文提出了一种用于文本分类的低复杂度词级深度卷积神经网络架构,并能有效捕捉长距离关联关系。在文献研究中已有研究表明,在处理此类任务时采用了多层次复杂的神经网络架构。然而,在计算资源方面随着网络深度的增加也会面临更大的挑战。进一步研究表明,在拥有充足训练数据的情况下,并非越深越好;相反,在某些情况下浅层字级CNN的表现甚至超越了较深的字符级CNN模型。基于上述研究发现和性能对比分析,我们提出了一种称为深度金字塔型结构的新模型架构。
2. Introduction
文本分类被视为一项关键的任务,在多个应用场景中发挥着重要作用。这些应用场景包括垃圾邮件过滤、情感分析以及主题识别等领域。近年来研究表明,在文本分类任务中采用词序感知的神经网络架构能够展现出显著的效果。尽管传统的方法如浅层卷积神经网络(CNN),即Kim在2014年首次提出的方案以及John Sion与Zhang在2015年的研究结果相对较为基础,在早期应用于这一领域时就已取得一定成效。然而随着深度学习的发展与研究的深入,在这项任务中引入更为复杂的神经网络架构逐渐成为研究热点。其中假设具备相当数量的训练数据集(如约一百万个文档),这些方法均取得了不错的效果:其中包含了多种先进的模型架构如深度字符级卷积神经网络(Zhang等人, 2015; Conneau等人, 2016)、融合型CNN-RNN架构(Tang等人, 2015)以及基于单词级别的递归神经网络(Yang等人, 2016)等创新性设计
以下是对输入文本的改写
该网络模型通过巧妙地调整词序展示了其在文本分类任务中的有效性。该研究工作发表于《基于卷积神经网络利用词序提升文本分类效果的研究》一文中。
尽管词汇总量庞大,在实际训练中仅采用了30K个高频词汇即可覆盖数据集总词量的98%。
近年来,在大规模文本分类任务中基于CNN的研究取得了诸多进展。其中一项研究是(Conneau等人)提出的32层字符级别CNN显著超越了(Zhang等人)的9层版本。然而,在(Johnson与Zhang,2016)的研究中发现单层单词级别CNN不仅准确性更高而且运算速度更快。尽管字符级别的方法无需处理海量词汇量却仍可通过有限数量的关键词汇实现良好效果这揭示了一个关键点:词汇知识能够生成强大的表征空间。这些发现促使我们探索高效实用的深度词级别CNN架构以提升文本分类性能值得注意的是这种做法并非简单地通过将单个词替换为字符来构建更深网络那样直接这种做法反而会导致精度下降
这一段文字表明加深网络具有重要意义,并指出单词级别的CNN相较于字符级别具有更强的优势(能够生成强大的表征)。因此作者将上述观点和方法论基础相结合:提出了一种高效而有效的深度词级别CNN架构以实现文本分类。
我们对词级卷积神经网络在大数据环境下的深化进行了深入研究,并发现了一种具有较高识别能力但计算复杂度较低的网络架构设计。通过依次增加深度而不提升计算时间即可获得最佳精度——总计算时间受限于常数规模。我们将这种新型架构命名为深度金字塔型卷积神经网络(DPCNN),因为其每层的计算时间呈指数下降趋势。具体而言,在将离散文本转换为连续表示后,DPCNN 通过反复交替使用卷积块和下采样层的方式构建了一个内部数据规模呈金字塔形逐步收缩的多层级结构模型。其中模型的整体深度可被视为一个可调节的关键参数设置值。值得注意的是该模型的最大运算复杂度仅相当于单个卷积块运算量的大约两倍水平同时随着模型逐步加深能够有效捕捉到文本中的长距离关联信息以及提取更多的全局语义特征进而显著提升了与之对比的传统浅层卷积神经网络(ShallowCNN)的表现
该论文采用了间距设置在2时的池化结构,在每次池化操作后会导致数据量减少一半。这种配置虽未被称为"金字塔"形状,但在顶级期刊和会议(top journals and conferences)发表的文章必须要有创新想法。
研究表明,在多个基准数据集上涉及情感分类与主题分类任务的研究中,DPCNN模型配置为15个权重层时表现出了超越现有最佳模型的结果
干的咋样
:
3. DPCNN原理
3.1 model结构
基于DPCNN架构如图(a)所示。第一层通过嵌入机制处理文本区域信息,并将常用的单词嵌入概括为涵盖一个或多个词的文本区域的嵌入形式。随后采用交错配置方式构建堆叠卷积块:即依次排列两个连续卷积层、一个残差连接以及步长为2的空间采样器来进行特征提取过程;并在各层次特征提取过程中采用了最大值池化方法获取最终输出特征向量

step1:模型输入
从上往下看的话,请注意这句话"A good buy!"是输入的一部分,在编程中我们通常会对它进行处理。如果我是来编写这段代码的话,请问有什么具体需求呢?首先我会基于语料库构建一个word_to_index字典,并将其映射为对应的索引序列;
接着我们可以采用基于word2vec预训练的词向量或者自行设定初始值:
step2:Region embedding
作者认为TextCNN中融合多尺度卷积核的卷积层输出被称为Textual region embedding。具体而言,作者认为对一个文本区域(如3-grams)进行一组卷积操作后生成的是某种特定类型的特征表示。
在处理3gram时有两种方法:一种是保持原始的词语顺序(即设置尺寸为3×D的二维卷积核对3gram进行卷积操作),另一种则是完全放弃词语顺序(即采用词袋模型的方法)。具体来说,在不采用词语顺序的情况下(即使用词袋模型),首先需要将3gram中的三个单词各自的嵌入表示取平均值以获得一个尺寸为D的结果向量;随后再设置一组尺寸为1×D的一维卷积核对该结果向量进行操作。显然,在TextCNN中采用的是保持词语顺序的做法,在这种架构下实现的是传统的基于连续词序列的操作方式;而相比之下,DPCNN则采用了完全放弃词语顺序的做法,其基本架构是先将输入序列映射到嵌入空间后再进行一维卷 convolution操作.然而,DPCNN的作者却认为,前者容易导致过拟合的问题,但实验结果表明,其性能表现与后者相当.
step3:等长卷积
在模型主干部分进行两次相同长度的卷积操作后施加激活作用,在后续的计算中使用shortcut connections将输入特征x与其经过卷积后的输出f(x)进行叠加。
文中的意思是说,在模型主干的两个卷积层上先进行激活操作后再相加x即可。也就是说,在经过第一个卷积层并完成激活操作后再将输入x相加得到结果;而如果是先将输入x与第一个卷积层输出相加后再进行激活操作则会得到不同的结果
等长卷积(Length-Preserving Convolution)是一种特殊的卷积操作,在其定义中步长s被设定为1值,并且两端填充数p被计算为(m-1)/2的形式(其中m代表卷积核尺寸大小)。这种设计确保了输入与输出序列在位置数量上的一致性。DPCNN模型采用了两层这样的操作层,并且每一层都使用尺寸为3的卷积核进行计算。
在这种情况下,
等长卷积的作用是什么?
由于输入序列与输出序列具有相同数量的位置,
我们可以通过将输入序列第n个嵌入称为第n个词位这一概念来理解其意义。
具体而言,
当使用大小为n的卷积核时,
该操作将每个词位及其左右((n-1)/2)个相邻词的信息融合在一起,
生成经过上下文修饰后的更高层次语义表示。
step4:Repeat
随后会进入一个循环结构的"池化-卷积模块"。具体而言,在论文中指出, feature map(即filter)的数量保持恒定, 这不仅有助于实现"池化-卷积模块"内部的快捷连接,还能确保模型深度增长的同时保证计算复杂度不变。
假设一次训练,数据走到Repeat部分前,batch=128, len=32, filter=250
第一次循环阶段:通过池化操作(size为3、step为2),导致输入数据的空间维度减半(从...变为...),计算得到输出特征图尺寸为[128×16×250]。主干部分经过两个等深卷积生成px[128×16×250]张特征图(其空间维度与原输入相同)。随后将原输入与生成的特征图进行逐元素加法运算(x = x + px),得到最终输出特征图尺寸为[128×16×50])。此过程仅涉及简单的算术运算以实现特征融合
第二次循环:同理,变为[128, 8, 250]。
第三次循环:同理,变为[128, 4, 250]。
第四次循环:同理,变为[128, 2, 250]。
第五次循环:同理,变为[128, 1, 250]。此时不再循环,接个fc就可以分类输出了。
4.DPCNN模型的使用
为什么在这块就上代码呢?帮助你更好的理解DPCNN的model结构
4.1 二分类问题
第一步是从文件中获取训练数据集和测试数据集的语料样本。通过jieba工具实现文本的分词处理。接着使用nltk库去除停用词汇。
def tokenizer(text):
sentence = jieba.lcut(text, cut_all=False)
stopwords = stopwords.words('chinese')
sentence = [_ for _ in sentence if _ not in stopwords]
return sentence
借助 torchtext 包来对已经经过预处理的数据进行收集工作,并生成与其对应的Word Embedding(即Word2Vec)形式的数据集以供后续训练使用。
train_set, validation_set = data.TabularDataset.splits(
path='corpus_data/',
skip_header=True,
train='corpus_train.csv',
validation='corpus_validation.csv',
format='csv',
fields=[('label', label), ('text', text)],
)
text.build_vocab(train_set, validation_set)
将处理好的词向量输入到DPCNN模型中进行处理。
self.conv_region = nn.Conv2d(1, args.filter_num, (3, embedding_dim), stride=1)
self.conv = nn.Conv2d(args.filter_num, args.filter_num, (3, 1), stride=1)
self.max_pool = nn.MaxPool2d(kernel_size=(3, 1), stride=2)
self.padding1 = nn.ZeroPad2d((0, 0, 1, 1)) # top bottom
self.padding2 = nn.ZeroPad2d((0, 0, 0, 1)) # bottom
self.relu = nn.ReLU()
self.fc = nn.Linear(args.filter_num, label_num)
def forward(self, x):
# region embedding 层
# 输入x的维度为(batch_size, max_len)
x = self.embedding(x) # [batch_size, seq_length, embedding_dim]
x = x.view(x.size(0), 1, x.size(1), self.args.embedding_dim) # [(]batch_size, 1, seq_length, embedding_dim]
x = self.conv_region(x) # x = [batch_size, num_filters, seq_len-3+1, 1]
# 等长卷积层
x = self.padding1(x) # [batch_size, num_filters, seq_len, 1]
x = self.relu(x)
x = self.conv(x) # [batch_size, num_filters, seq_len-3+1, 1]
x = self.padding1(x) # [batch_size, num_filters, seq_len, 1]
x = self.relu(x)
x = self.conv(x) # [batch_size, num_filters, seq_len-3+1, 1]
# block结构
while x.size()[2] >= 2:
x = self._block(x) # [batch_size, num_filters,1,1]
x = x.squeeze() # [batch_size, num_filters]
# 全连接+输出
loggits = self.fc(x) # [batch_size, 1]
return loggits
def _block(self, x):
x = self.padding2(x)
px = self.max_pool(x)
x = self.padding1(px)
x = F.relu(x)
x = self.conv(x)
x = self.padding1(x)
x = F.relu(x)
x = self.conv(x)
x = x + px # Short Cut
return x
5.实验结果
5.1 Large data results

我们对包含15层权重层的改进型DPCNN框架及其无监督嵌入模型进行了详细汇报(如图3所示)。实验结果按错误率从优到劣依次排列。无论是在哪一数据集上,DPCNN的表现均超越了现有所有方法,这充分验证了我们提出的方法具有显著的有效性
5.2 Computation time

在图 2 中展示了一个错误率与计算时间之间的关系曲线——其中计算时间指的是我们在 GPU 上开发用于对 10K 文档进行分类所消耗的时间成本。右侧图表聚焦于 x ∈ [0, 20] 区域内的细节情况。通过观察左图可以看出(引用 Conneau 等人于 2016 年的研究),字符级卷积神经网络(CNN)相较于 DPCNN 在分类效率上明显低劣。这一现象的原因在于字符级CNN通过增强特征图的数量(即取消金字塔架构)以及增加层数(共32个权重层)来提高性能;同时该模型需处理文档中的每个字符而非单词层面的信息导致其计算复杂度显著提升至15层深度。然而有趣的是两者在计算时长上表现接近——其数值均落在[0, 20]区间内相对稳定。而DPCNN之所以能实现较高的分类准确率源于其在固定特征图数量的前提下采用降采样技术使得每层运算强度呈现指数级下降趋势
5.3 与非金字塔变体的比较

第一个模型每隔一次下采样时将特征图数量翻倍以维持各层计算量大致恒定4 第二个模型则未进行任何下采样操作 这两个变体除在外其余结构均与DPCNN一致 图3展示了这两种变体及其与DPCNN的比较结果 其中x轴表示分类任务所需的时间 我们主要考察深度为11层及15层的网络结构 在所有测试中DPCNN的表现均优于其他方法
5.4 Small data results

在表 3 中列出的三个小规模数据集的表现情况中可以看出,在相同实验设置下 ShallowCNN 的性能表现优于 DPCNN 的表现。与之前的分析类似,在针对这些小规模数据集的研究中发现:采用 100 维无监督嵌入的 DPCNN 在性能上与采用 300 维无监督嵌入的 DPCNN 并驾齐驱。值得注意的是,在面对大型数据集时这一现象并不明显:浅层网络的优势更加突出地体现出来。具体而言,在第 2 行中 ShallowCNN(浅层卷积神经网络)与第 1 行中的 DPCNN(深度前馈循环神经网络)之间的竞争格局发生了显著变化:Zhang 等人所提出的最佳线性模型(第 3 行)从最差表现跃升至第三名位置。这一结果充分说明了一个普遍现象:即更为复杂的模型通常需要更多的训练数据,在面对较少的训练数据时相对简单的模型往往能够表现出更好的性能
6. 总结
DPCNN模型的设计思想:设计一个词级别的深度CNN
- 词序信息在文本分类中很重要,RNN和CNN都能获得词序信息,但由于CNN更简单并且容易并行,所以DPCNN中使用CNN
- CNN研究中,浅层级别的CNN效果好于深度字级别的CNN,DPCNN中使用词级别作为输入
- CNN的词序信息有限,通过加深网络可以获得更大感受野,但是被证明加深网络词级别CNN性能反而下降。
DPCNN模型的创新点:
- 预训练的Region Embedding
- pre-activation shortcut connections
- 下采样不增加feature maps
7. 参考资料
从经典的文本分类模型Text CNN开始转向深度的Pyramid结构DP-CNN,并值得推荐
