当前位置: 首页 > 编程日记 > 正文

通俗易懂:图卷积神经网络入门详解

640?wx_fmt=png


作者 | 蝈蝈
来源 | 转载自知乎用户蝈蝈

【导读】GCN问世已经有几年了(2016年就诞生了),但是这两年尤为火爆。本人愚钝,一直没能搞懂这个GCN为何物,最开始是看清华写的一篇三四十页的综述,读了几页就没读了;后来直接拜读GCN的开山之作,也是读到中间的数学部分就跪了;再后来在知乎上看大神们的讲解,直接被排山倒海般的公式——什么傅里叶变换、什么拉普拉斯算子等等,给搞蒙了,越读越觉得:“哇这些大佬好厉害,哎我怎么这么菜!”。

GCN的概念首次提出于ICLR2017(成文于2016年):

640?wx_fmt=jpeg


一、GCN是做什么的

在扎进GCN的汪洋大海前,我们先搞清楚这个玩意儿是做什么的,有什么用。

深度学习一直都是被几大经典模型给统治着,如CNN、RNN等等,它们无论再CV还是NLP领域都取得了优异的效果,那这个GCN是怎么跑出来的?是因为我们发现了很多CNN、RNN无法解决或者效果不好的问题——图结构的数据。

回忆一下,我们做图像识别,对象是图片,是一个二维的结构,于是人们发明了CNN这种神奇的模型来提取图片的特征。CNN的核心在于它的kernel,kernel是一个个小窗口,在图片上平移,通过卷积的方式来提取特征。这里的关键在于图片结构上的平移不变性:一个小窗口无论移动到图片的哪一个位置,其内部的结构都是一模一样的,因此CNN可以实现参数共享。这就是CNN的精髓所在。

再回忆一下RNN系列,它的对象是自然语言这样的序列信息,是一个一维的结构,RNN就是专门针对这些序列的结构而设计的,通过各种门的操作,使得序列前后的信息互相影响,从而很好地捕捉序列的特征。

上面讲的图片或者语言,都属于欧式空间的数据,因此才有维度的概念,欧式空间的数据的特点就是结构很规则。但是现实生活中,其实有很多很多不规则的数据结构,典型的就是图结构,或称拓扑结构,如社交网络、化学分子结构、知识图谱等等;即使是语言,实际上其内部也是复杂的树形结构,也是一种图结构;而像图片,在做目标识别的时候,我们关注的实际上只是二维图片上的部分关键点,这些点组成的也是一个图的结构。

图的结构一般来说是十分不规则的,可以认为是无限维的一种数据,所以它没有平移不变性。每一个节点的周围结构可能都是独一无二的,这种结构的数据,就让传统的CNN、RNN瞬间失效。所以很多学者从上个世纪就开始研究怎么处理这类数据了。这里涌现出了很多方法,例如GNN、DeepWalk、node2vec等等,GCN只是其中一种,这里只讲GCN,其他的后面有空再讨论。

GCN,图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。GCN精妙地设计了一种从图数据中提取特征的方法,从而让我们可以使用这些特征去对图数据进行节点分类(node classification)、图分类(graph classification)、边预测(link prediction),还可以顺便得到图的嵌入表示(graph embedding),可见用途广泛。因此现在人们脑洞大开,让GCN到各个领域中发光发热。


二、GCN长啥样,吓人吗

GCN的公式看起来还是有点吓人的,论文里的公式更是吓破了我的胆儿。但后来才发现,其实90%的内容根本不必理会,只是为了从数学上严谨地把事情给讲清楚,但是完全不影响我们的理解,尤其对于我这种“追求直觉,不求甚解”之人。

下面进入正题,我们直接看看GCN的核心部分是什么亚子:

假设我们手头有一批图数据,其中有N个节点(node),每个节点都有自己的特征,我们设这些节点的特征组成一个N×D维的矩阵X,然后各个节点之间的关系也会形成一个N×N维的矩阵A,也称为邻接矩阵(adjacency matrix)。X和A便是我们模型的输入。

GCN也是一个神经网络层,它的层与层之间的传播方式是:

640?wx_fmt=png

这个公式中:

  • A波浪=A+I,I是单位矩阵
  • D波浪是A波浪的度矩阵(degree matrix),公式为 640?wx_fmt=png
  • H是每一层的特征,对于输入层的话,H就是X
  • σ是非线性激活函数

