GCN卷积网络的详细介绍
字幕组双语原创:GCN图卷积网络介绍(GCN)
原英语:图形非自愿网络(GCN)
听风1996,大表哥
很多问题本质上都是图。在我们的世界里,我们看到很多数据都是图,比如分子,社交网络,论文引用网络。
图表示例。(图片来自[1])
在图中,我们有节点的特征(表示节点的数据)和图的结构(表示节点是如何连接的)。
对于节点,我们可以很容易的得到每个节点的数据。但是当涉及到图的结构时,要从中提取有用的信息并不容易。比如两个节点距离很近,是否应该和其他节点对区别对待?高低节点怎么处理?其实对于每一个具体的工作,只是特征工程,也就是把图的结构转化成我们的特征,会消耗大量的时间和精力。
图形特征工程。(图片来自[1])
如果能以某种方式获取图的节点特征和结构信息作为输入,让机器判断哪些信息有用就更好了。
这就是为什么我们需要图形表示学习。
我们希望涂能自学“特征工程”。(图片来自[1])
论文:基于图神经网络的半监督分类(2017)[3]
GCN是一种卷积神经网络,它可以直接在图上工作,并利用图的结构信息。
它解决了图(如引文网络)中节点(如文档)的分类问题,只对少量节点进行标记(半监督学习)。
图上半监督学习的一个例子。一些节点没有标签(未知节点)。
正如“卷积”这个名字所指,这个想法来源于图像,后来被引入到图形中。然而,当图像具有固定的结构时,图就复杂得多。
从图像到图形的卷积思想。(图片来自[1])
GCN的基本思想:对于每个节点,我们从它所有的邻居那里获得它的特征信息,包括它自己的特征。假设我们使用average()函数。我们将对所有节点进行同样的操作。最后,我们将这些计算的平均值输入到神经网络中。
在下图中,我们有一个简单的引用网络的例子。每个节点代表一篇研究论文,边代表一篇引文。我们在这里有一个预处理步骤。这里我们不用原纸作为特征,而是把纸转换成向量(通过使用NLP嵌入,比如tf-idf)。NLP嵌入,比如TF-IDF)。
让我们考虑绿色节点。首先我们得到它所有邻居的特征值,包括我们自己的节点,然后取平均值。最后,通过神经网络返回一个结果向量作为最终结果。
GCN的主要思想。让我们以绿色节点为例。首先,我们取它所有邻居的平均值,包括我们自己的节点。然后,平均值通过神经网络。请注意,在GCN,我们只使用一个全连接层。在这个例子中,我们得到一个二维向量作为输出(全连接层的两个节点)。
在实践中,我们可以使用比平均函数更复杂的聚合函数。我们也可以将更多的层堆叠在一起,以获得更深的GCN。每一层的输出将被视为下一层的输入。
两层GCN的例子:第一层的输出是第二层的输入。同样,注意GCN的神经网络只是一个完全连接的层(图片来自[2])。
让我们从数学的角度认真看看它是如何工作的。
首先,我们需要一些笔记。
我们来考虑图G,如下图所示。
从图g中,我们有一个邻接矩阵a和一个度矩阵d,同时,我们还有特征矩阵x。
那么如何才能从相邻节点得到每个节点的特征值呢?解决方法在于a和x的相乘。
看邻接矩阵的第一行,我们可以看到节点A和节点E之间有连接,矩阵的第一行是节点E与A连接的特征向量(如下图)。同样,得到的矩阵的第二行是D和e的特征向量之和,通过这种方法,我们可以得到所有邻居节点的向量之和。
计算“和向量矩阵”的第一行AX。
在问题(1)中,我们可以通过在A上加一个单位矩阵I来求解,得到一个新的邻接矩阵?。
取lambda=1(让节点本身的特征和邻居一样重要),我们有?=A+I,注意我们可以把lambda看成一个可训练参数,但是现在我们只需要把lambda赋值为1。即使在论文中,lambda也被简单地赋值为1。
通过给每个节点添加一个自循环,我们得到一个新的邻接矩阵。
对于问题(2):对于矩阵缩放,我们通常将矩阵乘以对角矩阵。在目前的情况下,应该取聚合特征的平均值,还是数学上应该根据节点的度来比较聚合向量矩阵?x缩放。直觉告诉我们,这里用于缩放的对角矩阵是和矩阵d?相关的事情(为什么d?,不是d?因为我们在考虑一个新的邻接矩阵?度矩阵d?,而不再是一个)。
现在的问题变成了我们如何缩放/归一化和向量?换句话说:
我们如何将邻居的信息传递给特定的节点?先说老朋友平均。在这种情况下,d?(即d的逆矩阵?{-1})就可以了。基本上,d?的逆矩阵中的每个元素都是对角矩阵d中对应项的倒数。
比如节点A的度是2,那么我们把节点A的聚合向量乘以1/2,节点E的度是5,那么就要把E的聚合向量乘以1/5,以此类推。
因此,通过d?把倒数和x相乘,我们就可以取所有邻居节点(包括我们自己的节点)的特征向量的平均值。
到目前为止,一切都很好。但是你可能会问加权平均()呢?直观上来说,区别对待高低度的节点应该更好。
但是我们只按行缩放,而忽略了相应的列(虚线框)。
向列中添加新的定标器。
新的缩放方法为我们提供了一个“加权”平均值。我们在这里做的是给低级别节点更多的权重,以减少高级别节点的影响。这种加权平均的思想是,我们假设低级别节点对邻居节点的影响会更大,而高级别节点的影响会更小,因为它们的影响分散在太多的邻居节点上。
当在节点B聚集相邻节点的特征时,我们将最大权重(度3)分配给节点B本身,将最小权重(度5)分配给节点E..
因为我们规范化了两次,所以把“-1”改成了“-1/2”。
比如我们有一个10类的多分类问题,f设为10。在层2中有10维向量后,我们通过softmax函数预测这些向量。
损失函数的计算方法很简单,就是用所有标记样本的交叉熵误差来计算,其中Y_{l}是标记节点的集合。
图层数是指结点要素可以传输的最远距离。例如,在1层GCN中,每个节点只能从它的邻居那里获得信息。每个节点收集信息的过程是独立的,所有节点都是同时完成的。
当一层叠加在第一层上时,我们重复收集信息的过程,但这一次,邻居节点已经有了自己的邻居信息(来自上一步)。这使得层数成为每个节点可以进行的最大跳跃。因此,根据我们认为一个节点应该从网络获取信息的程度,我们可以为#layers设置一个适当的数量。但同样,在图片中,我们通常不想走得太远。设置为6-7跳,我们几乎可以得到整个图,但这使得聚合没有意义。
示例:收集目标节点I的两层信息的过程
本文还分别对浅层和深层GCN进行了实验。在下图中,我们可以看到使用2层或3层模型可以获得最佳结果。此外,对于深GCN(超过7层),它通常得到较差的性能(蓝色虚线)。一种解决方案是使用隐藏层之间的剩余连接(紫色线)。
#不同层的性能#。图片来自报纸[3]
论文作者的说明
这个框架目前仅限于无向图(加权或未加权)。但是,我们可以通过将原始有向图表示为无向二分图,并在原始图中添加表示边的节点,来处理有向边和边特征。
对于GCN,似乎我们可以同时利用节点特征和图结构。但是,如果图中有不同类型的边呢?我们是否应该区别对待每一段感情?这种情况下如何聚合邻居节点?最近有什么先进的方法?
在下一篇关于图形主题的文章中,我们将研究一些更复杂的方法。
如何处理不同的关系(兄弟,朋友,...)?
[1]Jure Leskovec(斯坦福)关于图形表示学习的精彩幻灯片:
[5]使用StellarGraph库的演示:-node-classification.html
雷锋字幕组是一个由AI爱好者组成的翻译团队,汇集了五位以上志愿者的力量,分享海外最新的AI资讯,交流人工智能技术领域的产业变革和技术创新。
团队成员包括大数据专家、算法工程师、图像处理工程师、产品经理、产品运营、IT顾问、在校师生;志愿者来自IBM、AVL、Adobe、阿里、百度等知名企业,以及北大、清华、港大、中科院、南卡罗来纳大学、早稻田大学等国内外高校的科研院所。
如果,你也是一个爱分享的AI爱好者。欢迎和雷锋字幕组一起学习新知识,分享成长。