快速理解图神经网络(GCN)

2023-10-30

网上对图卷积神经网络(Graph Convolutional Networks)的介绍大都说的云里雾里,让人看了不甚明白,无意中找到了篇很好的文章,对图神经网络中 f ( H i , A ) = σ ( A H i W i ) f\left(H^{i}, A\right)=\sigma\left(A H^{i} W^{i}\right) f(Hi,A)=σ(AHiWi)这个式子有很清楚简洁的解释。本文主要参考这篇文章 https://towardsdatascience.com/how-to-do-deep-learning-on-graphs-with-graph-convolutional-networks-7d2250723780,强烈建议大家去读一下原文。

介绍

传统的CNN是在图像上面做卷积运算,假如把图像的每个像素看做一个图的节点,那么图像可以看做一个相互连接的图,但是对于节点不是相互连接的图应该怎么进行卷积操作呢?这就引入了图卷积神经网络。传统的图像卷积是对某个像素领域内的元素进行特征的加权聚合,而图卷积就可以看做是对一个图节点相邻的节点进行特征的加权聚合,具体示意见下图:



给定一个图 G = ( V , E ) G=(V, E) G=(V,E),GCN的输入为

  1. 特征矩阵 X X X X X X的维度为 N × F 0 N \times F^{0} N×F0,其中 N N N是节点的数目, F 0 F^{0} F0是每个节点特征的数目
  2. 图的邻接矩阵 A A A A A A的维度为 N × N N \times N N×N

GCN的一个隐藏层可以写成 H i = f ( H i − 1 , A ) ) \left.H^{i}=f\left(H^{i-1}, A\right)\right) Hi=f(Hi1,A)),其中 H 0 = X H^{0}=X H0=X f f f是网络的传递过程。每一层 H i H^{i} Hi是一个 N × F i N \times F^{i} N×Fi的特征矩阵,每一行都代表图中一个节点的特征向量。每一层这些特征都会通过传递规则 f f f聚合起来,形成下一层的特征向量,采用这种方式特征能随着层数增加变得更加抽象,含有高层的语义信息。下面来介绍传递函数 f f f的实现方法以及整个图神经网络的计算过程。

传递函数

传递函数可以写成如下的形式
f ( H i , A ) = σ ( A H i W i ) f\left(H^{i}, A\right)=\sigma\left(A H^{i} W^{i}\right) f(Hi,A)=σ(AHiWi)
其中 A A A代表邻接矩阵, H i H^{i} Hi代表第i层的特征, W i W^{i} Wi代表第i层的权重矩阵, σ \sigma σ代表非线性激活函数,比如ReLU,权重矩阵的维度为 F i × F i + 1 F^{i} \times F^{i+1} Fi×Fi+1,也就是说权重矩阵的第二个维度决定了下一层的特征维度。 A A A H i H^{i} Hi相乘代表将每个节点周围的节点特征进行聚合,得到更新后的当前节点特征,注意此时特征维度仍然为 N × F i N \times F^{i} N×Fi;之后将这个特征与特征矩阵 W i W^{i} Wi相乘,代表将当前特征进行维度变换,从 F i F^{i} Fi个特征变换为 F i + 1 F^{i+1} Fi+1个特征,其中 F i + 1 F^{i+1} Fi+1个特征中的每个特征都是 F i F^{i} Fi个特征的线性组合,最终得到一个 N × F i + 1 N \times F^{i+1} N×Fi+1维度的矩阵,通过 σ \sigma σ函数以后为第i+1层的特征 H i + 1 H^{i+1} Hi+1
在这里插入图片描述

简单的例子

下面举一个简单的例子以便更好地理解这个过程。首先有如下图这样一张有向图。
在这里插入图片描述
下面是这个图的邻接矩阵:

A = np.matrix([
    [0, 1, 0, 0],
    [0, 0, 1, 1], 
    [0, 1, 0, 0],
    [1, 0, 1, 0]],
    dtype=float
)

给每个节点创建一个二维的特征:

In [3]: X = np.matrix([
            [i, -i]
            for i in range(A.shape[0])
        ], dtype=float)
        X
Out[3]: matrix([
           [ 0.,  0.],
           [ 1., -1.],
           [ 2., -2.],
           [ 3., -3.]
        ])

然后应用上面提到的传播规则,首先进行 A A A X X X相乘:

