前面几次的整理GCN,GAT,GraphSAGE等等都适合在半监督,监督的场景下,而有没有图方法可以使用于在无监督的场景下使用呢?去发现节点的内在结果,挖掘隐藏关系如链接预测等等任务。

答案是:自编码器(AE) /变分自编码器(VAE)+Graph

Graph Auto-Encoders (GAE)
GAE的目的是通过encoder-decoder 的结构去获取到图中节点的 embedding,然后再去做具体的下游任务比如链接预测。

首先回顾一下自编码器,它是利用神经网络将数据逐层降维压缩,相当于让每层神经网络之间的激活函数就起到了将"线性"转化为"非线性"的作用,然后尝试还原输入即让输出==输出以捕捉到数据的隐含信息。整体的结构分编码器Decoder和解码器Encoder,编码器负责压缩,解码器负责还原。同样的,想要在Graph上也完成这种操作,也是使用encoder-decoder 的结构,具体操作如上图:

  • Encoder。直接使用 GCN 作为 encoder,来得到节点的 latent representations(即关于每个节点的 embedding)
    Z=GCN(A)Z=GCN(A)Z=GCN(A) 其中A是邻接矩阵,Z代表的就是所有节点的表示,如果接下来要做下游任务也是直接使用这个表示就可以。

  • Decoder。这里和原来的AE不一样,不是对称结构的网络,而是直接采用内积 inner-product 作为 decoder 来重构(reconstruct)原始的Graph
    A′=σ(ZTZ)A'=\sigma (Z^TZ)A=σ(ZTZ)这里的A’就是重构(reconstruct)出来的邻接矩阵,可以被理解为两个节点的独立事件概率相乘。

  • 最后的目标是使重构出的邻接矩阵与原始的邻接矩阵尽可能的相似,因为邻接矩阵决定了图的结构。所以直接采用交叉熵作为损失函数衡量A和A’就可以了
    L=−1N∑ylogy′+(1−y)log(1−y′)L=-\frac{1}{N}\sum ylogy'+(1-y)log(1-y')L=N1ylogy+(1y)log(1y)
    其中y代表邻接矩阵 A 中某个元素的值(0 或 1),y’ 代表重构的邻接矩阵A’中相应元素的值(概率值)。

pytorch_geomatric的实现:

class EncoderGCN(nn.Module): #编码器def __init__(self, n_total_features, n_latent, p_drop=0.):super(EncoderGCN, self).__init__()self.n_total_features = n_total_featuresself.conv1 = GCNConv(self.n_total_features, 11)self.act1=nn.Sequential(nn.ReLU(),nn.Dropout(p_drop))self.conv2 = GCNConv(11, 11)self.act2 = nn.Sequential(nn.ReLU(),nn.Dropout(p_drop))self.conv3 = GCNConv(11, n_latent)def forward(self, data): #实践中一般采取多层的GCN来编码x, edge_index = data.x, data.edge_indexx = self.act1(self.conv1(x, edge_index))x = self.act2(self.conv2(x, edge_index))x = self.conv3(x, edge_index) #经过三层GCN后得到节点的表示return xclass DecoderGCN(nn.Module): #解码器def __init__(self):super(DecoderGCN, self).__init__()def forward(self, z):A = torch.mm(z, torch.t(z)) #直接算点积A = torch.sigmoid(A) #映射成分数return A

完整逐行的中文源码阅读笔记可以参考:https://github.com/nakaizura/Source-Code-Notebook/tree/master/GAE

GAE和AE的区别

  • GAE在encoder过程中使用了 n∗n 矩阵的卷积核
  • GAE在decoder部分实际上没有解码,直接计算内积算邻接矩阵的相似度,然后用loss来约束


GVAE
上面的 GAE 用于重建(数据压缩和还原)效果还不错,但是如果用于直接的图生成就不够了,所以同样的AE不行,那VAE来试一下。VGAE 的思想和变分自编码器(VAE)很像,博主已经仔细推导过就不再赘述,大致的想法是:利用隐变量(latent variables),让模型学习出一些分布(distribution),再从这些分布中采样得到z,通过这样的z就会有多样化的结果,而不仅仅是还原,重建。

