(一)文本分类经典模型之CNN篇

news/2024/10/4 7:18:07

CNN源于计算机视觉研究,后来诸多学者将其应用于短文本分类,其基本结构如下图所示:

image

由上图可知,基于CNN的短文本分类模型,通常包括输入层、卷积层、池化层、全连接层和输出层五部分,其中卷积层和池化层是最为关键的特征提取环节。卷积层通过构造二维卷积核,并将其上下移动,在卷积窗口内与文本表示矩阵进行卷积操作,以此来提取文本特征。池化层则是对提取的特征进行选择,筛选出最为明显的特征。通常,在短文本分类时,需要对卷积层与池化层进行多层交替叠加,经过多次特征提取与特征选择,多角度获取文本特征信息;然后,进入全连接层,将特征信息进行整合,并将结果在输出层展示。

image

TextCNN是Yoon Kim在2014年提出的模型,开创了用CNN编码n-gram特征的先河。模型结构如上图3所示。

image

上图是来源于2016年ACL论文A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification

模型详解

数据处理:所有句子padding成一个长度:seq_len

1.模型输入[batch_size, seq_len]

2.经过embedding层加载预训练词向量或者随机初始化,词向量维度为embedding_size:[batch_size, seq_len, embedding_size]

3.卷积层:NLP中卷积核宽度与embedding_size相同,相当于一维卷积。3个尺寸的卷积核(2, 3, 4),每个尺寸的卷积核有100个,卷积后得到三个特征图: [batch_size, 100, seq_len -1][batch_size, 100, seq_len - 2][batch_size, 100, seq_len -3]

卷积操作相当于提取了句中的2-gram、3-gram、4-gram信息,多个卷积是为了提取多种特征,最大池化将提取到最重要的信息保留。

4.池化层:对三个特征图做最大池化[batch_size, 100][batch_size, 100][batch_size, 100]

5.拼接[batch_size, 300]

6.全连接[batch_size, num_classes]

7.预测:Softmax归一化,将num_class个数中最大的数对应的类作为最终预测。

TextCNN是很适合中短文本场景的强baseline,但不太适合长文本,因为卷积核尺寸通常不会设置很大,无法捕获长距离特征。同时max-pooling也存在局限,会丢掉一些有用特征。另外再仔细想的话,TextCNN和传统的n-gram词袋模型本质是一样的,它的好效果很大部分来自于词向量的引入,解决了词袋模型的稀疏性问题。这也正是TextCNN成功的原因,TextCNN的成功并不是结构的成功,而是证明了预训练词向量 + 微调是提升NLP各项任务的关键能力(实验结果如下图4所示)。

image

那么怎么改进TextCNN模型的分类效果呢?从模型上看,无非就是以下几个大的方面:

1.词嵌入Embedding

2.卷积层

3.池化层

4全连接层

而Character-level Convolutional Networks for Text Classification这篇文章则从字符级卷积网络进行文本分类进行了实证探索。这个模型的优点就是模型结构简单,并且在大语料上效果很好,可以用于各种语言,不需要做分词处理,在噪音比较多的文本上表现较好。但是缺点就是字符级别的文本长度特别长,不利于处理长文本的分类,只使用字符级别信息,所以模型学习语义方面的信息较少而且在小语料上效果较差。后来学者们也研究了此问题,在论文Shallow word-level vs. deep character-level中就表明:即使在大量训练数据的情况下,浅层字级CNN也比最先进的超深字符级CNN更准确、更快。

为了进一步提高TextCNN模型的分类效果,弥补在获取短文本语义和上下文信息等方面的不足,学者们试图通过增加层数,增大了卷积核获取信息的视野,构建了深度CNN模型。

受这些的启发,Tencent AI Lab在2017年提出了Deep Pyramid Convolutional Neural Networks for Text Categorization模型,从模型性能上纵向比较来看,其也比经典的TextCNN(表格的第二行ShallowCNN)有了明显提高,在Yelp五分类情感分类任务中提升了近2个百分点。

image

image

DPCNN的模型如上图。

模型详解

1.模型输入:[batch_size, seq_len]

2.经过embedding层:加载预训练词向量或者随机初始化,词向量维度为embedding_size。[batch_size, seq_len, embedding_size]

