【深度学习】最强算法之:图神经网络(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博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

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

相关推荐
阿史大杯茶几秒前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
დ旧言~30 分钟前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
张彦峰ZYF35 分钟前
投资策略规划最优决策分析
分布式·算法·金融
The_Ticker1 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
Dola_Pan2 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
GOTXX2 小时前
基于Opencv的图像处理软件
图像处理·人工智能·深度学习·opencv·卷积神经网络
繁依Fanyi2 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
烦躁的大鼻嘎2 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
C++忠实粉丝2 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法