陌路茶色/

Long Document Classification Survey 1

本篇记录自己对长文本的分类任务的调研,因为现在要做的是对用户评论内容挖掘,首先想到的是通过评论中的关键词来定义用户的评论特征,但是目前要做深度学习方向的用户特征挖掘,用户评论多达上万条,少也有上百条,直接使用pad_size来截断过于暴力,但是分片段放入bert中又太慢,试过取评论中topk个短语放入到bert中的效果,但是这样仍然会损失很多信息,因此准备调研一下这方面的论文的一些做法,当然时间有限,只能初略了解大概,顺便记录于此。

即主要遇到两个问题:
1.长文本如何更好的进行分类任务(文本字符长度在1000以上)
2.bert如何解决长文本的问题

HIERARCHICAL TRANSFORMERS FOR LONG DOCUMENT CLASSIFICATION

bert对长文本有如下两个限制:
1.self-attention层的时间复杂度为$O(n^2)$,其中n为句子的长度
2.使用BERT进行fine-tune工作,意味着位置矩阵会被原始的训练数据限制,因此fine-tune的句子不能超过已训练好的模型的最大句子长度。

该论文提出Recurrence over BERT (RoBERT) 和 Transformer over
BERT (ToBERT)两种方案,实质就是讲长句分割为若干个短句,然后放入到bert中,取出最后的隐藏层,再过一个lstm或transformer。
比如RoBERT:先将长句分为若干个短句,放到bert中获取H,再过100维的LSTM,再过2个30维的全连接层以及RELU,最后过softmax。【好像没有发现LSTM输出是取最后一个还是取平均???】
而ToBERT中只是将LSTM换成2层block的transformer encoder。
选取3个语料集分别是 Fisher,20 newsgroups,CSAT,其中Fisher的平均文本长度最长,长度分段占比如下:
屏幕快照 2020-01-09 下午10.37.51.png
分别做如下实验:
1)计算每个片段在bert中的预测值然后计算平均,发现最大类别作为最终的预测类别
2)找出每个片段预测类别最多的那个类别作为最终的预测类别
3)使用RoBERT或ToBERT来做分类任务
结果如下所示:
屏幕快照 2020-01-09 下午10.41.29.png
可以很明显的看到再做分类任务后效果非常好。

Hierarchical Attention Networks for Document Classification

在文档中不同的单词和句子含有不同的信息量,且高度独立,比如不同上下文的相同的单词/句子可能有不同的信息量。
本论文中相比于其它工作做的不同点在于我们的系统使用上下文去发现什么时候token序列是相关的,而不是你简单的脱离上下文来过滤token序列。【我的理解就是使用lstm来获取单词的上下文,句子的上下文】
HAN结构如下所示:
屏幕快照 2020-01-12 下午7.46.03.png
主要讲一下word级别的attention,句子级别的attention同理,从LSTM输出的两个h记为$h_{it}$,此为attention中的value,attention中的query为$u_w$,attention中的key为$u_{it}$,如下:
屏幕快照 2020-01-12 下午10.39.45.png
有个疑惑就是似乎每个单词的query $u_{w}$是一样的,而且不同句子中的单词对应的query $u_{w}$也是一样的,就是一个一维向量【与我理解的不符合,可能我理解错误,有时间看看源码
句子级别的attention同理,最后直接过softmax,以及交叉熵:
屏幕快照 2020-01-12 下午10.46.42.png

实验中使用80%的训练集,10%的验证集,10%的测试集,分别选用如下数据集:
Yelp reviews:5类
IMDB reviews:10类
Yahoo answers:主题分类,10个类别,140,000训练样本,5000测试样本,选取10%的训练样本作为测试
Amazon reviews:5分类,3,000,000训练样本,650,000测试样本,选取10%的训练样本作为测试
下面显示的是这些语料对应的统计信息:
屏幕快照 2020-01-12 下午10.56.59.png
【有时间也对评论做如上提统计,然后看看和哪个最符合】使用不同的方法训练结果如下:
屏幕快照 2020-01-12 下午10.58.54.png
上述中本论文使用了HN-{AVE,MAX,ATT}三种模型,HN表示Hierarchical Network,AVG是平均,也就是每层输出的$h_{it}$取平均作为下一层的输入,而不是使用attention。MAX表示max-pooling,我理解的是比如$h_{it}$的维度为hidden_dim,那么在时间方向上对每个维度取最大值,即最后的输出是hidden_dim维度的一维向量。从结果上可以看出使用attention的方法要比max-pooling,average的方法都要好。

DocBERT: BERT for Document Classification

本论文这么说道:bert为什么值得在document classification任务中探讨呢,因为document分类任务相对于自然语言推断等任务来说对语法/句法信息不是那么重要(也就是说bert本来就不适合文档分类任务),因为我们注意到LR和SVM在文档分类任务上能够达到一个非常强的基线。另一方面,文档通常在多个类中具有多个标签,这又与BERT检查的任务不符(没看懂,意思是说next sentence prediction和masked language modeling两个任务默认是两个句子是上下文的前提是两个句子在讲一个东西,一个句子只能有一个标签???,不过这个对二分类好像就没有影响)。【所以本论文在研究到底bert为什么在文档分类任务上能够达到SOTA】
提到基于bert的document classification确实能够达到SOTA,但是却非常耗费计算资源。
论文中的贡献在于两个点:
1.通过简单的fine-tune bert模型达到了document classification的SOTA
2.论证了bert可以被蒸馏为一个更简单的模型,其也具有可比较性的正确率,且带来更少的算力。

后面在讲使用知识蒸馏将训练的bert-large作为teacher,$LSTM_{reg}$作为student,通过teacher让student学习到teacher的网络知识,作为KD-$LSTM_{reg}$模型,然后说该模型和bert-base不相上下,我就纳闷了,都能够训练bert-large了,还用 KD-$LSTM_{reg}$模型干嘛,排除tinyBert这种供人使用的知识蒸馏的方法。
没有细看,仅将实验结果罗列于此,后期如果需要使用到知识蒸馏再回过来细读【我困惑的地方是既然论文前面提到bert可能对文档分类没有效果,但是为什么下面的结果却显示bert非常好呢???】:
屏幕快照 2020-01-14 上午10.51.20.png

Rethinking Complex Neural Network Architectures for Document Classification

因为上一篇文章讲到说这篇文章达到了文档分类非bert模型的SOTA,所以阅读一下。
本论文提到NLP模型越来越复杂,导致训练和部署非常的困难,有很多论文在讨论是不是有必要将模型如此复杂化,并发现一些简单有效的模型,我们发现在文档分类中简单的BiLSTM也能达到非常好的F1值,模型如下所示:
屏幕快照 2020-01-14 上午11.21.36.png
我看到的就是简单的embedding+BiLSTM+max_pooling+softmax的结构,然后下面是数据集的统计信息,可以说这篇论文和我想看的不太一样,选取的语料是类别特别多且文档中字符不是特别长的文章,HAN的优势体现不出来(我还专门看了一下IMDB这个文档比较长的数据集,但是好像也被超过了)。
屏幕快照 2020-01-14 上午11.24.52.png
结果如下所示:
屏幕快照 2020-01-14 上午11.32.36.png
model名称后面的Repl表示本论文重新实现了该模型(reimplementations),Orig表示原始文章中的结果。
有一句:$LSTM_{reg}$和$LSTM_{base}$使用adam,且在Reuters语料下的学习率为0.01,其他语料的学习率为0.001,$LSTM_{reg}$中的embedding的dropout设置为0.1,weight dropout设置为0.2
关于$LSTM_{reg}$中的reg具体可以参考代码实现embedding dropoutweight dropout

A visual attention-based keyword extractionfor document classification

