GraphSAGE聚合流程计算实例

这篇具有很好参考价值的文章主要介绍了GraphSAGE聚合流程计算实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇中我们只讨论聚合流程,不考虑GraphSAGE的小批量训练等内容。

我们先来看一下GraphSAGE的聚合流程伪代码,之后会给出两个具体的计算例子进行说明:
GraphSAGE聚合流程计算实例
11行中, N ( k ) ( u ) N^{(k)}(u) N(k)(u)表示节点u的邻居节点采样函数(指的是从其邻居节点中选取一批节点),Agg()指的是邻居节点的聚合算子,有平均(加和)聚合算子,也有最大(平均)池化聚合算子。我们接下来会以平均聚合算子和平均池化聚合算子为例进行说明。
12行中, [ h u ( k − 1 ) ∣ ∣ h N ( u ) k ] [h_u^{(k-1)}||h_{N(u)}^k] [hu(k1)∣∣hN(u)k]表示两个向量缀连起来(即[h1[1], h1[2], …, h1[n], h2[1], h2[2], …, h2[m]]),对这个缀连起来的向量乘一个 W k W^k Wk进行线性变换(往往在这一步将向量的维数转换成想要嵌入表示输出的 d o u t d_{out} dout维),再加个激活函数进行非线性变换。
最后对得到的向量进行归一化,就对节点 u u u完成了一次聚合过程。

数据准备

对于下面这样一个图:
GraphSAGE聚合流程计算实例

假如我们想要节点的嵌入输出的outputdim为2维的,输入的图对应初始特征数据如下:
i d , x 0 , x 1 , x 2 , x 3 1 , 0.5 , 0.6 , 0.7 , 0.8 2 , 0.3 , 0.8 , 0.3 , 0.4 3 , 0.7 , 0.9 , 0.6 , 0.9 4 , 0.2 , 0.1 , 0.2 , 0.3 5 , 0.8 , 0.4 , 0.3 , 0.2 id,x_0,x_1,x_2,x_3\\ 1,0.5,0.6,0.7,0.8\\ 2,0.3,0.8,0.3,0.4\\ 3,0.7,0.9,0.6,0.9\\ 4,0.2,0.1,0.2,0.3\\ 5,0.8,0.4,0.3,0.2\\ id,x0,x1,x2,x31,0.5,0.6,0.7,0.82,0.3,0.8,0.3,0.43,0.7,0.9,0.6,0.94,0.2,0.1,0.2,0.35,0.8,0.4,0.3,0.2

我们先完成第一步,邻居节点聚合。
这一步可以采用多种聚合算子,我们在此以平均聚合算子与平均池化聚合算子为例。

平均聚合算子

这里的Agg()是指取平均: A V E R A G E ( h j ) AVERAGE(h_j) AVERAGE(hj)

h 4 ( 0 ) = [ 0.2 , 0.1 , 0.2 , 0.3 ] T h_4 ^{(0)} =[0.2,0.1,0.2,0.3]^T h4(0)=[0.2,0.1,0.2,0.3]T
节点4的邻接节点为2,3,5
我们用平均聚合算子AVERAGE(h)对2,3,5这三个节点的信息进行聚合:
A g g ( 1 ) ( h 2 ( 0 ) , h 3 ( 0 ) , h 5 ( 0 ) ) Agg^{(1)}(h_2(0),h_3(0),h_5(0)) Agg(1)(h2(0),h3(0),h5(0))
就是对这三个向量对应值相加取均值,得到:
h N ( 4 ) ( 1 ) = [ 0.6 , 0.7 , 0.4 , 0.5 ] h_{N(4)}^{(1)}=[0.6,0.7,0.4,0.5] hN(4)(1)=[0.6,0.7,0.4,0.5]

由上面我们得到 h 4 ( 1 ) h_4^{(1)} h4(1)为:
σ ( W ( 1 ) [ h u ( 0 ) , h N ( u ) ( 1 ) ] ) = σ ( W ( 1 ) [ 0.2 , 0.1 , 0.2 , 0.3 , 0.6 , 0.7 , 0.4 , 0.5 ] T ) \sigma(W^{(1)}[h_u^{(0)},h_{N(u)}^{(1)}]) =\sigma(W^{(1)}[0.2,0.1,0.2,0.3,0.6,0.7,0.4,0.5]^T) σ(W(1)[hu(0),hN(u)(1)])=σ(W(1)[0.2,0.1,0.2,0.3,0.6,0.7,0.4,0.5]T)
为了使得输出是一个 2 × 1 2×1 2×1的向量,我们设置 W ( 1 ) W^{(1)} W(1)为一个 2 × 8 2×8 2×8 的矩阵,比如我们初始化为:

1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 1,0,0,0,1,0,1,0\\0,1,0,1,0,0,1,0 1,0,0,0,1,0,1,00,1,0,1,0,0,1,0

与上面的向量相乘,得到 [ 1.2 , 0.8 ] T [1.2,0.8]^T [1.2,0.8]T

