10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

Graph Neural Network:GCN 算法原理,实现和应用

2019 年 8 月 30 日

Graph Neural Network:GCN 算法原理,实现和应用

GCN 算法原理

首先,如果想要完整了解 GCN 的理论基础,我们还需要去了解空间域卷积,谱图卷积,傅里叶变换,Laplacian 算子这些,本文不涉及这些内容,感兴趣的同学可以自行查阅相关资料。


我们现在先记住一个结论,GCN 是谱图卷积的一阶局部近似,是一个多层的图卷积神经网络,每一个卷积层仅处理一阶邻域信息,通过叠加若干卷积层可以实现多阶邻域的信息传递。


每一个卷积层的传播规则如下:



其中:


  • 是无向图 G 的邻接矩阵加上自连接 ( 就是每个顶点和自身加一条边 ), 是单位矩阵。

  • 的度矩阵,即

  • 是第 层的激活单元矩阵,

  • 是每一层的参数矩阵


简单解释下,GCN 的每一层通过邻接矩阵 A 和特征矩阵 相乘得到每个顶点邻居特征的汇总,然后再乘上一个参数矩阵 加上激活函数 σ 做一次非线性变换得到聚合邻接顶点特征的矩阵


之所以邻接矩阵 A 要加上一个单位矩阵 ,是因为我们希望在进行信息传播的时候顶点自身的特征信息也得到保留。


而对邻居矩阵 进行归一化操作 是为了信息传递的过程中保持特征矩阵 H 的原有分布,防止一些度数高的顶点和度数低的顶点在特征分布上产生较大的差异。


GCN 的实现

1. GCN 卷积层实现


output = tf.matmul(tf.sparse_tensor_dense_matmul(A, features), self.kernel) if self.bias:     output += self.bias act = self.activation(output)
复制代码


上述代码片段对应的就是




只不过多了一个偏置项。


2. GCN 的实现


def GCN(adj_dim, num_class, feature_dim, dropout_rate=0.5, l2_reg=0, feature_less=True, ):    Adjs = [Input(shape=(None,), sparse=True)]    if feature_less:        X_in = Input(shape=(1,), )        emb = Embedding(adj_dim, feature_dim, embeddings_initializer=Identity(1.0), trainable=False)        X_emb = emb(X_in)        H = Reshape([X_emb.shape[-1]])(X_emb)    else:        X_in = Input(shape=(feature_dim,), )        H = X_in
H = GraphConvolution(16, activation='relu', dropout_rate=dropout_rate, l2_reg=l2_reg)( [H] + Adjs) Y = GraphConvolution(num_class, activation='softmax', dropout_rate=dropout_rate, l2_reg=0)( [H] + Adjs)
model = Model(inputs=[X_in] + Adjs, outputs=Y)
return model
复制代码


这里 feature_less 的作用是告诉模型我们是否有额外的顶点特征输入,当 feature_lessTrue 的时候,我们直接输入一个单位矩阵作为特征矩阵,相当于对每个顶点进行了 onehot 表示。


GCN 应用

本例中的训练,评测和可视化的完整代码在下面的 git 仓库中,后面还会陆续更新一些其他 GNN 算法:


https://github.com/shenweichen/GraphNeuralNetwork


使用论文引用网络数据集 Cora 进行测试,Cora 数据集包含 2708 个顶点, 5429 条边,每个顶点包含 1433 个特征,共有 7 个类别。


按照论文的设置,从每个类别中选取 20 个共 140 个顶点作为训练,500 个顶点作为验证集合,1000 个顶点作为测试集。DeepWalk 从全体顶点集合中进行采样,最后使用同样的 140 个顶点训练一个 LR 模型进行分类。


顶点分类任务结果


从分类任务结果可以看到,在使用较少训练样本的条件下 GCN 的效果是高于 DeepWalk 的,而不含顶点特征的 GCN 的效果则会变差很多。


不含顶点特征的 GCN 相当于仅仅在学习图的拓扑结构,而对于图的拓扑结构的学习 Graph Embedding 方法也能做到,这也说明了 GCN 的优势在于能够同时融入了图的拓扑结构和顶点的特征进行学习。


顶点向量可视化

从对得到的顶点向量的可视化结果来看,GCN 得到的向量相比于 DeepWalk 产出的向量确实更加能够将同类的顶点聚集在一起,不同类的顶点区分开来。


