GNN,GCN学习整理

GNN

GNN定义

GNN是Graph Neural Network的简称,是用于学习包含大量连接的图的联结主义模型。当信息在图的节点之间传播时GNN会捕捉到图的独立性。与标准神经网络不同的是,GNN会保持一种状态,这个状态可以代表来源于人为指定的深度上的信息。

图神经网络处理的数据就是图,而图是一种非欧几里得数据。GNN的目标是学习到每个节点的邻居的状态嵌入,这个状态嵌入是向量且可以用来产生输出,例如节点的标记。如下图,最终的目的就是学习到红框的H,由于H是定点,因此可以不断迭代直到H的值不再改变即停止。
在这里插入图片描述

GNN来源

  1. CNN:CNN可以提取大量本地紧密特征并组合为高阶特征,但CNN只能够操作欧几里得数据。CNN的关键在于局部连接、权值共享、多层使用;

  2. graph embedding:在低维向量上学习表示图节点、边或者子图。思想源于特征学习和单词嵌入,第一个图嵌入学习方法是DeepWalk,它把节点看做单词并在图上随机游走,并且在它们上面使用SkipGram模型;

基于以上两种思想,GNN会在图结构上聚合信息,因此可以对输入/输出的元素及元素间的独立性进行建模。GNN还可以同时使用RNN核对图上的扩散过程进行建模。

GNN优点

  1. 标准神经网络(CNN、RNN)无法解决图输入无序性,因为它们将点的特征看做是特定的输入;

  2. 两点之间的边代表着独立信息,在标准神经网络中,这种信息被看做是点的信息,而GNN可以通过图结构来进行传播,而不是将其看做是特征;通常而言,GNN更新隐藏节点的状态,是通过近邻节点的权值和;

  3. 高级人工只能需要更高的可解释性;标准神经网络可以生成合成图像或文档,但无法生成图;GNN可以生成无结构的数据(多种应用:文字分类、神经机器翻译、关系提取、图像分类)

GNN缺点

  1. 更新节点的隐藏状态是低效的;

  2. 在迭代中使用相同的参数,更新节点隐藏状态是时序的;

  3. 在边上有一些信息化的特征无法在原始GNN中建模;如何学习边的隐藏状态也是问题;

  4. 如果我们的目标是节点的表示而不是图,使用固定点H是不合适的

GCN

基础概念

图卷积神经网络(Graph Convolutional Network, GCN)是一类采用图卷积的神经网络,发展到现在已经有基于最简单的图卷积改进的无数版本,在图网络领域的地位正如同卷积操作在图像处理里的地位。
在这里插入图片描述
如上图所示,图卷积神经网络GCN属于图神经网络GNN的一类,是采用卷积操作的图神经网络,可以应用于图嵌入GE。

GCN理解

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

GCN也是一个神经网络层,它的层与层之间的传播方式是:
在这里插入图片描述
这个公式中:

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

这个部分,是可以事先算好的,因为D波浪由A计算而来,而A是我们的输入之一。

为了直观理解,使用论文中的一幅图:
在这里插入图片描述
上图中的GCN输入一个图,通过若干层GCN每个node的特征从X变成了Z,但是,无论中间有多少层,node之间的连接关系,即A,都是共享的。

假设构造一个两层的GCN,激活函数分别采用ReLU和Softmax,则整体的正向传播的公式为:
在这里插入图片描述
最后,针对所有带标签的节点计算cross entropy损失函数:
在这里插入图片描述
就可以训练一个node classification的模型了。由于即使只有很少的node有标签也能训练,作者称他们的方法为半监督分类。

GCN实战解决“空手道俱乐部问题”

问题概述

空手道俱乐部是一个包含34个成员的社交网络,有成对的文档交互发生在成员之间。俱乐部后来分裂成两个群体,分别以指导员(节点0)和俱乐部主席(节点33)为首,整个网络可视化如下图:
在这里插入图片描述
任务是预测每个节点会加入哪一边。
创建club图如下:

import dgl

def build_karate_club_graph():
    g = dgl.DGLGraph()
    # add 34 nodes into the graph; nodes are labeled from 0~33
    g.add_nodes(34)
    # all 78 edges as a list of tuples
    edge_list = [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2),
        (4, 0), (5, 0), (6, 0), (6, 4), (6, 5), (7, 0), (</
  • 5
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值