我们先不用考虑为什么要这样去设计一个公式。我们现在只用知道: 640?wx_fmt=svg这个部分,是可以事先算好的,因为D波浪由A计算而来,而A是我们的输入之一。

所以对于不需要去了解数学原理、只想应用GCN来解决实际问题的人来说,你只用知道:哦,这个GCN设计了一个牛逼的公式,用这个公式就可以很好地提取图的特征。这就够了,毕竟不是什么事情都需要知道内部原理,这是根据需求决定的。

为了直观理解,我们用论文中的一幅图:

640?wx_fmt=jpeg

上图中的GCN输入一个图,通过若干层GCN每个node的特征从X变成了Z,但是,无论中间有多少层,node之间的连接关系,即A,都是共享的

假设我们构造一个两层的GCN,激活函数分别采用ReLU和Softmax,则整体的正向传播的公式为:

640?wx_fmt=png

最后,我们针对所有带标签的节点计算cross entropy损失函数:

640?wx_fmt=png

就可以训练一个node classification的模型了。由于即使只有很少的node有标签也能训练,作者称他们的方法为半监督分类

当然,你也可以用这个方法去做graph classification、link prediction,只是把损失函数给变化一下即可。

三、GCN为什么是这个亚子


我前后翻看了很多人的解读,但是读了一圈,最让我清楚明白为什么GCN的公式是这样子的居然是作者Kipf自己的博客:tkipf.github.io/graph-c 推荐大家一读。

作者给出了一个由简入繁的过程来解释:

我们的每一层GCN的输入都是邻接矩阵A和node的特征H,那么我们直接做一个内积,再乘一个参数矩阵W,然后激活一下,就相当于一个简单的神经网络层嘛,是不是也可以呢?

640?wx_fmt=png

实验证明,即使就这么简单的神经网络层,就已经很强大了。这个简单模型应该大家都能理解吧,这就是正常的神经网络操作。
但是这个简单模型有几个局限性:
  • 只使用A的话,由于A的对角线上都是0,所以在和特征矩阵H相乘的时候,只会计算一个node的所有邻居的特征的加权和,该node自己的特征却被忽略了。因此,我们可以做一个小小的改动,给A加上一个单位矩阵I,这样就让对角线元素变成1了。

  • A是没有经过归一化的矩阵,这样与特征矩阵相乘会改变特征原本的分布,产生一些不可预测的问题。所以我们对A做一个标准化处理。首先让A的每一行加起来为1,我们可以乘以一个640?wx_fmt=png ,D就是度矩阵。我们可以进一步把640?wx_fmt=png 拆开与A相乘,得到一个对称且归一化的矩阵: 640?wx_fmt=png


通过对上面两个局限的改进,我们便得到了最终的层特征传播公式:

640?wx_fmt=png

其中 640?wx_fmt=svg640?wx_fmt=png为 640?wx_fmt=svg的degree matrix。

公式中的 640?wx_fmt=png与对称归一化拉普拉斯矩阵十分类似,而在谱图卷积的核心就是使用对称归一化拉普拉斯矩阵,这也是GCN的卷积叫法的来历。原论文中给出了完整的从谱卷积到GCN的一步步推导,我是看不下去的,大家有兴趣可以自行阅读。

四、GCN有多牛


在看了上面的公式以及训练方法之后,我并没有觉得GCN有多么特别,无非就是一个设计巧妙的公式嘛,也许我不用这么复杂的公式,多加一点训练数据或者把模型做深,也可能达到媲美的效果呢。

但是一直到我读到了论文的附录部分,我才顿时发现:GCN原来这么牛啊!
为啥呢?

因为即使不训练,完全使用随机初始化的参数W,GCN提取出来的特征就以及十分优秀了!这跟CNN不训练是完全不一样的,后者不训练是根本得不到什么有效特征的。

我们看论文原文:


640?wx_fmt=jpeg

然后作者做了一个实验,使用一个俱乐部会员的关系网络,使用随机初始化的GCN进行特征提取,得到各个node的embedding,然后可视化:

640?wx_fmt=jpeg

可以发现,在原数据中同类别的node,经过GCN的提取出的embedding,已经在空间上自动聚类了。

而这种聚类结果,可以和DeepWalk、node2vec这种经过复杂训练得到的node embedding的效果媲美了。

说的夸张一点,比赛还没开始,GCN就已经在终点了。看到这里我不禁猛拍大腿打呼:“NB!”

还没训练就已经效果这么好,那给少量的标注信息,GCN的效果就会更加出色。