In [6]: A * X
Out[6]: matrix([
            [ 1., -1.],
            [ 5., -5.],
            [ 1., -1.],

每一行代表每个节点的特征,这个特征为与当前节点相邻节点的特征之和,换句话说,图卷积层把每个节点表示成周围节点的聚合。

改善邻接矩阵

上述提到的这种方法有两个问题:

  1. 在进行节点聚合的时候只考虑了周围节点的特征,没有考虑自身的特征
  2. 度比较大的节点(和该节点相关联的边比较多)在计算特征的时候会有较大的值,这是因为参与计算的节点数目多;反之,度比较小的节点计算特征时值比较小,这样会导致在训练时候产生梯度爆炸或者梯度消失的问题。

针对以上第一个问题解决方案为:给每个图都添加自环,这样就能够把自身节点的特征也考虑进来。实际操作的时候可以给邻接矩阵加上一个单位矩阵。

In [4]: I = np.matrix(np.eye(A.shape[0]))
		I
Out[4]: matrix([
            [1., 0., 0., 0.],
            [0., 1., 0., 0.],
            [0., 0., 1., 0.],
            [0., 0., 0., 1.]
        ])
In [8]: A_hat = A + I
        A_hat * X
Out[8]: matrix([
            [ 1., -1.],
            [ 6., -6.],
            [ 3., -3.],
            [ 5., -5.]])

针对以上第二个问题解决方案为:对特征进行归一化,具体的方案就是让邻接矩阵乘以它度矩阵的逆。度矩阵为对角矩阵,对角线上元素依次为各个顶点的度。

In [9]: D = np.array(np.sum(A, axis=0))[0]
        D = np.matrix(np.diag(D))
        D
Out[9]: matrix([
            [1., 0., 0., 0.],
            [0., 2., 0., 0.],
            [0., 0., 2., 0.],
            [0., 0., 0., 1.]
        ])
In [10]: D**-1 * A
Out[10]: matrix([
             [0. , 1. , 0. , 0. ],
             [0. , 0. , 0.5, 0.5],
             [0. , 0.5, 0. , 0. ],
             [0.5, 0. , 0.5, 0. ]
])

从上面的结果可以看到邻接矩阵每一行的元素都除以了对应节点的度,这样起到了归一化的作用,下一步就可以对特征进行求解。

In [11]: D**-1 * A * X
Out[11]: matrix([
             [ 1. , -1. ],
             [ 2.5, -2.5],
             [ 0.5, -0.5],
             [ 2. , -2. ]
         ])

在进行乘法时,变换后邻接矩阵的的值就相当于是各个点的权重,计算得到的特征相当于是对相邻节点的特征做了一次加权平均。

最终步骤

上一步讲到了邻接矩阵可以添加自环以及归一化操作,下面就可以把特征矩阵的乘法以及激活函数也加进来形成最终的图神经网络表达式。

In [45]: W = np.matrix([
             [1, -1],
             [-1, 1]
         ])
         D_hat**-1 * A_hat * X * W
Out[45]: matrix([
            [ 1., -1.],
            [ 4., -4.],
            [ 2., -2.],
            [ 5., -5.]
        ])

其中D_hat是A_hat= A + I A+I A+I的度矩阵, W W W是特征矩阵,代表特征维度的转换关系。本例子中 W W W维度为2X2,因此输出的特征仍然是2维,如果想调整输出的维度可以相应地调整 W W W的列的数目,如下例所示:

In [46]: W = np.matrix([
             [1],
             [-1]
         ])
         D_hat**-1 * A_hat * X * W
Out[46]: matrix([[1.],
        [4.],
        [2.],
        [5.]]
)

W W W的维度变为2X1,这样输出特征的维度就由2变成了1。最后可以加上激活函数形成最终的表达式:

In [51]: W = np.matrix([
             [1, -1],
             [-1, 1]
         ])
         relu(D_hat**-1 * A_hat * X * W)
Out[51]: matrix([[1., 0.],
        [4., 0.],
        [2., 0.],
        [5., 0.]])

以上就是图神经网络其中一层的计算过程,把多层这样的结构前后级联叠加可以形成一个完整的网络。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速理解图神经网络(GCN) 的相关文章

随机推荐

  • HC-05学习笔记

    大家好 新手上路 请多多指教 网上有很多大佬也做了这个HC 05的文章 我这个文章只是个人学习笔记 如果有侵犯到那位大佬请与我联系谢谢 也是希望对一次的学习做一个记录 也能够希望帮助到其他的小伙伴们 HC 05蓝牙 大家好 新手上路 请多多
  • Python中Xpath一些研究,node与*的一些区别

    Python中Xpath一些研究 node与 的一些区别理解 详细看下文 主要是一些区别 主要是注意 child node 与child 的一些区别 node 表示的是节点 表示的是元素 元素 文本 注释都属于节点 而标签属于元素 同时 标
  • Python研究生组蓝桥杯(省二)参赛感受

    为什么参加蓝桥杯 今年是读研的第一年 看着我简历上的获奖经历 优秀学生干部 优秀志愿者 优秀毕业生 大学四年 我竟然没有一次竞赛类的经历 也没有拿得出手的项目 我陷入了深深的焦虑 听说蓝桥杯的门槛相对较低 对我这种小白比较友好 于是我报名了
  • 软件配置管理(二)配置管理角色与过程

    文章目录 一 配置管理角色及职责 项目经理 PM 配置控制委员会 CCB 配置管理员 CMO 系统集成员 SIO 开发人员 DEV 二 配置管理基本流程 计划阶段 开发和维护阶段 三 软件配置管理七项基本活动 1 制定配置管理计划 2 识别
  • ubuntu2004/1804安装编译RocksDB

    Linux Ubuntu下载依赖 Upgrade your gcc to version at least 4 8 to get C 11 support Install gflags First try sudo apt get inst
  • XSS十五关通关秘籍

    文章来源 MS08067 Web零基础1期作业 本文作者 ymsli Web零基础1期学员 第一关 url输入关键字 完成第一关 第二关 文本框内输入 nclick alert 123 gt 点击搜索 文本框已被添加onclick事件 点击
  • 面试总结:测试常见面试题汇总

    文章目录 理论 测试流程 各个测试阶段 单元测试 集成测试 系统测试区别 测试用例设计 什么是好的测试用例 方法 用户登录 实例 App测试和Web测试的区别 典型测试场景 聊天功能测试用例怎么设计 怎么测试微信朋友圈 TODO 怎么测试微
  • do_mmap解读

    1 unsigned long do mmap pgoff struct file file unsigned long addr 2 unsigned long len unsigned long prot 3 unsigned long
  • Chat Gpt 4.0 API接口技术对接

    GPT Generative Pre trained Transformer 是一种基于Transformer网络架构的自然语言处理模型 能够生成自然 连贯的语言文本 GPT API接口技术是指将GPT模型应用于API接口开发 使得通过AP
  • ML-机器学习基础

    目录 偏差与方差 导致偏差和方差的原因 深度学习中的偏差与方差 生成模型与判别模型 两者之间的联系 优缺点 常见模型 先验概率与后验概率 偏差与方差 偏差与方差分别是用于衡量一个模型泛化误差的两个方面 模型的偏差 指的是模型预测的期望值与真
  • 大数据单机学习环境搭建(5)Hive建表DDL详解

    专题 大数据单机学习环境搭建和使用 1 Hive建表简单示例 1 1 Hive建表语句 1 2 表详细信息 1 3 数据展示 2 Hive建表语法详解 3 拓展1 复杂数据分割 4 拓展2 事务表 大数据单机学习环境搭建 5 Hive建表D
  • Linux中使用ctrl+z停止任务后如何恢复任务

    ctrl z的作用是停止任务 要恢复停止的任务要使用fg命令 root localhost jobs 1 已停止 top root localhost fg 1 fg 任务序号 直接用fg命令 恢复的是最新停止的一条任务
  • 1流明等于多少lux_投影仪流明科普,别再被商家骗了

    一 简介 流明 英文 Lumen 简写 lm 是光通量的国际单位 光通量 luminous flux 代表了我们人眼对不同波长的光的变化铭感度 我们一般说的投影仪流明指的是 ANSI流明 这个是国际公认的标准单位 在不同位置对投影仪进行测量
  • vue3+vite+element-plus+husky+commitzen搭建项目

    1 1 编辑器统一编码规范 http editorconfig org root true 表示所有文件适用 charset utf 8 设置文件字符集为 utf 8 indent style space 缩进风格 tab space in
  • 【WIFI】WIFI基本知识汇总

    这里对wifi的802 11协议中比较常见的知识做一个基本的总结和整理 便于后续的学习 因为无线网络中涉及术语很多 并且许多协议都是用英文描述 所以有些地方翻译出来会有歧义 这种情况就直接英文来描述了 主要内容 目录 一 基本概述 1 有线
  • Concurrent Mark Sweep(cms)垃圾回收器

    好长时间没写过博客了 突发奇想 开始写下最近几年的积累吧 先从Concurrent Mark Sweep cms 开始 希望自己没有太懒吧 坚持写完吧 先介绍以下概念 GC ROOT 这里我引用下RednaxelaFX的原话 所谓 GC r
  • Linux串口相关的操作及绑定

    Linux串口相关的操作及绑定 操作串口出现权限不足情况处理 要查看某个串口的波特率等信息 cat打印串口数据 排查问题常用方法 1 查看串口是否可用 2 查看串口名称使用 3 查看串口驱动 4 查看串口设备 5 查一下板子上的串口有没有设
  • 【策略工厂模式】使用策略工厂模式解决if else过多的问题

    目录 一 为什么要用策略工厂解决问题 1 1 使用策略模式之前 1 2使用策略模式之后 二 怎么用策略工厂模式解决问题 2 1 创建枚举类 2 2 创建抽象类 2 3 创建工厂类 2 4 编写子类型 三 意义 一 为什么要用策略工厂解决问题
  • Tensorflow加载预训练模型和保存模型(ckpt文件)以及迁移学习finetuning

    转载自 https blog csdn net huachao1001 article details 78501928 使用tensorflow过程中 训练结束后我们需要用到模型文件 有时候 我们可能也需要用到别人训练好的模型 并在这个基
  • 快速理解图神经网络(GCN)

    网上对图卷积神经网络 Graph Convolutional Networks 的介绍大都说的云里雾里 让人看了不甚明白 无意中找到了篇很好的文章 对图神经网络中 f H i A