用于多关系数据的图神经网络R-GCNs(下)

简介: 用于多关系数据的图神经网络R-GCNs

关系图卷积网络(Relational-GCN)

前面的示例描述了GCN在无向和无类型图上的行为。如前所述,更新过程基于以下步骤(在以下说明中,为简单起见,不考虑节点度)。

通过将(i)单热点特征矩阵与(ii)权重矩阵相乘,可以实现投影步骤(或线性变换)。

(i)2D矩阵(n,n),用于定义表示节点的独热向量。

(ii)定义隐藏特征的2D矩阵(n,h)。当前矩阵仅编码一种类型的关系。

将邻接矩阵(i)与投影步骤产生的矩阵(ii)相乘,即可实现一个聚合步骤。

(i)2D对称矩阵(n,n),描述无向和无类型的边。

(ii)投影步骤产生的2D矩阵(n,h)。

为了扩展GCN层以编码KG结构,我们需要将我们的数据表示为有向图和多类型图。更新/聚合过程与上一个类似,但是组成部分稍微复杂一些。下面提供了有关执行步骤的详细信息。

通过将(i)独热点特征矩阵与(ii)权重张量相乘,可以实现投影步骤。

(i)定义节点初始特征的2D矩阵(n,n)。

(ii)描述节点隐藏特征的3D张量(r,n,h)。该张量能够通过堆叠大小为(n,h)的r批矩阵来编码不同的关系。每个批都编码单个类型的关系。

投影步骤将不再是矩阵的简单乘法,而是批次矩阵乘法,其中(i)与(ii)的每一批相乘。

聚合步骤,是通过将(i)(有向)邻接张量乘以(ii)由投影步骤得出的张量而实现的。

(i)描述有向和r型边的3D张量(r,n,n)。该张量由r批邻接矩阵(n,n)组成。每个邻接矩阵根据特定类型的关系描述节点之间的边。而且,与无向图的邻接矩阵相比,这些邻接矩阵中的每一个都不对称,因为它编码特定的边缘方向。

(ii)由上述投影步骤产生的3D张量(r,n,h)。

就像投影步骤一样,聚合阶段包括一个批处理矩阵乘法。每批(i)乘以每批(ii)。此汇总定义了每个批次的GCN转换。在该过程的最后,必须将批次加在一起(R-GCN),以获得根据不同关系类型并入邻域聚合的节点表示。

以下代码示例显示了R-GCN层的行为,该行为编码具有两种类型的边(或关系)的有向和多类型图或KG。

###Recall: One-hotvectorrepresentationofnodes (n,n)
print(X)-----[[0.0.1.0.0.] #Node1  [0.1.0.0.0.] ...
  [0.0.0.0.1.]
  [1.0.0.0.0.]
  [0.0.0.1.0.]]
###Numberofrelationtypes (r)
num_rels=2###Weightmatrixofrelationnumber1 (n,n)
##InitializationaccordingtoGlorotandBengio (2010))
W_rel1=np.random.uniform(-np.sqrt(1./h),np.sqrt(1./h),(n,h))
print(W_rel1)
-----[[-0.46378913-0.091097070.52872529]
  [ 0.038295970.22156061-0.2130242 ]
  [ 0.215352720.38639244-0.55623279]
  [ 0.288841780.564488160.28655701]
  [-0.253521440.334031-0.45815514]]
###Weightmatrixofrelationnumber2 (n,h)
##RandominitializationwithuniformdistributionW_rel2=np.random.uniform(1/100, 0.5, (n,h))
print(W_rel2)
-----[[0.229467830.45521180.15387093]
  [0.151009920.0737140.01948981]
  [0.342629410.113697780.14011786]
  [0.250870850.036147650.29131763]
  [0.0818970.298759710.3528816 ]]
###Tensorincludingbothweightmatrices (r,n,h)
W_rels=np.concatenate((W_rel1, W_rel2))
W_rels=np.reshape(W_rels,(num_rels, n, h))
print(W_rels)
-----[[[-0.46378913-0.091097070.52872529]
  [ 0.038295970.22156061-0.2130242 ]
  [ 0.215352720.38639244-0.55623279]
  [ 0.288841780.564488160.28655701]
  [-0.253521440.334031-0.45815514]]
  [[ 0.229467830.45521180.15387093]
  [ 0.151009920.0737140.01948981]
  [ 0.342629410.113697780.14011786]
  [ 0.250870850.036147650.29131763]
  [ 0.0818970.298759710.3528816 ]]]
