本文介绍的内容包含多篇基于图神经网络进行文本分类的论文,从提出GCN后的简单应用到去年ACL上的TextING以及今年的BertGCN,GNN在文本分类上取得了非常好的效果。
Graph Convolutional Networks for Text Classification
Text Level Graph Neural Network for Text Classification
Every Document Owns Its Structure - Inductive Text Classification via Graph Neural Networks
BertGCN: Transductive Text Classification by Combining GCN and BERT
Text Classification
文本分类的应用非常广泛,包括Sentiment Analysis、News Categorization、Topic Analysis甚至是Question Answering等。而automatic text classification方法大致可以被归为两类:基于规则的^rule-based以及基于机器学习的^数据驱动的。
基于规则的文本分类需要先验知识,包括pre-defined rules、domain knowledge等。而基于机器学习的方法则是借助标注数据集。通常我们可以把机器学习文本分类的步骤归为两步,首先是文本特征提取,而后将特征输入分类器进行分类。而发展到现在,基于神经网络的文本分类模型大致也随着深度学习的发展从前馈神经网络到CNN、RNN以及attention、transformer到如今pre-trained model如BERT等。
前馈神经网络进行文本分类通常将文本作为bag of words;RNN则把文本作为词的序列;CNN用于训练提取文本中的关键短语、词组等进行匹配分类;attention机制能识别文本中相互关联的词,可以嵌入到其他深度学习模型中;至于transformer以及BERT这类大规模预训练模型,则是“大力出奇迹”。
而本文的重点,则是基于GNN-图神经网络的文本分类方法。借助图神经网络进行文本中句法、语义解析树之类的图结构信息挖掘,进而进行文本分类。另外经过下文的介绍我们还能发现,基于GNN的模型能与其他深度神经网络进行级联并进行联合训练,进而有效提升分类准确率。
基于图神经网络的文本分类模型的差异大致体现在三个方面:图的构建、节点嵌入的初始化、图神经网络。
TextGCN
Graph Convolutional Networks for Text Classification
TextGCN为AAAI2018的论文,现在很多人看到这篇文章的时候可能会感叹“这也能发?”,但事实上这篇论文是最先构建了transductiive的基于GNN进行文本分类的框架,并取得了非常好的表现。
模型整体的框架如上图所示,包括图的构建和图神经网络两个模块。其中图神经网络由简单的两层卷积层构成。另一方面,图节点的特征初始化用one-hot vector,输入的信息仅为边信息和节点的结构信息,而其在分类结果上取得的准确率也反映了GNN应用文本分类的合理性。 \[ Z=\operatorname{softmax}\left(\tilde{A} \operatorname{ReLU}\left(\tilde{A} X W_{0}\right) W_{1}\right) \]
对于构图方面,模型基于整个语料库构建一个异构图,图中的节点包括文档节点和词节点。而这两类节点之间的边,word-word、doc-word定义如下 \[
A_{i j}=\left\{\begin{array}{ll}
\operatorname{PMI}(i, j) & i, j \text { are words, } \operatorname{PMI}(i, j)>0 \\
\operatorname{TF}-\operatorname{IDF}_{i j} & i \text { is document, } j \text { is word } \\
1 & i=j \\
0 & \text { otherwise }
\end{array}\right.
\] 其中词i与j之间的PMI (point-wise mutual information) 计算为 \[
\begin{aligned}
\operatorname{PMI}(i, j) &=\log \frac{p(i, j)}{p(i) p(j)} \\
p(i, j) &=\frac{\# W(i, j)}{\# W} \\
p(i) &=\frac{\# W(i)}{\# W}
\end{aligned}
\] \(\#W(i,j)\)代表滑窗中两个词共现次数。另外,图中的词节点会将语料库统计后的低频词过滤掉。至于为什么选择PMI以及TF-IDF这两个指标作为边权重,作者提到是从实验的结果出发作出的选择。 
Text-level GNN
Text Level Graph Neural Network for Text Classification [ENMLP2019]
TextGCN模型跟大部分直推式GNN模型一样,应用时存在明显的缺陷,即没有办法进行在线测试。当我们要输入的新文本进行分类时,需要将文本加入语料库后重新构建graph训练,这就会带来极大的开销。而这篇Text-level GNN则是构建基于文本级别的图,使得基于GNN的文本分类模型提供在线测试的功能,虽然模型依旧是Transductive。
Text-level图的构建如上图所示,其中词与词之间连接的边权重以及词的embedding为整个语料库全局共享,保存在全局矩阵中(上图的两个矩阵),另外文档中的每个词不止和相邻的词存在边,而由一个超参数控制多跳邻居。
在图神经网络模块,虽然论文中介绍的是non-spectral message passing mechanism,但事实上与TextGCN本质上是一样的,不过边的权重会在训练过程中进行更新。 \[
\begin{aligned}
\mathbf{M}_{\mathbf{n}} &=\max _{a \in \mathcal{N}_{n}^{p}} e_{a n} \mathbf{r}_{\mathbf{a}} \\
\mathbf{r}_{\mathbf{n}}^{\prime} &=\left(1-\eta_{n}\right) \mathbf{M}_{\mathbf{n}}+\eta_{n} \mathbf{r}_{\mathbf{n}}
\end{aligned}
\] 上式中\(r\)代表节点特征,\(\eta_{n}\)为可训练的参数。
最后,使用文本中的所有词的embedding进行类别的推断;而在TextGCN中则是直接使用文档节点的embedding进行分类。 \[
y_{i}=\operatorname{softmax}\left(\operatorname{Relu}\left(\mathbf{W} \sum_{n \in N_{i}} \mathbf{r}_{\mathbf{n}}^{\prime}+\mathbf{b}\right)\right)
\]
在这里简单对Corpus-level GNN(TextGCN)和Text-level GNN进行简单的比较。首先两者在下游任务的准确率上有较小的差异,其中后者略胜一筹,不过后者使用了Glove词向量进行初始化,所以事实上将TextGCN使用一些小技巧后两者的准确率是非常接近的。不过Text-level GNN优越性体现在其能够提供在线测试上,当输入新文档进行分类时,它的计算开销会远小于TextGCN。而对于它使用的MPM神经网络而不是GCN,是因为MPM更适合它的构图模式,而不是MPM比常规的GCN更强的信息提取能力。Text-level使得全局的边权重必须成为可训练的参数,而MPM中的另一个可训练的参数\(\eta_{n}\)实质上与GCN中结合\(I\)的拉普拉斯矩阵\(L\)是一致的。
TextING
Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks
上文的两个模型以及后续的BertGCN都是transductive,而本文的TextING则是inducive模型。论文发表在ACL2020上,也就是博客标题。
模型针对每篇文档构建一个图,以词共现作为边节点,借助滑窗(size 3)构建图。节点嵌入用Glove进行初始化。 模型的图神经网络模块使用了Gated Graph Neural Networks(GGNN)和图注意力(GAT)。 \[
\begin{aligned}
\mathbf{a}^{t} &=\mathbf{A h}^{t-1} \mathbf{W}_{a} \\
\mathbf{z}^{t} &=\sigma\left(\mathbf{W}_{z} \mathbf{a}^{t}+\mathbf{U}_{z} \mathbf{h}^{t-1}+\mathbf{b}_{z}\right) \\
\mathbf{r}^{t} &=\sigma\left(\mathbf{W}_{r} \mathbf{a}^{t}+\mathbf{U}_{r} \mathbf{h}^{t-1}+\mathbf{b}_{r}\right) \\
\tilde{\mathbf{h}}^{t} &=\tanh \left(\mathbf{W}_{h} \mathbf{a}^{t}+\mathbf{U}_{h}\left(\mathbf{r}^{t} \odot \mathbf{h}^{t-1}\right)+\mathbf{b}_{h}\right) \\
\mathbf{h}^{t} &=\tilde{\mathbf{h}}^{t} \odot \mathbf{z}^{t}+\mathbf{h}^{t-1} \odot\left(1-\mathbf{z}^{t}\right)
\end{aligned}
\]
上式中\(h\)表示节点embedding,\(a\)代表接受的信息,\(z\)和\(r\)分别代表更新和遗忘。而后将节点借助readout模块输出为graph-level的embedding: \[ \begin{array}{l} \mathbf{h}_{v}=\sigma\left(f_{1}\left(\mathbf{h}_{v}^{t}\right)\right) \odot \tanh \left(f_{2}\left(\mathbf{h}_{v}^{t}\right)\right) \\ \mathbf{h}_{\mathcal{G}}=\frac{1}{|\mathcal{V}|} \sum_{v \in \mathcal{V}} \mathbf{h}_{v}+\text { Maxpooling }\left(\mathbf{h}_{1} \ldots \mathbf{h}_{\mathcal{V}}\right) \end{array} \]
上文提到的两个模型中GNN并没有attention模块,这是由于TextGCN的PMI、TF-IDF信息会损失,另一方面Text-level GNN全局的边权重也不应该引入文本图中的attention机制进行更新。
将上文的三个模型进行简单的对比,可以隐约感到存在一个图的构建与图神经网络之间的trade-off。前两个模型的图构建过程都嵌入了大量的信息(先验信息、全局信息),而他们的图神经网络都非常简单。事实上我曾在TextGCN上做过一些实验,尝试把GAT融入到信息传播过程中,发现准确率会有明显下降。而TextING的构图过程中的信息仅是词节点的共现所包含的上下文信息和结构信息,因此它可以接受更复杂的信息传播和聚合过程。这也使得TextING可以面对新词和新输入的文本直接进行分类。
BertGCN
BertGCN: Transductive Text Classification by Combining GCN and BERT
BertGCN是由香侬科技提出,发表在ACL2021上的文章,也是目前文本分类的SOTA模型。不过这篇文章的贡献主要是工程上的。另外,不妨排列组合一下将Bert与TextING结合,应该能取得更好的结果XD(虽然在R8上的结果已经非常接近100了)。
回顾TextGCN,模型中图节点初始化用的是one-hot向量,而BertGCN则是用Bert进行embedding的初始化(文档节点用Bert、词节点直接为0),另外将Bert与GNN两个模块进行联合训练,取得了很好的表现。
两者的结合存在两个问题,一是难收敛:BERT与GCN处理数据的方式不同、模型大小不同;二是GCN是在整个图上运算,而BERT过大的模型无法一次全部加载图中所有结点,这就给BertGCN的训练带来阻碍。 针对第一个问题,模型使用了Interpolating损失。 \[
Z=\lambda Z_{\mathrm{GCN}}+(1-\lambda) Z_{\mathrm{BERT}}, Z_{\mathrm{BERT}}=\operatorname{softmax}(W X)
\] 当\(\lambda=1\)时,BERT模块没有更新;当\(\lambda=0\)时,GCN模块没有更新;当\(\lambda \in (0,1)\)时,两个模块都能得到更新,并且通过调节\(\lambda\)实现BertGCN整体模块的快速收敛。
对于无法整图训练这一问题,BertGNN提出了一个Memory Bank用于保存所有节点特征,每次从中加载batch进行训练并更新,其他保持不变。将整个语料库中的文档特征分批更新,为了防止异步更新带来的不一致性,模型在训练Bert模型时采用了小学习率。
