第十二周:机器学习周报

目录

摘要

Abstract

1 What is GNN?

2 Why need GNN?

3 Spatial-based GNN

3.1 模型一:NN4G(Neural Network for Graph)

3.2 模型二:DCNN(Diffusion-Convolution Neural Network)

3.3 模型三:DGC(Diffusion Graph Convolution)

3.4 模型四:MoNET(Mixture Model Networks)

3.5 模型五:GAT(Graph Attention Networks)

4 Spectral-based GNN

4.1 图信号的傅里叶变换

4.2 拉普拉斯变换

4.3 频率

4.4 能量差

4.5 分析与合成

4.6 Filter

4.7 最终形态

4.7 方法的弊端 

5 GNN模型代码分析

 总结


 

摘要

图神经网络(GNN)与其他模型不同的是它的输入和输出都是图,GNN可以通过卷积将图的结构和每个节点和边的特征转化为一般的神经网络的输入,GNN中的卷积有两种方法,一种是Spatial-based(基于空间的),另一种是Spectral-based(基于谱域的)。本周学习GNN的两种卷积方式,Spatial-based GNN方法采用类似CNN的卷积得到每个隐藏层的值,再将所有层的值集合成为整个graph的输出,Spectral-based GNN方法通过傅里叶变换与逆傅里叶变换得到图神经网络的卷积输出。

Abstract

The difference between  Graph Neural Network(GNN) and other models is that its input and output are graphs. GNN can transform the graph structure and the characteristics of each node and edge into the input of general neural network through convolution. There are two methods for convolution in GNN, one is Spatial-based and the other is Spectral-based. This week, we will learn two convolution methods of GNN. Spatial-based GNN method uses convolution similar to CNN to get the value of each hidden layer, and then sets the values of all layers into the output of the whole graph. Spectral-based GNN method obtains the convolution output of graph neural network through Fourier transform and inverse Fourier transform.

1 What is GNN?

简单来说GNN就是Graph + Nerual Networks,而这里的Graph的粗略定义就是有节点有边的图形,并不是图片而是数据结构中的图,而是一种结构化的数据。关键问题就是将graph的结构和图中每个节点和边的特征转化为一般的神经网络的输入(张量)。

169ea0bf65a941c9a84007eb9eb9040f.png

GNN考虑所有的特征并将其转化为神经网络可以输入的向量,就需要用到类似于CNN的Convolution(卷积),而GNN中的卷积有两种方法,一种是Spatial-based(基于空间的),另一种是Spectral-based(基于谱域的)。

08c49a8904ca4aaca16a6b14f11455fa.png

2 Why need GNN?

当我们在做classfication的时候数据以图的形式出现,而这张图非常大,拥有很多的节点,并且节点之间互相影响,那数据集就会非常大,我们需要考虑节点之间的各种联系,因此需要用到GNN。

ee15b9741b654c9e83f6f961531c0d0d.png

例如在一个故事中存在很多个角色,每个角色都有对应的特征,例如姓名职业等,要从这些角色中找到一个杀人凶手,寻找的这个过程可以看成是一个classfication的问题,训练一个分类器,将一个角色(即该角色的各个特征)放入训练出来的classifier,判断该角色是否是杀人凶手。

b806c40685d54c19822ba34274f513a5.png

但是问题是角色之间存在一张庞大的关系网,两两角色之间都存在一定的关系,而这些关系在做classfication的时候可以得到额外的信息,帮助我们做更好的model。因此需要考虑全部的关系,这就必须要用到graph neural network。

 

3 Spatial-based GNN

 Spatial-based GNN需要做空间域的卷积,也就是在空间上的卷积,需要做两步,第一步是aggregate,aggregate类似于CNN中的convolution也就是卷积,CNN 中的卷积核在计算某一个像素点的 feature 的时候,可以看成把这个像素点周围的像素点的特征按照一定的权重加权求和,Spatial-GNN 想要把这种卷积操作直接推广到 Graph 上,即用邻节点的特征更新下一隐藏层的状态,第二步是readout,把所有节点的特征集合起来代表整个graph。

733601a4f2024b9bac505f712ed6745c.png

 GNN在空间上的卷积和readout有很多种方法

3.1 模型一:NN4G(Neural Network for Graph)

NN4G是在上一层的数据基础上更新下一层隐藏层的特征,我们可以认为它的计算方法 COMBINE 的就是上层自己的特征经过一个线性变换。