###Lineartrasformationwithbatchmatrixmultiplication (r,n,h)
L_0_rels=np.matmul(X, W_rels)
print(L_0_rels)
-----[[[ 0.215352720.38639244-0.55623279] #Node1 (3rdrowofW_rel1)
  [ 0.038295970.22156061-0.2130242 ]
  [-0.253521440.334031-0.45815514]
  [-0.46378913-0.091097070.52872529]
  [ 0.288841780.564488160.28655701]]
  [[ 0.342629410.113697780.14011786] #Node1 (3rdrowofW_rel2)
  [ 0.151009920.0737140.01948981]
  [ 0.0818970.298759710.3528816 ]
  [ 0.229467830.45521180.15387093]
  [ 0.250870850.036147650.29131763]]]
###Adjacencymatrixofrelationnumber1 (n,n)
A_rel1=np.random.randint(2, size=(n, n))
np.fill_diagonal(A, 0) #Noself_loopprint(A_rel1)
-----[[01111] #ConnectionstoNode1withRel1  [11001] #ConnectionstoNode2withRel1  [10010]
  [00111]
  [11010]]
###Adjacencymatrixofrelationnumber2 (n,n)
A_rel2=np.random.randint(3,size=(n,n))
np.fill_diagonal(A_rel2, 0) #NoselfloopA_rel2[A_rel2>1] =0-----[[00010] #ConnectionstoNode1withRel2  [10000] #ConnectionstoNode2withRel2  [10011]
  [00000]
  [01000]]
###Tensorincludingbothadjacencymatrices (r,n,n)
A_rels=np.concatenate((A_rel1, A_rel2))
A_rels=np.reshape(A_rels, (num_rels, n, n))
print(A_rels)
-----[[[01111] #ConnectionstoNode1withRel1  [11001]
  [10010]
  [00111]
  [11010]]
  [[00010] #ConnectionstoNode2withRel2  [10000]
  [10011]
  [00000]
  [01000]]]
### (GCN) Neighborhooddiffusionforeachtypededge (r,n,h)
ND_GCN=np.matmul(A_rels, L_0_rels)
print(ND_GCN)
-----[[[-0.390172821.02898270.14410296] #UpdatedNode1withRel1  [ 0.542490471.17244121-0.48269997]
  [-0.248436410.29529538-0.0275075 ]
  [-0.428468790.807422090.35712716]
  [-0.210140430.51685598-0.2405317 ]]
  [[ 0.229467830.45521180.15387093] #UpdatedNode1withRel2  [ 0.342629410.113697780.14011786]
  [ 0.822968090.605057220.58530642]
  [ 0.0.0.       ]
  [ 0.151009920.0737140.01948981]]]
### (R-GCN) AggregationofGCN (n,h)
RGCN=np.sum(ND_GCN, axis=0)
print(RGCN)
-----[[-0.160704991.484194490.29797389] UpdatedNode1(Rel1+Rel2)
  [ 0.885119881.28613899-0.34258211]
  [ 0.574531680.90035260.55779892]
  [-0.428468790.807422090.35712716]
  [-0.059130520.59056998-0.22104189]]
###Testoftheaggregationassert(RGCN[0,0] ==L_0_rels[0,1,0] +L_0_rels[0,2,0] +L_0_rels[0,3,0] +L_0_rels[0,4,0] +L_0_rels[1,3,0])

你可以从这个例子中注意到,邻域扩散(GCN)的结果是一个大小为(r, n,h)的3D张量,而不是一个大小为(n,h)的2D矩阵。原因是,对于每种类型的关系,邻居扩散都是以一种单独的方式进行的。R-GCN层对GCN所实现的每种关系类型的节点表示进行聚合。为了阐明这个方面,考虑节点1的聚合表示

[-0.160704991.484194490.29797389]