如上图,其与GAE的不同只在Encoder的部分,后面的Decoder还是用内积基本是一样的,对于编码器即在GAE中是直接使用GCN作为编码器,它是一个确定的函数所以只能得到确定的结果。而在VGAE中,不再使用这样的函数得到Z,而是从一个多维的高斯分布中采样得到,即用GCN确定分布,再从分布中采样Z。

  • Encoder。而这样的分布,使用两个GCN来分别得到高斯分布的均值和方差就行了,即VGAE 利用GCN来分别计算均值和方差:
    u=GCNu(X,A)u=GCN_u(X,A)u=GCNu(X,A) σ=GCNσ(X,A)\sigma=GCN_{\sigma}(X,A)σ=GCNσ(X,A) 再将使其与 noise(随机生成的变量)相乘,相加,便得到高斯分布上采样到的一个Zz=u+ϵ×σz=u+\epsilon \times \sigmaz=u+ϵ×σ
  • Decoder和GAE是一样的,只是由于使用了变分的思想,所以损失函数变成了:loss=Eq(Z∣X,A)[logp(A∣Z)]−KL[Q(Z∣X,A)∣∣p(Z)]loss=E_{q(Z|X,A)} [log p(A|Z)]-KL[Q(Z|X,A)||p(Z)]loss=Eq(ZX,A)[logp(AZ)]KL[Q(ZX,A)p(Z)]变分下界写出的优化目标,第一项是期望,第二项是 KL 散度,详细推导在这里。
class EncoderGCN(nn.Module): #和GAE的一样def __init__(self, n_total_features, n_latent, p_drop=0.):super(EncoderGCN, self).__init__()self.n_total_features = n_total_featuresself.conv1 = GCNConv(self.n_total_features, 11)self.act1=nn.Sequential(nn.ReLU(),nn.Dropout(p_drop))self.conv2 = GCNConv(11, 11)self.act2 = nn.Sequential(nn.ReLU(),nn.Dropout(p_drop))self.conv3 = GCNConv(11, n_latent)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.act1(self.conv1(x, edge_index))x = self.act2(self.conv2(x, edge_index))x = self.conv3(x, edge_index)return xdef reparametrize(self, mean, log_std): #通过mean和std得到zif self.training:return mean + torch.randn_like(log_std) * torch.exp(log_std)else:return meandef encode(self, *args, **kwargs):self.mean, self.log_std = self.encoder(*args, **kwargs) #两个GCN分别得到mean和stdz = self.reparametrize(self.mean, self.log_std) #得到zreturn z

ARGA
编码器是否真的能够习得一个高斯分布?上GAN吧…即把模型分为生成器和判别器两部分,让两者对抗训练。

  • 生成器直接使用GAE,输出还原的图A’
  • 判别器使用成对比较咯,即将正例和负例同时输入到神经网络中,由判别器直接尝试区分这两者
class Discriminator(nn.Module):def __init__(self, n_input):super(Discriminator, self).__init__()# 判别器是3层FCself.fcs = nn.Sequential(nn.Linear(n_input,40),nn.ReLU(),nn.Linear(40,30),nn.ReLU(),nn.Linear(30,1),nn.Sigmoid())def forward(self, z):return self.fcs(z)class ARGA(nn.Module):def __init__(self, n_total_features, n_latent):super(ARGA, self).__init__()#这里的encode和decoder都是GAE的东西,一起作为生成器self.encoder = EncoderGCN(n_total_features, n_latent)self.decoder = DecoderGCN()self.discriminator = Discriminator(n_latent)def forward(self, x):z_fake = self.encoder(x)z_real=torch.randn(z_fake.size())A = self.decoder(z_fake) #得到生成的A# 让判别器区分真 与 假。d_real=self.discriminator(z_real)d_fake=self.discriminator(z_fake)return A, d_real, d_fakedef simulate(self, x): #训练完成后可以用来生成更好的Az_fake = self.encoder(x)A = self.decoder(z_fake)return A

其实除了这几份工作外,可以无监督的表示学习方法还有SDNE这种,而使用GAN的思想,其实也有做的更充分的工作比如GraphGAN,所以好像相比较之下,这三个算法更适合做链接预测,用于推荐系统之类的,比如GCMC。

