【源码复现】图神经网络之PPNP/APPNH

目录

  • 1、论文简介
  • 2、论文核心介绍
    • 2.1、现有方法局限
    • 2.2、PageRank&Personalized PageRank
    • 2.3、PPNP&APPNP
  • 3、源码复现
    • 3.1、模型总体框架
    • 3.2、PPNP
    • 3.3、APPNP
    • 3.4、MLP(两层)

1、论文简介

  • 论文题目——《PREDICT THEN PROPAGATE: GRAPH NEURAL NETWORKS MEET PERSONALIZED PAGERANK》
  • 论文作者——Johannes Klicpera, Aleksandar Bojchevski & Stephan Gu ̈nnemann
  • 论文地址——PREDICT THEN PROPAGATE: GRAPH NEURAL NETWORKS MEET PERSONALIZED PAGERANK
  • 源码——源码链接

2、论文核心介绍

2.1、现有方法局限

 现有的方法,仅仅使用了局部有限的邻域信息,更大的邻域信息并没有考虑到。例如,GCN,它采用平均的方法来聚合一阶邻域信息,通过堆叠多层来考虑到更高阶的邻域信息(论文中实际是两层);GAT则是采用注意力机制来学习不同邻域结点信息对当前结点的重要性,也就是说它是对周围邻域结点信息的加权平均。上述方法仍然是浅层的网络,并没有利用到深层邻域信息。
 现有方法的另外一个缺点就是过平滑现象(oversmoothing),这也是GCN不能堆叠多层的原因所在。另有作者,通过建立GCN和随机游走(random walk)的关系,发现当GCN的层数增加,GCN会收敛到随机游走的极限分布,会使不同类的结点之间变得不可分,导致GCN性能下降。
 为了解决上述的问题,作者提出了一个新的传播方案,这个方案的灵感来自于个性化PageRank算法,它平衡了局部邻域信息与更大的邻域信息的需要,允许更多的传播步骤而不会导致过平滑现象。此外,作者将神经网络从信息传播中分开来,允许去实现更大范围的传播而不用改变神经网络结构,由于这种特性,也可以将SOTA预测方法与文中的传播方案进行融合。

2.2、PageRank&Personalized PageRank

 PageRank算法通过网页链接重要性得分计算。重要性可认为是网页链接点击。PageRank算法给定一个概率值,定义为网页访问的概率。一般地, 1 N \frac{1}{N} N1 表示为每个网页节点初始化的概率, P R \rm{PR} PR也是一个初始化的概率值。PageRank 是一个迭代算法,因此 P R \rm{PR} PR 值初始化 1 N \frac{1}{N} N1 N N N表示为节点的数量。 P R \rm{PR} PR值的总和一般为1,当 P R {\rm{PR}} PR越大,说明重要性越大。
给定节点 v v v,求节点 v v v P R {\rm{PR}} PR值,
P R ( v ) = ∑ u ∈ N v P R ( u ) O ( u ) PR(v) = \sum_{u \in \mathcal{N}_v }\frac{PR(u)}{O(u)} PR(v)=uNvO(u)PR(u)
N v \mathcal{N}_v Nv表示所有链接到节点 v v v的集合。 O ( u ) O(u) O(u)表示节点 u u u的对外链接数。最早提出的PageRank算法存在着一些缺点,例如当一些节点存在自链接,或者是一些节点的出链节点形成循环圈时,PageRank在迭代过程中会出现 P R {\rm{PR}} PR持续增大,不会减小的情况。对于上述问题,PageRank算法被重新进行改进
P R ( v ) = α ∑ u ∈ N v P R ( u ) O ( u ) + ( 1 − α ) N \mathrm{PR(v)=}\alpha\sum_{\mathrm{u}\in\mathcal{N}_v}\frac{\mathrm{PR(u)}}{\mathrm{O(u)}}+\frac{(1-\alpha)}{\mathrm{N}} PR(v)=αuNvO(u)PR(u)+N(1α)
α \alpha α是一个超参数,取值一般为0.85。 α \alpha α表示节点跳转时的概率,不依据节点之间的链接进行跳转。
 PageRank算法衍生出的模型个性化的PageRank算法,主要利用图中节点的链接关系来迭代计算节点的权重。PageRank算法使用随机游走的策略来访问图中节点。PageRank算法与个性化Page Rank算法的区别在于随机游走时的跳转行为不同。个性化的PageRank算法对跳转行为进行约束,指定调转到的对外链接为特定的节点。例如在个性化排序时,用户只能跳转到一些特定的节点,这些节点表示用户偏好的那些节点。

PPR ′ ( v ) = α ∑ u ∈ N v P R ( u ) O ( u ) + ( 1 − α ) r v \text{PPR}^{'}(\mathrm{v})=\alpha\sum_{\mathrm{u}\in\mathcal{N}_v}\frac{\mathrm{PR(u)}}{\mathrm{O(u)}}+(1-\alpha)\mathrm{r}_\mathrm{v} PPR(v)=αuNvO(u)PR(u)+(1α)rv
r v = { 1   v = u 0   v ≠ u \mathrm r_\mathrm{v}=\begin{cases}1&\mathrm{~v=u}\\0&\mathrm{~v\neq u}\end{cases} rv={10 v=u v=u
个性化PageRank算法中,用户的偏好表示为 r ∣ v ∣ = 1 \mathrm r|\mathrm{v}| = 1 rv=1,原始的PageRank采用的计算方式为 Π p r = A r w Π p r \Pi_{pr} = A_{rw}\Pi_{pr} Πpr=ArwΠpr, Π p r 是 A r w \Pi_{pr}是A_{rw} ΠprArw的特征向量, A r w = A D − 1 A_{rw}=AD^{-1} Arw=AD1。类似的,个性化的PageRank 算法可以表示为

Π p p r ( i x ) = ( 1 − α ) A ~ Π p p r ( i x ) + α i x \Pi_{\mathrm{ppr}}(\mathbf{i_x})=(1-\alpha)\tilde{{A}}\Pi_{\mathrm{ppr}}(\mathbf{i_x})+\alpha\mathbf{i_x} Πppr(ix)=(1α)A~Πppr(ix)+αix
参考连接

2.3、PPNP&APPNP

 上一节,我们知道了Personalized PageRank算法及其他的表达式,对上式进行求解,求得 Π p p r \Pi_{\mathrm{ppr}} Πppr
Π p p r ( i x ) = α ( I n − ( 1 − α ) A ~ ) − 1 i x \Pi_{\mathrm{ppr}}(\mathbf{i_{x}})=\alpha(\mathbf{I_n}-(1-\alpha)\tilde{\mathbf{A}})^{-1}\mathbf{i_{x}} Πppr(ix)=α(In(1α)A~)1ix
其中, A ~ = D ~ − 1 2 A ^ D ~ − 1 2 , A ^ = A + I , i x 是传送向量 \tilde{A}=\tilde{D}^{-\frac{1}{2}}\hat{A}\tilde{D}^{-\frac{1}{2}},\hat{A} = A+I,\mathrm{i_x}是传送向量 A~=D~21A^D~21A^=A+Iix是传送向量。最终的PPNP算法公式表达如下:
Z p p n p = s o f t m a x ( α ( I n − ( 1 − α ) A ~ ) − 1 H ) Z_{\mathrm{ppnp}} = \mathrm{softmax}(\alpha(\mathbf{I_n}-(1-\alpha)\tilde{\mathbf{A}})^{-1}\mathbf{H}) Zppnp=softmax(α(In(1α)A~)1H)
H i , : = f θ ( X i , : ) \mathbf{H}_{i,:} = f_{\theta}(\mathbf{X}_{i,:}) Hi,:=fθ(Xi,:)
其中 X \mathbf{X} X是特征向量矩阵, f θ f_{\theta} fθ是具有参数集合 θ \theta θ的神经网络, H ∈ R n × c \mathbf{H} \in R^{n \times c} HRn×c
 由于在计算上式的时候,需要求矩阵的逆运算,这是一个耗时的操作,为了加速PPNP的训练速度,作者采用一种近似操作来求解,称为APPNP。
Z ( 0 ) = H = f θ ( X ) , Z ( k + 1 ) = ( 1 − α ) A ~ Z ( k ) + α H , Z ( K ) = s o f t m a x ( ( 1 − α ) A ~ Z ( K − 1 ) + α H ) Z^{(0)}=H=f_\theta(\mathbf{X}),\\ Z^{(k+1)} =(1-\alpha)\tilde{A}Z^{(k)}+\alpha H,\\ Z^{(K)}=\mathrm{softmax}((1-\alpha)\tilde{A}Z^{(K-1)}+\alpha H) Z(0)=H=fθ(X),Z(k+1)=(1α)A~Z(k)+αH,Z(K)=softmax((1α)A~Z(K1)+αH)
其中, K K K是迭代次数。作者也在后面的附录中也证明了APPNP当 K ⟶ ∞ K \longrightarrow \infty K时,收敛到PPNP,所以APPNP可以看作PPNP的迭代解。
模型的框架如下图所示:
在这里插入图片描述

3、源码复现

模型复现源码链接链接:点我点我 提取码:6666

3.1、模型总体框架

import torch
from torch.nn import Module
import torch.nn as nn
from torch.nn import functional as F
import numpy as np

class PPNP(nn.Module):
    def __init__(self,model,propagation):
        super(PPNP,self).__init__()
        self.model = model
        self.propagation = propagation
    def forward(self,feature,adj):
        #Generate Prediction
        #用于生成预测
        if self.model.__class__.__name__ =='MLP':
            output = self.model(feature)
        else:
            output = self.model(feature,adj)
        #通过个性化PageRank传播
        if self.propagation is not None:
            output = self.propagation(output)
        #返回最后一层的结果
        return F.log_softmax(output,dim=1)

3.2、PPNP

class PPNPExtract(Module):
    def __init__(self,alpha,adj,dropout):
        super(PPNPExtract,self).__init__()
        self.alpha = alpha
        self.adj = adj
        self.dropout = dropout
        pass
    def forward(self,H):
        inv = self.PPR()
        inv = F.dropout(inv,self.dropout,training=self.training)
        return self.alpha * torch.mm(inv,H) 
    def PPR(self):
        if isinstance(self.adj,torch.Tensor):
            ADJ = self.adj.to_dense().numpy()
        I_n = np.eye(self.adj.shape[0])
        M = I_n-(1-self.alpha)*ADJ
        inv_M = np.linalg.inv(M)
        return torch.Tensor(inv_M)

3.3、APPNP

class PowerIteration(Module):
    def __init__(self,adj,alpha,k,dropout):
        super(PowerIteration,self).__init__()
     
        self.adj = adj
        self.alpha = alpha
        self.k = k
        self.dropout = dropout
    def forward(self,H):
        Z = H
        for _ in range(self.k):
            Z = F.dropout(Z,self.dropout,training=self.training)
            Z = (1-self.alpha)*torch.mm(self.adj,Z) + self.alpha * H
        return Z

3.4、MLP(两层)

class MLP(Module):
    def __init__(self,input_dim,hid_dim,output_dim,dropout):
        super(MLP,self).__init__()
        self.input_dim = input_dim
        self.hid_dim = hid_dim
        self.output_dim = output_dim
        self.dropout = dropout
        self.layer1 = nn.Linear(input_dim,hid_dim,bias=False)
        self.layer2 = nn.Linear(hid_dim,output_dim,bias=False)

    def forward(self,X):
        X = F.dropout(X,self.dropout,training=self.training)
        X = self.layer1(X)
        X = F.relu(X)
        X = F.dropout(X,self.dropout,training=self.training)
        X = self.layer2(X)
        return X
    def __repr__(self) -> str:
        return self.__class__.__name__

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/139294.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

转本考前4个月,手把手教你逆袭上岸

现在离转本考试的时间还剩下4个月,绝大多数同学会在之后的寒假期间全力学习,谁在这段时期懈怠,谁就丢掉了一半的分数。 不管是复习了很长一段时间,还是刚起步的同学,都有必要重新规划后面的复习。下面给大家讲讲&…

【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用

Redis缓存使用问题 数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例,来给你解释一下,数据的增删改操作具体是如何进行的。 我…

个推「数据驱动运营增长」城市巡回沙龙·上海专场:哈啰出行的自动化营销之路

近日,以“数据增能,高效提升用户运营价值”为主题的个推「数据驱动运营增长」城市巡回沙龙上海专场圆满举行。活动现场,哈啰出行基础算法负责人贾立从APP的营销场景切入,将“智能圈人->智能创意->智能活动->智能补贴->…

什么是指纹浏览器?——社媒营销多账号的管理神器

对于跨境卖家来说,通过海外社媒平台进行引流推广是不错的选择,但在实际操作中我们总会遇到很多问题。比如老手们肯定都经历过多个账号被封禁的情况,如果你也跟以前的东哥一样困扰怎么在一台电脑登录同平台多个账号,那今天这篇文章…

Go利用反射实现一个ini文件的解析器程序

package mainimport ("bufio" // 逐行读取配置文件"fmt""log""os""reflect""strconv""strings" )type Config struct { // 定义配置结构体Section1 Section1 ini:"section1" // 嵌套结构体1…

SAP系统供应商预付款请求和预付账款业务

最近搞清帐! 在SAP中处理客户或供应商的预收/预付款相关业务流程操作说明, 首先由业务部门(销售或采购)下达销售/采购订单,同时基于订单提交预收/预付申请,客户/供应商款项到账时,由财务部门在SAP中勾选申请单来收付款;最后在财务转应收/应付转发票时自动核销。预付…

立体库堆垛机水平电机输出控制程序功能

###############水平电机输出控制程序################# #############水平变频器输出控制程序################# *******************水平速度曲线建立*********************** 列距离差值,建立与速度的关系式:VX/k MW220为K系数 水平速度控制K系数 列…

RK3568驱动指南|第七期-设备树-第66章of操作函数实验:获取设备树节点

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

圆形承重钢管用在线直线度测量仪实时检测品质!

关于直线度尺寸的检测,相信你听说过很多诸如直线法、直尺法、激光准直法等的离线检测方式,那你听说过在线直线度测量仪吗?它是可安装在产线上进行实时在线检测的设备。本文就跟随小编一起来简单的了解一下。 在线直线度测量仪的测量方法 直…

Notepad++,搜索窗口独立后,恢复

双击一下find result框,恢复到原来的模式。

使用cmd运行控制面板工具

如何通过键入命令运行“控制面板”工具 - Microsoft 支持 windows自带管理工具(exe/cpl/msc)-CSDN博客 CMD下打开系统各面板_cmd打开轻松使用面板-CSDN博客 示例: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl 替换powercfg.…

光计算1周2篇Nature,英伟达的时代彻底结束!

近期,光计算领域连续发出重量级文章,刊登在学术界的顶级期刊上。一时间,各大媒体纷纷转发,读者们也纷纷感叹:中国芯片取代英伟达的机会来了!今天,光子盒用这篇万字长文为大家梳理光计算的背景、…

FL Studio最新版本号21.2发行更新啦

Image Line宣布发布FL Studio 21.2。更新带来了许多改进,但主要功能是引入了新的词干分离功能和FL Cloud,这是一个新的在线平台,直接与DAW集成,为用户提供从循环和样本到母带和发行功能的一切。 词干分离与FL云 随着最新更新的发…

记一次线上问题引发的对 Mysql 锁机制分析

背景 最近双十一开门红期间组内出现了一次因 Mysql 死锁导致的线上问题,当时从监控可以看到数据库活跃连接数飙升,导致应用层数据库连接池被打满,后续所有请求都因获取不到连接而失败 整体业务代码精简逻辑如下: Transaction p…

DP4301-M无线模块一款SUB-1G无线收发模块

DP4301-M无线模块是一款低成本高效率工作于1GHz以内的收发模块,支持中国智能电无线 集抄标准470MHz~ 510MHz,兼容433MHz ISM/SRD频段均可使用。 此模块且前已经超大量应用于国标智能无线抄表及物联网自组网等双向数据传输系统方案,模 块具备的…

ADFS 高可用配置 + NLB配置(Windows网络负载均衡)

ADFS 高可用配置 NLB配置(Windows网络负载均衡) ADFS安装配置NLB配置节点 TEST-ADFS-01 网络负载平衡配置节点 TEST-ADFS-02 网络负载平衡修改CRM配置 ADFS实现高可用负载均衡有两种,主要是在数据库的选择方式: windows自带的内…

力扣第647题 回文子串 c++ 动态规划 双指针 附Java代码 注释解释版

题目 647. 回文子串 中等 相关标签 字符串 动态规划 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串…

数字化转型二

参考一华为数字化转型之道 企业做好数字化转型要有战略决心,要有信心,还要有恒心。顶层设计很重要,行动力也同样重要,转型不是画出来的,而是干出来的,遇到问题就要快速调整。方向大致正确下,组织…

家长群如何发成绩?

老师们是否经常被家长们追问:“老师,我孩子的成绩出来了吗?”、“老师,我孩子考了多少分?”等等。要想解决这个问题,看完这篇文章你就可以让家长们能够自助查询孩子的成绩了。 一、什么是成绩查询系统&…

windows aseprite编译指南(白嫖)

aseprite是画像素图的专业软件,steam上有售卖,不过官方也在github开源了,需要自己编译。 1. 首先获取源码 直接在github上clone源码到本地指定目录 git.bash中执行(需要腾一个用来安放源码的路径): git…