这个向量是由节点1的更新表示与关系1相加得到的

[-0.390172821.02898270.14410296]

与关系2的节点1的更新表示

[ 0.229467830.45521180.15387093]

本节中描述的代码可以在数学上形式化如下:

640.png

描述R-GCN层执行的各向同性聚合的功能。与先前的功能相比,此聚合包括进一步的求和运算,该运算包括节点i和j之间的不同类型的边缘(E_ij)。为了简单起见,省略了节点的度数

总结

R-GCN代表了强大的图神经体系结构,可对诸如KG之类的多关系数据进行编码。在以后的文章中,我将向您展示如何利用这种编码能力在KG中执行特定任务,包括节点分类和链接预测。

如果要直接运行和测试代码,可以在此处下载可用的笔记本:

https://github.com/giuseppefutia/notebooks/blob/main/rgcn.ipynb

以下研究论文提供了有关R-GCN架构的更多详细信息:

https://arxiv.org/abs/1703.06103

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
277 0
|
3月前
|
机器学习/深度学习 数据采集 传感器
【故障诊断】基于matlab BP神经网络电机数据特征提取与故障诊断研究(Matlab代码实现)
【故障诊断】基于matlab BP神经网络电机数据特征提取与故障诊断研究(Matlab代码实现)
116 0
|
4月前
|
数据采集 存储 算法
MyEMS 开源能源管理系统:基于 4G 无线传感网络的能源数据闭环管理方案
MyEMS 是开源能源管理领域的标杆解决方案,采用 Python、Django 与 React 技术栈,具备模块化架构与跨平台兼容性。系统涵盖能源数据治理、设备管理、工单流转与智能控制四大核心功能,结合高精度 4G 无线计量仪表,实现高效数据采集与边缘计算。方案部署灵活、安全性高,助力企业实现能源数字化与碳减排目标。
125 0
|
5月前
|
Python
LBA-ECO CD-32 通量塔网络数据汇编,巴西亚马逊:1999-2006,V2
该数据集汇集了1999年至2006年间巴西亚马逊地区九座观测塔的碳和能量通量、气象、辐射等多类数据,涵盖小时至月度时间步长。作为第二版汇编,数据经过协调与质量控制,扩展了第一版内容,并新增生态系统呼吸等相关计算数据,支持综合研究与模型合成。数据以36个制表符分隔文本文件形式提供,配套PDF说明文件,适用于生态与气候研究。引用来源为Restrepo-Coupe等人(2021)。
75 1
|
20天前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
|
2月前
|
机器学习/深度学习 数据采集 运维
改进的遗传算法优化的BP神经网络用于电厂数据的异常检测和故障诊断
改进的遗传算法优化的BP神经网络用于电厂数据的异常检测和故障诊断
|
4月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
116 4
|
5月前
|
开发者
鸿蒙仓颉语言开发教程:网络请求和数据解析
本文介绍了在仓颉开发语言中实现网络请求的方法,以购物应用的分类列表为例,详细讲解了从权限配置、发起请求到数据解析的全过程。通过示例代码,帮助开发者快速掌握如何在网络请求中处理数据并展示到页面上,减少开发中的摸索成本。
鸿蒙仓颉语言开发教程:网络请求和数据解析
|
7月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
236 22
|
7月前
|
存储 数据库 Python
利用Python获取网络数据的技巧
抓起你的Python魔杖,我们一起进入了网络之海,捕捉那些悠游在网络中的数据鱼,想一想不同的网络资源,是不是都像数不尽的海洋生物,我们要做的,就是像一个优秀的渔民一样,找到他们,把它们捕获,然后用他们制作出种种美味。 **1. 打开魔法之门:请求包** 要抓鱼,首先需要一个鱼网。在Python的世界里,我们就是通过所谓的“请求包”来发送“抓鱼”的请求。requests是Python中常用的发送HTTP请求的库,用它可以方便地与网络上的资源进行交互。所谓的GET,POST,DELETE,还有PUT,这些听起来像偶像歌曲一样的单词,其实就是我们鱼网的不同方式。 简单用法如下: ``` im
150 14

热门文章

最新文章