通俗全面理解图卷积与GCN网络(一):图与图卷积
下一篇:通俗全面理解图卷积与GCN网络(二):从图卷积到GCN
目录
- 前言
- 图
- 一般表示
- 度、邻接、拉普拉斯
- 为什么拉普拉斯
- 拉普拉斯矩阵的特征值分解
- 图卷积通式
- 总结
前言
相信大家都了解普通卷积操作,在一般的论文里,习惯认为普通的卷积是操作在Euclidean Structure,即欧几里得空间上的。直观的来看,一般卷积操作的图片是非常整齐的矩阵,一个像素周围必定有上下左右以及斜对角八个像素包围,这样的卷积好操作,卷积核大小也固定,再加之权值共享,有效的提取空间特征同时减少参数,使得CNN成为深度学习图像处理界当之无愧的扛把子。
但人们逐渐认识到,并非所有的数据都是这样规则的。 反而可以说,自然界中大多数的数据都是不规则的。也就是数据之间相互影响,构成了数据结构里图的形状。即使普通我们规则的图像,我们在逐像素处理中可能计算了很多对我们任务来说无用的像素点。而如果我们提取关键点,这些点之间也会构成一幅图。这里的图指图论里的图,而非我们平常见的图片。
CNN理论已经非常完整,但是遇到这种不规则的图结构,我们又该如何提取它的空间特征呢?这就应该从CNN的本质说起,去模仿它,把它扩展到所谓的非欧几里得空间里,这就是我们所说的“图卷积”。
图
一般表示
对于图 G = ( V , E ) G=(V,E) G=(V,E),V表示节点集合,E表示边集合。对于每个节点i,都有其特征 x ⃗ i \vec x_i x i。这些特征可以用矩阵 X N ∗ D X_{N*D} XN∗D表示,N为节点数,D为特征维度。
这里其实类似于我们普通的图片里每个像素点都有对应的像素值,在卷积层每个像素点上的值变成一个高维向量,称为其特征。
度、邻接、拉普拉斯
我们先来介绍一下图论里面的相关概念(会的同学直接跳过)
相信大家在查资料时下面这幅图也见过不下十次了,我们这里也用这幅图来说明:
可见,最左面画出了一个拥有6个节点,7条边的无向图,右面分别是该图所对应的度矩阵、邻接矩阵和一种拉普拉斯矩阵。
节点的度: 节点的度定义为该节点上拥有的边数,上面的度矩阵也就是每个节点的度所构成的对角矩阵。
邻接矩阵: 邻接矩阵代表了图的几何结构,在节点联通的地方取值为1,不联通的地方取值为0.也即:A(i,j)=1 if 节点i和j联通 else 0。易知一个无向图的邻接矩阵一定是对称的。
拉普拉斯矩阵: 邻接矩阵只定义了与该节点联通的节点有哪些,而没有该节点自身的信息。反应在矩阵上可以看到邻接矩阵的对角线均为0。我们要在一个矩阵中同时表示该节点的信息和该节点的邻接信息,就出来了拉普拉斯矩阵。直观的想,拉普拉斯矩阵就是度矩阵减去邻接矩阵,即 L = D − A L=D-A L=D−A
上面为什么要说这是一种拉普拉斯矩阵呢,因为拉普拉斯矩阵的定义有好多种,这只是其中的一种:
1、 L = D − A L=D-A L=D−A这种定义的拉普拉斯矩阵全称为Combinatorial Laplacian,也是最简单的一种。
2、 L s y m = D − 1 2 L D − 1 2 L^{sym}=D^{-\frac{1}{2}}LD^{-\frac{1}{2}} Lsym=D−21LD−21全称为Symmetric normalized Laplacian,一般的图卷积神经网络中都采用这种方式。其目的就是将第一种拉普拉斯矩阵的特征值归一化,防止在训练时尺度不同导致的性能降低。
3、 L r w = D − 1 2 L L^{rw}=D^{-\frac{1}{2}}L Lrw=D−21L全称为Random walk normalized Laplacian,也是一种拉普拉斯矩阵的定义方式。
为什么拉普拉斯
聪明的同学可能就会想,为什么叫做拉普拉斯矩阵。其实并不是拉普拉斯搞出来的,而是它和图上的拉普拉斯算子有很大的关系。
先放结论:拉普拉斯矩阵就是图上的拉普拉斯算子,或者说是离散的拉普拉斯算子。
推导警告,可直接跳过
众所周知,拉普拉斯算子如下:
Δ = ∇ 2 = ∇ ⋅ ∇ = ∑ i ∂ 2 ∂ x i 2 \Delta=\nabla^2=\nabla\cdot\nabla=\sum_i\frac{\partial^{2}}{\partial x^{2}_i} Δ=∇2=∇⋅∇=i∑∂xi2∂2
这是n维的拉普拉斯算子,而对于图这种离散的结构,偏导当然不能用了,聪明的同学一定知道了,离散域的求导就是差分嘛:
对于一个图f,我们可以仿照上面直接定义其拉普拉斯算子:
Δ f i = ∑ j ∈ N i ( f i − f j ) \Delta f_i=\sum_{j\in N_i}(f_i-f_j) Δfi=j∈Ni∑(fi−fj)
其中 N i N_i Ni为与节点i相邻的节点集合,计算出的 Δ f i \Delta f_i Δfi为节点i的拉普拉斯。上面的公示很好理解,就是所有与节点i相邻的节点和节点i做差再求和。(这里操作的是每个节点的特征)
设A为该图的邻接矩阵,那么可以把求和条件扩展为整张图,因为不相邻的地方邻接矩阵值为0:
Δ f i = ∑ j ∈ N A i , j ( f i − f j ) \Delta f_i=\sum_{j\in N}A_{i,j}(f_i-f_j) Δfi=j∈N∑Ai,j(fi−fj)
继续展开:
Δ f i = ∑ j ∈ N A i , j f i − ∑ j ∈ N A i , j f j = d i f i − ∑ j ∈ N A i , j f j \Delta f_i=\sum_{j\in N}A_{i,j}f_i-\sum_{j\in N}A_{i,j}f_j\\=d_if_i-\sum_{j\in N}A_{i,j}f_j Δfi=j∈N∑Ai,jfi−j∈N∑Ai,jfj=difi−j∈N∑Ai,jfj
其中 d i d_i di即为节点i的度,由于对A按行求和。
这里计算出的是节点i的拉普拉斯,对于整张图,我们写成矩阵形式:
Δ f = [ Δ f 1 Δ f 2 ⋮ Δ f n ] = [ d 1 f 1 − ∑ j ∈ N A 1 , j f j d 2 f 2 − ∑ j ∈ N A 2 , j f j ⋮ d n f n − ∑ j ∈ N A n , j f j ] = [ d 1 ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ d n ] f − A f = ( D − A ) f = L f \Delta f =\begin{bmatrix} \Delta f_1\\ \Delta f_2 \\ \vdots \\ \Delta f_n \end{bmatrix}\\ =\begin{bmatrix} d_1f_1-\sum_{j\in N}A_{1,j}f_j \\ d_2f_2-\sum_{j\in N}A_{2,j}f_j \\ \vdots \\ d_nf_n-\sum_{j\in N}A_{n,j}f_j \end{bmatrix}\\ =\begin{bmatrix} d_1 & \cdots & 0\\ \vdots & \ddots & \vdots\\ 0 & \cdots & d_n \end{bmatrix}f-Af\\ =(D-A)f\\ =Lf Δf=⎣⎢⎢⎢⎡Δf1Δf2⋮Δfn⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡d1f1−∑j∈NA1,jfjd2f2−∑j∈NA2,jfj⋮dnfn−∑j∈NAn,jfj⎦⎥⎥⎥⎤=⎣⎢⎡d1⋮0⋯⋱⋯0⋮dn⎦⎥⎤f−Af=(D−A)f=Lf
所以,可以清楚的看到,对图求拉欧拉斯就相当于对图左乘其拉普拉斯矩阵。
拉普拉斯矩阵的特征值分解
这一部分内容主要会与我们下一篇博客内容有关,在这里我们简单了解一下拉普拉斯矩阵的性质。
特征值分解,有的地方也叫谱分解,或者对角化,是一样的。
这里我们要记住拉普拉斯矩阵的一个性质:拉普拉斯矩阵一定是半正定对称矩阵。
依据这条性质,我们知道它一定有n个特征值,而且特征值非负。
故其特征分解为:
其中 U = ( u ⃗ 1 , u ⃗ 2 , . . . , u ⃗ n ) U=(\vec u_1,\vec u_2,...,\vec u_n) U=(u 1,u 2,...,u n)是列向量为单位特征向量的矩阵。
可以证明,U是正交矩阵,所以特征分解也可以写成:
图卷积通式
下面我们直接给出类比得出的图卷积通式,在下一篇文章中,我们再详细介绍图卷积的由来:
与卷积类似任何图卷积层都可以看做是非线性函数:
H l + 1 = f ( H l , A ) H^{l+1}=f(H^l,A) Hl+1=f(Hl,A)
H 0 = X H^0=X H0=X为第一层的输入,可以想到,非线性函数f设计不同,就会有不同的图卷积形式,下面简单的介绍几种:
1、 H l + 1 = σ ( A H l W l ) H^{l+1}=\sigma(AH^lW^l) Hl+1=σ(AHlWl)
其中 σ \sigma σ为激活函数,这个公式直观的意义就是把一个节点相邻节点的特征相加作为这一节点的输出。这样的做法显然没考虑到自己对自己的影响。
2、 H l + 1 = σ ( L H l W l ) H^{l+1}=\sigma(LH^lW^l) Hl+1=σ(LHlWl)
考虑到自己对自己的影响,我们该用拉普拉斯矩阵,但是直接用这样的拉普拉斯矩阵有着特征值没有规范化的问题,所以使用刚才所说的最通用的一种拉普拉斯矩阵作为第三种实现方式:
3、 H l + 1 = σ ( D − 1 2 L D − 1 2 H l W l ) H^{l+1}=\sigma(D^{-\frac{1}{2}}LD^{-\frac{1}{2}}H^lW^l) Hl+1=σ(D−21LD−21HlWl)
总结
这篇文章我们介绍了图与图卷积的基本概念,但这里的图卷积在实现起来还存在着一些问题,在下一篇文章中,我们将从卷积的本质来导出图上的卷积,并介绍GCN网络。
通俗全面理解图卷积与GCN网络(一):图与图卷积相关推荐
- 盛邦安全发布首个网络空间地图——网络空间坤舆图,为新基建提供数字安全底图
近日,第四届"纵横"网络空间安全创新论坛暨2022年国家网络安全宣传周国防网络安全论坛在安徽合肥举办.在网络安全新产品新技术发布环节,盛邦安全发布并展示了首个网络空间地图--网络空 ...
- 直播预告 | 基于层级超图匹配的图相似度学习网络
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 12月2日晚 7:30-8:30 AI TIME 特别邀请了新加坡国立大学博士后张震,给大家带来分享:<基于层级超图匹配的图相似度 ...
- 深入理解图卷积神经网络(GCN)原理
深入理解图卷积神经网络(GCN)原理 文章目录 深入理解图卷积神经网络(GCN)原理 前言 一.为什么需要GCN 二.GCN的原理 1.图的定义 2.GCN来了 2.1 矩阵计算公式 2.2 以小规模 ...
- 神经网络学习笔记4——GNN图神经和GCN图卷积网络
系列文章目录 博客依托于国外GNN综述 结合沐神视频 文章目录 系列文章目录 图神经 一.图是什么? 二.机器学习中使用图 1.邻接矩阵的表达 2.GNN 1.独自更新 2.VE交互更新 3.UVE交 ...
- 图卷积神经网络GCN的一些理解以及DGL代码实例的一些讲解
文章目录 前言 GCN 传播公式 例1 例2 DGL中的GCN实例 dgl.DGLGraph.update_all 参考 前言 近些年图神经网络十分火热,因为图数据结构其实在我们的现实生活中更常见,例 ...
- DeepLearning | 图卷积神经网络(GCN)解析(论文、算法、代码)
本篇博客主要讲述三种图卷积网络(Graph Convolutional Network, GCN)的算法原理及python实现,全文阅读时间约10分钟. 博主关于图神经网络的文章 DeepLearni ...
- 图卷积神经网络GCN原理+图结构学习+GAT+VGAE
https://baijiahao.baidu.com/s?id=1678519457206249337&wfr=spider&for=pc GCN是一种卷积神经网络,它可以直接在图上 ...
- 图卷积神经网络GCN大白话解读!
何时能懂你的心--图卷积神经网络(GCN) https://zhuanlan.zhihu.com/p/71200936 蝈蝈 把知道的讲清楚.公众号SimpleAI,欢迎来逛逛. 已关注 天雨粟 . ...
- IGNN图卷积超分网络:挖掘隐藏在低分辨率图像中的高清纹理
本文转载自商汤泰坦公开课. 摘要 · 看点 在NeurIPS 2020上,南洋理工大学.商汤和哈工大研究员联合提出了跨尺度的图卷积超分网络IGNN.近些年来,Non-local方法利用同尺度的自相似性 ...
最新文章
- [Linux] 010 权限管理命令 chmod
- 14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3
- 处理数字_6_NULL值的列的个数
- Linux系统调用号表
- 对于一个ul列表,单击弹出每个li对应的索引
- Ubuntu 安装 Tomcat 7.0.40
- 文件系统模拟程序python_如何使用sh实现Python虚拟文件系统
- 学习bash的一些零碎知识总结(二)
- 8——对象的作用域,生存期,……
- java出租车计费系统_基于JavaEE的出租车计费系统的设计实验报告
- java使用POI识别excel的复选框插件
- 橘子学设计模式之原型模式
- Rose Blumki
- 促进早期的父母-婴儿情感联系可以改善早产儿的皮质网络
- 推荐5款小众实用神器软件,功能强大,值得你去收藏
- OSChina 周日乱弹 ——会爬墙的不仅仅是壁虎还有班主任
- LQ0262 棋盘放麦子【大数+亿进制】
- 统计大写字母、小写字母、数字;
- h5中使用C语言sdk开发包,腾讯社交联盟广告
- matlab测量硬币尺寸,MATLAB硬币定位
热门文章
- Python的运算符
- 【优化布局】免疫算法求解充电站最优布局【含Matlab源码 2539期】
- 一些常用的市场调查与信息收集方法
- 排序算法竟能如此美丽?排序算法可视化大全!
- python 函数定义的样例
- R语言箱型图 boxplot
- 【学习笔记】《Writing Science》14-21
- 目前最流行的Web 数据接口 API 设计规范:RESTful
- c语言 case语句用大括号,c++ - 关于“ switch”中“ case”语句中的花括号 - 堆栈内存溢出...
- 快慢指针追逐法寻找单链表中环的起点