GCN->GAT

Inductive (归纳式) 式的文本分类:训练过程中仅使用标注数据,测试数据在训练的时候没有见过。
Transductive (传导式) 文本分类:训练时候也提供未标注的数据,测试时的数据就是这些未标注的数据。
Transductive文本分类的目的在于让模型能够从观测到的标注数据推演到观测到的未标注数据,这就通过训练阶段的信息传导实现。

一 GCN模型

1.1 图构造(Build Graph):构建一个由结点与边构成的异质图。

结点分为两种:词结点与文档结点。
记图中所有结点的特征组成的矩阵是X(ndoc+nword)*d,其中是ndoc图中文档的数量,是nword词的数量,而d则是特征向量的维度。

初始化:TextGCN -> BERTGCN
TextGCN采用随机初始化策略
BertGCN把文档节点用BERT进行初始化,把所有的词结点初始化为0

边:则在词与词,词与文档之间进行连接。
边的权重由TF-IDF (Term Frequency-Inverse Document Frequency)与PPMI (Positive Point-wise Mutual Information)决定:
GCN->GAT_第1张图片
GCN->GAT_第2张图片

TextGCN -> BERTGCN在这里插入图片描述

1.2 模型定义

ZGCN=softmax(g(X,A))
g(X,A) = A ReLu(A X W0)W1【两层的GCN Layer】
GCN->GAT_第3张图片

1.3 模型训练

由于GCN是full-batch更新的即全图更新,也就意味着当节点比较多、图比较大时,全图更新计算是很慢的而且内存占用大,在工程应用上是没法接受的.

由于BERT与GCN处理数据的方式不同、模型大小不同,将二者直接结合起来无法导致模型收敛;此外,由于GCN是在整个图上运算,而BERT过大的模型无法一次全部加载图中所有结点,这就给BertGCN的训练带来阻碍。

BertGCN采用了预测插值、记忆存储、小学习率的技术解决这些问题。
一个直观的观察是:直接在GCN模块最后计算损失、梯度下降会导致BERT模块无法接受有效的优化信号。一个简单的解决方案是,插值两个模块的预测,同时联合优化两个模块:
Z = λZGCN + (1-λ)ZBERT
通过λ调节实现BertGCN整体模块的快速收敛。

记忆存储与小学习率
由于BERT的存在,BertGCN在训练时只能一次加载一个batch而非整个图。为此,记忆存储库保存了所有文档结点的特征
由于文档结点是分批更新的,所以在一个Epoch的不同迭代步,输入到模型里的特征会出现不一致的现象。为此,BertGCN在更新BERT模块时采用较小的学习率,减少特征之间的不一致。为加速训练,BertGCN还在训练之前用一个在下游数据集上训练好的BERT模型初始化BertGCN中的BERT模块。

1.4 GCN的局限性

GCN是处理transductive任务的一把利器(transductive任务是指:训练阶段与测试阶段都基于同样的图结构),然而GCN有两大局限性是经常被诟病的:
(a)无法完成inductive任务,即处理动态图问题。inductive任务是指:训练阶段与测试阶段需要处理的graph不同。通常是训练阶段只是在子图(subgraph)上进行,测试阶段需要处理未知的顶点。(unseen node)
(b)处理有向图的瓶颈,不容易实现分配不同的学习权重给不同的neighbor。这一点在前面的文章中已经讲过了,不再赘述,如有需要可以参考下面的链接。

二 GAT模型

2.1 计算步骤

计算注意力系数(attention coefficient)+ 加权求和(aggregate)

对于顶点i,逐个计算它的邻居们j和它自己之间的相似系数
eij = a([Whi][Whj])
解读一下这个公式:首先一个共享参数W的线性映射对于顶点的特征进行了增维,当然这是一种常见的特征增强(feature augment)方法[][]对于顶点i,j的变换后的特征进行了拼接(concatenate);最后 把拼接后的高维特征映射到一个实数上,作者是通过 single-layer feedforward neural network实现的。
显然学习顶点ij之间的相关性,就是通过可学习的参数W和映射a完成的。
有了相关系数,离注意力系数就差归一化了!其实就是用个softmax在这里插入图片描述
要注意这里作者用了个LeakyRelu,至于原因嘛,估计是试出来的,毕竟深度玄学。

在这里插入图片描述
在这里插入图片描述

2.2 计算复杂度

V表示图中的顶点数,E表示图中的边数,F表示原始的特征维度,F’表示输出的特征维度。

计算复杂度是由运算中的乘法次数决定的,从上面的公式(1)-(4)可以看出,GAT的运算主要涉及如下两个乘法运算环节:

顶点的特征映射,即Whi将F维的向量映射到F’维的空间,W是FF’维的参数矩阵。因此,Whi的计算复杂度是O(FF’)。对于所有顶点的特征都需要进行映射,则计算复杂度为
计算注意力系数过程中的 映射,从公式(1)可以看出, 是将 维的向量映射到一个实数上,则其计算复杂度为 。在计算注意力系数的过程中,图有多少条边,就需要计算多少次(因为每个顶点计算与其邻居顶点的相似系数),则其计算复杂度为
结合上面两个环节,GAT模型首先计算所有顶点的特征映射,然后计算注意力系数,后续的aggregate环节中主要都是加权求和运算,不再涉及高复杂度的乘法运算了。因此,单头GAT模型的计算复杂度为 ,而多头(multi-head)情形下的计算复杂度就是单头的 ( 是head数)倍。

2.4 GAT的局限性

优点:完全不依赖于图的结构,对于inductive任务无压力
缺点:(1)丢掉了图结构的这个特征,无异于自废武功,效果可能会很差(2)运算面临着高昂的成本

2.5 深入

与GCN的联系与区别
无独有偶,我们可以发现本质上而言:GCN与GAT都是将邻居顶点的特征聚合到中心顶点上(一种aggregate运算),利用graph上的local stationary学习新的顶点特征表达。不同的是GCN利用了拉普拉斯矩阵,GAT利用attention系数。一定程度上而言,GAT会更强,因为 顶点特征之间的相关性被更好地融入到模型中。

为什么GAT适用于有向图?
我认为最根本的原因是GAT的运算方式是逐顶点的运算(node-wise),这一点可从公式(1)—公式(3)中很明显地看出。每一次运算都需要循环遍历图上的所有顶点来完成。逐顶点运算意味着,摆脱了拉普利矩阵的束缚,使得有向图问题迎刃而解。

为什么GAT适用于inductive任务?
GAT中重要的学习参数是W与a(),因为上述的逐顶点运算方式,这两个参数仅与1.1节阐述的顶点特征相关,与图的结构毫无关系。所以测试任务中改变图的结构,对于GAT影响并不大,只需要改变N,重新计算即可。
与此相反的是,GCN是一种全图的计算方式,一次计算就更新全图的节点特征。学习的参数很大程度与图结构相关,这使得GCN在inductive任务上遇到困境。

你可能感兴趣的:(自然语言处理,机器学习,深度学习,人工智能)