每个隐藏层都是一个图,有若干个节点,每个节点都有一个对应的权值,权值与上一层相联系,某一节点的权值=(上一层该节点的所有相邻节点的权值之和)✖一个待学习的参数+该点本身的值与一个参数矩阵的乘积(eq?x_%7B3%7D是这个节点本来值)。

 

c289cf6ef81741bdb9100ab0081ee084.png

Readout的计算方法:对每一个隐藏层计算均值,然后分别乘以可训练矩阵后加起来。

046f9abc622045ba8c0014c5a234ded0.png

通过卷积的过程可以将各种特征作为输入放入全连接网络中,但是全连接网络中的神经元是固定的,因此对于每个输入的图来说,通过卷积之后的输入网络的向量维度都应该是一样。对于每个图NN4G都是使用固定数量的隐藏层对应固定的神经元,然后将每层的均值输入全连接神经网络。

AGGREGATE:求和之后做一个 Transform
COMBINE:求和之后再加上自身做一个 Transform 的结果。
READOUT:先通过平均操作求除每一层的图的表示方式,然后将所有层的图表示加权求和得到最终的图的表示。

3.2 模型二:DCNN(Diffusion-Convolution Neural Network)

DCNN的每一层都是以原始的数据进行更新,第K个隐藏层的某一点的值=原图中与这个点距离为K的点的值取平均值✖待学习的参数。(mean(d(3,.)=1)代表距离节点eq?v_%7B3%7D 为1,mean(d(3,.)=2)代表距离节点eq?v_%7B3%7D 为2的所有节点特征的均值)

ddb654a4602b4c38ba03141636fe7513.png

通过上面的方法求得每一层网络中所有节点,将这些向量组成一个矩阵eq?H%5E%7Bi%7D以后,eq?H%5E%7Bi%7D代表第 i层的矩阵,假设有 n 个节点,特征维度为 d ,那么这个矩阵就是一个 eq?n%5Ctimes%20d 的矩阵,然后i层,就有一个eq?i%5Ctimes%20n%5Ctimes%20d 的一个张量。

把每个eq?H%5E%7Bi%7D中对应的节点eq?h_%7Bj%7D%5E%7Bi%7D都串起来,也就是将eq?i%5Ctimes%20n%5Ctimes%20d张量中的取出长度为eq?i的一行,也就是某一节点的特征,然后 eq?i%5Ctimes%20n%5Ctimes%20d张量就成了一个 eq?i%5Ctimes%20d的矩阵,然后做一个 Transform (乘以一个参数矩阵eq?w),最后得到这个节点的特征向量eq?y%5E%7Bi%7D

d9b2fe2d2b594c4eb630eb1cde42b0d7.png

最后像NN4G一样将结果放入一个全连接网络,最后得到一个数值。

3.3 模型三:DGC(Diffusion Graph Convolution)

与DCNN不同的是将所有层的结果进行相加,即eq?ieq?n%5Ctimes%20d的矩阵进行相加,与DCNN的区别是一个结果是得到一张图一个结果是得到一个数值。

fb6ba13b850b485d8293717a771210d3.png

3.4 模型四:MoNET(Mixture Model Networks)

之前只是简单的相加,并没有考虑到一个节点的邻居跟邻居之间的区别(有的邻居可能更重要一点,每个邻居对该点的影响程度不一样)。

77cc67a5f1ca4c548bec5bff2496eaf5.png

3.5 模型五:GAT(Graph Attention Networks)

在基础的图神经网络上加上了注意力机制,不止是简单的weighted sum, 不是像之前那样定的weight ,而且要让他自己去学习每个节点的注意力权重。对邻居做Attention,就是不同的邻居给出不同的weight。

49bf64ddcdda448b81efe053fd08e59a.png

9f3a4e8ba931432b9f955d2cc96f93e6.png

4 Spectral-based GNN

CNN在卷积的时候会确定一个卷积核,这就是一个特定大小的过滤器,每次只需要考虑kernel范围的信息。但是GNN不行,因为每个节点的邻居都不一样,无法想CNN一样用一个九宫格定义图中某一节点的邻居节点。所以要把图在空间的结构进行思想转换,将输入的图进行傅里叶转换,采用谱域实现类似的过滤器来做卷积,在给定的卷积核再做傅立叶变化,对两次傅立叶变化的结果相乘,再将结果做反的傅立叶变化得到下一层的图。

