深度学习与文本分类总结第一篇--常用模型总结

本文转载自:  https://blog.csdn.net/liuchonge/article/details/77140719?locationNum=6&fps=1

前面一段时间一直忙着参加知乎看山杯机器学习挑战赛,现在比赛结束了想着总结一下最近的收获。因为这是一个多标签多类别的文本分类问题,而且题目非常适合用深度学习相关的知识去做,正好结合着这个竞赛把之前一段时间的学习成果检验一下。接下来我会分成常用模型总结、多标签/多类别专题、竞赛实战三部分进行介绍。 
首先我们先来总结一下文本分类中常用的几个深度学习模型,这里可以参考brightsmart大神在github上面开源出来的代码,自己在做竞赛的时候也进行了参考,收获很大,下面我也会部分引用其代码来阐述。他给出了几乎可以用于文本分类的所有基础模型及相关代码实现(基于TensorFlow),是一份很棒的总结!接下来我们详细的介绍一下每个模型的原理。

FastText

正好最近做商品分类的时候用到这个模型,了解了一下,是facebook在2016年提出来的模型,代码可以直接使用这里的。这个模型其实算不上深度学习,他跟word2vec的模型极其相似,即输入层是文本中的单词,然后经过一个嵌入层将单词转化为词向量,接下来对文本中所有的词进行求平均的操作得到一个文本的向量,然后再经过一个输出层映射到所有类别中,可以参考Bag of Tricks for Efficient Text Classification这篇论文,里面还详细论述了如何使用n-gram feature考虑单词的顺序关系,以及如何使用Hierarchical softmax机制加速softmax函数的计算速度。模型的原理图如下所示: 
这里写图片描述

  1. 这种模型的优点在于简单,无论训练还是预测的速度都很快,比其他深度学习模型高了几个量级
  2. 缺点是模型过于简单,准确度较低。(但是我听说有人只用这个模型竞赛里就做到了0.4的准确度,很厉害)

这里想说的是很多公司的实际场景里面,他们的数据并不像我们平时跑实验那么完美,各种人工标注,数据量也很大等等,很多应用的数据量又小、又很杂乱、甚至还没有标记==,所以那些深度学习的模型并不一定能派上很大的用场,反而这种简单快速的模型用的很多。这里也可以看一下其模型构建部分的代码,真的很简单: 
这里写图片描述

TextCNN

这个模型我们就不再赘述了,放张图镇楼。很经典想要了解的可以戳下面几个链接: 
这里写图片描述

  1. 论文Convolutional Neural Networks for Sentence Classification
  2. 我写的对模型架构的理解
  3. dennybritz使用TensorFlow实现的代码
  4. 我写的分析上面代码的博客

TextRNN

这种模型与TextCNN很像,只不过是把上面的Conv+Pooling替换成了Bi-LSTM,最后将两个方向上的输出进行拼接再传给输出层即可。但是这种模型仅仅是对TextCNN应用到RNN上进行的一个小改动,效果并不是很好。因为RNN模型在训练时速度很慢,所以并不推荐使用这种方法。

RCNN

这个模型是在Recurrent Convolutional Neural Network for Text Classification一文中提出的模型,架构如下图所示: 
这里写图片描述 
这种模型的想法是在word embedding的基础上,求解每个单词左边和右边上下文的表示,然后将三者融合在一起作为单词的representation。在经过隐藏层、pooling层、输出层得到文本的representation。采用了一种recurrent的方式替代CNN中的卷积层。这样做的好处是,每个单词最终的表示都不仅仅是一个单词的表示这么简单,而是融合了其上下文信息,可以更好地反映其含义,下面跟一个max-pooling层相当于取出对文本信息贡献较大的单词及其组合,这样我们就可以得到其分类。具体图中的每个元素可以按照下面的公式计算: 
cl和cr是上下文representation,等于前面一个词的上下文表示与当前单词的embedding分别乘以权重参数再组合起来。最终的单词表示xi为cl、embed、cr三者的联合。在接下来将其通过一层神经网络得到yi。

这里写图片描述 
这里写图片描述 
这里写图片描述

这种方法相比TextRNN而言,组合了单词之间的上下文信息,可以更好的得到文本中的长依赖关系。而且相比RNN来讲,熟练速度更快,基本上可以与TextCNN达到相同的效果。也是一种十分优秀的文本分类模型。

Char CNN、Char RNN

