枯燥公式先不看

个人感觉最开始如果就看公式的话,不如先举一个实例让大家了解。因为公式往往过于抽象难懂,而实例却形象容易被人记住。

在讲这个之前,大家先稍微看下下面几张图:

多层感知机的隐层计算形式为:H = σ\sigmaσ(XW)
即:特征矩阵乘以权重矩阵。其中X为特征矩阵,W为参数矩阵。

图神经网络的隐层计算形式为:H = σ\sigmaσ(AXW)
这里多了一个邻接矩阵A:三个矩阵相乘再加上一个非线性变换(对应上面图的fwf_wfw​)。

好,下面开始讲实例。

为方便大家全面理解,我没有选这篇博客的第一张图,而是选了这张简单的有向图。

那么请问,如何用数字表达这张图呢?

其实图中无非就两种信息:有啥结点(结点长啥样),以及哪个结点和哪个结点是相连接的。

那理清这个,我们只要用一个矩阵表示所有的结点(特征矩阵),另一个矩阵表示结点连接情况(邻接矩阵),就可以表示这张图啦。

下面用一个matlab的代码(python啥的都行)

A = [0, 1, 0, 0;0, 0, 1, 1;0, 1, 0, 0;1, 0, 1, 0]X = [1., -1.;2., -2.;3., -3.;4., -4.]

A 即为邻接矩阵,X 即为特征矩阵(X是随便设置的,意思是每个结点有两个特征)。

假设我们将参数矩阵置为1(单位矩阵),将σ\sigmaσ设为恒等函数,那么此时H = AX,求得:

Input: H = A*X
Output:[2., -2.;7., -7.;2., -2.;4., -4.]

大家仔细分析一下这个结果,我们不难发现:现在每个结点的特征都是其邻居点的特征和(注意,结点0指向了结点1,则结点1是结点0的邻居,同理类推)。

到这,大家应该也发现了一个问题,那就是每个结点经过一次运算后,自己的结点特征反而没了。同时,不止这样,度越大的结点越运算其特征结点就会越大,这样子会造成后面进行梯度运算时容易出现梯度爆炸的情况。

那我们先对这两种情况分别进行处理。

首先是第一种,我们增加自环,改变其邻接矩阵。

A = [1, 1, 0, 0;0, 1, 1, 1;0, 1, 1, 0;1, 0, 1, 1]X = [1., -1.;2., -2.;3., -3.;4., -4.]

同理可得:

Input: H = A*X
Output:[3., -3.;9., -9.;5., -5.;8., -8.]

此时结果中每个结点特征就包含了自己的特征。

其次是第二种,我们对对特征表征进行归一化处理,方法为:

H = D−D^-D−1^11AX
其中D−D^-D−1^11为度矩阵的逆矩阵。

D = [1, 0, 0, 0;0, 2, 0, 0;0, 0, 2, 0;0, 0, 0, 1]

先计算一下 D−D^-D−1^11A:

Input: inv(D) * A
Output:[0., 1.0, 0., 0.;0., 0, 0.5, 0.5;0., 0.5, 0., 0.;1.0, 0., 1.0, 0.]

其实不难发现,最终结果也就是每个结点的特征值都除以其对应度的值。

其目的也就是为了消除度值大小带来的影响。

继续往下算:

Input: inv(D) * A * X
Output:[2.0, -2.0;3.5, -3.5;1.0, -1.0;4.0, -4.0]

现在我们将两种情况结合起来处理并添加参数矩阵(下面是我随便设的)和激活函数ReLU:

D = [1, 0, 0, 0;0, 2, 0, 0;0, 0, 2, 0;0, 0, 0, 1]A = [1, 1, 0, 0;0, 1, 1, 1;0, 1, 1, 0;1, 0, 1, 1]X = [1., -1.;2., -2.;3., -3.;4., -4.]W = [2.0, 1.0;-1.0, 3.0]

先简单介绍一下激活函数ReLU长啥样:

即:relu = max(x, 0)

Input: max(inv(D) * A * X * W, 0)
Output:[9.0, 0.;13.5, 0.;7.5, 0.;24.0, 0.]

到这,我们就已经真正的了解了一个图结点是怎么利用自身和邻居结点进行信息更新交流的啦。

关于图的应用

大体分为两种:
graph-focused(图应用)以及node-focused(结点应用),举例如下:

左图是一个化合物,用于识别其是否为有害物质。
由于是基于图整体,单看结点没办法,所以属于图应用。

右图是一座城堡,黑点为城堡内部,白点为城堡外部,判断其结点是否为城堡内结点。
基于结点进行分类判断,属于结点应用。

