【GPRGNN】根据2024年异配图神经网络综述《Towards Learning from Graphs with Heterophily:Progress and Future》中的分类(Taxonomy)部分,我们选择研究不同类别下的异配图神经网络,从GPRGNN开始。
发表在2021年ICLR会议上,作者学校:美国伊利诺伊香槟分校,引用量:588。
ICLR会议简介:全称International Conference on Learning Representations(国际学习表征会议),深度学习顶会。
查询会议:
- 会伴:https://www.myhuiban.com/
- CCF deadline:https://ccfddl.github.io/
原文和开源代码链接:
- paper原文:https://arxiv.org/abs/2006.07988
- 开源代码:https://github.com/jianhao2016/GPRGNN
0、核心内容
在许多重要的图数据处理应用程序中,所获得的信息包括节点特征和图拓扑的观察结果。图神经网络(GNNs)被设计用来利用这两种证据来源,但它们并没有最优地权衡它们的效用,并以一种同样通用的方式整合它们。在这里普遍性是指对同质性或异配性图假设的独立性。
我们通过引入一种新的Generalized PageRank(GPR)GNN结构来解决这些问题,该结构自适应地学习GPR权值,从而共同优化节点特征和拓扑信息提取,无论节点标签在多大程度上是同配性或异配性的。学习到的GPR权值会自动调整到节点标签模式,而这与初始化的类型无关,从而保证了对通常难以处理的标签模式的优秀学习性能。
此外,它们允许人们避免特征过平滑,这一过程使特征信息是非区别性的,而不需要网络是浅浅的。
我们对GPRGNN方法的理论分析是由所谓的上下文随机块模型生成的新的合成基准数据集所促进的。
我们还比较了我们的GNN架构和一些最先进的GNN在节点分类问题上的性能,使用著名的同配型和异配性的基准数据集(homophilic and heterophilic datasets)。结果表明,与现有的技术相比,GPRGNN在合成数据和基准数据上都提供了显著的性能改进。
(引自摘要)
总结一下就是:目前的GNNs都是基于同质性假设的,对于异配图表现不好。因此需要设计一个独立于同质性或异配性图假设的GNN,说白了就是在同质图(对应翻译为同配图)上表现好,在异配图上表现不受异配性影响,也表现好的GNN。于是本文设计了GPRGNN算法,摘要看不懂没关系,继续往下看,研究算法是如何具体实现的,看一下源代码也很有必要。
1、先验知识
① homophily & homophily assumption(同质性&同质性假设)
Homophily(同质性)是一个社会网络和社会心理学中的概念,指的是相似个体之间更有可能建立联系或关系的趋势。这种现象在各种社交环境中普遍存在,包括友谊、婚姻、职业网络等。在网络科学中,同质性也用来描述网络中节点之间因为共享某些特征或属性而倾向于彼此连接的倾向。
Homophily Assumption(同质性假设)是社交网络分析中的一个核心假设,它假设网络中的个体倾向于与自己相似的其他个体建立联系。这种假设基于观察到的社交现象,即人们倾向于与拥有相似特征(如年龄、性别、种族、兴趣、社会经济地位等)的人交往。同质性假设在社交网络分析、信息传播模型、网络形式理论等多个领域都有重要应用。
在图论和网络科学中,同质性假设对理解和预测网络结构和动态具有重要意义。例如:
- 社区检测:在社交网络中,同质性假设可以帮助识别由具有相似特征的个体组成的社区或群体。
- 信息传播:同质性假设可以解释信息如何在网络中传播,因为相似的个体更有可能分享和采纳相同的信息或观点。
- 网络演化:同质性假设有助于理解网络如何随时间演化,因为新的连接往往在已经具有相似特征的个体之间形成。
然而,需要注意的是,同质性假设并不是在所有情况下都成立。在某些网络或情境中,也可能观察到异质性(Heterophily,通常翻译为异配性,Homophily对应翻译为同配性),即不同的个体之间建立联系。异配性可以增加网络的多样性,促进不同观点和信息的交流。
在设计算法和模型来分析和预测网络行为时,考虑同质性假设是非常重要的,它可以帮助提高模型的准确性和预测能力。同时,理解同质性和异配性在不同网络中的作用,对于深入分析社交结构和动态具有重要意义。
② 什么是PageRank算法?
PageRank是一种由谷歌创始人拉里·佩奇(Larry Page)提出并以其名字命名的网页排名算法(这名字起的好,以自己名字命名,还跟网页有关系。以后给孩子起名叫Neural Network吧,天选研究GNN的小伙汁)。它是一种用于衡量网页重要性的算法,通过分析网页之间的链接关系来确定每个网页的相对重要性或质量。
PageRank算法的核心思想是,一个网页的重要性由链接到它的其他网页的数量和质量决定。如果一个网页被许多其他重要的网络链接,那么它本身也很可能是一个重要的网页。PageRank算法使用一个概率模型,假设一个用户随机点击链接来浏览网页,通过这种方式来计算每个网页的排名。
直观地说,一个网页,如果指向该网页的超链接越多,随机跳转到该网页的概率也就越高,该网页的PageRank值就越高,这个网页也就越重要。PageRank值依赖于网络的拓扑结构,一旦网络的拓扑(连接关系)确定,PageRank值就确定。
具体来说,PageRank算法的工作流程大致如下:
- Step1 初始化:为每个网页分配一个初始的PageRank值,通常是1/N,其中N是网页的总数。
- Step2 迭代计算:通过迭代过程更新每个网页的PageRank值。在每次迭代中,每个网页的PageRank值由链接到它的网页的PageRank值决定。具体来说,一个网页的PageRank值是左右链接到它的网页的PageRank值的加权和,每个链接的权重是链接网页的PageRank值除以它链接出的网页数。
- Step3 衰减因子:为了防止排名值无限增长,PageRank算法引入了一个衰减因子(damping factor),通常设为0.85。这意味着用户有d的概率通过链接浏览网页,有1-d的概率随机跳转到其他网页。
- Step4 收敛:迭代过程一直进行,直到每个网页的PageRank值收敛到一个稳定的状态,或者达到预设的迭代次数。
- Step5 排名:最终,根据计算得到的PageRank值对所有网页进行排序。
PageRank算法不仅用于搜索引擎的网页排名,也被应用于社交网络分析、引文分析、推荐系统等多个领域。
③ 什么是Generalized PageRank?
Generalized PageRank是对PageRank的推广,它引入了一系列可学习的权重参数,用于调整图中节点的重要性得分。这些权重参数允许模型自适应地调整不同节点的贡献,从而可以更好地处理不同类型的图结构,包括那些不符合同质性假设的图。Generalized PageRank可以看作是图上执行多项式滤波,其中多项式的系数是可学习的参数,这使得GPR能够适应图的频率特性,既可以作为高通滤波器也可以作为低通滤波器使用。
在图神经网络(GNN)的领域,Generalized PageRank被用来改进模型对节点特征和拓扑信息的提取,同时防止过平滑现象的发生,即避免节点特征在多层传播后变得过于现实,导致模型性能下降。通过自适应地学习GPR权重,GNN模型可以更好地泛化到具有不同节点标签模式的图上,无论是同配图还是异配图。
④ 同配性和异配性的英文表示
- Heterophily:异配性
- Heterophilic graphs:异配图(来自paper《GPRGNN》,这两种用法用哪个都行)
- Heterophilous graphs:异配图(来自paper《Is Homophily A Necessary for Graph Neural Networks?》)
- Homophily:同质性(对应异配性,翻译为同配性)
- Homophilic graphs:同配图
- Homophilous graphs:同配图
- graphs with arbitrary levels of homophily and heterophily:任意同配和异配水平的图
Heterophilic graphs和Heterophilous graphs都表示异配图,用哪个都行,同配图同理。
2、本文所用数据集和对比神经网络算法
① cSBM合成数据集
为了测试GPRGNN在同配性和异配性节点标签模式上的性能,并确定节点和拓扑特征探索之间的权衡,我们首先描述了最近提出的上下文随机块模型(cSBM)。cSBM允许平滑地控制节点特征和图拓扑之间的“信息量比率”(“Informativeness ratio”)。其中的图可以从高度同配性到高度异配性。本文表明,在cSBM上的半监督节点分类任务中,GPRGNN从强同配性到强异配性始终优于其他基线方法。
cSBM生成合成图的过程:我们考虑有两个大小相等的类的情况。在cSBM中,节点特征是高斯随机向量,其中高斯分布的平均值取决于社区的分配。均值的差值由参数μ控制,社区间和社区边缘密度的差值由参数λ控制。因此,μ和λ分别捕获了节点特征和图拓扑的“相对信息量”(“relative Informativeness”)。此外,正的λ表示同配图,负的λ表示异配图。
② 常用真实世界基准数据集
本文证明了GPRGNN在节点分类基准真实数据集上提供了包含同配图和异配图的最先进的性能。
本文采用的图同质性指标 H ( G ) H(G) H(G)为节点同质性, H ( G ) H(G) H(G)等于对于每个节点 v v v,该节点邻居中与中心节点 v v v标签类别相同的邻居个数除以总邻居个数的值,对于每个节点求该值求和,最后除以总节点数。公式表示如下:
其中, H ( G ) H(G) H(G)趋近于1表示较强的同配性, H ( G ) H(G) H(G)趋近于0表示较强的异配性。
③ 对比的图神经网络算法
对比的图神经网络算法有APPNP、MLP、SGC、GCN、GAT、SAGE、JKNet、GCN-Cheby、GeomGCN。
3、GPRGNN原理
用GPRGNN模型来缓解图的异配性和过平滑问题:GPRGNN首先为每个节点提取隐藏的状态特征,然后使用GPR进行传播。GPRGNN过程可以用数学方法描述为:
其中, f θ ( . ) f_{θ}(.) fθ(.)表示一个参数集为 θ {θ} θ的神经网络,该网络生成隐藏状态特征 H ( 0 ) H^{(0)} H(0)。GPR权重 γ k γ_k γk与 θ {θ} θ一起以端到端的方式进行训练。
GPRGNN模型很容易解释:如前所指出的,GPRGNN能够自适应地控制每个传播步骤的贡献,并将其调整到节点标签模式。检查学习到的GPR权值也有助于阐明一个图的拓扑信息的性质(即,确定最优多项式图滤波器),如图1(b)和©所示。
4、代码
源码数据集不全,没复现出来,有人复现出来踢我一下。
源码的算法部分:
class GPR_prop(MessagePassing):
'''
propagation class for GPR_GNN
'''
def __init__(self, K, alpha, Init, Gamma=None, bias=True, **kwargs):
super(GPR_prop, self).__init__(aggr='add', **kwargs)
self.K = K
self.Init = Init
self.alpha = alpha
self.Gamma = Gamma
assert Init in ['SGC', 'PPR', 'NPPR', 'Random', 'WS']
if Init == 'SGC':
# SGC-like, note that in this case, alpha has to be a integer. It means where the peak at when initializing GPR weights.
TEMP = 0.0*np.ones(K+1)
TEMP[alpha] = 1.0
elif Init == 'PPR':
# PPR-like
TEMP = alpha*(1-alpha)**np.arange(K+1)
TEMP[-1] = (1-alpha)**K
elif Init == 'NPPR':
# Negative PPR
TEMP = (alpha)**np.arange(K+1)
TEMP = TEMP/np.sum(np.abs(TEMP))
elif Init == 'Random':
# Random
bound = np.sqrt(3/(K+1))
TEMP = np.random.uniform(-bound, bound, K+1)
TEMP = TEMP/np.sum(np.abs(TEMP))
elif Init == 'WS':
# Specify Gamma
TEMP = Gamma
self.temp = Parameter(torch.tensor(TEMP))
def reset_parameters(self):
torch.nn.init.zeros_(self.temp)
if self.Init == 'SGC':
self.temp.data[self.alpha]= 1.0
elif self.Init == 'PPR':
for k in range(self.K+1):
self.temp.data[k] = self.alpha*(1-self.alpha)**k
self.temp.data[-1] = (1-self.alpha)**self.K
elif self.Init == 'NPPR':
for k in range(self.K+1):
self.temp.data[k] = self.alpha**k
self.temp.data = self.temp.data/torch.sum(torch.abs(self.temp.data))
elif self.Init == 'Random':
bound = np.sqrt(3/(self.K+1))
torch.nn.init.uniform_(self.temp,-bound,bound)
self.temp.data = self.temp.data/torch.sum(torch.abs(self.temp.data))
elif self.Init == 'WS':
self.temp.data = self.Gamma
def forward(self, x, edge_index, edge_weight=None):
edge_index, norm = gcn_norm(
edge_index, edge_weight, num_nodes=x.size(0), dtype=x.dtype)
hidden = x*(self.temp[0])
for k in range(self.K):
x = self.propagate(edge_index, x=x, norm=norm)
gamma = self.temp[k+1]
hidden = hidden + gamma*x
return hidden
def message(self, x_j, norm):
return norm.view(-1, 1) * x_j
def __repr__(self):
return '{}(K={}, temp={})'.format(self.__class__.__name__, self.K,
self.temp)
class GPRGNN(torch.nn.Module):
def __init__(self, dataset, args):
super(GPRGNN, self).__init__()
self.lin1 = Linear(dataset.num_features, args.hidden)
self.lin2 = Linear(args.hidden, dataset.num_classes)
if args.ppnp == 'PPNP':
self.prop1 = APPNP(args.K, args.alpha)
elif args.ppnp == 'GPR_prop':
self.prop1 = GPR_prop(args.K, args.alpha, args.Init, args.Gamma)
self.Init = args.Init
self.dprate = args.dprate
self.dropout = args.dropout
def reset_parameters(self):
self.prop1.reset_parameters()
def forward(self, data):
x, edge_index = data.x, data.edge_index
x = F.dropout(x, p=self.dropout, training=self.training)
x = F.relu(self.lin1(x))
x = F.dropout(x, p=self.dropout, training=self.training)
x = self.lin2(x)
if self.dprate == 0.0:
x = self.prop1(x, edge_index)
return F.log_softmax(x, dim=1)
else:
x = F.dropout(x, p=self.dprate, training=self.training)
x = self.prop1(x, edge_index)
return F.log_softmax(x, dim=1)
深入理解还需要再看看其他相关论文。
5、参考资料
- kimi:https://kimi.moonshot.cn/
- PageRank算法详解:https://zhuanlan.zhihu.com/p/137561088
- 机器学习经典算法之PageRank:https://www.cnblogs.com/jpcflyer/p/11180263.html