3.进行卷积,250个尺寸为3的卷积核,论文中称这层为region embedding。[batch_size, 250, seq_len - 2]

4.接两层卷积,每层都是250个尺寸为3的卷积核(等长卷积,先padding再卷积,保证卷积前后的序列长度不变)[batch_size, 250, seq_len - 2]

5.Repeat

a.进行大小为3,步长为2的最大池化,将序列长度压缩为原来的二分之一。(进行采样)

b.接两层等长卷积,每层都是250个尺寸为3的卷积核

c.a的结果加上b的结果

重复以上操作,直至序列长度等于1。[batch_size, 250, 1]

6.全连接 + softmax归一化:

[batch_size, num_class] ==> [batch_size, 1]

DPCNN的核心改进如下:

1.在Region embedding时不采用CNN那样加权卷积的做法,而是对n个词进行pooling后再加个1 * 1的卷积(这儿有疑问,查看一下源码),因为实验下来效果差不多,且作者认为前者的表示能力更强,

2.使用1/2池化层,用size=3 stride=2的卷积核,直接让模型可编码的sequence长度翻倍

3.残差连接,参考ResNet,减缓梯度弥散问题。

TextCNN的过程类似于提取n-gram信息,而且只有一层,难以捕捉长距离特征。而DPCNN,可以看出来它的region embedding就是一个去掉池化层的TextCNN,再将卷积层叠加。

每层序列长度都减半,如图7所示。可以这么理解:相当于在n-gram上再做n-gram。越往后的层,每个位置融合的信息越多,最后一层提取的就是整个序列的语义信息。

image

上面的DPCNN是从纵向增加层数构建的深度CNN模型,那么横向改变模型是否可行呢?比如在论文A Convolutional Neural Network for Modelling Sentences中使用了动态池化K-Max这一概念细化了短文本特征提取;同时,在池化层保留前K个最大特征值,从多个维度获取短文本特征。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28988.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Apache DolphinScheduler 3.3.0 版本重磅更新提前看!

Apache DolphinScheduler 3.3.0版本终于要在万众期待中发布啦!本次发版将有重大功能更新,包括架构上的调整。 为了让广大用户提前尝鲜,社区特别准备了直播活动提前揭秘3.3.0版本中的重要更新,到时候你将会了解到这些信息:3.3.0版本的工作流引擎改进 任务执行流程的优化 架…

【触想智能】工业级平板电脑五大特征与应用领域分析

工业级平板电脑是专供工业环境使用的工业控制计算机,也被称为工控一体机。工业级平板电脑基本性能及兼容性与商用平板电脑几乎相同,但是工业级平板电脑更注重在不同环境下的稳定性能,因此,工业级平板电脑与普通的商用平板电脑存在一定的区别。一、工业级平板电脑的五大特征…

TCP的三次握手和四次挥手

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问…

新版宝塔加密数据解密

宝塔更新了数据存储的方式,PanelForensics会尽快支持最近啊,fic中出现了宝塔,结果PanelForensics居然没有梭哈,这怎么行?? 于是我就一通分析,发现这个版本更新了架构,并且对密码的加解密是通过调用二进制依赖进行实现的 我这里就以mysql的密码为例,在新版本中,mysql的…

MongoDB索引

MongoDB索引 概述 索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常…

Vue2工程化介绍

Vue2项目[基于vue-cli]工程化 【一】环境搭建06-Vue-cli - 刘清政 - 博客园 (cnblogs.com)安装node 使用npm/cnpm npm换源:npm config set registry https://registry.npmmirror.com 安装vue-cli cnpm install -g @vue/cli# 安装脚手架 cnpm install -g @vue/cli # 切换目录,…

jmeter以命令行模式运行:非GUI界面

* `-n`:表示非GUI模式运行:命令行模式运行jmeter脚本 * `-t`:要执行的jmeter脚本(JMX):a.默认执行当前路径下的脚本,b.或执行指定路径下的脚本 * `-l`:生成结果文件(JTL):a.默认在当前路径下生成JTL文件,b.或在指定路径下生成JTL文件 * `-e`:生成HTML报告 * `-o`…

79. 单词搜索-c++

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。…