图神经网络是很大的一个系统知识,包图卷积网络GCN、图注意力网络GAT......,GCN的产生涉及图信号处理、图傅里叶变换、图滤波器等复杂的图像方面的内容。对图像知识小白的我,只能站在CNN的角度去理解GCN。CNN可以用于文本分类,GCN当然也可以,而且在多标签分类问题上表现如著名的BERT,非常不错,值得一试。
GCN 和CNN的区别和联系
1、从处理的数据格式看:
CNN处理的图像数据是固定2D栅格结构,非常有规则,通过共享一个卷积核,来计算相邻像素点的加权和,以此提取空间特征。
GCN中的卷积计算则是处理更普遍的非结构化的图数据的,非结构数据无法保持平移不变性,所以无法用相同尺寸的卷积核来进行卷积计算。
2、从卷积核来看:
GCN和CNN都是对局部提取特征,并且卷积核的参数处处共享。GCN中的卷积核也作用于全图所有的节点,权重参数共享,减少了单层网络的参数量,可以有效避免过拟合现象的出现。
需要明确的是,我们目的是用卷积核来卷积上一层的信息,假如上一层的信息为f,卷积核为h,那么二者的乘积就是下层节点的信息。f*h就不像CNN那样的矩阵运算这么简单了。
卷积定理指出,函数卷积的傅立叶变换是函数傅立叶变换的乘积,对于函数f和h两者的卷积是函数傅里叶变换乘积的逆变换。
f的傅里叶变换为: ;其中U是列量为单位特征向量的矩阵,是正交矩阵。
h的傅里叶变换为:
再乘以U得到逆变换,f和h在图上的卷积计算为:
式子中间的对角矩阵写成:。
3、从感受域来看:
GCN和CNN感受域都随着卷积层增大而增大,两类模型中,节点自身特征的更新是与卷积运算强耦合在一起的,每一个新卷积层的加入,都可以使节点获得更加抽象化的特征表示。
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中的元素就是表达第i个节点和第j个节点之间的关系权重。计算方式为:
字节点之间的关系用PMI值表示,其计算方式为:
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。最终得到对称归一化拉普拉斯算子,计算过程如下:
Training
得到拉普拉斯矩阵以后,就进行特征分解、傅里叶变换、卷积,然后整个过程又回到CNN上面一样,这个过程就交给GraphConvolution类来处理吧!从第一层到第二层的公式为:
,这里的就是上面的Lsys,拉普拉斯算子。
到这里就晕了,卷积计算不是式(3)的f*h吗,和有什么关系?
式(3)是Graph通用的卷积公式,而是为深度学习经几代演化调整而来的,原理是一样的。
将替换成,在神经网络中,x就是上一层的信息,再套一个激活函数Relu(论文中是Relu),就变成:
将激活函数里面的部分写成矩阵形式:
拉普拉斯矩阵的特征分解:
将式(5)按照上述方式改写后:
这时,其实式(8)就是了。
按照上述卷积计算的过程,图的卷积计算就完成了,如果有多层,就迭代此操作。卷积完之后,分类也就完成了。这里不像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)