作者接着给每一类的node,提供仅仅一个标注样本,然后去训练,得到的可视化效果如下:

640?wx_fmt=gif


这是整片论文让我印象最深刻的地方。

看到这里,我觉得,以后有机会,确实得详细地吧GCN背后的数学琢磨琢磨,其中的玄妙之处究竟为何,其物理本质为何。这个时候,回忆起在知乎上看到的各路大神从各种角度解读GCN,例如从热量传播的角度,从一个群体中每个人的工资的角度,生动形象地解释。这一刻,历来痛恨数学的我,我感受到了一丝数学之美,于是凌晨两点的我,打开了天猫,下单了一本正版《数学之美》。哦,数学啊,你真如一朵美丽的玫瑰,每次被你的美所吸引,都要深深受到刺痛,我何时才能懂得你、拥有你?


其他关于GCN的点滴:

  1. 对于很多网络,我们可能没有节点的特征,这个时候可以使用GCN吗?答案是可以的,如论文中作者对那个俱乐部网络,采用的方法就是用单位矩阵 I 替换特征矩阵 X。
  2. 我没有任何的节点类别的标注,或者什么其他的标注信息,可以使用GCN吗?当然,就如前面讲的,不训练的GCN,也可以用来提取graph embedding,而且效果还不错。
  3. GCN网络的层数多少比较好?论文的作者做过GCN网络深度的对比研究,在他们的实验中发现,GCN层数不宜多,2-3层的效果就很好了。

这么强大的玩意儿,赶紧去试试吧!

原文链接:https://zhuanlan.zhihu.com/p/71200936