d752aa2ca50649c3a502fe82995b7707.png

根据卷积定理,两信号在空域(或时域)卷积的傅里叶变换等于这俩个信号在频域中的傅里叶变换的乘积

ccd34d06ff434f5cae569c6ca8569b33.png

卷积操作就可以这样定义:首先将空域上的信号eq?f_%7B1%7D%28t%29转换到频域信号 eq?F_%7B1%28w%29%7Deq?f_%7B2%7D%28t%29转换到频域eq?F_%7B2%28w%29%7D,然后将频域信号相乘,再将相乘后的结果通过傅里叶反变换转回空域,这个就是谱域图卷积的实现思路(将空域转换到频域上处理,处理完再返回)。

那如何进行傅里叶变换呢?需要用到信号系统相关知识。

4.1 图信号的傅里叶变换

任何一个周期函数都能等价为一系列的正(余)弦函数的和,这就是傅里叶级数。将一个周期函数经过傅里叶变换,也就是将一个时域上的函数表达,转换为其频域和相位的表示。通过对图片的傅里叶变换,可以根据变化后数据的频率特征,提取图片中的特征,如低频率的轮廓特征,高频率的细节特征。

31500f6474234bcfb23d8bb81f05dc18.png

定义

D为度矩阵,它对角线上的值是从 i 节点出发的所有边的权重之和(对角矩阵)。

拉普拉斯矩阵(L)是度矩阵(D)减去邻接矩阵(A),即L = D - A。拉普拉斯矩阵是对称半正定矩阵,因此该矩阵的特征值一定非负,一定有n个线性无关的特征向量,它们是n维空间中的一组标准正交基,组成正交矩阵。

将拉普拉斯矩阵(L)进行特征分解即谱分解,是将矩阵分解为其特征值和特征向量表示的矩阵之积的方法。eq?L%3DU%5CLambda%20U%5E%7BT%7D,其中eq?%5CLambda为特征值矩阵,eq?U为特征向量

在如下的图中,定义一个图上的信号eq?f%28i%29,我们把eq?f%28i%29看做是一个信号的属性大小,,它可以是一个向量也可以是一个标量,假设有4个节点,每一个节点上有一个信号值,(此文中假定f(0)、f(1)等4个信号都是标量)

745a789cf75f4972a56cb3f62a705ee4.png

4.2 拉普拉斯变换

对该图做傅里叶变换,计算该图的拉普拉斯矩阵,以及对拉普拉斯矩阵进行谱分解得到特征值和特征向量。

0054f8f88515414ebbf650778bdeb07c.png

4.3 频率

将图做傅里叶变化后,将矩阵L进行特征分解,上图中每个特征值eq?%5Clambda%20_%7Bi%7D对应的特征向量eq?U都对应其相应点在该特征值频率下的强度大小,可根据上图计算的特征值eq?%5Clambda%20_%7Bi%7D和特征向量eq?u_%7Bi%7D将原图在频率上表达。

dfa0ac07a54e4baf865fd44a1994a73a.png

当频率很低的时候每个都一样的强度,当频率越来越高的时候,每一个信号的强度变化越来越大。因此频率越大,相邻两点之间的信号变化量就越大,通过这个更好理解frequency的概念。

eb486a39e3694c3d83d259e5fce5bfa4.png

4.4 能量差

将信号乘以一个拉普拉斯矩阵eq?L,即对其做拉普拉斯变化。下面计算表明,对信号做拉普拉斯变换得到的结果,可以表示某节点与其所有邻域节点的能量差之和。

a6a4966720264bb28adcd67e4e5052bd.png

如果要看能量差的话需要看平方,平方方式如下

90ba3d19605f4a249adbf48be5c3508f.png

通过等式可以发现当信号越平滑即频率低的时候,相邻两个信号能量差越小,当频率越大,两个相邻信号能量差越大。因此eq?f%5E%7Bt%7DLf代表节点之间的能量概念,可以当作频率来使用,为什么这么说呢?9ea6207b6a8a49b89198e9ab115d73d6.png

最后eq?f%5E%7Bt%7DLf可以得到eq?%5Clambda,也就是频率值。所以特征值eq?%5Clambda代表的是对应的特征向量的频率大小,也可以代表两两节点之间的信号的能量差。

4.5 分析与合成

假设给出一个时域的信号,想要转换出它在谱域上面不同频率大小对应的组成部分大小是多少,那么做这件事情的时候就是做傅里叶变换。怎么在graph上也用同样的方式,把一个graph上的信号转换到它的频域,方法如下:

2ac6bb6222f240338b0ba65864f452b3.png

 频域到时域的转化就是将各个频域的频率乘以各自在频域的响应值,然后加和。

4.6 Filter

前面知识的学习就是为了找出一个可以在graph上做filter的方式,在graph上做filter首先要定义出来在graph上怎么做傅里叶变换和逆傅里叶变换,才能通过这两种方法将它变换到谱域,然后再谱域上之间相乘,这个过程就是做filter,做完filter之后再将它逆变换回到vertex domain。

eq?X%5E%7B%27%7D%3DXH

d8f90a0d3fbc4e21844c2df5fc0f11ec.png

推广到Spectral Graph Theory做filter也是一样的东西,eq?%5Chat%7Bx%7D就是信号x通过图理论变换得到的信号,然后将它乘以某一个filter的频率反应就可以得到经过filter的信号eq?%5Chat%7By%7D

c4ea5aee32db457fb31036b2a9f75794.png

4.7 最终形态

经过傅里叶变换、拉普拉斯变换以及逆傅里叶变换,最终就是要学一个拉普拉斯函数eq?g_%7B%5Ctheta%20%7D%28%5CLambda%20%29

a11a40b8e9064659b1b7badd33fac1a0.png

ab7396b81cdc4076a39b5e6312597d30.png

总结:这个模型要做的就是当给出一个信号向量x,希望模型可以学习一个Filter叫做eq?g_%7B%5Ctheta%20%7D%28%5CLambda%20%29,这个eq?g_%7B%5Ctheta%20%7D%28%5CLambda%20%29经过Filter之后可以得到一个信号y,也就是做完卷积之后得到y。将U放进去之后,通过线性代数可以得到一个拉普拉斯函数与x相乘可以得到一个经过Filter的信号向量y。

4.7 方法的弊端 

一是Filter学习的复杂程度随着输入图的规格变化而变化,如果输入图的大小不一样,那么Filter的参数量会有很明显的差距,每输入一次就要学习一次。

二是机器可能会学习到一些我们不想让它学到的信号。因为此方法机器学的eq?g_%7B%5Ctheta%20%7D%28%5CLambda%20%29可以是任何函数,有些函数会计算不相邻的节点的信号,导致整个Graph的信号互相影响,这就失去了Filter的意义。

5 GNN模型代码分析

import numpy as np

# 这个图是一个有向无环图(DAG)
# -1 代表什么也不连
# 图用二维列表,第一行代表节点编号,第二行为对应节点的指向节点
graph = [
    [0,0,1,2,3],
    [1,2,3,3,4]
]

# 定义5个节点的初始特征值
embeddings = [
    [1,2,3],
    [2,6,5],
    [2,3,7],
    [7,8,6],
    [1,0,0]
]

# 定义聚合的权重w全为1
w = [1,1,1,1,1]

# 下面开始图神经网络的聚合过程(训练过程)
# 在这里每个节点只按照方向聚合一层
for i in range(len(graph[0])):  # 每个节点
    # 先寻找指向节点i的节点们
    temp_roots = []
    for j, eve in enumerate(graph[1]):
        if eve == i:
            temp_roots.append(graph[0][j])
    temp_roots.append(i)
    # 此时temp_roots存储了节点i的根节点以及节点i自己的编号
    around = [
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]
    ]
    # 将temp_roots中的几点对应的around替换成当前的embedding
    for every_node_id in temp_roots:
        around[every_node_id] = embeddings[every_node_id]
    # 开始更新节点i的特征:自己之前的特征+周围节点特征的平均
    embeddings[i] = np.matmul(np.array(w),np.array(around))

# 输出更新一层后的embeddings
print(embeddings)

f274f339befb4a04aaf6219dc006d50f.png

 总结

图神经网络(GNN)是一种处理图结构数据的深度学习方法。与CNN、RNN等传统神经网络处理的数据结构不同,图神经网络专门处理不规则的图结构数据,需要考虑节点之间的关系,因此需要一种新的方式来表示节点和边。在时域上图神经网络是将每个节点的特征与其周围节点的特征进行聚合,形成新的节点表示。在频域上图神经网路就是把数据先transform到频域上,用filter处理,然后再转回到空域的过程。

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值