图卷积网络(Semi-Supervised论文思路整理)

本文探讨了图神经网络(GNN)的基本概念与应用,强调了在复杂图数据中学习潜在知识的重要性。介绍了GCNs的定义与实例,展示了其在分类任务上的效果,并提供了直观的视觉解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.youkuaiyun.com/u013006675/article/details/81098466				</div>
							            <div id="content_views" class="markdown_views prism-atom-one-dark">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p>之前承诺要写一个关于graph network的介绍,因为随着deep learning的发展达到一个很高的水平,reasoning(推理)能力的具备变得异常迫切。而knowledge graph则是实现reasoning的重要途径之一,如何从复杂的graph中学习到潜在的知识是一项非常challenging的任务,图作为knowledge的存储媒介,deep learning作为信息抽取的重要工具,二者的结合可谓是必然趋势。下面我将结合之前看过的一篇国外的博客,为大家入门graph neural network抛一块砖。</p>

在开始之前,多说几句,关于graph和deep learning结合的工作,想必大家都能猜到名字该怎么取,无非是这几个关键词的组合:Graph,Neural,Network,Convolution…所以,许多工作从paper名字来看并没有多大的区分性。

前言

现实世界许多数据都是以graph的形式存储的,比如social networks(社交网络), knowledge graphs(知识图谱), protein-interaction networks(蛋白质相互作用网络), the World Wide Web(万维网),最近有一些研究者把目光投向建立一种通用的神经网络模型来处理graph数据。在此之前,该领域的主流方法是一些基于kernel的方法或基于graph的正则化技术,不过从deep learning的角度来讲,这些已经属于“传统方法”了,不是我们要讨论的主题,不了解也没有关系。

GCNs:定义

由于大家的思想普遍是如何将CNN等神经网络的思想迁移到graph上,所以往往设计出来的结构都有一定的共性,使用类似convolution权重共享的思想,我们可以把这类网络暂且都称作Graph Convolutional Networks(GCNs)。这类网络从数学上来看,是想学习 G = ( V , E ) G = ( V , E ) G = ( V , E ) G=(V,E)G=(V,E) G=(V, E) G=(V,E)G=(V,E)G=(V,E)f(H(l),A)=σ[D1/2(A+I)D1/2H(l)W(l)]

这样,本质上我们就实现了Kipf & Welling (ICLR 2017)中设计的传播模型。

GCNs : 实例

本节我们利用上面介绍的模型实现一个分类问题。首先大家可以先看一下Zachary’s karate club network数据集以及它的背景,该数据集可以以下图的形式呈现,简单介绍的话就是说一个空手道俱乐部内部出现矛盾要被拆分为两波人,我们需要依据队员们平时的交往关系来判断他们会站哪一支队伍,图中每个节点表示一个队员,若两个节点之间存在边,则表示对应两个队员之间关系密切。下图使用clustering做个一个简单的划分,仅做参考,颜色相同的表示最后分在一组(这里作者貌似没有分为2类,而是4类)。

这里使用上述介绍的模型对每个node做embedding(这里网络设置为3层,使用了半监督,具体可以看原文Kipf & Welling ,不过大可以当做有监督来看),embedding后的效果就是同一组特征在空间上距离相近,下面的video展示了embedding的过程,效果还是相当明显的:

width="560" height="315" src="https://youtu.be/EuK4L61JmcQ" allowfullscreen="">

显示不了的话可移步https://youtu.be/EuK4L61JmcQ观看

GCNs:启发式的解释

我们发现一个很有意思的现象,就是当我们还没有开始训练,仅仅是随机初始化上述模型的参数之后,也产生了一定的embedding效果,如下图所示:

近期一个叫DeepWalk (Perozzi et al., KDD 2014)的工作表明他们可以使用无监督的方式产生一个相似的embedding效果,这听起来挺不可思议的,我们试图从Weisfeiler-Lehman算法的角度来解释,并把GCNs看做该算法的通用、可微版。

其实下面的部分可看可不看,因为我并没与觉得作者的解释有多少说服力,感兴趣的可以看一下原文。
之前做过一个PPT,也简单的介绍了一下三种graph neural network,需要的可以点击这里浏览一下。

由于水平所限,可能文中很多地方解释的不好,欢迎大家批评指正,相互进步,谢谢~

reference

http://tkipf.github.io/graph-convolutional-networks/

        </div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7b4cdcb592.css" rel="stylesheet">
            </div>
### 图卷积网络在半监督分类中的应用 #### 半监督学习背景 半监督学习是一种利用少量标注数据和大量未标注数据来提高模型性能的学习范式。对于许多实际应用场景而言,获取大规模高质量的标注数据成本较高,因此半监督学习成为一种重要的解决方案。 #### 图卷积网络的核心思想 图卷积网络(Graph Convolutional Network, GCN)通过将传统的卷积操作推广到图结构上,能够有效地处理具有复杂关系的数据集。其核心在于如何定义适用于图结构的卷积运算,并将其应用于节点特征的学习过程[^1]。 具体来说,《Semi-Supervised Classification with Graph Convolutional Networks》提出了基于谱图理论的方法,通过对拉普拉斯矩阵进行局部一阶近似,实现了高效的前向传播算法。这种方法不仅保留了图结构的信息,还能够在计算效率方面取得良好的平衡[^2]。 #### 谱图卷积及其简化形式 原始的谱图卷积依赖于傅里叶变换,在频域中完成滤波器的设计与应用。然而,这种做法通常涉及复杂的矩阵分解操作,难以直接扩展至大型稀疏图。为了克服这一局限性,论文引入了一种切比雪夫多项式的近似方式,进一步减少了参数数量并提升了运行速度[^3]。 最终得到的形式化表达如下所示: \[ H^{(l+1)} = \sigma(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}) \] 其中 \(H^{(l)}\) 表示第 l 层隐藏层的状态;\(W^{(l)}\) 是权重矩阵;而 \(\tilde{A}=A+I_N,\tilde{D}_{ii}=\sum_j{\tilde{A}_{ij}}\) 则分别代表增广邻接矩阵以及对应的度数矩阵[^4]。 此更新规则体现了两方面的特性:一方面它融合了来自邻居节点的影响;另一方面允许逐层调整特征表示的空间维度大小。 #### 应用实例 该框架被成功验证于多个标准基准测试任务之上,比如Cora、Citeseer 和 Pubmed 文献引用网络数据集。实验结果显示相比于其他传统方法或者简单的多层感知机架构,采用GCNs能显著提升预测精度的同时保持较低的时间开销。 ```python import numpy as np from scipy.sparse import csr_matrix from sklearn.preprocessing import OneHotEncoder def preprocess_adjacency(adj): """Preprocess adjacency matrix.""" adj_normalized = normalize_adj(adj + sp.eye(adj.shape[0])) return sparse_to_tuple(adj_normalized) class GraphConvLayer(tf.keras.layers.Layer): def __init__(self, input_dim, output_dim, activation=tf.nn.relu, **kwargs): super(GraphConvLayer, self).__init__(**kwargs) self.W = tf.Variable(initial_value=tf.random.normal([input_dim, output_dim]), trainable=True) self.activation = activation def call(self, inputs): features, support = inputs pre_sup = dot(features, self.W, sparse=False) output = dot(support, pre_sup, sparse=True) return self.activation(output) if self.activation is not None else output ``` 上述代码片段展示了构建基本图形卷积层的过程,其中包括必要的预处理步骤以及自定义Keras层的具体实现细节。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值