这两种模型都是从char级别开始进行文本分类的方法,在这之前我已经对两种模型进行过分析和实现。可以参考我之前的几篇文章进行了解,由于参赛的时间有限,所以在竞赛过程中并未使用这两种方法进行检验效果。原因是官方提供了词向量和字符向量,但是据别的参赛选手反应使用字符向量效果普遍不好。而且官方给的语聊是经过脱敏处理的,并不适合使用char-cnn模型进行建模。

HAN

这是Hierarchical Attention Network for Document Classification论文中提出的模型,这部分内容可以参考我之前的两篇文章,已经对模型和tf实现做了详细的介绍:

这里写图片描述

这里写图片描述

其基本思路就是将文本按层次分成单词、句子、文本三层关系,然后分别用两个Bi-LSTM模型去建模word-sentence、sentence-doc的模型。而且在每个模型中都引入了Attention机制来捕获更长的依赖关系,从而得出不同词/句子在构建句子/文本时的重要程度。这种模型相对来说效果在RNN模型中还是算不错的,因为它综合考虑了文本结构、词句的重要性等因素。

Dynamic Memory Network

这个模型是“Ask Me Anything: Dynamic Memory Networks for Natural Language Processing”一文提出来的。他的思路是所有的NLP任务都可以归为QA任务,也就是由输入、问题、答案构成。所以DMN是构建了一个QA的模型,然后也可以用于分类、翻译、序列数据等多重任务中。其模型主要有四部分组成:

这里写图片描述

这里输入是一段话,然后question相当于一种门控机制,会用Attention机制选择性的将input中的信息保存在episodic memory当中。接下来episodic memory的输出在经过answer模块产生问题的答案。具体的每个模块细节如下图所示:

这里写图片描述

  1. 输入模块的作用是将输入的文本表示成向量,这里采用RNN模型作为文本表示的模型。如果输入是一句话就使用RNN的hidden state作为其representation,如果输入是多句话,则在每句话后面添加标识符,然后给每句话都生成一个representation,如图中蓝色的小条。
  2. question模块的作用是将question表示成向量,与输入模块相似同样使用RNN作为模型,将最终的hidden state作为输出向量传入episodic memory模块,作为其初始状态。
  3. episodic memory模块通过迭代产生记忆。输入模块产生的句子表示会根据question模块进行注意力机制的加权,按照问题针对性的选择出相应的表示。记忆模块的两条线分别代表带着问题q第一次阅读input的记忆,以及带着问题q第二次阅读的记忆。
  4. answer module是根据episodic memory的最后一个memory作为模型的初始状态,这里使用GRU进行建模。然后生成最终的答案

这部分的详细介绍可以参考码农场对这篇论文的笔记

Entity Network

在看到brightmart的分享之前并未听说过这个模型,后来查了一下,发现是2017年ICLR刚发的文章“Tracking the World State with Recurrent Entity Networks”,这些大牛们真的是紧跟业内最前沿==这篇论文等我之后有时间会专门去研究一下然后写篇博客来讲,这里先不说。放张模型的架构图感受一下~~ 
这里写图片描述

Attention is all your need

这是谷歌今年刚发的论文,对标Facebook之前发布的“Attention is all your need”。由于时间关系同样还没有仔细阅读过,先写在这占个坑位吧,看之后什么时候有时间实现一下。

总结

至此我们已经把主流的文本分类中会用到的深度学习模型说了个遍,从CNN到RNN,从seq2seq到Attention,我觉得这些模型各有优劣,在不同的任务上会有不同的表现效果。但是基本上来讲如果追求简单速度,可以使用fasttext,想要提升效果先可以试试textCNN和RCNN这两种模型,在接下来可以试试HAN这类LSTM或者GRU的模型,剩下几种也会有不错的效果,可以根据自己的精力和项目要求判断是否进行尝试。因为有的并不是专门为了文本分类设计的,所以效果上可能更需要自己针对具体的任务进行调整。

但是其实深度学习里面模型可能只是一部分,不同的模型肯定会取得不一样的效果。但是更加重要的参数调整,因为按照具体的任务和数据不一样,参数的选择会给最终的效果带来很大的差距。就单纯地按照这次竞赛来讲,相同的单模型分数会在0.30-0.41范围中波动,然而参数的选择和调优却是十分麻烦和困难的事情,所以很多人称之为黑盒==是门学问,等之后竞赛前排大神出了分享之后,我也会参考他们的经验写一下我对于这部分的理解。


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值