【NLP】深度学习的NLP文本分类常用模型

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: 本文详细介绍了几种常用的深度学习文本分类模型,包括FastText、TextCNN、DPCNN、TextRCNN、TextBiLSTM+Attention、HAN和Bert,并提供了相关论文和不同框架下的实现源码链接。同时,还讨论了模型的优缺点、适用场景以及一些优化策略。

引言

更多模型介绍基于深度学习的文本分类
模型大致分类如下:

  • 词嵌入向量化:word2vec, FastText等等
  • 卷积神经网络特征提取:Text-CNN, Char-CNN等等
  • 上下文机制:Text-RNN, BiRNN, RCNN等等
  • 记忆存储机制:EntNet, DMN等等
  • 注意力机制:HAN等等

1 FastText

1.1 相关资料

论文:《Bag of Tricks for Efficient Text Classification》
Keras实现源码
Tensorflow实现源码

1.2 介绍

(1)简介
Fasttext是Facebook推出的一个便捷的工具,包含文本分类和词向量训练两个功能
Fasttext的分类实现很简单:把输入转化为词向量,取平均,再经过线性分类器得到类别。输入的词向量可以是预先训练好的,也可以随机初始化,跟着分类任务一起训练。

1.png

(2)优点

  • 模型本身复杂度低,但效果不错,能快速产生任务的baseline
  • Facebook使用C++进行实现,进一步提升了计算效率
  • 采用了char-level的n-gram作为附加特征,比如paper的trigram是 [pap, ape, per],在将输入paper转为向量的同时也会把trigram转为向量一起参与计算。这样一方面解决了长尾词的OOV (out-of-vocabulary)问题,一方面利用n-gram特征提升了表现
  • 当类别过多时,支持采用hierarchical softmax进行分类,提升效率

(3)适用场景
对于文本长且对速度要求高的场景,Fasttext是baseline首选。同时用它在无监督语料上训练词向量,进行文本表示也不错。不过想继续提升效果还需要更复杂的模型。

2 TextCNN

2.1 相关资料

论文《Convolutional Neural Networks for Sentence Classification》
Python 实现工具包
Tensorflow实现文本分类

2.2 介绍

TextCNN是Yoon Kim在2014年提出的模型,开创了用CNN编码n-gram特征的先河

2.png

模型结构如图,图像中的卷积都是二维的,而TextCNN则使用「一维卷积」,即filter_size * embedding_dim,有一个维度和embedding相等。这样就能抽取filter_size个gram的信息。以1个样本为例,整体的前向逻辑是:

  • 对词进行embedding,得到[seq_length, embedding_dim]
  • 用N个卷积核,得到N个seq_length-filter_size+1长度的一维feature map
  • 对feature map进行max-pooling(因为是时间维度的,也称max-over-time pooling),得到N个1x1的数值,拼接成一个N维向量,作为文本的句子表示
  • 将N维向量压缩到类目个数的维度,过Softmax

在TextCNN的实践中,有很多地方可以优化(参考这篇论文《A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification》):

  • Filter尺寸:这个参数决定了抽取n-gram特征的长度,这个参数主要跟数据有关,平均长度在50以内的话,用10以下就可以了,否则可以长一些。在调参时可以先用一个尺寸grid search,找到一个最优尺寸,然后尝试最优尺寸和附近尺寸的组合
  • Filter个数:这个参数会影响最终特征的维度,维度太大的话训练速度就会变慢。这里在100-600之间调参即可
  • CNN的激活函数:可以尝试Identity、ReLU、tanh
  • 正则化:指对CNN参数的正则化,可以使用dropout或L2,但能起的作用很小,可以试下小的dropout率(<0.5),L2限制大一点
  • Pooling方法:根据情况选择mean、max、k-max pooling,大部分时候max表现就很好,因为分类任务对细粒度语义的要求不高,只抓住最大特征就好了
  • Embedding表:中文可以选择char或word级别的输入,也可以两种都用,会提升些效果。如果训练数据充足(10w+),也可以从头训练
  • 蒸馏BERT的logits,利用领域内无监督数据
  • 加深全连接:原论文只使用了一层全连接,而加到3、4层左右效果会更好

TextCNN是很适合中短文本场景的强baseline,但不太适合长文本,因为卷积核尺寸通常不会设很大,无法捕获长距离特征。同时max-pooling也存在局限,会丢掉一些有用特征。另外再仔细想的话,TextCNN和传统的n-gram词袋模型本质是一样的,它的好效果很大部分来自于词向量的引入,因为解决了词袋模型的稀疏性问题

3 DPCNN

3.1 相关资料

论文《Deep Pyramid Convolutional Neural Networks for Text Categorization》