1. DeepWalk 可视化



2. GCN 可视化



参考资料

Kipf T N, Welling M. Semi-supervised classification with graph convolutional networks[J]. arXiv preprint arXiv:1609.02907, 2016.


https://arxiv.org/pdf/1609.02907.pdf


作者介绍


沈伟臣,阿里巴巴算法工程师,硕士毕业于浙江大学计算机学院。对机器学习,强化学习技术及其在推荐系统领域内的应用具有浓厚兴趣。


本文来自 DataFun 社区


原文链接


https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247493066&idx=1&sn=9e776b0e6661d052cce62e9136f39510&chksm=fbd757a6cca0deb0269c4b99ccf5c09763a0064db074c19aba1f028038cd31b88f0050fe2f0a&scene=27#wechat_redirect


2019 年 8 月 30 日 08:004356

评论

发布
暂无评论
发现更多内容

任务调度框架Quartz快速入门

程序员小毕

Java 架构 分布式 框架 quartz

Seata-AT 如何保证分布式事务一致性

阿里巴巴云原生

云计算 开源 分布式 微服务 云原生

LeetCode题解:剑指 Offer 40. 最小的k个数,sort,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

阿里云仓库使用小技巧

Java maven

SpringBoot系列(7)- 自动装配

引花眠

springboot

这份阿里P8级别内部疯传的“Linux私房菜”让你一次吃个饱

Java架构之路

Java 程序员 架构 面试 编程语言

智慧平安小区整体解决方案,智慧社区管控系统开发

13530558032

区块链食品溯源系统开发,农产品溯源小程序搭建

13530558032

3D 可视化突发公共卫生事件 ,防护效率高达90%

一只数据鲸鱼

疫情 物联网 数据可视化 数据监测 3D可视化

漏洞扫描软件AWVS的介绍和使用

行者AI

安全 漏洞

大作业2

追风

架构师一期

ARTS打卡 第28周

引花眠

微服务 ARTS 打卡计划 springboot

从根上理解高性能、高并发(二):深入操作系统,理解I/O与零拷贝技术

JackJiang

网络编程 高并发 高性能 即时通讯

窝家恶补三月,字节跳动三面,终于喜提offer!分享面试感受

Java架构之路

Java 程序员 架构 面试 编程语言

Alibaba面试官:“这该死的程序员,知识竟如此渊博!”

Java架构之路

Java 程序员 架构 面试 编程语言

CEG挖矿系统APP开发|CEG挖矿软件开发

系统开发

软件测试所需要掌握的技能

测试人生路

软件测试

浅谈如何做客户端性能测试

行者AI

性能测试

Java程序员晋升之路:“Java高级核心知识全面解析”

Java架构之路

Java 程序员 架构 面试 编程语言

Dubbo 3.0 前瞻系列:服务发现支持百万集群,带来可伸缩微服务架构

阿里巴巴云原生

开源 微服务 云原生 dubbo 中间件

你真的会学习吗?从结构化思维说起

阿里巴巴云原生

云原生 技术人 自我思考 职场成长 成长笔记

道高一丈,且看CWE4.2的新特性

华为云开发者社区

技术 安全 漏洞

7年Java开发经验,面试20多家公司,砍下16个Offer,总结干货面试题!

Java架构追梦

Java 架构 面试 大厂

ModelArts黑科技揭秘|弹性训练,让训练资源张弛有度

华为云开发者社区

学习 华为云

如何通过一个SDK轻松搞定人脸识别,拯救初入职场的程序猿

华为云开发者社区

人脸识别 智能 识别

圣诞狂欢,保险师APP赋能精细、个性化的运营服务

DT极客

字节面试坎坷之路,第一次二面凉了!捞起来之后一面就凉了;我太难了呀!

Java架构之路

Java 程序员 架构 面试 编程语言

腾讯大牛亲自带你学:Java安全weblogic T3协议漏洞!

比伯

Java 编程 架构 面试 计算机

阿里云开源项目 OAM 负责人张磊入选「中国开源先锋 33 人」

阿里巴巴云原生

开源 开发者 云原生 k8s cncf

利用文字技术帮助选购商品,慧眼“识”物的人都这样做……

华为云开发者社区

文字识别 智能 识别

阿里“云钉一体”加速整合 低代码开发平台“钉钉宜搭”发布

人称T客

Graph Neural Network:GCN 算法原理,实现和应用-InfoQ