(其实应该还有专注于边的应用,在此不作说明)

图神经网络

下面开始正式介绍图神经网络(最原始的GNN模型)。

首先说图,本文所讲的图如非专门说明,则如右图所示。

该模型基于信息传播机制,即每一个结点通过与其他结点进行信息交流(传播),通过不断迭代更新以达到一个稳定状态。

那如何进行结点的更新呢?

其实基本是类似于我们开头所举的实例的,不过会稍微复杂一点点。

首先, 该模型的理论基础是不动点理论(后面会详讲)。

其次,GNN通过迭代式更新所有结点的隐藏状态来实现,在t+1时刻,结点v的隐藏状态按照如下方式更新:

其中xvx_vxv​为结点v的特征,xcx_cxc​o_oo​[v]为与结点v相连边的特征,hth^thtn_nn​e_ee​[v]为结点v的邻居点的隐含层特征,xxxn_nn​e_ee​[v]为结点v的邻居点的特征。

上面这个公式中的 f 就是隐藏状态的状态更新函数,也被称为局部转移函数(local transaction function)。f 具体如何实现后面会讲。

那么,请问,当整个图的信息流动趋于平稳,即每个结点都掌握了邻居结点的信息时,此时比方说我们想判断这个结点是不是城堡内的点,咋整?

此时就需要一个输出函数来解决问题啦。

g 又被称为局部输出函数(local output function),与 f 类似,g 也可以由一个神经网络来表达,它也是一个全局共享的函数。

同时,对于不同的图来说,收敛的时刻可能不同,因为收敛是通过两个时刻p-范数的差值是否小于某个阈值 ϵ来判定的,比如:

不动点理论

在一开始我们就提到了不动点理论,那么不动点理论究竟是啥?

首先,设 F 为表示若干个 f 叠加得到的一个函数,我们称为全局更新函数,则图中所有结点的状态更新公式可以写成:

不动点定理指的就是,不论H0H^0H0是什么,只要 F 是个压缩映射(contraction map),H0H^0H0经过不断迭代必然会收敛到一个固定的点,我们称之为不动点。

那么问题又来了,啥是压缩映射呢?

压缩映射


上图的实线箭头就是指映射 F, 任意两个点 x,y 在经过 F 这个映射后,分别变成了 F(x), F(y)。压缩映射就是指,d(F(x), F(y))≤cd(x,y), 0≤c<1。也就是说,经过 F 变换后的新空间一定比原先的空间要小,原先的空间被压缩了。

想象这种压缩的过程不断进行,最终就会把原空间中的所有点映射到一个点上。

f 和 g 函数

来,我们再看一遍 f 的图:

这不就是一个前馈神经网络吗?

其实,f 是可以通过一个简单的前馈神经网络即可实现。

比如说,可以把每个邻居结点的特征、隐藏状态、每条相连边的特征以及结点本身的特征简单拼接在一起,在经过前馈神经网络后做一次简单的加和。


不懂前馈神经网络的话,可以到我的另一篇介绍神经网络的博客去看看。

那我们如何保证 f 是个压缩映射呢?

其实是通过限制 f 对 H 的偏导数矩阵的大小,这是通过一个对雅可比矩阵的惩罚项来实现的。

在代数中,有一个定理是: f 为压缩映射的等价条件是 f 的梯度/导数要小于1。

这个等价定理可以从压缩映射的形式化定义导出,我们这里使用 ||x|| 表示 x 在空间中的范数。范数是一个标量,它是向量的长度或者模,||x|| 是 x 在有限空间中坐标的连续函数。

这里把 x 简化成1维的,坐标之间的差值可以看作向量在空间中的距离,根据压缩映射的定义,可以导出:
基于此在推广一下,即得到雅可比矩阵的罚项需要满足其范数小于等于c等价于压缩映射的条件。根据拉格朗日乘子法,将有约束问题变成带罚项的无约束优化问题,训练的目标可表示成如下形式:

其中λ是超参数,与其相乘的项即为雅可比矩阵的罚项。

策略和算法

好,模型选好后,那么我们的策略(损失函数)是啥,又该怎么学习呢?

以文中一直提到的城堡举例,输出结果有是城堡内结点和不是城堡内结点两种情况,典型的二分类,那么假设监督结点一共有 p 个,模型损失可定义为:
注意:在很多应用场景中,其实我们并不清楚一些结点是哪种分类,所以我们在计算损失函数时利用到的其实并不一定是所有结点,而是那些有监督信号的结点。

模型的学习

大家可以看一看这个伪代码,我这里稍微总结一下:

FORWARD:

