关系抽取:图卷积网络的学习(一)(附代码)
目录
一、 图卷积网络(GCN)【托马斯·基普夫】
1.介绍
现实世界里很多重要的数据集都以图表或网络的形式呈现,例如:社交网络、知识图谱、蛋白质相互作用网络、万维网等等。然而直到最近,神经网络模型对这些结构化数据集的泛化仍然很少得到关注。
过去几年,很多研究重新思考了推广神经网络用于任意结构化图表的问题( Bruna et al., ICLR 2014;Henaff et al., 2015;Duvenaud et al., NIPS 2015;Li et al., ICLR 2016;Defferrard et al., NIPS 2016;Kipf & Welling, ICLR 2017 ),其中有些已经在某些领域取得了非常不错的结果,而这些领域过去使用基于核函数的方法、基于图的正则化技术或其他方法。
在这篇文章里,我将对这个领域的最新进展作一个简要概述,并指出各种方法的强处和不足。这些讨论主要关注最近的两篇论文:
- Kipf & Welling (ICLR 2017), Semi-Supervised Classification with Graph Convolutional Networks (disclaimer: I’m the first author)
- Defferrard et al. (NIPS 2016), Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering
以及 Ferenc Huszar 的评论文章:How powerful are Graph Convolutions? ,这篇文章讨论了这些类型的模型的一些限制。
2.Outline
- 简要介绍神经网络在图上的应用
- 图谱卷积核图卷积网络(GCNs)
- 实例:简单的1阶GCN模型的图嵌入
- GCN视作Weisfeiler-Lehman算法一般化的可微分形式
3.GCN到底有多强?
Recent literature相关文献
比较成熟的神经网络模型,如RNN、CNN在任意结构图上的应用是一个具有挑战性的问题。最近的一些论文引入了针对特定问题的特定结构(e.g.Duvenaud et al., NIPS 2015;Li et al., ICLR 2016;Jain et al., CVPR 2016),另外一些从图谱理论(Bruna et al., ICLR 2014;Henaff et al., 2015)中引入图卷积多层叠加的方式来解决问题,其中卷积的参数化的过滤器(filter)和经典CNN中的核(filter) 很相似。
更近一点的研究主要集中在解决快速启发式和慢速启发式之间的问题,不过好像只有图谱理论这一个途径。Defferrard et al.(NIPS 2016) 在图谱理论中用切比雪夫多项式(Chebyshev polynomials)以神经网络的自由参数方式估算出平滑的过滤器。他们在常规领域(如MNIST)取得了令人信服的结果,非常接近简单的2D CNN模型。
在Kipf & Welling(ICLR 2017)这篇论文中,我采用了一些相似的方法,从图谱卷积框架开始,引入一些简化,在很多情况下可以成倍提高训练速度和取得更好的的预测精确度。在一些基准的图数据集中,我们已经达到了state-of-the-art的分类结果。
GCNs Part I: Definitions
当前,大部分图神经网络模型都有一些通用的架构。我将引用那些模型作为图卷积网络(GCNs);卷积,是因为过滤器参数在图的所有地方共享了卷积核参数(或者是一部分Duvenaud et al., NIPS 2015)。
对于那些模型,目标是学习出一个信号/特征在图上的函数,G=(V,E),函数的输入是:
• 节点特征矩阵XN×D,N是节点数,D:输入的特征数。
• 图的邻接矩阵 ANxN。
输出是节点层面的矩阵 ZNxF( F是每个节点的输出特征数)。图层面的输出可以引入一些池化操作。(e.g.Duvenaud et al., NIPS 2015)
每一个神经网络层可以写成下面非线性的函数:
这里 H(0)=X and H(L)=Z(或者Z是图层面的输出),L是神经网络的层数。这个模型主要依赖于函数f和参数化的选择。
GCNs Part II: A simple example
一个例子,让我们考虑下面一个简单层面的传播规则。
这里 W(l)是神经网第l层的参数矩阵,σ是非线性的激活函数,比如ReLU。尽管这个模型非常简单,但是已经很强了。
在开始之前,我们给这个模型两个限制:乘矩阵A是什么意思?对于每个节点,我把除自身(除了有自循环外)外相邻节点的特征全加起来。我们可以对邻接矩阵A加上一个单位矩阵I强制变成带自循环的邻接矩阵。
第二个主要限制是A一般情况下是没有正规化的的,因此乘矩阵A会完全改变特征矩阵的规模(我们用A的特征值来想象一下)。正规化A使得A的每一行加起来等于1,比如 D−1A,这里D一个图的度的对角矩阵,这样我们来摆脱这个问题。乘D−1A结果会取相邻节点特征和的平均。在实际中,我们一般使用对称的形式 D−1/2AD−1/2(这样就不仅仅是简单的相邻节点的平均了)。综合这两个限制(trick),我们基本上获得了由Kipf & Welling (ICLR 2017)引入的神经网络传播规则:
A^=A+I, I是单位矩阵, D^是 邻接矩阵A^ 的节点度对角矩阵。
下一节我们将会近距离观察这个模型在将图上的作用例子:Zachary空手道俱乐部网络(Zachary’s karate club network)。
GCNs Part III: Embedding the karate club network 嵌入空手道俱乐部网络
让我们看看我们简单的GCNs模型在著名的Zachary空手道俱乐部网络数据集上是如何工作的。
我们采用随机初始化的3层GCN网络。在开始训练之前,我们简单的把图的邻接矩阵A和特征矩阵X=I(用单位矩阵表示节点特征矩阵,因为我们不知道任何节点的信息)插入到模型中。这个3层GCN在前向传播中进行3次传播,并且非常有效的做3阶节点相邻的卷积(所有的节点最多跳3次)。这非常令人印象深刻,这个嵌入了所有节点的模型输出了和社交网络非常相似的图(如下图)。注意我们只是网络参数是随机初始化的,并且没有做训练更新。
这可能有点让人吃惊。最近的一篇关于模型的论文叫 DeepWalk (Perozzi et al., KDD 2014)展示了在复杂的非监督学习训练过程中,他们能学习出非常相似的嵌入。用我们简单的没有训练过的GCN模型去做图嵌入,这是如何可能的呢?
我们可以用GCN更广泛的意义稍微解释一下,就是著名的Weisfeiler-Lehman算法在图上可微分的版本。下面的是1维Weisfeiler-Lehman算法工作的基本原理。
遍历所有点 vi∈G:
- 获取所有相邻节点 {vj}的特征 {hvj}
- 更新节点的特征 hvi←hash(∑jhvj), 这里的hash是一个单射hash函数。
重复上述过程k次或者直到收敛。
在实际应用中,Weisfeiler-Lehman 算法可以为大多数图赋予一组独特的特征。这意味着每个节点都被分配了一个独一无二的特征,该特征描述了该节点在图中的作用。但这对于像网格、链等高度规则的图是不适用的。对大多数不规则的图而言,特征分配可用于检查图的同构(即从节点排列,看两个图是否相同)。
回看下图卷积层层传播的规则(向量形式):
式中,j 表示 vi 的相邻节点。cij 是使用我们的 GCN 模型中的对称归一化邻接矩阵 D-1/2 A D-1/2 生成的边 (v_i,v_j) 的归一化常数。
我们可以将该传播规则解释为在原始的 Weisfeiler-Lehman 算法中使用的 hash 函数的可微和参数化(对 W(l))变体。如果我们现在选择一个适当的、非线性的的矩阵,并且初始化其随机权重,使它是正交的,(或者使用 Glorot & Bengio, AISTATS 2010 提出的初始化)那么这个更新规则在实际应用中会变得稳定(这也归功于归一化中的 c_ij 的使用)。我们得出了很有见地的结论,即我们得到了一个很有意义的平滑嵌入,其中可以用距离远近表示局部图结构的相似性/不相似性!
GCNs Part IV: Semi-supervised learning 半监督学习
到目前为止,我们模型是可微分的和参数化的,我们可以添加一写标记,训练模型,观察嵌入后的反应。我们可以使用由Kipf & Welling (ICLR 2017)引入的半监督学习方法。对于每个类/群体,我们简单的标记一个节点。下面是训练的几个迭代。
用 GCNs 进行半监督分类:对每类仅仅标记一个标签,(突出显示标记节点)进行 300 次迭代训练得到隐空间的动态。
隐式空间的动态模型,300个迭代训练,每个类一个标记的样本。高亮的是标记过的样本。
注意模型的产生的是2维的隐式空间,我们可以直接视觉化。我们观察到3层GCN模型可以线性的分隔社交群体,只需一个类别标记一个样本。这是一个非常牛逼的结果(This is a somewhat remarkable result),我们并没有给出节点的任何特征。同时,节点初始化特征是可以被提供的,这和论文(Kipf & Welling, ICLR 2017)中的实验一样,在图数据集中的分类中取得了state-of-the-art的结果。
4.结论
有关这个领域的研究才刚刚起步。在过去的几个月中,该领域已经获得了振奋人心的发展,但是迄今为止,我们可能只是抓住了这些模型的表象。而神经网络如何在图论上针对特定类型的问题进行研究,如在定向图或关系图上进行学习,以及如何使用学习的图嵌入来完成下一步的任务等问题,还有待进一步探索。本文涉及的内容绝非详尽无遗的,而我希望在不久的将来会有更多有趣的应用和扩展。
二、关系图卷积网络(R-GCN)
这里,我们将会了解如何实现一个关系图卷积网络(R-GCN),这种类型的网络旨在泛化GCN来处理知识库中实体之间的不同关系。如果想要学习更多R-GCN背后的东西,可以看Modeling Relational Data with Graph Convolutional Networks 。
简单的图卷积网络(GCN)和DGL探索一个数据集的结构信息(即,图的连通性)来改善节点表示的提取。图的边被保留为无类型。
知识图由主题、关系、对象形式的三元组集合组成。 因此,边对重要信息进行编码,并具有自己有待学习的嵌入。 此外,在任何给定对之间可能存在多个边。
1.R-GCN的一个简单介绍
在统计关系学习(statistical relational learning, SRL) 中,有两类基本任务:
- 实体分类——需要指定实体的类型和分类属性
- 链路预测——需要发现丢失的三元组
上面两种情况中,我们都期望可以从图的邻居结构中发现丢失的信息。例如,有一篇R-GCN的文章提供了下面的例子。在知道Mikhail Baryshnikov曾经在Vaganova Academy受教育,可以推断出Mikhail Baryshnikov是有标签的,而且我们也可以知道三元组(Mikhail Baryshnikov, lived in, Russia)一定属于这个知识图。
R-GCN通过一个常见的图卷积网络来解决上面两个问题。它使用多边编码进行扩展来计算实体的嵌入,但具有不同的下游处理。
- 实体分类通过在实体(节点)嵌入的最后加一个softmax分类器来实现,训练是采用标准交叉熵的损失函数。
- 链路预测通过一个自编码器结构来重新构建一条边,参数化score函数来实现,训练采用负采样。
这里关注的是第一个任务,实体分类,并展示了如何去生成实体表示。
2.R-GCN的关键点
回想一下GCN中,在(l+1)th每个节点i的隐层表示通过下面式子计算:
其中,ci为正则化常数。
R-GCN和GCN不同的关键之处:在R-GCN中,边可以表示不同的关系。GCN中,上述等式中的W(1)是l层中所有的边共享的。相反,R-GCN中,不同类型的边使用不同的权重,只有相同关系类型r的边才使用相同的映射权重W(1)r。
因此在R-GCN中,(l+1)th层上实体隐藏层可以用下面的等式来表示:
其中Nri表示在满足r∈R关系下,节点ii的邻居节点集合,ci,r是正则化常数。在实体分类中,R-GCN使用ci,r=∣Nri∣。
直接使用上面的等式存在问题:参数数目增长迅速,尤其对于高度多关系的数据而言。为了减少模型的参数规模和防止过拟合,原始的论文中提出使用基础分解。
因此,权重Wr(l)是基础转换Vb(l)和系数arb(l)的线性组合。base的数目B远远小于知识库的关系数目。
3.DGL中R-GCN的实现
一个R-GCN模型由多个R-GCN层构成。第一个R-GCN层作为输入层,输入与节点实体相关的特征,并映射到隐层空间(如:描述文本)。这里,我们只使用实体ID作为实体特征。
1)R-GCN层
对于每个节点,一个R-GCN层执行下面的步骤:
• 使用节点表示和与边类型(消息函数)相关的权重矩阵计算输出信息。
• 聚合输入的信息并生成新的节点表示(reduce和apply函数)。
下面定义R-GCN隐藏层的代码。
每种关系类型对应于不同的权重,因此,整个权重矩阵维度为3:关系,输入特征,输出特征。
import torch
import torch.nn.functional as F
from dgl import DGLGraph
import dgl.function as fn
from functools import partial
class RGCNLayer(nn.Module):
def __init__(self, in_feat, out_feat, num_rels, num_bases=-1, bias=None, activation