图神经网络GNN算法

本文结合一个具体的无向图来对最简单的一种GNN进行推导。本文第一部分是数据介绍,第二部分为推导过程中需要用的变量的定义,第三部分是GNN的具体推导过程,最后一部分为自己对GNN的一些看法与总结。

Posted in Python onMay 11, 2022

前言

本文结合一个具体的无向图来对最简单的一种GNN进行推导。本文第一部分是数据介绍,第二部分为推导过程中需要用的变量的定义,第三部分是GNN的具体推导过程,最后一部分为自己对GNN的一些看法与总结。

1. 数据

利用networkx简单生成一个无向图:

# -*- coding: utf-8 -*-
"""
@Time : 2021/12/21 11:23
@Author :KI 
@File :gnn_basic.py
@Motto:Hungry And Humble

"""
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

G = nx.Graph()
node_features = [[2, 3], [4, 7], [3, 7], [4, 5], [5, 5]]
edges = [(1, 2), (1, 3), (2, 4), (2, 5), (1, 3), (3, 5), (3, 4)]
edge_features = [[1, 3], [4, 1], [1, 5], [5, 3], [5, 6], [5, 4], [4, 3]]
colors = []
edge_colors = []

# add nodes
for i in range(1, len(node_features) + 1):
    G.add_node(i, feature=str(i) + ':(' + str(node_features[i-1][0]) + ',' + str(node_features[i-1][1]) + ')')
    colors.append('#DCBB8A')

# add edges
for i in range(1, len(edge_features) + 1):
    G.add_edge(edges[i-1][0], edges[i-1][1], feature='(' + str(edge_features[i-1][0]) + ',' + str(edge_features[i-1][1]) + ')')
    edge_colors.append('#3CA9C4')

# draw
fig, ax = plt.subplots()

pos = nx.spring_layout(G)
nx.draw(G, pos=pos, node_size=2000, node_color=colors, edge_color='black')
node_labels = nx.get_node_attributes(G, 'feature')
nx.draw_networkx_labels(G, pos=pos, labels=node_labels, node_size=2000, node_color=colors, font_color='r', font_size=14)
edge_labels = nx.get_edge_attributes(G, 'feature')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=14, font_color='#7E8877')

ax.set_facecolor('deepskyblue')
ax.axis('off')
fig.set_facecolor('deepskyblue')
plt.show()

如下所示:

图神经网络GNN算法


其中,每一个节点都有自己的一些特征,比如在社交网络中,每个节点(用户)有性别以及年龄等特征。

5个节点的特征向量依次为:

[[2, 3], [4, 7], [3, 7], [4, 5], [5, 5]]

同样,6条边的特征向量为:

[[1, 3], [4, 1], [1, 5], [5, 3], [5, 6], [5, 4], [4, 3]]

2. 变量定义

图神经网络GNN算法

特征向量实际上也就是节点或者边的标签,这个是图本身的属性,一直保持不变。

3. GNN算法

GNN算法的完整描述如下:Forward向前计算状态,Backward向后计算梯度,主函数通过向前和向后迭代调用来最小化损失。

图神经网络GNN算法


主函数中:

图神经网络GNN算法

上述描述只是一个总体的概述,可以略过先不看。

3.1 Forward

早期的GNN都是RecGNN,即循环GNN。这种类型的GNN基于信息传播机制: GNN通过不断交换邻域信息来更新节点状态,直到达到稳定均衡。节点的状态向量 x 由以下 f w ​函数来进行周期性更新:

图神经网络GNN算法

 

图神经网络GNN算法


解析上述公式:对于节点 n ,假设为节点1,更新其状态需要以下数据参与:

图神经网络GNN算法

这里的fw只是形式化的定义,不同的GNN有不同的定义,如随机稳态嵌入(SSE)中定义如下:

图神经网络GNN算法

由更新公式可知,当所有节点的状态都趋于稳定状态时,此时所有节点的状态向量都包含了其邻居节点和相连边的信息。

这与图嵌入有些类似:如果是节点嵌入,我们最终得到的是一个节点的向量表示,而这些向量是根据随机游走序列得到的,随机游走序列中又包括了节点的邻居信息, 因此节点的向量表示中包含了连接信息。

