【深度学习】最强算法之:图神经网络(GNN)

图神经网络

  • 1、引言
  • 2、图神经网络
    • [2.1 定义](#2.1 定义)
    • [2.2 原理](#2.2 原理)
    • [2.3 实现方式](#2.3 实现方式)
    • [2.4 算法公式](#2.4 算法公式)
      • [2.4.1 GNN](#2.4.1 GNN)
      • [2.4.2 GCN](#2.4.2 GCN)
    • [2.5 代码示例](#2.5 代码示例)
  • 3、总结

1、引言

小屌丝 :鱼哥,给俺讲一讲图神经网络啊
小鱼 :你看,我这会在忙着呢
小屌丝 :啊~
小鱼 :这是咋的了,
小屌丝 :你咋还有这技术?
小鱼 :这... 不是很平常的操作,有啥惊讶的。
小屌丝 :哇哦~ 难得哦
小鱼 :你这...
小屌丝 :看来今晚是有贵客到哦?
小鱼 :也没有了, 嘿嘿~
小屌丝 : 66号技师??
小鱼 :你可真能扯,我是那种人吗,我能做那种事情吗?
小屌丝 :那你说你这要干嘛?
小鱼 :我... 我就要烧个菜,你真是能联想翩翩
小屌丝 :我...

2、图神经网络

2.1 定义

图神经网络(GNN)是一种处理图结构数据的神经网络。

与传统的神经网络不同,GNN能够直接在图结构上进行操作,捕捉节点之间的复杂关系。

这种能力让GNN成为处理社交网络分析、知识图谱、推荐系统等问题的强有力工具。

2.2 原理

GNN的核心原理基于邻居聚合策略,即:通过迭代地聚合邻居节点的信息来更新当前节点的表示。

在每次迭代中,节点会接收来自其邻居的信息,并通过一个可学习的函数(通常是神经网络)来整合这些信息,从而更新自己的状态。

这个过程会重复进行,直到达到一个稳定的状态,最终得到每个节点的高级表示,这些表示可以用于后续的任务,如节点分类、图分类等

2.3 实现方式

GNN的实现通常包括以下几个关键步骤:

  • 节点表示初始化:为图中的每个节点分配初始表示(如节点特征或嵌入)。
  • 邻居信息聚合:对于每个节点,从其邻居节点收集信息,并通过聚合函数(如平均、求和、最大值)将这些信息整合起来。
  • 节点状态更新:结合节点当前的状态和聚合得到的邻居信息,通过一个更新函数(如全连接层)来更新节点的状态。
  • 读出:对于图级别的任务,需要通过一个读出(readout)函数将所有节点的表示整合成图的总体表示。

2.4 算法公式

2.4.1 GNN

一个基本的GNN更新公式可以表示为: [ h v ( l + 1 ) = f ( h v ( l ) , □ u ∈ N ( v ) g ( h u ( l ) ) ) ] [h_v^{(l+1)} = f\left(h_v^{(l)}, \square_{u \in \mathcal{N}(v)} g\left(h_u^{(l)}\right)\right)] [hv(l+1)=f(hv(l),□u∈N(v)g(hu(l)))]

其中,

  • ( h v ( l ) ) (h_v^{(l)}) (hv(l))表示节点 ( v ) (v) (v)在第 ( l ) (l) (l)层的表示,
  • ( N ( v ) ) (\mathcal{N}(v)) (N(v))是 ( v ) (v) (v)的邻居节点集合,
  • ( f ) (f) (f)和 ( g ) (g) (g)分别是更新函数和邻居信息聚合函数,
  • ( □ ) (\square) (□)是聚合操作(如求和、平均或最大值)。

2.4.2 GCN

对于具体的GNN变体,如GCN(图卷积网络),其公式会有所不同。以GCN为例,其每一层的更新可以表示为:

[ H ( l ) = σ ( D − 1 2 A D − 1 2 H ( l − 1 ) W ( l ) ) ] [ H^{(l)} = \sigma\left(D^{-\frac{1}{2}}AD^{-\frac{1}{2}}H^{(l-1)}W^{(l)}\right) ] [H(l)=σ(D−21AD−21H(l−1)W(l))]

其中:

  • ( H ( l ) ) (H^{(l)}) (H(l)) 是一个矩阵,其行表示第 ( l ) (l) (l) 层中所有节点的特征向量。
  • ( A ) (A) (A) 是图的邻接矩阵。
  • ( D ) (D) (D) 是度矩阵,其对角线上的元素是每个节点的度(即相邻节点的数量)。
  • ( W ( l ) ) (W^{(l)}) (W(l)) 是第 ( l ) (l) (l) 层的可学习权重矩阵。
  • ( σ ( ⋅ ) ) (\sigma(\cdot)) (σ(⋅)) 是激活函数,如 R e L U ReLU ReLU。

这个公式体现了GCN中的两个关键步骤:

  • 邻居信息的聚合(通过 ( D − 1 2 A D − 1 2 H ( l − 1 ) ) (D^{-\frac{1}{2}}AD^{-\frac{1}{2}}H^{(l-1)}) (D−21AD−21H(l−1)) 实现)和线性变换(通过 ( W ( l ) ) (W^{(l)}) (W(l)) 实现)。
  • 通过这种方式,GCN能够捕捉图的结构信息并学习节点的有效表示。

2.5 代码示例

python 复制代码
# -*- coding:utf-8 -*-
# @Time   : 2024-04-02
# @Author : Carl_DJ

'''
实现功能:
    使用PyTorch框架和PyTorch Geometric库实现GNN

'''
import torch
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
import torch.optim as optim
import torch.nn.functional as F

class ComplexGNN(torch.nn.Module):
    def __init__(self, in_channels, hidden_channels, out_channels):
        super(ComplexGNN, self).__init__()
        # 第一个图卷积层,将输入特征转换为隐藏层特征
        self.conv1 = GCNConv(in_channels, hidden_channels)
        # 第二个图卷积层,将隐藏层特征转换为输出特征
        self.conv2 = GCNConv(hidden_channels, out_channels)

    def forward(self, x, edge_index):
        # 输入特征通过第一个卷积层,激活函数为ReLU
        x = F.relu(self.conv1(x, edge_index))
        # 加入dropout,防止过拟合
        x = F.dropout(x, training=self.training)
        # 通过第二个卷积层得到输出特征
        x = self.conv2(x, edge_index)
        return F.log_softmax(x, dim=1)

# 加载数据集,这里使用Planetoid数据集作为示例,Cora是其中一个公开的图数据集
dataset = Planetoid(root='/tmp/Cora', name='Cora')

# 初始化模型,指定输入特征维度、隐藏层维度和输出特征维度
model = ComplexGNN(in_channels=dataset.num_node_features, hidden_channels=16, out_channels=dataset.num_classes)
optimizer = optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

# 定义训练函数
def train():
    model.train()
    optimizer.zero_grad()
    # forward pass
    out = model(dataset.data.x, dataset.data.edge_index)
    # 计算损失,这里使用负对数似然损失
    loss = F.nll_loss(out[dataset.data.train_mask], dataset.data.y[dataset.data.train_mask])
    # 反向传播
    loss.backward()
    optimizer.step()
    return loss

# 训练模型
for epoch in range(200):
    loss = train()
    print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}')

代码解析:

初始化

  • 定义了一个名为ComplexGNN的图神经网络模型,它包含两个图卷积层(GCNConv)。
  • 模型的输入是节点的特征向量,输出是节点类别的预测。
  • 使用ReLU作为激活函数,并在第一个图卷积层后加入了dropout层以减少过拟合。

在数据处理

  • 使用了PyTorch Geometric提供的Planetoid数据集加载工具来加载Cora数据集。

Cora数据集是一个常用的图节点分类数据集,其中节点代表科学出版物,边代表引用关系。

在训练过程

  • 使用负对数似然损失(Negative Log Likelihood Loss)作为损失函数,
  • 使用Adam优化器来优化模型参数。
  • 训练循环中,对模型进行前向传播,计算损失,执行反向传播并更新模型参数。

3、总结

图神经网络通过其独特的结构处理图数据的能力,在多个领域显示出了卓越的性能,从社交网络分析到分子结构识别。

随着研究的深入和技术的进步,GNN将继续扩展其应用领域,为解决复杂的图结构问题提供有效的工具。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼 ,学习【机器学习】&【深度学习】领域的知识。

相关推荐
陈苏同学13 分钟前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
FL162386312941 分钟前
[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪
深度学习·qt·yolo
羊小猪~~1 小时前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm
我是哈哈hh1 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy1 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
龙的爹23331 小时前
论文 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust
人工智能·gpt·深度学习·语言模型·自然语言处理·prompt
工业机器视觉设计和实现1 小时前
cnn突破四(生成卷积核与固定核对比)
人工智能·深度学习·cnn
醒了就刷牙1 小时前
58 深层循环神经网络_by《李沐:动手学深度学习v2》pytorch版
pytorch·rnn·深度学习
985小水博一枚呀1 小时前
【对于Python爬虫的理解】数据挖掘、信息聚合、价格监控、新闻爬取等,附代码。
爬虫·python·深度学习·数据挖掘
Mephisto.java1 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode