0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于GCN的入门学习知识详解

深度学习自然语言处理 来源:程序员客栈 作者: NLP情报局 2021-03-30 15:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

什么是GCN

由于高度的复杂性和信息的结构特征,图上的机器学习是一项困难的任务。「GCN是被设计用来针对图结构的神经网络,它能从之前的网络层中聚合信息。在图中,这种机制能够对节点产生有用的特征表示。」

GCN是基于图机器学习的非常强大的神经网络体系结构。

实际上,它们是如此强大,以至于随机发起的2层GCN都可以产生网络中节点的有用特征表示。

下图说明了由此类GCN生成的网络中每个节点的二维表示。请注意,即使没有任何训练,网络中节点的相对接近度仍保留在二维表示中。

b8e46f16-8e8e-11eb-8b86-12bb97331649.jpg

更正式地说,图卷积网络(GCN)是在图上运行的神经网络。给定图G =(V,E),V表示节点,E表示边,则GCN作为输入

输入特征矩阵X(N×F⁰),其中N是节点数,F⁰是每个节点的输入特征数,以及图结构的N×N矩阵表示形式,例如G的邻接矩阵A

因此,GCN中的隐藏层可以写成Hⁱ= f(Hⁱ⁻¹,A))。

其中H⁰= X,f是传播(propagation)方式。每一层Hⁱ对应于一个N×Fi特征矩阵,其中每一行是一个节点的特征表示。在每一层,使用传播规则f聚合这些特征,以形成下一层的特征。这样,特征在连续层上变得越来越抽象。在此框架中,GCN的变体仅在传播规则f的选择上有所不同。

一个简单的传播规则

传播规则中最简单的一种是:

f(Hⁱ,A)=σ(AHⁱWⁱ)

其中Wⁱ是第i层的权重矩阵,而σ是非线性激活函数,例如ReLU函数。权重矩阵的尺寸为Fⁱ×Fⁱ⁺¹;换句话说,权重矩阵的第二维的大小确定了下一层的特征数量。如果你熟悉卷积神经网络,则此操作类似于过滤操作(filtering operation),因为这些权重在图中的节点之间共享。

简化

让我们从最简单的角度检查传播规则:

i = 1,满足 f是输入特征矩阵的函数

σ是恒等函数

选择权重 AH⁰W⁰=AXW⁰= AX

换句话说,f(X,A)= AX。这个传播规则可能有点太简单了,稍后我们会添加缺失的部分。AX现在等效于多层感知器的输入层。

一个简单的图形示例

举一个简单的例子,我们使用以下图形:

b95b7520-8e8e-11eb-8b86-12bb97331649.png

下面是其numpy邻接矩阵表示形式。