将其代入激活函数(ReLU)后进行归一化,就正式得到
h 4 ( 1 ) = [ 0.83205029 , 0.5547002 ] T h_4^{(1)} = [0.83205029,0.5547002 ]^T h4(1)=[0.83205029,0.5547002]T
这样就正式完成了对节点4的一次聚合操作。
对第一层的其他节点的操作也是类似的。

平均池化聚合算子

平均池化聚合算子,就是指 A V E R A G E [ σ ( W h + b ) ] AVERAGE[\sigma(Wh+b)] AVERAGE[σ(Wh+b)], σ \sigma σ是激活函数(ReLU)
具体怎么做的呢?
我们待处理的邻接节点:
h 2 ( 0 ) = [ 0.3 , 0.8 , 0.3 , 0.4 ] , h 3 ( 0 ) = [ 0.7 , 0.9 , 0.6 , 0.9 ] , h 5 ( 0 ) = [ 0.8 , 0.4 , 0.2 , 0.3 ] h_2^{(0)} = [0.3,0.8,0.3,0.4],\\ h_3^{(0)} = [0.7,0.9,0.6,0.9],\\ h_5^{(0)} = [0.8,0.4,0.2,0.3] h2(0)=[0.3,0.8,0.3,0.4],h3(0)=[0.7,0.9,0.6,0.9],h5(0)=[0.8,0.4,0.2,0.3]
此刻我们在此添加一个dense层(全连接层)。这里全连接层是指:对这每个节点,其向量的每个分量经过了一个全连接层。

对于 h j h_j hj,输出是: R e L U ( W h j + b ) ReLU(Wh_j+b) ReLU(Whj+b)

我们引入一个权重矩阵 W W W,它是hidden dim×input dim维度的,在这里input dim是4维,我们设定这个隐藏层的输出维度为3,那么W就是一个3×4的矩阵;对于同一层中的每个邻居节点,W是固定的。
b就是一个hidden_dim(3)维的向量。

所以说线性变换的输出就是

GraphSAGE聚合流程计算实例

这样的话:
对于节点2,我们的输入 h 2 ( 0 ) = [ 0.3 , 0.8 , 0.3 , 0.4 ] h_2{(0)} = [0.3,0.8,0.3,0.4] h2(0)=[0.3,0.8,0.3,0.4]是4维的。
所以
o 1 = w 11 x 1 + w 12 x 2 + w 13 x 3 + w 14 x 4 + b 1 o 2 = w 21 x 1 + w 22 x 2 + w 23 x 3 + w 24 x 4 + b 2 o 3 = w 31 x 1 + w 32 x 2 + w 33 x 3 + w 34 x 4 + b 3 o1 = w11x1+w12x2+w13x3+w14x4+b1\\ o2 = w21x1+w22x2+w23x3+w24x4+b2\\ o3 = w31x1+w32x2+w33x3+w34x4+b3 o1=w11x1+w12x2+w13x3+w14x4+b1o2=w21x1+w22x2+w23x3+w24x4+b2o3=w31x1+w32x2+w33x3+w34x4+b3
所以实际上 o = W h 2 ( 0 ) o = Wh_2{(0)} o=Wh2(0)

W W W 权重的初始化有多种方式,我们在此用随机数初始化

col0 col1 col2 col3
0.17 0.4 -0.14 0.51
0.75 -0.04 0.67 -0.18
0.53 -0.04 0.4 0.77

b = [ 0.66 , − 0.58 , − 0.64 ] b = [0.66,-0.58,-0.64] b=[0.66,0.58,0.64]

对于节点2,3,5,得到的 W h j + b Wh_j+b Whj+b分别为
[ 1.19 , − 0.26 , − 0.08 ] [ 1.51 , 0.15 , 0.63 ] [ 1.08 , 0.08 , 0.08 ] [1.19,-0.26,-0.08]\\ [1.51,0.15,0.63] \\ [1.08,0.08,0.08] [1.19,0.26,0.08][1.51,0.15,0.63][1.08,0.08,0.08]

将上述三个向量经过激活函数ReLU:
就得到(对每个分量分别取ReLU)
[ 1.19 , 0 , 0 ] [ 1.51 , 0.15 , 0.63 ] [ 1.08 , 0.08 , 0.08 ] [1.19, 0, 0]\\ [1.51,0.15,0.63] \\ [1.08,0.08,0.08] [1.19,0,0][1.51,0.15,0.63][1.08,0.08,0.08]

对上面三个向量取均值
h N ( 4 ) ( 0 ) = A V E R A G E ( R e L U ( W h j + b ) ) = [ 1.26 , 0.08 , 0.24 ] h_{N(4)}^{(0)} = AVERAGE(ReLU(Wh_j+b)) = [1.26,0.08,0.24] hN(4)(0)=AVERAGE(ReLU(Whj+b))=[1.26,0.08,0.24]

这样我们就完成了第一步;

刚刚我们得到了 h N ( 4 ) ( 1 ) h_{N(4)}^{(1)} hN(4)(1),而 h 4 ( 0 ) = [ 0.2 , 0.1 , 0.2 , 0.3 ] h_4^{(0)} = [0.2,0.1,0.2,0.3] h4(0)=[0.2,0.1,0.2,0.3]

