图神经网络(GNN)模型的基本原理
一、概述
在人工智能领域,数据的多样性促使研究人员不断探索新的模型与算法。传统的神经网络在处理像图像、文本这类具有固定结构的数据时表现出色,但面对具有不规则拓扑结构的图数据,如社交网络、化学分子结构、知识图谱等,却显得力不从心。
图神经网络(Graph Neural Networks, GNN)是一种直接在图结构数据上运行的神经网络,用于处理节点、边或整个图的特征信息。其核心思想是通过聚合邻域节点的特征信息来更新当前节点的表示,从而捕捉图中节点间的依赖关系和拓扑结构特征。
二、模型原理
1. 图结构数据的特点
图由节点(vertices)和边(edges)组成,可表示为\(G=\left( V,E \right)\),其中:
\(V=\left\{ v_1,v_2,...,v_N \right\}\)为节点集合,可能包含特征向量(如用户属性、原子特征等)。
\(E=\left\{ (v_i,v_j) \right\}\)为边集合,描述节点间的关系,可能带有权重或类型(如社交关系、化学键)。
节点和边的特征表示:
节点特征矩阵\(X\in R^{N\times F}\)(\(F\)为节点特征维度);
边特征矩阵\(E\in R^{M\times D}\)(\(M\)为边数,\(D\)为边特征维度);
邻接矩阵\(A\in R^{N\times N}\)(表示节点连接关系,无向图中矩阵对称)。
图具有以下特性:
非欧几里得结构:节点间无序,邻居数量可变。
异构性:图的规模、密度、节点类型可能差异极大。
2.核心机制:消息传递与节点更新
图神经网络的核心目标之一是为图中的每个节点生成一个具有代表性的向量表示,也就是将节点的复杂特征和其在图中的拓扑结构信息编码到一个向量空间中,便于后续的节点分类、预测等任务。
节点表示的生成过程基于图的拓扑结构和节点自身的特征,利用神经网络的学习能力,自动提取出对任务有价值的信息。其基本思想是通过不断聚合邻居节点的信息,并结合自身的特征,逐步更新节点的表示,使得每个节点能够充分反映其在图中的角色和上下文信息。
(1)消息聚合(Message Aggregation)
对于每个节点\(v\),收集其邻域节点\(N(v)\)的特征信息,生成聚合消息\(m\)。
常用聚合函数包括:
求和(Sum):\(m_i=\sum_{v_j\in N(v_i)}{ReLU(W\cdot h_j+b)}\)
均值(Mean):\(m_i=\frac{1}{\left| N(v_i) \right|}\sum_{v_j\in N(v_i)}{h_j}\)
最大值(Max Pooling):\(m_i=\max_{v_j\in N(v_i)}\left\{ h_j \right\}\)
其中,\(h_j\)为邻域节点 \(v_j\)的隐藏状态,\(W\)和\(b\)为可学习参数。
(2)节点状态更新(Update)
利用聚合得到的消息\(m_i\)和当前节点的旧状态 \(h_{i}^{(l)}\),更新节点的隐藏状态:
\]
其中 \(\sigma\)为激活函数(如 ReLU、Sigmoid),\(\oplus\)表示拼接或线性变换操作。
三、典型 GNN 模型架构
不同 GNN 模型的差异主要体现在消息聚合方式和图结构处理策略上,几种典型模型为:
1. 图卷积网络(GCN, Graph Convolutional Network)
简化了消息传递过程,通过对称归一化的邻接矩阵直接聚合邻居:
\]
其中,\(\hat A=A+I\)(\(I\)为单位矩阵,引入自环),\(\hat D\)为\(\hat A\)的度矩阵(对角矩阵,\(\hat D_{ii}=\sum_{j}{\hat A_{ij}}\))。
2. 图注意力网络(GAT, Graph Attention Network)
引入注意力机制,动态学习邻居的重要性权重:
\]
其中,\(\alpha_{uv}\)是通过注意力机制计算的归一化权重。
3. 图采样与聚合网络(GraphSAGE, Graph SAmple and aggreGatE)
核心思想:对大规模图进行子图采样,避免全图计算的高复杂度。
采样策略:随机采样固定数量的邻域节点(如固定采样 5 个邻居),再通过聚合函数(如均值、LSTM、池化)更新节点表示。
适用场景:适用于归纳学习(Inductive Learning,处理训练中未出现的节点)。
四、优势与挑战
优势:
结构感知:直接利用图的拓扑结构,捕捉节点间依赖关系;
灵活性:适用于多种图类型(有向图、无向图、异质图);
可扩展性:结合采样技术可处理大规模图数据。
挑战:
过平滑(Over-smoothing):深层 GNN 中节点特征趋于同质化,丢失区分度;
异质图处理:节点和边类型多样时,需设计更复杂的聚合方式;
计算效率:全图计算的时间复杂度高,需优化采样或稀疏矩阵运算。
五、应用场景
社交网络:用户行为预测、社区检测;
生物医学:分子特性预测、药物研发(如 GNN 用于预测蛋白质相互作用);
推荐系统:建模用户-物品交互图,提升推荐准确性;
计算机视觉:点云数据处理、场景图生成;
知识图谱:链接预测、实体分类;
交通网络:流量预测、路径优化。
六、Python实现示例
(环境:Python 3.11,PyTorch 2.4.0)
import torch
import torch.nn as nn
import torch.nn.functional as F
class GraphConvolution(nn.Module):
def __init__(self, input_dim, output_dim):
super(GraphConvolution, self).__init__()
self.weight = nn.Parameter(torch.FloatTensor(input_dim, output_dim))
self.bias = nn.Parameter(torch.FloatTensor(output_dim))
self.reset_parameters()
def reset_parameters(self):
nn.init.xavier_uniform_(self.weight)
nn.init.zeros_(self.bias)
def forward(self, x, adj):
support = torch.mm(x, self.weight)
output = torch.spmm(adj, support)
return output + self.bias
class GNN(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(GNN, self).__init__()
self.gc1 = GraphConvolution(input_dim, hidden_dim)
self.gc2 = GraphConvolution(hidden_dim, output_dim)
def forward(self, x, adj):
x = F.relu(self.gc1(x, adj))
x = F.dropout(x, training=self.training)
x = self.gc2(x, adj)
return F.log_softmax(x, dim=1)
# 示例用法
def test_gnn():
# 创建一个简单的3节点图
# 节点特征矩阵 (3节点,每个节点特征维度为4)
features = torch.FloatTensor([
[0.1, 0.2, 0.3, 0.4],
[0.5, 0.6, 0.7, 0.8],
[0.9, 1.0, 1.1, 1.2]
])
# 邻接矩阵 (3x3)
adj = torch.FloatTensor([
[1, 1, 0],
[1, 1, 1],
[0, 1, 1]
])
# 添加自环并归一化
adj = adj + torch.eye(adj.size(0))
d_inv_sqrt = torch.pow(adj.sum(1), -0.5).flatten()
d_inv_sqrt[torch.isinf(d_inv_sqrt)] = 0.
d_mat_inv_sqrt = torch.diag(d_inv_sqrt)
adj = torch.mm(torch.mm(d_mat_inv_sqrt, adj), d_mat_inv_sqrt)
# 创建GNN模型
model = GNN(input_dim=4, hidden_dim=8, output_dim=2)
# 前向传播
output = model(features, adj)
print("GNN输出:", output)
# 随机生成标签并计算损失
labels = torch.LongTensor([0, 1, 0])
loss = F.nll_loss(output, labels)
print("损失值:", loss.item())
if __name__ == "__main__":
test_gnn()

示例实现了一个简单的两层图神经网络,包含
1. GraphConvolution类实现了基本的图卷积操作,包括权重矩阵和偏置项;
2. GNN类定义了一个两层GNN模型,使用ReLU激活函数和dropout;
3. 代码展示了如何创建图数据(特征矩阵和邻接矩阵);
4. 包含了邻接矩阵的预处理(添加自环和归一化)。
七、小结
图神经网络通过消息传递机制聚合邻域信息,实现了图结构数据的高效建模。其核心在于设计合理的聚合函数和更新规则,以捕捉不同场景下的图特征。随着研究深入,GNN 在理论分析(如泛化能力、表达能力)和应用创新(如异质图、动态图)方面仍在不断发展,未来有望在更多复杂图任务中发挥关键作用。
End.
图神经网络(GNN)模型的基本原理的更多相关文章
- PGL图学习之图神经网络GNN模型GCN、GAT[系列六]
PGL图学习之图神经网络GNN模型GCN.GAT[系列六] 项目链接:一键fork直接跑程序 https://aistudio.baidu.com/aistudio/projectdetail/505 ...
- zz【清华NLP】图神经网络GNN论文分门别类,16大应用200+篇论文最新推荐
[清华NLP]图神经网络GNN论文分门别类,16大应用200+篇论文最新推荐 图神经网络研究成为当前深度学习领域的热点.最近,清华大学NLP课题组Jie Zhou, Ganqu Cui, Zhengy ...
- 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...
- Github项目推荐-图神经网络(GNN)相关资源大列表
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 | AI研习社 作者|Zonghan Wu 这是一个与图神经网络相关的资源集合.相关资源浏览下方 ...
- NLP知识图谱项目合集(信息抽取、文本分类、图神经网络、性能优化等)
NLP知识图谱项目合集(信息抽取.文本分类.图神经网络.性能优化等) 这段时间完成了很多大大小小的小项目,现在做一个整体归纳方便学习和收藏,有利于持续学习. 1. 信息抽取项目合集 1.PaddleN ...
- 【GNN】图神经网络小结
图神经网络小结 图神经网络小结 图神经网络分类 GCN: 由谱方法到空域方法 GCN概述 GCN的输出机制 GCN的不同方法 基于谱方法的GCN 初始 切比雪夫K阶截断: ChebNet 一阶Cheb ...
- PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八]
PGL图学习之图神经网络ERNIESage.UniMP进阶模型[系列八] 原项目链接:fork一下即可:https://aistudio.baidu.com/aistudio/projectdetai ...
- 图神经网络(GNN)--slide
课件是学习小组汇报时用的,许多资料是从大佬哪里搬运的.Tex文档也在里面. GNN课件,下载不了,可以点击 带你入门图神经网络(GNN) 图神经网络(GNN)学习推荐网址 傅里叶分析之掐死教程(完整版 ...
- 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-KG4SL:用于人类癌症综合致死率预测的知识图神经网络
5.(2021.7.12)Bioinformatics-KG4SL:用于人类癌症综合致死率预测的知识图神经网络 论文标题:KG4SL: knowledge graph neural network f ...
- PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七]
0. PGL图学习之图神经网络GraphSAGE.GIN图采样算法[系列七] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/50619 ...
随机推荐
- linux中如何判断一个rpm是手动安装还是通过yum安装的
现状 对于一个不熟悉的服务器或者是虽然是自己的服务器,但历史比较久远,对于上面安装了的一些软件包,我们记忆都慢慢模糊了. 我今天遇到一个情况,在安装一个工具x2openEuler时,安装失败,提示依赖 ...
- datagrid源码
/** * jQuery EasyUI 1.2.3 * * Licensed under the GPL terms * To use it on other terms please contact ...
- Oracle 对 Json 数据进行增删改
1.背景: 由于项目要求,需要对大型的 Json 数据入库到DB中(clob 类型),由于内容过长或者 oracle 版本限制,有一些熟知的处理方法是不能使用的. 精确解决问题,可以直接看第四步:[4 ...
- PostgreSQL的可变字符串
在Oralce中,通常都使用varchar2作为字符串,它能自动删除前后空格.因业务需要用到Postgre,使用了character类型,用起来是没有什么问题.后来发现在smartBI引用这里面的数据 ...
- 什么是单点登录?什么是SSO?什么是CAS?
目录 单点登录简介 SSO&CAS是什么 单点登录适合什么场景 单点登录的三种实现方式 CAS的几个重要知识点 CAS的实现过程 单点登录简介 单点登录(SingleSignOn,SSO),就 ...
- vue & font-awesome
vue & font-awesome // 使用npm安装依赖 npm install font-awesome@4.7.0 --save --verbose // 会在包管理文件(packa ...
- LinkedBlockingQueue的poll方法底层原理
一.LinkedBlockingQueue的poll方法底层原理 LinkedBlockingQueue 的 poll 方法用于从队列头部移除并返回元素.如果队列为空,poll 方法会立即返回 nul ...
- 什么是 Java 的 PLAB(Promotion Local Allocation Buffer)?
什么是 Java 的 PLAB(Promotion Local Allocation Buffer)? PLAB 全称是 Promotion Local Allocation Buffer,是 Jav ...
- 什么是 Java 的 AOT(Ahead-Of-Time)?
Java 的 AOT(Ahead-Of-Time) 1. 定义 AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式. 在 AOT 模式下,Java 字节 ...
- 【docker】4种网络模式
bridge模式 使用--net=bridge指定,Docker的默认设置,这种模式创建出来的docker容器链接到Dcoker网桥上(docker0网桥或者其它自定义的网桥): 1)创建一对虚拟网卡 ...