A = np.matrix([

[0, 1, 0, 0],

[0, 0, 1, 1],

[0, 1, 0, 0],

[1, 0, 1, 0]],

dtype=float

接下来,根据其索引为每个节点生成2个整数特征,便于以后手动确认矩阵计算。

In [3]: X = np.matrix([

[i, -i]

for i in range(A.shape[0])

], dtype=float)

X

Out[3]: matrix([

[ 0., 0.],

[ 1., -1.],

[ 2., -2.],

[ 3., -3.]

])

应用传播规则

好吧!现在,我们有了一个图形,其邻接矩阵A和一组输入要素X。让我们看看应用传播规则时会发生什么:

In [6]: A * X

Out[6]: matrix([

[ 1., -1.],

[ 5., -5.],

[ 1., -1.],

[ 2., -2.]]

发生了什么?现在,每个节点(每行)的表示形式都是其邻居特征的总和!换句话说,图卷积层将每个节点表示为其邻居的集合。注意,在这种情况下,如果存在从v到n的边,则节点n是节点v的邻居。

问题

你可能已经发现了问题:

节点的汇总表示不包括其自身的功能!

该表示是邻居节点特征的集合,因此只有具有自环的节点才会在集合中包括自己的特征。度数较大的节点的特征将具有较大的值,而度数较小的节点将具有较小的值。这可能会导致梯度消失或爆炸,但对于随机梯度下降算法(通常用于训练此类网络并且对每个输入特征的比例(或值的范围)敏感)也存在问题。在下文中,我将分别讨论每个问题。

添加自环

为了解决第一个问题,可以简单地向每个节点添加一个自环。实际上,这是通过在应用传播规则之前将单位矩阵I与邻接矩阵A相加来完成的。

In [4]: I = np.matrix(np.eye(A.shape[0]))

IOut[4]: matrix([

[1., 0., 0., 0.],

[0., 1., 0., 0.],

[0., 0., 1., 0.],

[0., 0., 0., 1.]

])

In [8]: A_hat = A + I

A_hat * X

Out[8]: matrix([

[ 1., -1.],

[ 6., -6.],

[ 3., -3.],

[ 5., -5.]])

由于该节点现在是其自身的邻居,因此在总结其邻居的特征时会包括该节点自己的特征!

规范特征表示

通过将邻接矩阵A与D的逆矩阵相乘来变换邻接矩阵A,可以按节点度对特征表示进行归一化。因此,我们简化的传播规则如下所示:

f(X,A)=D⁻¹AX

让我们看看发生了什么。我们首先计算度矩阵。

In [9]: D = np.array(np.sum(A, axis=0))[0]

D = np.matrix(np.diag(D))

D

Out[9]: matrix([

[1., 0., 0., 0.],

[0., 2., 0., 0.],

[0., 0., 2., 0.],

[0., 0., 0., 1.]

])

在应用规则之前,让我们看看对邻接矩阵进行转换后会发生什么。

Berfore

A = np.matrix([

[0, 1, 0, 0],

[0, 0, 1, 1],

[0, 1, 0, 0],

[1, 0, 1, 0]],

dtype=float

After

In [10]: D**-1 * A

Out[10]: matrix([

[0. , 1. , 0. , 0. ],

[0. , 0. , 0.5, 0.5],

[0. , 0.5, 0. , 0. ],

[0.5, 0. , 0.5, 0. ]

])

请注意,邻接矩阵每一行中的权重(值)已除以与该行相对应的节点的度。我们将传播规则与变换后的邻接矩阵一起应用:

In [11]: D**-1 * A * X

Out[11]: matrix([

[ 1. , -1. ],

[ 2.5, -2.5],

[ 0.5, -0.5],

[ 2. , -2. ]

])

得到与相邻节点特征均值相对应的节点表示。这是因为(转换后的)邻接矩阵权重,与相邻节点特征加权和的权重相对应。我鼓励你自己验证此观察。

放在一起

现在,我们结合了自循环和标准化技巧。此外,我们将重新介绍先前为简化讨论而丢弃的权重和激活函数。

加重权重

首要任务是应用权重。请注意,这里D_hat是A_hat = A + I的度矩阵,即具有强制自环的A的度矩阵。

In [45]: W = np.matrix([

[1, -1],

[-1, 1]

])

D_hat**-1 * A_hat * X * W

Out[45]: matrix([

[ 1., -1.],

[ 4., -4.],

[ 2., -2.],

[ 5., -5.]

])

如果我们想减小输出特征表示的维数,可以减小权重矩阵W的大小:

In [46]: W = np.matrix([

[1],

[-1]

])

D_hat**-1 * A_hat * X * W

Out[46]: matrix([[1.],

[4.],

[2.],

添加激活功能

我们选择保留特征表示的维数并应用ReLU激活功能。

In [51]: W = np.matrix([

[1, -1],

[-1, 1]

])

relu(D_hat**-1 * A_hat * X * W)

Out[51]: matrix([[1., 0.],

[4., 0.],

[2., 0.],

[5., 0.]])

瞧!具有邻接矩阵,输入函数,权重和激活功能的完整隐藏层!

简单样例

最后,我们可以在真实图上应用图卷积网络。我将向你展示如何产生我们在文章开头看到的要素表示。

扎卡里的空手道俱乐部

扎卡里(Zachary)的空手道俱乐部是一种常用的社交网络,其中节点代表空手道俱乐部的成员,其边缘相互联系。当扎卡里(Zachary)研究空手道俱乐部时,管理者与教练之间发生了冲突,导致俱乐部分裂为两部分。下图显示了网络的图形表示,并且根据俱乐部的哪个部分标记了节点。管理员和讲师分别标有“ A”和“ I”。

b9b5d420-8e8e-11eb-8b86-12bb97331649.png

建立GCN

现在来建立图卷积网络。实际上我们不会训练网络,只是简单地随机初始化,以产生在本文开头看到的功能表示。我们将使用图网络networkx表示整个图,并计算A_hat和D_hat矩阵。

from networkx import karate_club_graph, to_numpy_matrixzkc = karate_club_graph()

order = sorted(list(zkc.nodes()))A = to_numpy_matrix(zkc, nodelist=order)

I = np.eye(zkc.number_of_nodes())A_hat = A + I

D_hat = np.array(np.sum(A_hat, axis=0))[0]

D_hat = np.matrix(np.diag(D_hat))

接下来,我们随机初始化权重。

W_1 = np.random.normal(

loc=0, scale=1, size=(zkc.number_of_nodes(), 4))

W_2 = np.random.normal(

loc=0, size=(W_1.shape[1], 2))

堆叠GCN层:在这里,我们仅使用单位矩阵作为特征表示,即,每个节点都表示为单次热编码的分类变量。

def gcn_layer(A_hat, D_hat, X, W):

return relu(D_hat**-1 * A_hat * X * W)H_1 = gcn_layer(A_hat, D_hat, I, W_1)

H_2 = gcn_layer(A_hat, D_hat, H_1, W_2)

output = H_2

提取特征表示:

feature_representations = {

node: np.array(output)[node]

for node in zkc.nodes()}

瞧!特征表示很好地将Zachary空手道俱乐部中的社区分隔开来。而且我们还没有开始训练!

ba1e32d6-8e8e-11eb-8b86-12bb97331649.png

对于此示例,由于ReLU函数的作用,随机初始化的权重很有可能在x轴或y轴上给出0值,因此需要进行几次随机初始化才能产生上图。

结论在这篇文章中,我对图卷积网络进行了高级介绍,并说明了GCN中每一层节点的特征表示是如何基于其邻域聚合而得出的。我们了解了如何使用numpy构建这些网络以及它们的强大功能:即使是随机初始化的GCN,也可以在Zachary的空手道俱乐部中分离社区。

编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    67

    文章

    8570

    浏览量

    137421
  • GNN
    GNN
    +关注

    关注

    1

    文章

    31

    浏览量

    6823
  • GCN
    GCN
    +关注

    关注

    0

    文章

    5

    浏览量

    2584

原文标题:【GCN】2021年,我终于决定入门GCN

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    学习STM32单片机,从菜鸟到牛人应该怎么走?

    第一步 编程及硬件基础知识 1.掌握C语言基础 作为STM32的主要编程语言,C语言的基础知识是必不可少的。建议通过书籍、在线课程或者教学视频系统地学习C语言的基础知识,包括
    发表于 05-11 15:38

    模拟电路入门难?掌握这7大核心电路,你也能轻松上手!

    很多电子工程师在入门模拟电路时,都会觉得它“知识点杂、电路形式多”,学起来一头雾水。其实,模拟电路的学习是有规律可循的,今天就为大家拆解7大核心模拟电路,掌握它们,你会发现模拟电路其实没那么难!一
    的头像 发表于 03-28 21:01 378次阅读
    模拟电路<b class='flag-5'>入门</b>难?掌握这7大核心电路,你也能轻松上手!

    嵌入式单片机开发学习路径

    路径,让你的学习过程更加轻松有趣。 1. 入门基础 1.1 了解嵌入式系统 在开始学习之前,首先需要了解什么是嵌入式系统以及它的基本构成和应用场景。可以阅读一些基础书籍和网上资源。 1.2
    发表于 02-09 15:42

    单片机的入门准备

    单片机入门篇 1、学好电子技术基础知识,如电路基础、模拟电路、数字电路和微机原理。这几门课程都是弱电类专业的必修课程,学会这些后能保证你看懂单片机电路、知道电路的设计思路和工作原理; 2、学习
    发表于 12-22 07:39

    迅为iTOP-Hi3516开发板驱动开发资料全面上线,构建从入门到精通的完整学习路径!

    迅为iTOP-Hi3516开发板linux驱动开发资料全面上线,构建从入门到精通的完整学习路径!
    的头像 发表于 12-19 15:47 952次阅读
    迅为iTOP-Hi3516开发板驱动开发资料全面上线,构建从<b class='flag-5'>入门</b>到精通的完整<b class='flag-5'>学习</b>路径!

    从零开始:一份详细的灌封胶新手入门指南,告别常见操作误区 | 铬锐特实业

    针对新手的灌封胶完整入门指南,从类型选择、配比搅拌、真空脱泡到灌封固化全流程详解,帮助你避开常见操作误区,轻松掌握电子元器件防护技巧。 | 铬锐特官网
    的头像 发表于 12-17 00:31 913次阅读
    从零开始:一份详细的灌封胶新手<b class='flag-5'>入门</b>指南,告别常见操作误区 | 铬锐特实业

    关于“AI(人工智能)芯片”基础知识详解

    【博主简介】本人“爱在七夕时”,系一名半导体行业质量管理从业者,旨在业余时间不定期的分享半导体行业中的:产品质量、失效分析、可靠性分析和产品基础应用等相关知识。常言:真知不问出处,所分享的内容
    的头像 发表于 12-05 08:31 1008次阅读
    <b class='flag-5'>关于</b>“AI(人工智能)芯片”基础<b class='flag-5'>知识</b>的<b class='flag-5'>详解</b>;

    学习物联网怎么入门?

    景等。同时,学习物联网的基本技术,如传感器技术、通信技术、云计算等,也是非常重要的。 其次,选择适合自己的学习方式也是入门学习物联网的重要一步。
    发表于 10-14 10:34

    关于“随机存取存储器(RAM)”的基础知识详解

    【博主简介】 本人系一名半导体行业质量管理从业者,旨在业余时间不定期的分享半导体行业中的:产品质量、失效分析、可靠性分析和产品基础应用等相关知识。常言:真知不问出处,所分享的内容如有雷同或是不当之处
    的头像 发表于 09-19 11:04 2872次阅读
    <b class='flag-5'>关于</b>“随机存取存储器(RAM)”的基础<b class='flag-5'>知识</b><b class='flag-5'>详解</b>;

    人工智能学习17问:从入门到避坑,新手最关心的问题全在这

    问:学人工智能,光看书就行?答:不行。AI是“练出来”的,不是“看出来”的。书能教理论,但写代码、调模型、解决实际问题的能力,必须靠动手练。利用学习平台把书本知识拆解成可操作的步骤,跟着练3次,比看
    的头像 发表于 07-30 14:18 899次阅读
    人工智能<b class='flag-5'>学习</b>17问:从<b class='flag-5'>入门</b>到避坑,新手最关心的问题全在这

    ARM入门学习方法分享

    ,了解相关的硬件知识也是很重要的。学习关于计算机体系结构和电子电路的基础知识可以帮助你更好地理解ARM的工作原理。 六、参考文档和教程:ARM的官方文档和教程是
    发表于 07-23 10:21

    DSP从入门到精通全集

    这是一本循序渐进介绍DSP的书籍,从DSP的入门知识介绍到DPS的硬件,接口,应用,从DSP的ADC/DAC到数字滤波器处理。本文除了对DSP的各种软硬件知识进行介绍后,还结合实际,接受了对应
    发表于 07-12 14:36

    【HarmonyOS 5】鸿蒙CodeGenie AI辅助编程工具详解

    菜单View布局。主界面主要由编码助手的介绍和知识问答与生成代码两个入门组成。 当我们点击两个入门其中一个后,最下方的输入栏位置就会显示对应的输入内容。此时我们在输入栏,输入对应的提示词后,AI就会
    发表于 06-11 16:34

    以太网入门:从零开始,掌握以太网基础知识

    以太网作为现代通信技术的基石,其重要性不言而喻。无论是日常网络应用,还是AI对高速大带宽网络的需求,以太网都扮演着不可或缺的角色。本文将从零开始,带您了解以太网的基础知识,帮助您快速入门。什么是以
    的头像 发表于 06-09 14:00 4117次阅读
    以太网<b class='flag-5'>入门</b>:从零开始,掌握以太网基础<b class='flag-5'>知识</b>!

    跟老齐学Python:从入门到精通

    本帖最后由 yuu_cool 于 2025-6-3 16:52 编辑 本资料是面向编程零基础读者的Python 入门教程,内容涵盖了Python 的基础知识和初步应用。以比较轻快的风格,向零基
    发表于 06-03 16:10