本文提出基于关键词的长文档分类,比较符合我现在做的工作,非常简单,先给出模型图如下所示:
屏幕快照 2020-01-19 下午9.39.30.png
主要的创新点在于Attention based Keyword Filtering这部分,也就是该如何从文档中挑选出关键词,关于这部分我的理解就是通过word2vec中的skipgram+hierarchical softmax来实现word的排序。先看其关键词排序算法:
屏幕快照 2020-01-19 下午9.59.22.png
其中唯一没有解释的就是$L(w_k|w_i)$这个值,回到前面看几个公式:
屏幕快照 2020-01-19 下午10.01.15.png
屏幕快照 2020-01-19 下午10.01.24.png
其实就是hierarchical softmax中的公式,对中心词,预测该词的上下文词的概率,也就是说本论文的核心是认为该词的上下文越多,那么该词越会被排到top词中(当然最后还会过一个类似于停用词的词表筛选一下)。具体计算:因为通过word2vec训练可以得到两个矩阵,其中$v(w_i)$为从输入矩阵中取,$θ_{j-1}^{w_k}$从输出矩阵中取。【稍稍有点复杂,暂时等价不到论文具体是怎么实现这一步的,我觉得应该有个超级简单的方法可以实现】

来看看数据集如下:
屏幕快照 2020-01-19 下午10.08.31.png
结果如下(最后一个为该论文中提到的模型):
屏幕快照 2020-01-19 下午10.09.55.png
虽然说结果不是非常明显,但是对于想使用bert做长文档分类任务但没有多少GPU资源来说还是非常可行的。我之前使用类似textrank关键词提取算法提取长评论中的keyword放到bert中做分类,但是效果不如直接使用textcnn(当然我bert没怎么微调,而且关键词提取算法可能也需要优化一下)。

COMBINING DOMAIN KEYWORDS INTOAUTOMATIC DOCUMENTCLASSIFICATION BY DEEP NEURALNETWORK

不知道为什么这篇论文也能发表,可能是我理解有问题???,先来看模型:
屏幕快照 2020-01-20 下午10.36.15.png
很简单,就是添加了一个Bag-of-words features,而这个在文章中称为领域特征,比如对某个领域(文中提到的是health和card)进行分类,首先对该领域的关键词做一个重要性排序,比如选取topK个词作为该领域的代表词,这样每篇文章就多了一个01的向量和LSTM输出部分一起放到LR中。

那么这个topK是如何取的呢?,以下是我对论文的解读:
首先使用专家标注一批,比如health和card对应的关键词,然后训练词的embedding来扩充更多的关键词,将这些关键词合在一起,在要训练/预测的语料中对这些关键词的tf-idf进行统计并排序,然后选取topK个词最为最终每个维度对应的词(即Bag-of-words features),比如文中提到的topk=4800,说维度过大会出现out of memory。

文中提到说Bag-of-words features可以学习文档的特征,LSTM的输出可以学习到上下文信息。结果就不放了,看着不怎么样。。。

该论文的借鉴意义在于我们可以将挑选出来的关键短语作为Bag-of-words features来和深度学习的方法融合

Enriching BERT with Knowledge Graph Embeddings for DocumentClassification

这篇论文有源代码实现,见pytorch-bert-document-classification,做的是book classification,通过编码title,author,short descriptive text,URL,ISBN,date of publication来做分类。

PAPER LIST

HIERARCHICAL TRANSFORMERS FOR LONG DOCUMENT CLASSIFICATION
Hierarchical Attention Networks for Document Classification
DocBERT: BERT for Document Classification
Rethinking Complex Neural Network Architectures for Document Classification
A visual attention-based keyword extractionfor document classification
COMBINING DOMAIN KEYWORDS INTOAUTOMATIC DOCUMENTCLASSIFICATION BY DEEP NEURALNETWORK
Enriching BERT with Knowledge Graph Embeddings for DocumentClassification

https://github.com/castorini/hedwig

留下一条评论

共有 2 条评论

  1. 麦山:

    你好啊博主,我最近也在研究多标签长文本分类的问题。
    博主很有见解,这里列举的文章我也基本读过。
    不知道能否进一步交流下呢?

    December 26th, 2020 at 12:14 pm 回复
    1. moluchase:

      hi,你好,这个是我好久前搞过的啦,我已经忘记的差不多了,多标签的话,如果标签比较少,优化方式应该是可以改造一下bert吧【比如输入的三个Embedding加一些长文本的结构信息之类的】,然后在自己的语料上pretrain一个bert,再做fine-tune,如果是标签非常多的话(上千以上),可以试试 召回+排序的策略

      April 18th, 2021 at 06:46 pm 回复