GCN for Text Classification<总结>

图神经网络是很大的一个系统知识,包图卷积网络GCN、图注意力网络GAT......,GCN的产生涉及图信号处理、图傅里叶变换、图滤波器等复杂的图像方面的内容。对图像知识小白的我,只能站在CNN的角度去理解GCN。CNN可以用于文本分类,GCN当然也可以,而且在多标签分类问题上表现如著名的BERT,非常不错,值得一试。

图 1

GCN 和CNN的区别和联系

1、从处理的数据格式看:

CNN处理的图像数据是固定2D栅格结构,非常有规则,通过共享一个卷积核,来计算相邻像素点的加权和,以此提取空间特征。

GCN中的卷积计算则是处理更普遍的非结构化的图数据的,非结构数据无法保持平移不变性,所以无法用相同尺寸的卷积核来进行卷积计算。

2、从卷积核来看:

GCN和CNN都是对局部提取特征,并且卷积核的参数处处共享。GCN中的卷积核也作用于全图所有的节点,权重参数共享,减少了单层网络的参数量,可以有效避免过拟合现象的出现。

需要明确的是,我们目的是用卷积核来卷积上一层的信息,假如上一层的信息为f,卷积核为h,那么二者的乘积就是下层节点的信息。f*h就不像CNN那样的矩阵运算这么简单了。

卷积定理指出,函数卷积的傅立叶变换是函数傅立叶变换的乘积,对于函数f和h两者的卷积是函数傅里叶变换乘积的逆变换。

式 (1)

f的傅里叶变换为:\hat{f} =U^Tf ;其中U是列量为单位特征向量的矩阵,是正交矩阵。

h的傅里叶变换为:

式 (2)

                                                                \hat{h} (\lambda _{l} )=\sum_{i=1}^Nh(i)u_{l}^*(i)

再乘以U得到逆变换,f和h在图上的卷积计算为:

式 (3)

式子中间的对角矩阵写成:diag(\hat{h} (\lambda _{l} ))。

3、从感受域来看:

GCN和CNN感受域都随着卷积层增大而增大,两类模型中,节点自身特征的更新是与卷积运算强耦合在一起的,每一个新卷积层的加入,都可以使节点获得更加抽象化的特征表示。

图 2

GCN特性

从何CNN的对比之中,了解了GCN具有的卷积神经网络的性质,但作为“图”神经网络的一员,具有不同于CNN的“图”的特性:

1、GCN得有一张数据构成的图,包含属性信息与结构信息。

2、有一个邻接矩阵来表达节点与节点之间的关系,也就是结构信息。

3、每个节点有自己独特的信息,也就是属性信息。

文本分类任务的图

1、构建节点--node

对于文本分类来说,节点包含字节点和文档节点。首先对语料进行分词,建立一个词典,词典大小就是字节点的个数,设为n。文档的节点为文档或者样本的个数,设为m。那么整个图的节点个数为n+m。

2、构建节点的特征--feature

字节点的特征是对应的word embedding,文档的特征是文档中字节点特征的加和,刚开始word embedding为初始化值,随着模型训练而更新。

3、构建节点之间的边--edge

由一个(n+m)*(n+m)维的矩阵A来表示每一个节点之间的邻接关系,那么A中的元素A_{ij} 就是表达第i个节点和第j个节点之间的关系权重。计算方式为:

图 3

字节点之间的关系用PMI值表示,其计算方式为:

图4

p(i,j)是i和j共现的频次,p(i)和p(i)是i和j各自出现的频次。

p(i)和p(j)的计算:首先,定义一个滑窗大小,然后将语料切分成无数个windows,如果样本不足滑窗大小当一个滑窗计算。然后,建立一个字典,并且遍历每一个滑窗,得到{'字':该字有多少滑窗出现}这样一个字典,如果一个滑窗中同一个字出现多只也算一次。

p(i,j)的计算:同样也是建立一个字典,遍历每一个滑窗,只是需要在取某个字的时候,再遍历一次该字之前的所有字,组成i,j字对,得到{'字ij':该字对有多少滑窗出现}。

TF-IDF值是词频逆文档频次,反映某个词的在该文档中的重要性,TF是该词在文档中的频率,IDF是该词在多少文档中出现过。

当i和j相同时,PMI值为1,那么A矩阵的对角线为1。其余情况为0。

进行完以上三步之后,将数据按照id(每个字和每个文档都有一个对应的id:0~m+n)写入矩阵里,得到的是上三角或下三角的矩阵,然后将非对称的邻接矩阵转化成对称的。接下来,对矩阵进行归一化处理,并且在对角线上添加元素为1,认为文档和文档、字与字本身的关系为1。最终得到对称归一化拉普拉斯算子,计算过程如下:

图 5

                                                                 L =D-A

式(4)

Training

得到拉普拉斯矩阵以后,就进行特征分解、傅里叶变换、卷积,然后整个过程又回到CNN上面一样,这个过程就交给GraphConvolution类来处理吧!从第一层到第二层的公式为:

L^1 = \rho (\tilde{L}XW_{0}  ),这里的\tilde{L} 就是上面的Lsys,拉普拉斯算子。

到这里就晕了,卷积计算不是式(3)的f*h吗,和L^1有什么关系?

式(3)是Graph通用的卷积公式,而L^1是为深度学习经几代演化调整而来的,原理是一样的。

将diag(\hat{h} (\lambda _{l} ))替换成\sum_{j=0}^N\alpha _{j}\lambda _{l}^j  ,在神经网络中,x就是上一层的信息,再套一个激活函数Relu(论文中是Relu),就变成:

式(5)

将激活函数里面的部分写成矩阵形式:

式(6)

拉普拉斯矩阵的特征分解:

式(7)

将式(5)按照上述方式改写后:

式(8)

这时,其实式(8)就是L^1了。

按照上述卷积计算的过程,图的卷积计算就完成了,如果有多层,就迭代此操作。卷积完之后,分类也就完成了。这里不像CNN,要先卷积,然后池化,最后全连接层。GCN最后一层feature向量就是输出的概率分布,比如输入的feature是516维,经一层卷积hidden为258维,经二层卷积为95维,最后一层的维度需要和label的类别保持一致,节点feature就是一个概率分布,然后输出概率最大的那个作为该节点的类别。

Testing

根据《Graph Convolutional Networks for Text Classification》这篇文章给出的代码,运用于试题多标签的分类任务上,测试精度比CNN要高很多。结果如下,和bert的试验结果差不多。

Macro average Test Precision, Recall and F1-Score...

(0.5177944301111611, 0.9799458881748833, 0.643836952049565, None)

Micro average Test Precision, Recall and F1-Score...

(0.5890837859496038, 0.9972867048537836, 0.7406661069129583, None)

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容