GraphSAGE聚合流程计算实例

news2024/11/26 12:44:44

本篇中我们只讨论聚合流程,不考虑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完成了一次聚合过程。

数据准备

对于下面这样一个图:
在这里插入图片描述

假如我们想要节点的嵌入输出的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)维的向量。

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

在这里插入图片描述

这样的话:
对于节点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 权重的初始化有多种方式,我们在此用随机数初始化

col0col1col2col3
0.170.4-0.140.51
0.75-0.040.67-0.18
0.53-0.040.40.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的官方代码,如有疏漏之处敬请指正)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣杯2023春·个人赛

文章目录 力扣杯2023春-个人赛[LCP 72. 补给马车](https://leetcode.cn/problems/hqCnmP/)模拟 [LCP 73. 探险营地](https://leetcode.cn/problems/0Zeoeg/)模拟 哈希 [LCP 74. 最强祝福力场](https://leetcode.cn/problems/xepqZ5/)二维差分 离散化扫描线 [LCP 75. 传送卷轴…

CANOE入门到精通——CANOE系列教程记录1 第一个仿真工程

本系列以初学者角度记录学习CANOE,以《CANoe开发从入门到精通》参考学习,CANoe16 demo版就可以进行学习 概念 CANoe是一种用于开发、测试和分析汽车电子系统的软件工具。它通过在不同层次上模拟汽车电子系统中的不同部件,如ECU、总线和传感…

自动化运维工具Ansible之playbook剧本

目录 一、playbook 1、playbook简述 2、playbook剧本格式 3、playbook组成部分 4、playbook启动及检测 5、playbook模块实战实例1 6、vars模块实战实例2 7、when模块实战实例3 8、with_items循环模块实战实例4 9、template模块实战实例5 10、tags模块实战实例6 一、…

VM中kali虚拟机创建docker部署WebGoat

这里选择在docker中配置(因为方便) 首先下载docker sudo apt-get install docker.io 然后从Docker Hub下载WebGoat 8.0 的docker镜像 使用命令 docker pull webgoat/webgoat-8.0 完成后查看现在kali虚拟机中的docker镜像列表 输入命令 docker images …

0704一阶线性微分方程-微分方程

文章目录 1 线性方程1.1 定义1.2 解法(常数变易法)1.3 例题 2伯努利方程3 简单变量替换解方程结语 1 线性方程 1.1 定义 一阶微分方程:形式上能化成 d y d x P ( x ) y Q ( x ) \frac{dy}{dx}P(x)yQ(x) dxdy​P(x)yQ(x)的方程,…

树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别

目录 一、完成摄像头的调用 二、利用python调用opencv库函数对图像进行处理 2.1 图像处理大体流程 2.2 opencv调用函数的参数以及含义 2.2.1 ret, img cap.read() 读取帧图像 2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像 2.2.3 gray_diff_img cv2.absdiff(g…

详解子网划分练习题(32道)

目录 1 子网划分概念: 2 划分方法: 子网划分方法:段,块,数的计算三步。 段就是确定ip地址段中既有网络地址,又有主机地址的那一段是四段中的那一段? 块就确定上一步中确定的那一段中的主机…

【Linux】网络配置详细步骤及其相关基础知识介绍

一、Linux网络配置步骤 1、登录root账户 进行网络配置需要使用root权限,因此需要先登录root用户 2、输入ip addr查看网络信息 只有一个本机地址127.0.0.1,因为Linux操作系统的网卡开关还没有打开。 3、输入cd /etc/sysconfig/network-scripts/进入目录…

R语言 | 列表

目录 一、建立列表 1.1 建立列表对象——对象元素不含名称 1.2 建立列表对象——对象元素含名称 1.3 处理列表内对象的元素名称 1.4 获得列表的对象元素个数 二、获取列表内对象的元素内容 2.1 使用"$"符号取得列表对象的元素内容 2.2 使用"[[ ]]"符…

关于GeoServer发布服务时数据源设置的避坑指南

题外话 时光任然,一年一度的五一劳动节已然来到。作为疫情之后迎来的第一个五一,不知道各位小伙伴们怎么度过这个劳动节呢?是决定去另一个城市,观察体验一下不一样的风景,或者去旅游,给自己放假。昨天被123…

three.js进阶之动画系统

我曾在three.js进阶之骨骼绑定文章中提到了AnimationMixer、AnimationAction等内容,其实这些应该属于Three.js的动画系统,本文就系统的介绍一下动画系统(Animation System)。 前言 一般情况下,我们很少会使用three.j…

【学习视频】阅读开源工业软件和工业智能实战上线B站

图片来源:https://metrology.news/a-i-for-smarter-factories-the-world-of-industrial-artificial-intelligence/ 为了帮助大家做好工业软件以及用人工智能解决工业领域现实问题,我在B站上开了两个视频系列,一个是“一起来读开源工业软件”…

STM32 基础知识入门 (C语言基础巩固)

1、在不改变其他位的值的状况下,对某几个位进行设值 这个场景在单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作, 然后用|操作符设值。 比如我要改变 GPIOA 的 CRL 寄存器 bit6(第 6 位)的…

MiNiGPT4安装记录

装conda wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh chmod x Anaconda3-5.3.0-Linux-x86_64.sh ./Anaconda3-5.3.0-Linux-x86_64.sh export PATH~/anaconda3/bin:$PATH # 或者写到环境保护变量 # 不会弄看这吧 https://blog.csdn.net/wyf2017/a…

fork()创建进程原理

目录 一、写时复制技术写时复制的优点:vfork()和fork() 二、fork()原理初步再理解下页表与多进程在内存中的图像创建进程和创建线程的区别 三、fork()的具体过程 一、写时复制技术 fork()生成子进程时,只是把虚拟地址拷贝给子进程,也就是父进…

( 字符串) 205. 同构字符串 ——【Leetcode每日一题】

❓205. 同构字符串 难度:简单 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同…

网络基础:socket套接字

文章目录 1. 前导知识1.1 源MAC地址和目的MAC地址1.2 源IP地址和目的IP地址1.3 MAC地址和IP地址的配合1.4 源端口号和目的端口号1.5 Socket1.6 UCP协议和TCP协议1.7 网络字节序高低位高低地址大端和小端网络字节序常用转换函数 2. socket 网络编程2.1 socket 常见接口创建套接字…

ChatGPT最好用的连接-自动写文案-代码算法最佳选择

ChatGPT最好用的连接-自动写文案-代码算法最佳选择 最近测试了很多国内分享的ChatGPT,很多都是限制最多写200文字,超过200个文字就不显示了。或者有的写出的文章逻辑性不对,写的算法不能正常运行。 经过多天的搜索测试,最终确定…

某电商客户数据价值分析项目

目录 一、项目意义 二、项目流程 三、项目内容 1、导入数据 2、数据预处理 3、单变量分析 4、聚类分析—Kmeans算法 一、项目意义 客户价值分析就是一个客户分群问题,以客户为中心,从客户需求出发,搞清楚客户需要什么,他们…

Linux进程通信:进程组 会话

1. 进程组 (1)概念:一个或多个进程的集合,也称为“作业”。 (2)父进程创建子进程时,默认属于同一个进程组。进程组ID为组长进程ID。 (3)进程组中只要有一个进程存在&a…