调用 f 若干次,比如 Tn次,直到HvH_vHv​T^TTn^nn收敛,此时每个结点的隐藏状态接近不动点的解。

BACKWARD:

对于有监督信号的结点,将其隐藏状态通过 g 得到输出,进而算出模型的损失。

我们可以直接求出 f 和 g 对最终的隐藏状态HvH_vHv​T^TTn^nn的梯度。通过迭代计算TnT_nTn​次梯度,并最终模型的参数更新。

总而言之也算是非常简单的梯度下降算法啦。

对于GNN的思考

不足性不少,比方没有太过区分边的不同重要性、迭代过多导致自身特征信息匮乏等。但作为图神经网络的开山之作,属实厉害,瑞思拜!

一文搞懂什么是图神经网络GNN【入门教程】相关推荐

  1. 图神经网络(GNN)入门之旅(三)-拉普拉斯矩阵与GCN

    知乎专栏:图神经网络 第三篇: https://zhuanlan.zhihu.com/p/344005023

  2. 【直观理解】一文搞懂RNN(循环神经网络)基础篇

    推荐阅读时间8min~15min 主要内容简介:神经网络基础.为什么需要RNN.RNN的具体结构.以及RNN应用和一些结论 1神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够 ...

  3. rnn按时间展开_一文搞懂RNN(循环神经网络)基础篇

    神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下: 将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特 ...

  4. 循环取矩阵的某行_一文搞懂RNN(循环神经网络)基础篇

    神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下: 将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特 ...

  5. 一文搞懂Q-Q plot图的含义

    欢迎关注"生信修炼手册"! Q-Q plot是关联分析结果可视化的一种经典方案,这里的Q代表quantile, 分位数的意思,关联分析的Q-Q plot示意如下 x轴代表期望p值, ...

  6. 一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  7. 一文搞懂k近邻(k-NN)算法(一)

    原文链接 一文搞懂k近邻(k-NN)算法(一) 前几天和德川一起在学习会上讲解了k-NN算法,这里进行总结一下,力争用最 通俗的语言讲解以便更多同学的理解. 本文目录如下: 1.k近邻算法的基本概念, ...

  8. 一文搞懂BN、LN、IN、GN的区别

    一文搞懂BN.LN.IN.GN的区别 批归一化(BN)已经成为许多先进深度学习模型的重要组成部分,特别是在计算机视觉领域.它通过批处理中计算的平均值和方差来规范化层输入,因此得名.要使BN工作,批大小 ...

  9. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

最新文章

  1. 从员工的离职时间,就能看出离职原因
  2. 势能线段树(均摊分析)
  3. Qt文档阅读笔记-单元测试中构建标准检测程序(CPU、Linux性能、内存泄漏等)
  4. 22. C# -- 抽象类和接口
  5. bzoj 4196 树链剖分 模板
  6. java程序中单方法接口通常是,Android面试题1--Java基础之线程(持续更新)
  7. H3C设备运行状态查询常用命令
  8. 容器技术Docker K8s 35 容器服务ACK基础与进阶-应用与发布管理
  9. QQ音乐自定义音效通用设置
  10. 【Unity】ET框架学习笔记
  11. 使用ARKit编写测量应用程序代码:交互和测量
  12. 程序猿、公关狗、设计狮……知道你们年底苦,该去京东生鲜补补了
  13. 软件系统开发步骤包括哪些过程?
  14. # simulink高级应用-matlab function中查看变量
  15. 今日头条python_GitHub - a57571735/headlines_today: 基于Python的爬取今日头条文章及视频...
  16. win10远程连接服务器出现“这可能是由于credssp加密……”的原因及解决办法,win10家庭版无法找到gpedit.msc或者组策略或安全组策略
  17. 【高效沟通技巧】与人交流要求我们巧妙地听和说
  18. 超全教授svg图标素材网站整理
  19. Linux 安装Redis 图解教程
  20. 【财富空间】陈春花:好公司就是要满足人们对美好生活的向往;技术如何驱动商业腾飞?...

热门文章

  1. MySQL8.0 OCP最新版1Z0-908认证考试题库整理-006
  2. Flutter 淡入淡出效果
  3. raid0 raid1 raid5 三种工作模式的工作原理及特点
  4. python画猫和老鼠_利用python如何实现猫捉老鼠小游戏
  5. conda安装tensorflow和conda常用命令
  6. idea如何配置jdk环境_idea配置jdk环境变量
  7. DDR2/3进阶实验测试篇
  8. 基于51单片机的篮球计时计分器仿真原理图PCB方案设计
  9. JavaSE-Lambada
  10. Java解一元一次方程,一元二次方程,一元三次方程