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

GraphSAGE:我寻思GCN也没我厉害!

640?wx_fmt=jpeg

作者 | 郭必扬来源 | SimpleAI(ID:SimpleAI_1


640?wx_fmt=jpeg



众所周知,2017年ICLR出产的GCN现在是多么地热门,仿佛自己就是图神经网络的名片。然而,在GCN的风头中,很多人忽略了GCN本身的巨大局限——Transductive Learning——没法快速表示新节点,这限制了它在生产环境中应用。同年NIPS来了一篇使用Inductive Learning的GraphSAGE,解决了这个问题。今天,让我们来一起琢磨琢磨这个GraphSAGE是个什么玩意儿。


一、回顾GCN及其问题


对GCN不熟悉的盆友,可以看看我的上一篇文章:《何时能懂你的心——图卷积神经网络(GCN)》(https://zhuanlan.zhihu.com/p/71200936)


  • GCN的基本思想: 把一个节点在图中的高纬度邻接信息降维到一个低维的向量表示。 
  • GCN的优点: 可以捕捉graph的全局信息,从而很好地表示node的特征。
  • GCN的缺点:Transductive learning的方式,需要把所有节点都参与训练才能得到node embedding,无法快速得到新node的embedding。

得到新节点的表示的难处:
要想得到新节点的表示,需要让新的graph或者subgraph去和已经优化好的node embedding去“对齐”。然而每个节点的表示都是受到其他节点的影响,因此添加一个节点,意味着许许多多与之相关的节点的表示都应该调整。这会带来极大的计算开销,即使增加几个节点,也要完全重新训练所有的节点,这可太费劲了。
因此我们需要换一种思路:
既然新增的节点,一定会改变原有节点的表示,那么我们干嘛一定要得到每个节点的一个固定的表示呢?我们何不直接学习一种节点的表示方法。这样不管graph怎么改变,都可以很容易地得到新的表示。

二、GraphSAGE是怎么做的


针对这种问题,GraphSAGE模型提出了一种算法框架,可以很方便地得到新node的表示。
基本思想:
去学习一个节点的信息是怎么通过其邻居节点的特征聚合而来的。学习到了这样的“聚合函数”,而我们本身就已知各个节点的特征和邻居关系,我们就可以很方便地得到一个新节点的表示了。
GCN等transductive的方法,学到的是每个节点的一个唯一确定的embedding;而GraphSAGE方法学到的node embedding,是根据node的邻居关系的变化而变化的,也就是说,即使是旧的node,如果建立了一些新的link,那么其对应的embedding也会变化,而且也很方便地学到。


1. Embedding generation


即GraphSAGE的前向传播算法。


640?wx_fmt=jpeg


上面的算法的意思是:
假设我们要聚合K次,则需要有K个聚合函数(aggregator),可以认为是N层。每一次聚合,都是把上一层得到的各个node的特征聚合一次,在假设该node自己在上一层的特征,得到该层的特征。如此反复聚合K次,得到该node最后的特征。最下面一层的node特征就是输入的node features。
用作者的图来表示就是这样的:(虽然酷炫,但有点迷糊)


640?wx_fmt=jpeg


我来画一个图说明:(虽然朴素,但是明明白白)


640?wx_fmt=jpeg


这里需要注意的是,每一层的node的表示都是由上一层生成的,跟本层的其他节点无关。

2.GraphSAGE的参数学习


在上面的过程中,我们需要学习各个聚合函数的参数,因此需要设计一个损失函数。损失函数是设计是根据目标任务来的,可以是无监督的,也可以是有监督的。
对于无监督学习,我们设计的损失函数应该让临近的节点的拥有相似的表示,反之应该表示大不相同。所以损失函数是这样的:


640?wx_fmt=png



也没什么好解释的。对于有监督学习,可以直接使用cross-entropy。


3. 聚合函数的选择


这里作者提供了三种方式:
  • Mean aggregator :
    直接取邻居节点的平均,公式过于直白故不展示。
  • GCN aggregator:这个跟mean aggregator十分类似,但有细微的不同,公式如下:


640?wx_fmt=png


把这个公式,去替换前面给的Algorithm1中的第4,5行。自己体会一下哪里不同。想不明白的留言。实际上,这个几乎就是GCN中的聚合方式,想一想为啥。

  • LSTM aggregator:
    使用LSTM来encode邻居的特征。这里忽略掉邻居之间的顺序,即随机打乱,输入到LSTM中。这里突然冒出来一个LSTM我也是蛮惊讶,作者的想法是LSTM的表示能力比较强。但是这里既然都没有序列信息,那我不知道LSTM的优势在何处。
  • Pooling aggregator:
    把各个邻居节点单独经过一个MLP得到一个向量,最后把所有邻居的向量做一个element-wise的max-pooling或者什么其他的pooling。公式如下:


640?wx_fmt=png



这就是GraphSAGE的主要内容了,其实思路还是十分简洁的,理解起来也比GCN容易多了。


邻居的定义:


前面一直都没讨论一个点,那就是如何选择一个节点的邻居以及多远的邻居。这里作者的做法是设置一个定值,每次选择邻居的时候就是从周围的直接邻居(一阶邻居)中均匀地采样固定个数个邻居。
那我就有一个疑问了?每次都只是从其一阶邻居聚合信息,为何作者说:随着迭代,可以聚合越来越远距离的信息呢?
后来我想了想,发现确实是这样的。虽然在聚合时仅仅聚合了一个节点邻居的信息,但该节点的邻居,也聚合了其邻居的信息,这样,在下一次聚合时,该节点就会接收到其邻居的邻居的信息,也就是聚合到了二阶邻居的信息了。还是拿出我的看家本领——用图说话:


640?wx_fmt=jpeg


我的天,这个图简直画的太好了吧。
图中(为了图的简洁,这里假设只随机聚合两个邻居)可以看出,层与层之间,确实都是一阶邻居的信息在聚合。在图中的“1层”,节点v聚合了“0层”的两个邻居的信息,v的邻居u也是聚合了“0层”的两个邻居的信息。到了“2层”,可以看到节点v通过“1层”的节点u,扩展到了“0层”的二阶邻居节点。因此,在聚合时,聚合K次,就可以扩展到K阶邻居。
在GraphSAGE的实践中,作者发现,K不必取很大的值,当K=2时,效果就灰常好了,也就是只用扩展到2阶邻居即可。至于邻居的个数,文中提到S1×S2<=500,即两次扩展的邻居数之际小于500,大约每次只需要扩展20来个邻居即可
这也是合情合理,例如在现实生活中,对你影响最大就是亲朋好友,这些属于一阶邻居,然后可能你偶尔从他们口中听说一些他们的同事、朋友的一些故事,这些会对你产生一定的影响,这些人就属于二阶邻居。但是到了三阶,可能基本对你不会产生什么影响了,例如你听你同学说他同学听说她同学的什么事迹,是不是很绕口,绕口就对了,因为你基本不会听到这样的故事,你所接触到的、听到的、看到的,基本都在“二阶”的范围之内


三、效果与性能分析


这个部分是最没意思的,毕竟谁发paper不是说自己的模型最牛逼?


640?wx_fmt=jpeg



这个部分我不想多说,三个图都很好理解。


(彩蛋)思考 & GCN的反刍:


在看完GraphSAGE之后,我又回头把GCN思考了一遍。从直观上去看,我一开始觉得GraphSAGE和GCN截然不同,后来发现只是论文作者的介绍的角度不同,实际上两者的本质上没有很大差别。或者说,懂了GraphSAGE的原理之后,再去看GCN,会发GCN没那么难以理解了。
来人啊,GCN公式搬上来:


640?wx_fmt=png


额,,,这个是丑版本的公式,还是上美版本的吧:


640?wx_fmt=png


中间这个A帽子,就是上面丑公式中的那一大串东西。对A帽子的理解,其实它就是邻接矩阵A做的一个归一化下面为了表达的方便,我直接当做邻接矩阵来分析吧!H是节点的每一层的特征矩阵。
这个公式的内部,画成矩阵相乘的形式是这样的:


640?wx_fmt=png


其中,A是n×n维,H是n×m维,W则是m×u维。n就是节点个数,m则是节点特征的维度,u就是神经网络层的单元数。
我们先看看A乘以H是个啥意思:


640?wx_fmt=jpeg


A帽子矩阵的第i行和H矩阵的第j列对应元素相乘在求和就得到Q矩阵的(i,j)个元素。这都是最基本的线性代数了,但我们不妨再仔细看看我图中高亮的那几个向量的内部:


640?wx_fmt=jpeg


这个图说的明明白白,所以我们发现,GCN的这一步,跟GraphSAGE是一样的思想,都是把邻居的特征做一个聚合(aggregation)


640?wx_fmt=jpeg


所以,都是一个词——Aggregate!Aggregate就完事儿了。
这也是为什么GraphSAGE的作者说,他们的mean-aggregator跟GCN十分类似。在GCN中,是直接把邻居的特征进行求和,而实际不是A跟H相乘,而是A帽子,A帽子是归一化的A,所以实际上我画的图中的邻居关系向量不应该是0,1构成的序列,而是归一化之后的结果,所以跟H的向量相乘之后,相当于是“求平均”。GraphSAGE进一步拓展了“聚合”的方法,提出了LSTM、Pooling等聚合方式,不是简单地求平均,而是更加复杂的组合方式,所以有一些效果的提升也是在情理之内的。
至于说为什么GCN是transductive,为啥要把所有节点放在一起训练?我感觉不一定要把所有节点放在一起训练,一个个节点放进去训练也是可以的。无非是你如果想得到所有节点的embedding,那么GCN可以让你一口气把整个graph丢进去,直接得到embedding,还可以直接进行节点分类、边的预测等任务。
其实,通过GraphSAGE得到的节点的embedding,在增加了新的节点之后,旧的节点也需要更新,这个是无法避免的,因为,新增加点意味着环境变了,那之前的节点的表示自然也应该有所调整。只不过,对于老节点,可能新增一个节点对其影响微乎其微,所以可以暂且使用原来的embedding,但如果新增了很多,极大地改变的原有的graph结构,那么就只能全部更新一次了。
从这个角度去想的话,似乎GraphSAGE也不是什么“神仙”方法,只不过生成新节点embedding的过程,实施起来相比于GCN更加灵活方便了。我们学习到了各种的聚合函数之后,其实就不用去计算所有节点的embedding,而是我们需要去考察哪些节点,就现场去计算,这种方法的迁移能力也很强,在一个graph上学得了节点的聚合方法,到另一个新的类似的graph上就可以直接使用了。好啦,关于GraphSAGE的介绍就到这里,我个人在读了这篇文章后还是收获颇丰的,尤其是和GCN对比的过程,让我对二者都有了更加深刻的认识。

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


社群福利

扫码添加小助手,回复:大会,加入2019 AI开发者大会福利群,每周一、三、五更新技术福利,还有不定期的抽奖活动~

640?wx_fmt=jpeg


精彩推荐



640?wx_fmt=jpeg


60+技术大咖与你相约 2019 AI ProCon!大会早鸟票已售罄,优惠票速抢进行中......2019 AI开发者大会将于9月6日-7日在北京举行,这一届AI开发者大会有哪些亮点?一线公司的大牛们都在关注什么?AI行业的风向是什么?2019 AI开发者大会,倾听大牛分享,聚焦技术实践,和万千开发者共成长。


推荐阅读

  • 通俗易懂:图解10大CNN网络架构

  • AI+DevOps正当时

  • 5天破10亿的哪吒,为啥这么火,Python来分析

  • 5G+AI重新定义生老病死

  • 北上深人均月薪超 2 万元,清华近三成毕业生年入 50 万+,5G 人才月薪超 4 万

  • 如何从零开始设计一颗芯片?

  • 在其他国家被揭穿骗子又盯上非洲? 这几个骗子公司可把非洲人民坑苦了…

  • 国内首款 5G 机型开售;Google Chrome 大部分插件无人用;Firefox 69 Beta 9 发布 | 极客头条

640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢


相关文章:

CxImage的编译及简单使用举例

1、 从http://sourceforge.net/projects/cximage/下载最新的CxImage 702源码&#xff1b; 2、 解压缩后&#xff0c;以管理员身份打开CxImageFull_vc10.sln工程&#xff0c;在编译之前先将每个工程属性的Character Set由原先的Use Unicode Character Set改为Use Multi-ByteC…

如何使用好android的可访问性服务(Accessibility Services)

原文&#xff1a;http://android.eoe.cn/topic/android_sdk * 主题* Manifest声明和权限 可访问性服务声明 可访问性服务配置 AccessibilityService方法 获得事件细节 示例代码 主要的类*AccessibilityService AccessibilityServiceInfo AccessibilityEvent AccessibilityReco…

自动驾驶人的福音!Lyft公开Level 5部署平台Flexo细节

作者 | Mathias Gug等&#xff0c;Lyft Level 5 软件工程师译者 | Lucy编辑 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;经过一年半的 bootstrapping&#xff08;一种再抽样统计方法&#xff09;&#xff0c;Lyft 让 Level 5 实现区分非常…

Cygwin的安装及在Android jni中的简单使用举例

Cygwin是一个在windows平台上运行的类UNIX模拟环境&#xff0c;是cygnussolutions公司开发的自由软件。Cygwin是许多自由软件的集合&#xff0c;Cygwin的主要目的是通过重新编译&#xff0c;将POSIX系统上的软件移植到Windows上。Cygwin包括了一套库&#xff0c;该库在win32系统…

university, school, college, department, institute的区别

这些个词没有太大区别&#xff0c;有时候有些词是可以通用的&#xff0c;而有些用法则是随着地域时间的不同而变迁。一般说来&#xff0c;college译作“学院”&#xff0c;它是university &#xff08;综合性大学&#xff09;的一个组成部分&#xff0c;例如&#xff0c;一所综…

XML简介及举例

可扩展标记语言(eXtensibleMarkup Language&#xff0c;简称XML)&#xff0c;是一种标记语言。标记指计算机所能理解的信息符号&#xff0c;通过此种标记&#xff0c;计算机之间可以处理包含各种信息的文章等。如何定义这些标记&#xff0c;既可以选择国际通用的标记语言&#…

关于事务的传播特性和隔离级别的问题

REQUIRED&#xff1a;业务方法需要在一个事务中运行。如果方法运行时&#xff0c;已经处在一个事务中&#xff0c;那么加入到该事务&#xff0c;否则为自己创建一个新的事务。 NOT_SUPPORTED&#xff1a;声明方法不需要事务。如果方法没有关联到一个事务&#xff0c;容器不会为…

[Big Data - Kafka] kafka学习笔记:知识点整理

一、为什么需要消息系统 1.解耦&#xff1a; 允许你独立的扩展或修改两边的处理过程&#xff0c;只要确保它们遵守同样的接口约束。 2.冗余&#xff1a;消息队列把数据进行持久化直到它们已经被完全处理&#xff0c;通过这一方式规避了数据丢失风险。许多消息队列所采用的&q…

自然语言处理十问!独家福利

最近&#xff0c;NLP 圈简直不要太热闹&#xff01;预训练模型频频刷新榜单&#xff0c;让一众研究者、开发者“痛并快乐着”。自 2018 年 10 月&#xff0c;Google 提出 BERT 以来&#xff0c;NLP 领域预训练模型的发展仿佛坐上了火箭&#xff0c;完全控制不住。BERT 出世前&a…

BERT的成功是否依赖于虚假相关的统计线索?

作者 | 李理来源 | 个人博客导读&#xff1a;本文介绍论文Probing Neural Network Comprehension of Natural Language Arguments&#xff0c;讨论BERT在ACRT任务下的成绩是否依赖虚假的统计线索&#xff0c;同时分享一些个人对目前机器学习尤其是自然语言理解的看法。目录论文…

【电子基础】模拟电路问答

模拟电路基础知识问答整理 mystery 1、温度对半导体材料的导电性能有什么影响? 答&#xff1a;温度对半导体的导电性能有很大影响。当温度升高时&#xff0c;半导体材料内的自由电子和空穴数量迅速增加&#xff0c;半导体的导电性能将迅速提高。 2、什么是本征半导体和杂质半导…

XML解析简介及Xerces-C++简单使用举例

XML是由World WideWeb联盟(W3C)定义的元语言。它已经成为一种通用的数据交换格式&#xff0c;它的平台无关性&#xff0c;语言无关性&#xff0c;系统无关性&#xff0c;给数据集成与交互带来了极大的方便。XML在不同的语言里解析方式都是一样的&#xff0c;只不过实现的语法不…

[干货]Kaggle热门 | 用一个框架解决所有机器学习难题

新智元推荐 来源&#xff1a;LinkedIn 作者&#xff1a;Abhishek Thakur 译者&#xff1a;弗格森 【新智元导读】本文是数据科学家Abhishek Thakur发表的Kaggle热门文章。作者总结了自己参加100多场机器学习竞赛的经验&#xff0c;主要从模型框架方面阐述了机器学习过程中可能会…

gtest简介及简单使用

gtest是一个跨平台(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)的C测试框架&#xff0c;有google公司发布。gtest测试框架是在不同平台上为编写C测试而生成的。从http://code.google.com/p/googletest/downloads/detail?namegtest-1.7.0.zip&can2&q下…

新浪微博推广网站的一些实践体会

本以为微博推广很难&#xff0c;每天都要刷粉刷内容的&#xff0c;也本以为做微博推广也很简单&#xff0c;一不卖产品、二不卖服务的&#xff0c;目的单纯灵活性强些&#xff0c;做了之后才发现都不是那么回事&#xff0c;微博虽然也过了“火了”&#xff0c;但新媒体还真是不…

AI和大数据如何落地智能城市?京东城市这6篇论文必读 | KDD 2019

来源 | 京东城市&#xff08;ID: icity-jd&#xff09;作为世界数据挖掘领域的最高级别的学术会议&#xff0c;ACM SIGKDD&#xff08;国际数据挖掘与知识发现大会&#xff0c;简称 KDD&#xff09;将于 2019 年 8 月 4 日—8 日在美国阿拉斯加州安克雷奇市举行。自 1995 年以来…

OSError: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so

OSError: Could not find library geos_c or load any of its variants [libgeos_c.so.1, libgeos_c.so 解决&#xff1a; sudo vim /etc/ld.so.conf 添加&#xff1a;/opt/source/geos-3.5.0/build/lib sudo ldconfig

五分钟搭建BERT服务,实现1000+QPS​,这个Service-Streamer做到了

作者 | 刘欣简介&#xff1a;刘欣&#xff0c;Meteorix&#xff0c;毕业于华中科技大学&#xff0c;前网易游戏技术总监&#xff0c;现任香侬科技算法架构负责人。之前专注游戏引擎工具架构和自动化领域&#xff0c;2018年在GDC和GoogleIO开源Airtest自动化框架&#xff0c;广泛…

Nagios+pnp4nagios+rrdtool 安装配置为nagios添加自定义插件(三)

nagios博大精深&#xff0c;可以以shell、perl等语句为nagios写插件&#xff0c;来满足自己监控的需要。本文写mysql中tps、qps的插件&#xff0c;并把收集到的结果以图形形式展现出来&#xff0c;这样输出的结果就有一定的要求了。 编写插件tps qps check_qps 插件如下内容 #…

OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤

OpenSSL介绍&#xff1a;OpenSSL是一个强大的安全套接字层密码库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;并提供丰富的应用程序供测试或其它目的使用。 SSL是SecureSockets Layer(安全套接层协议)的缩写&#xff0c;可以在Interne…

Guava Cache本地缓存在 Spring Boot应用中的实践

概述 在如今高并发的互联网应用中&#xff0c;缓存的地位举足轻重&#xff0c;对提升程序性能帮助不小。而 3.x开始的 Spring也引入了对 Cache的支持&#xff0c;那对于如今发展得如火如荼的 Spring Boot来说自然也是支持缓存特性的。当然 Spring Boot默认使用的是 SimpleCache…

Windows 8.1 Preview(Windows Blue)预览版简体中文官方下载(ISO完整版镜像)

Windows 8.1是微软继Windows 8以来的又一全新力作&#xff0c;又名Windows Blue&#xff08;视窗蓝&#xff0c;专注蓝屏30年&#xff09;&#xff0c;个人觉得Win8还是比较流畅的但大众始终觉得还是有很多需要改进或者改善的&#xff0c;如今微软为了迎合大众需求对Win8进行升…

Linux下编辑器vi/vim的使用介绍

vi编辑器是所有Unix及Linux系统下标准的编辑器。对Unix及Linux系统的任何版本&#xff0c;vi编辑器是完全相同的。 基本上vi可以分为三种状态&#xff0c;分别是命令模式(commandmode)、插入模式(insert mode)和底行模式(last line mode)&#xff0c;各模式的功能为&#xff1…

Clojure程序设计

《Clojure程序设计》基本信息作者&#xff1a; (美)Stuart Halloway Aaron Bedra [作译者介绍]出版社&#xff1a;人民邮电出版社ISBN&#xff1a;9787115308474上架时间&#xff1a;2013-3-1出版日期&#xff1a;2013 年3月开本&#xff1a;16开页码&#xff1a;230版次&#…

重磅!AI Top 30+案例评选正式启动

2019 年&#xff0c;人工智能应用落地的重要性正在逐步得到验证&#xff0c;这是关乎企业生死攸关的一环。科技巨头、AI 独角兽还有起于草莽的创业公司在各领域进行着一场多方角斗。进行平台布局的科技巨头们&#xff0c;正在加快承载企业部署 AI 应用的步伐&#xff0c;曾经无…

直播回顾 | 关于Apollo 5.0控制在环仿真技术的分享

Apollo 用于模型验证和测试的基于 Web 的仿真平台 Dreamland 已经更新到能使用更强大的场景编辑器和环控制模拟。基于 Apollo 流水线和机器学习的动力学模型&#xff0c;复杂度较高&#xff0c;同时基于 AI 的全景数据建模&#xff0c;模型精细度高&#xff0c;误差比传统方式可…

eclipes 安装 pytdev,svn,插件

1&#xff0c; python pydevhttp://pydev.org/updates2, svnhttp://subclipse.tigris.org/update3, 推荐http://subclipse.tigris.org/update_1.10.x 转载于:https://blog.51cto.com/swq499809608/1240873

FFmpeg简介及在vc2010下编译步骤

FFmpeg是一个开源的多媒体库&#xff0c;最新版本是2.4.3&#xff0c;它的License是LGPL或GPL。FFmpeg可以用来记录、转换数字音频、视频&#xff0c;并能将其转换为流的开源计算机程序。它包括了音/视频编码库libavcodec。FFmpeg是在Linux下开发出来的&#xff0c;但它可以在包…

医院六级电子病历建设思路及要点

产生背景 在医院电子病历信息化发展的过程中&#xff0c;先后经历了纸质病历、电子病历、结构化电子病历以及具有全医疗过程管理能力的电子病历四个阶段。临床业务需求质量的逐步提升&#xff0c;标准规范的逐步细化&#xff0c;互联网战略的落地实施&#xff0c;无疑对目前电子…

上手必备!不可错过的TensorFlow、PyTorch和Keras样例资源

作者 | 黄海广来源 | 机器学习初学者&#xff08;ID: ai-start-com&#xff09;TensorFlow、Keras和PyTorch是目前深度学习的主要框架&#xff0c;也是入门深度学习必须掌握的三大框架&#xff0c;但是官方文档相对内容较多&#xff0c;初学者往往无从下手。本人从github里搜到…