(*本文为 AI科技大本营转载文章,转载联系作者


精彩推荐



2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。5 折票倒计时 2 天!

640?wx_fmt=png


推荐阅读

相关文章:

Java数据结构一 —— Java Collections API中的表

1.Collection接口 位于java.util包中&#xff0c;以下是重要的部分。 1 public interface Collection<AnyType> extends Iterable<AnyType> 2 { 3 int size(); 4 boolean isEmpty(); 5 void clear(); 6 boolean add(AnyType x); 7 …

Swift 中的内存管理详解

这篇文章是在阅读《The Swift Programming Language》Automatic Reference Counting&#xff08;ARC&#xff0c;自动引用计数&#xff09;一章时做的一些笔记&#xff0c;同时参考了其他的一些资料。 在早期的 iOS 开发中&#xff0c;内存管理是由开发者手动来完成的。因为传统…

Ubuntu14.04 64位机上配置OpenCV3.4.2+OpenCV_Contrib3.4.2+Python3.4.3操作步骤

Ubuntu 14.04 64位上默认安装了两个版本的python&#xff0c;一个是python2.7.6,另外一个是python3.4.3。这里使用OpenCV最新的稳定版本3.4.2在Ubuntu上安装python3.4.3支持OpenCV的操作步骤如下&#xff1a; 1. 更新包&#xff0c;执行&#xff1a; sudo apt-get update sud…

“Python之父”从Dropbox退休

作者 | 若名出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;10 月 30 日&#xff0c;Python 之父 Guido Van Rossum 宣布将从工作六年的 Dropbox 公司退休&#xff0c;他在 Twitter 上转发了 Dropbox 团队写的《Thank you, Guido》公开信长文。Guido 表示&#xff0c…

谭浩强《C++程序设计》书后习题 第十三章-第十四章

2019独角兽企业重金招聘Python工程师标准>>> 最近要复习一下C和C的基础知识&#xff0c;于是计划把之前学过的谭浩强的《C程序设计》和《C程序设计》习题重新做一遍。 编译环境为&#xff1a;操作系统32位Win7&#xff0c;编译工具VC6.0 第十三章&#xff1a;输入输…

图像处理库(fbc_cv):源自OpenCV代码提取

在实际项目中会经常用到一些基本的图像处理操作&#xff0c;而且经常拿OpenCV进行结果对比&#xff0c;因此这里从OpenCV中提取了一些代码组织成fbc_cv库。项目fbc_cv所有的代码已放到GitHub中&#xff0c;地址为 https://github.com/fengbingchun/OpenCV_Test &#xff0c;它…

Swift2.x编写NavigationController动态缩放titleView

这两天看到一篇文章iOS 关于navigationBar的一些..中的动态缩放比较有意思,看了一下源码,然后用Swift写了一下,使用storyboard实现. 效果图: 部分代码: 设置滑动代理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26/**设置滑动代理- parameter scrollV…

云厂商和开源厂商“鹬蚌相争”,他却看到了开发者的新机会

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】过去一年&#xff0c;开发者生态发生了一些或巨大、或微妙的变化&#xff0c;大的变化如巨头云厂商正在通过开源、收购等方式争夺开发者生态&#xff0c;比如微软以 75 亿美金收购 GitHub&#xff…

Error: could not open 'D:\Program Files\Java\jre7\lib\amd64\jvm.cfg'

重装JDK后&#xff0c;因为没有装在以前的目录&#xff0c;运行java命令后报错&#xff0c;环境变量的设置都没有问题。解决方法&#xff1a;删除c:/windows/system32/目录下的java.exe 、javaw.exe、javaws.exe&#xff0c;找不到的话在C:\Windows\SysWOW64下找。删除三个文件…

循环神经网络(RNN)简介

人工神经网络介绍参考&#xff1a; https://blog.csdn.net/fengbingchun/article/details/50274471 卷积神经网络介绍参考&#xff1a; https://blog.csdn.net/fengbingchun/article/details/50529500 这里在以上两篇基础上整理介绍循环神经网络&#xff1a; 前馈网络可以…

Swift 中 10 个震惊小伙伴的单行代码

几年前&#xff0c;函数式编程的复兴正值巅峰&#xff0c;一篇介绍 Scala 中 10 个单行函数式代码的博文在网上走红。很快地&#xff0c;一系列使用其他语言实现这些单行代码的文章也随之出现&#xff0c;比如 Haskell&#xff0c;Ruby&#xff0c;Groovy&#xff0c;Clojure&a…

满12万送Mate 30 Pro?华为云“双十一”20+款明星产品齐上线

双十一这次是真的真的真真真来了&#xff0c;华为云11.11血拼风暴一促即发&#xff01;想好怎么玩转双十一了嘛&#xff1f;怎么买到低价高性价比的云主机&#xff1f;怎么抽到100%中奖的礼品&#xff1f;怎么当欧皇被免单&#xff1f;不仅红包、折扣、特惠、满赠、抽奖一样都没…

javascript json对象转字符串形式

2019独角兽企业重金招聘Python工程师标准>>> /*** json对象转字符串形式*/function json2str(o) {var arr [];var fmt function(s) {if (typeof s object && s ! null) return json2str(s);return /^(string|number)$/.test(typeof s) ? "" …

使用 NSURLSession 开发一个支持后台下载和断点续传的下载工具

NSURLSession 是 iOS 系统提供给我们的原生网络操作库&#xff0c;它提供了网络操作相关的一系列特性支持&#xff0c;比如缓存控制&#xff0c;Cookie管理&#xff0c;HTTP 认证处理等等&#xff0c;是一套整体的网络操作处理解决方案。 关于 NSURLSession 的基本特性&#xf…

SSHDroid及sshpass简介

一、SSHDroid简介 SSH为Secure Shell的缩写&#xff0c;是建立在应用层基础上的安全协议。SSH是目前较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。SSH客户端适用于多种平台&#xff0c;几乎所有…

漫画:我用深度学习框架画下女朋友最美的脸

这不&#xff0c;又一个程序员为爱变身灵魂画手&#xff0c;看得我都想学画画了。阿华是幸运的&#xff0c;因为他找到了对的方法&#xff0c;事半功倍&#xff0c;最终有情人终成眷属。这也得益于 PyTorch 的易学易用&#xff0c;大多数人第一次使用 PyTorch 几乎可以做到无痛…

吴恩达老师深度学习视频课笔记:循环神经网络

Why sequence models?&#xff1a;序列数据例子&#xff0c;如下图&#xff1a;(1).语音识别(speech recognition)&#xff1a;给定一个输入音频片段X&#xff0c;并要求输出片段对应的文字记录Y&#xff0c;这里输入和输出都是序列数据(sequence data)。因为X是按时序播放的音…

周伯文对话斯坦福AI实验室负责人:下一个NLP前沿是什么?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;10 月 31 日&#xff0c;在北京智源大会上&#xff0c;京东集团副总裁兼人工智能事业部总裁、智源-京东联合实验室主任周伯文&#xff0c;斯坦福人工智能实验室负责人&#xff08;SAIL&#xff09;Christopher Manning…

IOS8中SWIFT 弹出框的显示

弹出框不管是在网页端,还是在手机APP端,都是常用的控件.在网页中实现个简单的弹出框只需要调用alert,在IOS中,也不是那么复杂,也是容易使用的. 我先用xcode6创建一个名为iOS8SwiftAlertViewTutorial,设置好相关的信息. 在Storyboard中调整好视图显示方式 拖动一个按钮到主视图…

Maven学习笔记(二) :Maven的安装与配置

在Windows上安装Maven&#xff1a; 1. 首先检查安装JDK通过命令行运行命令&#xff1a;echo %JAVA_HOME%和java -version&#xff0c;能够查看当前java的安装文件夹及java的版本号&#xff0c;maven要求JDK的版本号必须在1.4以上。2. 下载Maven前往maven的下载页面:http://ma…

swift闭包

其实闭包就是函数 作为条件的函数 闭包表达式 首先声明一个数组 <code class"hljs cs has-numbering" style"display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: Source Code Pro, mono…

吴恩达老师深度学习视频课笔记:自然语言处理与词嵌入

Word representation&#xff1a;词嵌入(word embedding)&#xff0c;是语言表示的一种方式&#xff0c;可以让算法自动理解一些类似的词比如男人、女人&#xff0c;国王、王后等。通过词嵌入的概念&#xff0c;即使你的模型标记的训练集相对较小&#xff0c;也可以构建NLP(自然…

高文院士:为什么中国的AI发展必须要有开源开放平台?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;10 月 31 日&#xff0c;由北京智源人工智能研究院主办的 2019 北京智源大会在国家会议中心开幕&#xff0c;本次大会围绕人工智能基础研究现状及面临的机遇和挑战、人工智能技术未来发展的核心方向等话题&#xff0c;…

libcurl断点下载遇到的问题

最近游戏把资源&#xff08;图片、配置、lua&#xff09;的加载、更新全部改了 &#xff0c;加载其实还好&#xff0c;就是不走之前的zip解压方式。 以前的大体流程&#xff1a; 下载 –> 启动 –> 解压 –> 更新 –> 进入游戏 现在的大体流程&#xff1a; 下载 –…

sqlite3数据的使用(xcode 7,ios9)

由于考虑将来还要开发Android版本app&#xff0c;为了移植方便&#xff0c;所以使用了sqlite3来做数据持久化&#xff0c;到时候把sql语句拷过去还能用。 1、 首先用xcode载入sqlite3类库 选择工程的TARGETS-build phases-link binary with libraries&#xff0c;点击“”按钮&…

吴恩达老师深度学习视频课笔记:序列模型和注意力机制

基础模型&#xff1a;比如你想通过输入一个法语句子来将它翻译成一个英语句子&#xff0c;如下图&#xff0c;seq2seq模型&#xff0c;用x<1>一直到x<5>来表示输入句子的单词&#xff0c;然后我们用y<1>到y<6>来表示输出的句子的单词&#xff0c;如何训…

七个开发者成就百亿市值公司?这个技术思路如今让阿里发扬光大

2015年&#xff0c;马云带领阿里巴巴集团的高管拜访了位于芬兰游戏公司supercell 这家公司开发出了《部落战争》、《皇室战争》、《海岛奇兵》等App端知名游戏图片来自多玩BBS社区但是&#xff0c;这么知名的游戏公司开发团队当时却不足7人&#xff01;整个团队好像cell一样&am…

Linux学习笔记之文件管理和目录管理类命令

在开始理解Linux文件管理和目录类命令之前&#xff0c;有必要先说一下&#xff0c;关于操作系统在计算机中都做了哪些工作。0、操作系统的工作1、文件管理&#xff0c;增删改查2、目录管理3、进程管理4、软件安装5、运行程序6、网络管理7、设备管理本次笔记介绍的是文件管理和目…

张钹、朱松纯、黄铁军等同台激辩:人工智能的“能”与“不能”

整理 | AI科技大本营编辑部出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;10 月 31 日&#xff0c;由北京智源人工智能研究院主办的 2019 北京智源大会在国家会议中心开幕&#xff0c;本次大会吸引了国际人工智能领域的顶级专家学者参加&#xff0c;围绕人工智能基础…

ssqlit3.0数据库使用方法

由于考虑将来还要开发Android版本app&#xff0c;为了移植方便&#xff0c;所以使用了sqlite3来做数据持久化&#xff0c;到时候把sql语句拷过去还能用。 1、 首先用xcode载入sqlite3类库 选择工程的TARGETS-build phases-link binary with libraries&#xff0c;点击“”按钮&…