PyTorch实现源码
TensorFlow实现源码
Keras实现源码

3.2 介绍

2017年,腾讯提出了把TextCNN做到更深的DPCNN模型:

3.png

上图中的ShallowCNN指TextCNN。DPCNN的核心改进如下:

  • 在Region embedding时不采用CNN那样加权卷积的做法,而是对n个词进行pooling后再加个1x1的卷积,因为实验下来效果差不多,且作者认为前者的表示能力更强,容易过拟合
  • 使用1/2池化层,用size=3 stride=2的卷积核,直接让模型可编码的sequence长度翻倍(自己在纸上画一下就get啦)
  • 残差链接,参考ResNet,减缓梯度弥散问题
    凭借以上一些精妙的改进,DPCNN相比TextCNN有1-2个百分点的提升。

4 TextRCNN

4.1 相关资料

论文《Recurrent convolutional neural networks for text classification》
Pytorch实现源码
Keras实现源码
Tensorflow实现源码

4.2 介绍

除了DPCNN那样增加感受野的方式,RNN也可以缓解长距离依赖的问题

4.png

5 TextBiLSTM+Attention

5.1 相关资料

论文《Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification》
Pytorch实现源码
Tensorflow实现源码
Keras实现源码

5.2 介绍

从前面介绍的几种方法,可以自然地得到文本分类的框架,就是先基于上下文对token编码,然后pooling出句子表示再分类。在最终池化时,max-pooling通常表现更好,因为文本分类经常是主题上的分类,从句子中一两个主要的词就可以得到结论,其他大多是噪声,对分类没有意义。而到更细粒度的分析时,max-pooling可能又把有用的特征去掉了,这时便可以用attention进行句子表示的融合:

5.png

6 HAN

6.1 相关资料

论文《Hierarchical Attention Networks for Document Classification》
TensorFlow实现源码
Keras实现源码

6.2 介绍

上文都是句子级别的分类,虽然用到长文本、篇章级也是可以的,但速度精度都会下降,于是有研究者提出了层次注意力分类框架,即Hierarchical Attention。先对每个句子用 BiGRU+Att 编码得到句向量,再对句向量用 BiGRU+Att 得到doc级别的表示进行分类:

6.png

7 Bert

7.1 相关资料

7.2 介绍

BERT分类的优化可以尝试:
• 多试试不同的预训练模型,比如RoBERT、WWM、ALBERT
• 除了 [CLS] 外还可以用 avg、max 池化做句表示,甚至可以把不同层组合起来
• 在领域数据上增量预训练
• 集成蒸馏,训多个大模型集成起来后蒸馏到一个上
• 先用多任务训,再迁移到自己的任务

8 封装的源码汇总

pytorch实现源码:https://github.com/649453932/Chinese-Text-Classification-Pytorch

目录
相关文章
|
10天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品加工优化的深度学习模型
使用Python实现智能食品加工优化的深度学习模型
105 59
|
6天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品市场预测的深度学习模型
使用Python实现智能食品市场预测的深度学习模型
33 5
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的Transformer模型
探索深度学习中的Transformer模型
13 1
|
8天前
|
机器学习/深度学习 算法 开发者
探索深度学习中的优化器选择对模型性能的影响
在深度学习领域,优化器的选择对于模型训练的效果具有决定性作用。本文通过对比分析不同优化器的工作原理及其在实际应用中的表现,探讨了如何根据具体任务选择合适的优化器以提高模型性能。文章首先概述了几种常见的优化算法,包括梯度下降法、随机梯度下降法(SGD)、动量法、AdaGrad、RMSProp和Adam等;然后,通过实验验证了这些优化器在不同数据集上训练神经网络时的效率与准确性差异;最后,提出了一些基于经验的规则帮助开发者更好地做出选择。
|
7天前
|
机器学习/深度学习 算法 数据可视化
使用Python实现深度学习模型:智能食品配送优化
使用Python实现深度学习模型:智能食品配送优化
24 2
|
6天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
22 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
6天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
26 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
12天前
|
机器学习/深度学习 数据采集 数据库
使用Python实现智能食品营养分析的深度学习模型
使用Python实现智能食品营养分析的深度学习模型
39 6
|
9天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品储存管理的深度学习模型
使用Python实现智能食品储存管理的深度学习模型
25 2
|
10天前
|
机器学习/深度学习 算法
深度学习中的模型优化策略
【10月更文挑战第35天】在深度学习的海洋中,模型优化是那把能够引领我们抵达知识彼岸的桨。本文将从梯度下降法出发,逐步深入到动量、自适应学习率等高级技巧,最后通过一个实际代码案例,展示如何应用这些策略以提升模型性能。