Graph Neural Network(GAE,GVAE,ARGA)相关推荐

  1. Heterogeneous Graph Neural Network(异质图神经网络)

    Heterogeneous Information Network 传统的同构图(Homogeneous Graph)中只存在一种类型的节点和边,当图中的节点和边存在多种类型和各种复杂的关系时,再采用 ...

  2. Introduction to Graph Neural Network(图神经网络概论)翻译:目录总览

    前言:最近对图神经网络部分比较感兴趣,偶尔看到清华大学刘知远老师在今年3月份发表的一本书:Introduction to Graph Neural Network,于是将该书内容进行翻译,记录阅读中自 ...

  3. Graph Neural Network(GraphSAGE,GAT)

    Graph 图论问题.如生成树算法,最短路径算法,BFS,DFS. 概率图模型.将条件概率表达为图结构,如马尔可夫链,条件随机场. 图神经网络.结合深度学习,如博主已经整理过的Graph Embedd ...

  4. Introduction to Graph Neural Network(图神经网络概论)翻译:Chapter4:Vanilla Graph Neural Networks

    文章目录 4.Vanilla Graph Neural Networks(原始图神经网络) 4.1. Introduction 4.2 Model 4.3 Limitations 4.Vanilla ...

  5. Graph Neural Network(GNN)综述

    关注"SIGAI",选择"星标"或"置顶" 技术文章,第一时间获取 作者简介: 吴天龙  香侬科技researcher 公众号(suanfa ...

  6. Introduction to Graph Neural Network(图神经网络概论)翻译:Chapter2:Basic of Math and Graph

    文章目录 2 Basic of Math and Graph 2.1 Linear Algebra(线性代数) 2.1.1 Basic Concepts(基本概念) 2.1.2 EIGENDECOMP ...

  7. 深度学习1:神经网络基础前馈神经网络Feedforward Neural Network(基于Python MXNet.Gluon框架)

    目录 神经网络背景 常用的深度学习框架 机器学习的三个基本要素 模型 学习准则 损失函数 0-1损失函数 0-1 Loss Function 平方损失函数 Quadratic Loss Functio ...

  8. 论文笔记:Person Re-identification with Deep Similarity-Guided Graph Neural Network

    Person Re-identification with Deep Similarity-Guided Graph Neural Network 2018-07-27 17:41:45 Paper: ...

  9. Metapath-guided Heterogeneous Graph Neural Network for Intent Recommendation 个人总结

    Metapath-guided Heterogeneous Graph Neural Network for Intent Recommendation 个人总结 写在前面:为方便阅读,尽量使用中文总 ...

  10. Graph Decipher: A transparent dual-attention graph neural network 图解密器:一种透明的双注意图神经网络,用于理解节点分类的消息传递机制

    引用 Pang Y, Liu C. Graph Decipher: A transparent dual-attention graph neural network to understand th ...

最新文章

  1. 大数据为智慧城市建设添砖加瓦
  2. java程序运行堆栈分析
  3. 奔跑了24年,中国零售业会员制到底该怎么玩?
  4. phonegap在android中如何退出程序
  5. 使用google colab运行RNN网络代码报告错误ValueError: Object arrays cannot be loaded when allow_pickle=False
  6. c语言中函数调用的原理
  7. python面试题总结(7)--操作类
  8. 局域网内文件传输速度_详解蒲公英路由器组网 实现文件共享
  9. python编程思维代码_Python编程快速上手——强口令检测算法案例分析
  10. 【深度学习】神经网络为何非激活函数不可?
  11. 数控g71编程实例带图_数控编程代码g71 数控g71编程实例有图
  12. 前端电子时钟字体引入
  13. 2021-02-20
  14. VUE面试题-2022
  15. android 全屏时钟,手机全屏数字时钟软件
  16. 【C#基础】输入一个字符,判定它是什么类型的字符(大写字母,小写字母,数字或者其它字符)
  17. 使用 ClickHouse 构建通用日志系统
  18. 《途客圈创业记:不疯魔,不成活》一一2.12 Nanfang离职
  19. 图像的放大:双线性插值算法(C++实现)
  20. requests库的使用

热门文章

  1. xp系统网上邻居看不到局域网电脑_win7系统网上邻居看不到局域网中其他电脑的解决方法...
  2. Mkdocs部署静态网页至GitHub pages配置说明(mkdocs.yml)
  3. JAVA利用httpclient登录开心网
  4. 在第一列前面、中间、后面插入字符串
  5. win7副本不是正版_为什么有人愿意放弃win10,重装成盗版的win7呢原因有三点!...
  6. perfectmoney php接口_兑换paypal PerfectMoney(转载)
  7. 清华领军计划计算机试题,清华大学2017自主招生真题
  8. pom 备注_POM 500P物性表
  9. 【笔记】wincap收集并统计网络流量
  10. 【Tensorflow 报错】struct.error: 'i' format requires -2147483648 = number = 2147483647