证明上述更新过程能够收敛需要用到不动点理论,这里简单描述下:

如果我们有以下更新公式:

图神经网络GNN算法

GNN的Foward描述如下:

图神经网络GNN算法


解释:

图神经网络GNN算法

3.2 Backward

在节点嵌入中,我们最终得到了每个节点的表征向量,此时我们就能利用这些向量来进行聚类、节点分类、链接预测等等。

GNN中类似,得到这些节点状态向量的最终形式不是我们的目的,我们的目的是利用这些节点状态向量来做一些实际的应用,比如节点标签预测。

因此,如果想要预测的话,我们就需要一个输出函数来对节点状态进行变换,得到我们要想要的东西:

图神经网络GNN算法


最容易想到的就是将节点状态向量经过一个前馈神经网络得到输出,也就是说 g w g_w gw​可以是一个FNN,同样的, f w f_w fw​也可以是一个FNN:

图神经网络GNN算法


我们利用 g w g_w gw​函数对节点 n n n收敛后的状态向量 x n x_n xn​以及其特征向量 l n l_n ln​进行变换,就能得到我们想要的输出,比如某一类别,某一具体的数值等等。

在BP算法中,我们有了输出后,就能算出损失,然后利用损失反向传播算出梯度,最后再利用梯度下降法对神经网络的参数进行更新。

对于某一节点的损失(比如回归)我们可以简单定义如下:

图神经网络GNN算法

图神经网络GNN算法


有了z(t)后,我们就能求导了:

图神经网络GNN算法

图神经网络GNN算法

z(t)的求解方法在Backward中有描述:

图神经网络GNN算法

图神经网络GNN算法

因此,在Backward中需要计算以下导数:

图神经网络GNN算法

4.总结与展望

本文所讲的GNN是最原始的GNN,此时的GNN存在着不少的问题,比如对不动点隐藏状态的更新比较低效。

由于CNN在CV领域的成功,许多重新定义图形数据卷积概念的方法被提了出来,图卷积神经网络ConvGNN也被提了出来,ConvGNN被分为两大类:频域方法(spectral-based method )和空间域方法(spatial-based method)。2009年,Micheli在继承了来自RecGNN的消息传递思想的同时,在架构上复合非递归层,首次解决了图的相互依赖问题。在过去的几年里还开发了许多替代GNN,包括GAE和STGNN。这些学习框架可以建立在RecGNN、ConvGNN或其他用于图形建模的神经架构上。

GNN是用于图数据的深度学习架构,它将端到端学习与归纳推理相结合,业界普遍认为其有望解决深度学习无法处理的因果推理、可解释性等一系列瓶颈问题,是未来3到5年的重点方向。

因此,不仅仅是GNN,图领域的相关研究都是比较有前景的,这方面的应用也十分广泛,比如推荐系统、计算机视觉、物理/化学(生命科学)、药物发现等等。

以上就是图神经网络GNN算法基本原理详解的详细内容!


Tags in this post...

Python 相关文章推荐
python中的yield使用方法
Feb 11 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
基于python读取.mat文件并取出信息
Dec 16 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
Python数据分析入门之数据读取与存储
May 13 Python
python神经网络ResNet50模型
May 06 #Python
python和anaconda的区别
May 06 #Python
python神经网络Xception模型
May 06 #Python
Python使用永中文档转换服务
May 06 #Python
Python tensorflow卷积神经Inception V3网络结构
May 06 #Python
Python实现Matplotlib,Seaborn动态数据图
May 06 #Python
PYTHON InceptionV3模型的复现详解
You might like
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
Python中字典映射类型的学习教程
2015/08/20 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
python绘制汉诺塔
2021/03/01 Python
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
Java模拟试题
2014/11/10 面试题
户外亲子活动策划方案
2014/02/07 职场文书
项目建议书怎么写
2014/05/15 职场文书
工作作风建设心得体会
2014/10/22 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
转正申请报告格式
2015/05/15 职场文书
经济纠纷起诉状
2015/05/20 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL