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

news2024/11/26 2:25:36

图神经网络

  • 1、引言
  • 2、图神经网络
    • 2.1 定义
    • 2.2 原理
    • 2.3 实现方式
    • 2.4 算法公式
      • 2.4.1 GNN
      • 2.4.2 GCN
    • 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),uN(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)=σ(D21AD21H(l1)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)}) (D21AD21H(l1)) 实现)和线性变换(通过 ( W ( l ) ) (W^{(l)}) (W(l)) 实现)。
  • 通过这种方式,GCN能够捕捉图的结构信息并学习节点的有效表示。

2.5 代码示例

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1578704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Rust中操作JSON

❝ 越努力,越幸运 ❞ 大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。 前言 我们之前在Rust 赋能前端-开发一款属于你的前端脚手架中有过在Rust项目中如何操作JSON。 由于文章篇幅的原因,我们就没详细介绍…

java算法day48 | 动态规划part09 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 class Solution {public int rob(int[] nums) {if(nums.length0) return 0;if(nums.length1) return nums[0];int[] dpnew int[nums.length];dp[0]nums[0];dp[1]Math.max(nums[1],nums[0]);for(int i2;i<nums.length;i){dp[i]Math.max(dp[i-1],dp[i-2]nums[i])…

网络工程师笔记18(关于网络的一些基本知识)

网络的分类 介绍计算机网络的基本概念&#xff0c;这一章最主要的内容是计算机网络的体系结构-ISO 开放系统互连参考模型&#xff0c;其中的基本概念&#xff0c;例如协议实体、协议数据单元&#xff0c;服务数据单元、面向连接的服务和无连接的服务、服务原语、服务访问点、相…

ubuntu 安装 mysql8,远程连接数据库(华为云、压缩包安装、问题解决)

下载解压 mysql8 cd /usr/local/ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz tar -Jvxf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz修改 mysql 文件夹名&#xff0c;设置环境变量 mv mysql-8.0.33-linux-glibc2…

javaScript中原型链

一、原型链 js 的对象分为普通对象和函数对象。每个对象都有__proto__ 但是只有函数对象 (非箭头函数) 才有 prototype 属性。 new的过程&#xff1a; 1、创建一个空的简单 javaScript对象 2、将空对象的 __proto__连接到该函数的 prototype 3、将函数的this指向新创建的对象…

【教程】iOS Swift应用加固

&#x1f512; 保护您的iOS应用免受恶意攻击&#xff01;在本篇博客中&#xff0c;我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序&#xff0c;并优化其安全性。通过以下步骤&#xff0c;您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …

抖音视频评论关键词采集工具|评论ID提取下载软件

抖音评论关键词采集工具&#xff1a;批量拓客&#xff0c;轻松抓取 最新版本的抖音评论关键词采集工具带来了许多实用功能&#xff0c;帮助您更便捷地抓取抖音视频评论。通过输入关键词和评论监控词&#xff0c;您可以快速建立抓取任务并获取相关数据。以下是该工具的主要功能&…

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而电路和协…

在线免费图像处理

功能 尺寸修改(自定义和内置常用的照片尺寸)图像压缩(比较好的情况最高可以压缩 10 倍, 如果是无损压缩可以压缩 5 倍左右,参数范围 50~70 左右)图像方向修改图像格式修改修改后的效果支持实时反馈, 并且支持点击图像预览,同时保留历史修改图片(在预览中可以查看)支持修改撤回…

【Spring】一问详解什么是Spring IoC和DI

目录 一、IoC & DI入门1.1、Spring1.1.1、什么是容器1.1.2、什么是IoC 1.2、IoC介绍1.2.1、传统程序开发1.2.2、问题分析1.2.3、问题解决1.2.4、 IoC优势 1.3、Bean的作用域1.4、DI介绍 二、IoC详解2.1、Bean的存储2.1.1、类注解的使用2.1.2、获取bean对象的其他方式2.1.3、…

k8s_入门_命令详解

命令详解 kubectl是官方的CLI命令行工具&#xff0c;用于与 apiserver进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver能识别的信息&#xff0c;进而实现管理k8s各种资源的一种有效途径 1. 帮助 2. 查看版本信息 3. 查看资源对象等 查看No…

小型企业网络安全指南

许多小型企业刚刚起步&#xff0c;没有大公司所拥有的相同资源来保护其数据。他们不仅可能没有资金来支持多样化的安全计划&#xff0c;而且也可能没有人力或时间。 网络犯罪分子知道小型企业缺乏这些资源&#xff0c;并利用这些资源来谋取利益。遭受网络攻击后&#xff0c;小…

c语言:操作符

操作符 一.算术操作符: + - * % / 1.除了%操作符之外,其他的几个操作符可以作用与整数和浮点数,如:5%2.0//error. 2.对于操作符,如果两个操作数都为整数,执行整数除法而只要有浮点数执行的就是浮点数除法。 3.%操作符的两个操作数必须为整数。 二.移位操作符:<&…

Windows(Win11) 安装 Docker (Docker Desktop)

目录 前言 下载 安装 wsl 安装 Docker Desktop 启动 Docker Desktop 配置国内镜像 拉取镜像 前言 一般 docker 都是直接安装在 Linux 服务器上&#xff0c;用来快速部署一些中间件&#xff08;比如 redis&#xff0c;rocketmq等等&#xff09;&#xff0c;省去繁琐的安…

Qt QML的插件(Qt Quick 2 Extension Plugin)方法

Qt Quick的插件方法 序言环境前置注意概念——Qt Quick插件的相关知识插件里的qml文件模块名的相关知识模块名本身注意事项模块名版本注意事项 以示例来说明创建插件qmltypes的生成qmltypes的可能性失效 插件的编码注意1、插件模块版本控制2、pro里的注意 调用插件插件信息输入…

element-ui drawer 组件源码分享

今日简单分享 drawer 组件的源码实现&#xff0c;从以下五个方面来分享&#xff1a; 1、drawer 组件页面结构 2、drawer 组件属性 3、drawer 组件 slot 4、drawer 组件方法 5、drawer 组件事件 一、drawer 组件页面结构 二、drawer 组件属性 2.1 append-to-body 属性&am…

(Atcoder Beginner Contest 348)题解

前言 这是我第 4 4 4 次做出 F F F 题&#xff0c;庆祝上蓝&#xff01; 正题 本题解提供 A − F A-F A−F 题题解&#xff0c;欢迎诸位大佬参考。 第 1 题 Penalty Kick 照例很水&#xff0c;模拟即可。 #include <bits/stdc.h> using namespace std; #define…

一种新兴的身份安全理念:身份结构免疫

文章目录 前言一、从身份管理到身份结构免疫二、身份结构免疫应用实践三、典型应用场景前言 随着组织的数字身份数量激增,基于身份的网络攻击活动也在不断增长。在身份优先的安全原则下,新一代身份安全方案需要更好的统一性和控制度。而在现有的身份管理模式中,组成业务运营…

MySQL相关问题快问快答

我写这篇文章的目的只有一个&#xff1a;通过这些问题来帮助我去将我脑子里的MySQL脑图给巩固熟悉&#xff0c;通过回答这些问题&#xff0c;让我对脑子里的MySQL知识有更深的印象&#xff0c;当什么时候我的MySQL脑图不熟的时候&#xff0c;我就可以拿这篇文章来去巩固一下&am…

ctfshow web入门 php特性 web123--web139

web123 必须传CTF_SHOW&#xff0c;CTF_SHOW.COM 不能有fl0g 在php中变量名字是由数字字母和下划线组成的&#xff0c;所以不论用post还是get传入变量名的时候都将空格、、点、[转换为下划线&#xff0c;但是用一个特性是可以绕过的&#xff0c;就是当[提前出现后&#xff0c;…