因为经过了一个平均池化聚合,邻居节点的输出变成了3维的,所以GraphSAGE对当前节点与邻居节点分别引入了一个权重矩阵,于是伪代码第12行的操作在这里为:

R e L U ( W ( 1 ) [ h u ( 0 ) , h N ( u ) ( 1 ) ] ) = R e L U ( W s e l f ( 1 ) h 4 ( 0 ) + W n e i g h ( 1 ) h N ( 4 ) ( 1 ) ) ReLU(W^{(1)}[h_u^{(0)},h_{N(u)}^{(1)}]) = ReLU(W_{self}^{(1)}h_4^{(0)}+W_{neigh}^{(1)}h_{N(4)}^{(1)}) ReLU(W(1)[hu(0),hN(u)(1)])=ReLU(Wself(1)h4(0)+Wneigh(1)hN(4)(1))

因为我们想要输出是2维的,那么
W s e l f ( 1 ) W_{self}^{(1)} Wself(1) W n e i g h ( 1 ) W_{neigh}^{(1)} Wneigh(1)就分别是4×2维的和3×2维的;
当然,我们也可以在括号里加一个二维的bias向量作偏置。

将计算得到的结果向量经过一个ReLU函数(依然是对各分量分别取ReLU),再除以它的模进行归一化后输出,就完成了聚合操作。

(关于具体计算过程,有参考GraphSAGE的官方代码,如有疏漏之处敬请指正)文章来源地址https://www.toymoban.com/news/detail-429588.html

到了这里,关于GraphSAGE聚合流程计算实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 选读SQL经典实例笔记13_case与聚合

    6.4.2.1. Oracle的窗口函数支持DATE类型排序

    2024年02月15日
    浏览(177)
  • 计算机组成原理课题讨论——编译器对程序的影响

    一、引言   本次课题研究题目由我的老师提出,研究成果以及结论均由我以及我的同学经过不懈的努力得出,仅供大家参考! 二、编译器的概念及工作流程   编译器是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往是以二进制的

    2024年02月04日
    浏览(36)
  • Cisco Packet Tracer路由器配置、路由聚合实例

    本教程适用于了解Cisco Packet Tracer的朋友阅读,用于帮助理解路由器的使用以及路由聚合的概念、路由聚合的方法,若不熟悉基本操作,点击链接快速学习软件基本操作 高手请通过目录快速跳转到 路由聚合 部分(含路由聚合计算过程,仿真结果) 终端设备:PC机 交换机:PT交换

    2024年02月05日
    浏览(41)
  • FlinkSQL【分组聚合-多维分析-性能调优】应用实例分析

    FlinkSQL处理如下实时数据需求: 实时聚合不同 类型/账号/发布时间 的各个指标数据,比如: 初始化/初始化后删除/初始化后取消/推送/成功/失败 的指标数据。要求实时产出指标数据,数据源是mysql cdc binlog数据。 其他配置 flink集群参数 检查点配置 job运行资源 管理节点(JM)

    2024年01月17日
    浏览(59)
  • [论文阅读]PANet(PAFPN)——用于实例分割的路径聚合网络

    Path Aggregation Network for Instance Segmentation 用于实例分割的路径聚合网络 论文网址:PANet 这篇论文提出了Path Aggregation Network (PANet),目的是增强基于proposal的实例分割框架中的信息流动。具体来说,论文提出了以下几点改进: 增加自底向上的路径(bottom-up path augmentation),用低层中的精确

    2024年02月05日
    浏览(34)
  • 我们在操作自动化测如何实现用例设计实例

    在编写用例之间,笔者再次强调几点编写自动化测试用例的原则: 1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统 3、尽量只做功能中正向逻辑的

    2024年02月05日
    浏览(35)
  • 【C#】【IO】【Threading】【实例】工作报表前的本地数据聚合操作

    工作记录——Report 报表前的数据获取操作是高重复性的,今天差不多完成了脚本,下述是代码: 上述代码中,关键变量分别都在顶级语句中(SN、sourcefold、falsefold) 因为业务原因,所以需要剥离多层文件夹,并精准获取指定文件夹中的所有文件然后进行拷贝,其中多线程调

    2024年02月08日
    浏览(40)
  • GraphSAGE的基础理论

    引入: GCN的缺点: 从大型网络中学习的困难 :GCN在嵌入训练期间需要所有节点的存在。这不允许批量训练模型。 推广到看不见的节点的困难 :GCN假设单个固定图,要求在一个确定的图中去学习顶点的embedding。但是,在许多实际应用中,需要快速生成看不见的节点的嵌入。

    2023年04月15日
    浏览(51)
  • 论文笔记:详解GraphSAGE

    对节点嵌入不明白的可以先看这篇: 论文笔记:DeepWalk与Node2vec   还是之前笔记里提到过的直推式(Transductive)学习与归纳(Inductive)学习: Inductive learning,翻译成中文可以叫做 “归纳式学习”,就是从已有数据中归纳出模式来,应用于新的数据和任务。在图学习的训练过程中

    2024年02月03日
    浏览(28)
  • Pytorch+PyG实现GraphSAGE

    大家好,我是阿光。 本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10 语言环

    2023年04月18日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包