COLING 2018的一篇多标签文本分类的文章,思路比较新颖,用序列生成的方法来做的,而且效果非常好。

SGM: Sequence Generation Model for Multi-label Classification?

arxiv.org

abstract

多标签文本分类是NLP中一项非常重要且有挑战性的任务。由于多个label之间往往相互依赖,所以多标签分类比单标签分类更复杂。这篇文章将多标签文本分类看成序列生成问题,然后用seq2seq的架构来解决。实验证明了该方法的有效性,该方法不仅能捕捉label之间的相关性,而且在预测不同label时能自动选择最有信息量的词。

introduction

multi-label classification(MLC)是NLP中一项重要任务,现实中也有许多应用场景,比如给文本归类打标签、信息检索等等。

一般的做法:

binary relevance,Boutell 等人2004提出,最早的做法,将MLC转换为单标签分类问题,忽略了label之间相关性;

classifier chain,Read 等人2011提出,将MLC问题转换为一连串二分类问题来建模label之间相关性,然而,复杂度太高;

还有一些其他的方法,比如ML-DT (Clare and King, 2001), Rank-SVM (Elisseeff and Weston, 2002), 以及ML-KNN (Zhang and Zhou, 2007),这些方法要么就是只考虑了label之间一阶或二阶相关性,要么就是计算复杂度太高。

近些年来,神经网路在NLP领域取得了巨大成功,MLC方面也有一些重要进展。受机器翻译、自动摘要等领域Seq2Seq模型的启发,本文提出了一种序列生成模型,使用了一种创新性的解码器,来解决MLC问题,模型就叫SGM,SGM包括编码器和带注意力机制的解码器。解码器一步步生成multi-label,每一步生成label的时候都会基于上一步解码的结果,因此可以建模label之间的相关性。另外,注意力机制在解码不同label的时候可以聚焦文本不同部分。本文的主要贡献如下:

  • 将多标签分类看成序列生成问题来建模标签之间相关性;
  • 提出了一种新的解码器用于序列生成模型,能捕捉label之间相关性,而且预测不同label的时候能聚焦输入不同部分
  • 实验结果比基线好a large margin

proposed method

先定义问题, mathcal{L} = {l1, l2, ..., l_L} 是分类目标空间,给定一个包含m个词的文本序列 m{x} ,我们的目标是确定包含n个label的 m y 。传统的分类任务一般是针对一个样本给出一个label,在MLC问题中,每个样本可以有多个label。从序列生成的角度来看,MLC任务可以建模为找 m {y^*} 使得条件概率 p(m{y}|m{x}) 最大:

p(m{y}|m{x}) = Pi_{i=1}^{n}p(y_i|y_1, y_2, ..., y_{i-1}, m{x})

本文提出的模型结构如下图所示:

首先,将每个样本的标签序列按训练集中标签频率排序,高频标签排前面,同时添加句首和句尾占位符。

首先将文本序列 m{x} 编码得到隐状态,然后在每个时间步t使用注意力机制将隐状态聚合成上下文向量 m{c}_t ,然后解码器利用上下文向量 m{c}_t ,上一步的隐状态 m{s}_{t-1} 以及上一步解码结果的embedding向量 g(m{y}_{t-1}) 作为输入来得到t时刻的状态 m{s}_t ,最后,利用masked softmax层输出 m{y}_t 的概率分布。

sequence generation

整个序列生成模型包括一个编码器和带注意力机制的解码器。

编码器:设 (m{w}_1, m{w}_2, ...m{w}_m) 是文本序列中的m个词, m{w}_i 是第i个词的one-hot编码,利用embedding层可以得到 (m{x}_1, m{x}_2, ..., m{x}_m) ,然后利用双向LSTM进行编码得到每个词的隐状态, m{h}_i = mathrm{LSTM}(m h_{i-1}, m x_i) ,将双向计算结果拼起来就得到最终编码结果

注意力机制:在预测标签的时候,每个词的贡献是不一样的,使用注意力机制可以使模型在预测不同label的时候聚焦文本不同部分

e_{ti} = m v_{a}^T mathrm{tanh}(m W_am s_t + m U_a m h_i) ,根据t时刻解码器状态和每个词编码状态计算注意力分配

alpha_{ti} = frac{mathrm{exp}(e_{ti})}{sum_{j=1}^mmathrm{exp}(e_{tj})} ,归一化注意力分配,得到注意力机制系数,系数大对应贡献大

m c_t = sum_{i=1} ^m alpha_{ti}m h_i ,编码器状态加权和

解码器:

m s_t = mathrm{LSTM}(m s_{t-1}, [g(m y_{t-1}); m c_{t-1}]) ,上一时刻解码label对应的embedding向量和注意力向量是解码器的输入

m o_t = m W_o f(m W_d m s_t + m V_d m c_t) ,利用解码器状态和注意力聚合向量计算softmax输入,类似全连接层

m y_t = softmax(m o_t +  m I_t)

其中 m I_t 是掩码向量,如果上一时刻输出了 l_i ,则当前时刻掩码向量第i个元素未负无穷,这样可以避免解码器重复输出相同label

在训练阶段使用交叉熵损失函数,预测的时候使用beam search演算法。

Global Embedding

解码器的输入依赖上一个预测label的embedding,因此,如果上一个label预测错了会直接影响后续的预测,这也叫exposure bias。beam search一定程度上可以缓解此问题,然而没有本质上解决,因为beam search的候选path可能都有exposure bias的问题。考虑到我们其实知道了上一步预测的概率分布,所以可以利用概率来加权,而不是只用概率最大的label的embedding。

ar {m e} = sum_{i=1} ^L y_{t-1}^{(i)} m e_i ,每个label的embedding的加权和

g(m y_{t-1}) = (m 1 - m H) odot m e + m H odot  ar {m e} ,结合最大label embedding和加权embedding

m H = m W_1 m e + m W_2 ar {m e} ,模型自适应两部分的比例,计算gate,用于上式加权

这种计算方式理论上包含了只用最大label embeding的情况,而且更加soft,因为用到了所有label的embedding,所以叫global吧

experiment

实验主要用了两个数据集,评估指标用的Hamming-loss和Micro-F1,两个数据上的模型用了不同参数:

RCV1-V2实验参数:词表5w,文本截断500,beam size = 5,word embedding size = 512,encoder hidden size = 256, decoder hidden size = 512,encoder和decoder都用了2层LSTM

AAPD实验参数:词表3w,文本截断500,beam size = 9,word embedding = 256,encoder hidden size = 256,decoder hidden size = 512,encoder用了2层LSTM,decoder只用1层LSTM

其他实验设置:使用adam优化,学习了0.001,用了dropout和梯度剪裁

实验基线

  • Binary Relevance:每个label做二分类,忽略label之间相关性
  • Classifier Chains:转化为一串二分类问题,考虑了label直接的相关性
  • Label Powerset:将多个label组合成新的label,然后做single-label classification
  • CNN:使用多个卷积核提取文本特征,优化multi-label soft margin
  • CNN-RNN:利用CNN和RNN同时捕捉全局和局部语义特征,建模labe之间相关性

实验结果如下图所示

在RCV1-V2数据集上,与常用的BR相比,SGM的hamming-loss下降了12.79,micro-F1提升了2.33%,即使与深度学习模型比也有较大提升,比如与CNN相比,hamming-loss下降了15.73%,micro-F1提升了2.69%,即使不用global embedding,SGM也比大部分基线好。此外,使用global embedding效果显著,比不用的情况下hamming-loss下降了7.41%,micro-F1提升了1.04%。在数据集AAPD上,结果也类似。

analysis and discussion

global embedding的作用:

通过测试不同的 lambda 值对结果的影响,结果如下图所示,可以发现, lambda 为0时效果是最差的,这对应不使用global embedding的情况,这也说明了global embedding确实有效。另一方面,通过模型自适应得到的 lambda 效果比取固定值好。

mask和sorting的作用:测试结果如下图所示,可以看出,无论用不用global embedding,mask和sorting都是有效的,而且可以看出sorting影响非常大,文章中label是按训练集中label频率从高到低排的(我这里有点小疑问,如果按其他顺序排会影响模型结果么?比如按label的字典序排列,或者干脆按频率从低到高排列,这个后续可以实验看看)

error analysis:将测试集按length of label sequence(LLS)来分,可以看出LLS越大模型效果越差,这也很好理解,毕竟label越多越不好预测。

related work

针对MLC任务主要有4类方法(个人感觉这个分类边界不太清晰,比如即使用深度学习的方法,也可以在最后输出层用BR或者LP或者其他方法。。)

  • 转换类方法,将问题转换为其他任务,比如转为single-label task,BR(Boutell et al., 2004)属于这一类。LP(Tsoumakas and Katakis, 2006)也属于这一类,LP枚举所有multi-label的组合然后转出single-label task。CC(Read et al., 2011)将MLC问题转为一串二分类问题,每一个二分类任务都依赖上一个二分类问题的结果,因此复杂度较高。
  • 演算法适应类,改造现有演算法适应MLC任务,比如Clare and King (2001)提出了一种基于multi-label entropy的决策树用于分类;Elisseeff and Weston (2002)通过利用最大化margin和核技巧来优化empirical ranking loss;Collective multi-label classifier (CML) (Ghamrawi and McCallum, 2005)将label之间的相关性作为约束条件引入,然后利用最大熵准则来优化;Zhang and Zhou (2007)采用KNN来处理multi-label数据;Furnkranz et al. (2008)利用pairwise的比较来得到labels之间的排序;Li et al. (2015)提出了一种新颖的联合训练演算法,可以将后续的label预测的反馈传回当前label;这一类方法要么只能捕捉低阶相关性,要么复杂度太高
  • 集成类,Tsoumakas et al. (2011)将初始的labels集合随机分成一些小的子集然后利用LP演算法分别处理;Szymanski et al. (2016)利用label之间的共现来构建图,然后利用社区发现演算法来分割label集合
  • 神经网路类,Zhang and Zhou (2006)提出了BP-MLL,利用了全连接网路然后优化pairwise ranking loss;Nam et al. (2013)提出了一个神经网路,不过优化的是交叉熵;Benites and Sapozhnikova (2015)通过增加一个额外的用于聚类的ART层来加快分类的速度;Kurata et al. (2016)利用基于word embedding的CNN来捕捉label之间的相关性;Chen et al. (2017)结合CNN和RNN来建模文本的语义信息和label之间的高阶依赖关系;Baker and Korhonen (2017)基于CNN的框架,利用对应标签共现的行初始化最后的隐藏层,从而提升模型性能;Ma et al. (2018)提出将多标签分类演算法用于机器翻译以处理一个句子可以被翻译成多个正确句子的情况。

conclusion

总的来讲,感觉最大的贡献是将MLC问题建模为序列生成的问题,然后可以将序列生成的一系列方法用上,另外global embedding也是比较好的思路,可以缓解exposure bias的问题。从实验结果来看,建模思路确实是有效的,估计后续会成为多标签文本分类问题的标配。


推荐阅读:
相关文章