赞
踩
传统机器学习难以应用在图结构上。节点嵌入是将节点映射到d维向量,使得在图中相似的节点在向量域中也相似。存在以下问题:
deep graph encoders:即用GNN进行节点嵌入
Assume:
图 G
节点集 V
邻接矩阵 A(二元,无向无权图。这些内容都可以泛化到其他情况下)
节点特征矩阵 X
一个节点 v
v 的邻居集合N(v)
如果数据集中没有节点特征,可以用指示向量indicator vectors(节点的独热编码),或者所有元素为常数1的向量。有时也会用节点度数来作为特征。
将邻接矩阵拼和节点特征合并,用DNN训练,缺点:
---->借用CNN的思想,将网格上的卷积神经网络泛化到图上,并应用到节点特征数据。但是在CNN中,卷积核大小是固定的,而图的邻居无法用固定大小的卷积核来处理(图上无法定义固定的lacality或滑动窗口且节点顺序不固定),因此用的是聚合(aggregation) 思想。
1.转换邻居信息,将其加总
2. Graph Convolutional Networks
通过节点邻居定义其计算图,传播并转换信息,计算出节点表示(可以说是用邻居信息来表示一个节点)
3.核心思想:通过聚合邻居来生成节点嵌入
通过神经网络聚合邻居信息,通过节点邻居定义计算图(它的邻居是子节点,子节点的邻居又是子节点们的子节点……)
4.深度模型:很多层
节点在每一层都有不同的表示向量,每一层节点嵌入是邻居上一层节点嵌入再加上它自己(相当于添加了自环)的聚合。
第0层是节点特征,第k层是节点通过聚合k hop邻居所形成的表示向量。
图神经网络的层数是计算图的层数,而不是神经网络的层数。根据六度空间理论,这个层数没必要太大
在这里就没有收敛的概念了,直接选择跑有限步(k)层。
5.邻居信息聚合neighborhood aggregation
盒子里就是一个全连接神经网络
不同聚合方法的区别就在于如何跨层聚合邻居节点信息。neighborhood aggregation方法必须要order invariant或者说permutation invariant
基础方法:从邻居获取信息求平均,再应用神经网络
不同顺序下,目标节点有相同的计算图
模型上可以学习的参数有Wl(neighborhood aggregation的权重)和Bl转换节点自身隐藏向量的权重)(注意,每层参数在不同节点之间是共享的)。
可以通过将输出的节点表示向量输入损失函数中,运行SGD来训练参数。
矩阵形式
训练:监督学习和非监督学习
非监督学习
监督学习
第一步:定义节点聚合的函数
第二步:定义节点嵌入的损失函数
第三步:训练
第四步:生成节点嵌入
第五步:泛化到新节点
泛化到新节点:聚合参数在所有节点共享---->泛化到新图
CNN可以看作时一个有固定邻域和固定顺序特殊的GNN
transformer:处理顺序问题,核心是自注意力
优点
K层GNN的感受野:决定节点嵌入的节点集合
如果GNN层数很小,如果提高GNN的表示能力?
1)在GNN层的内部加上深度神经网络
在之前的例子中,邻域信息转换或聚合只有一个线性层
2)预处理和后处理
在GNN层的前后加MLP层
如果需要很多GNN 层呢?
解决方法(2)在GNN中增加skip connections
GNN靠前层(感受野较小的层)的节点嵌入能够较好的区分节点—>通过裁剪增加前面层的影响
skip connections可以创造混合模型
例子:GCN with skip conections
其他例子;
在这之前,都是假设原始图==计算图
但是,
以上步骤可以得到节点嵌入,下一步是prediction head
以上方法在小图中效果很好,在大图中会丢失信息,在大型图中怎么做呢?
比如在下面的例子中,两个图的预测结果相同。
—>解决方法:分层聚合节点嵌入
示例1:社群分层池化
a.分层池化
b.利用2个独立的GNN,A计算节点嵌入,B计算节点聚类
c.两个GNN可以同时执行
对于每个池化层
分类,结果为离散值;回归,结果为连续值。GNN可以应用于这两种情况。
不同之处在于损失函数和评价指标
精确度和混淆矩阵,可以用sklearn实现
如果分配训练集、验证集、测试集
比较:
直推式学习,训练验证和测试在同一个图上,用节点标签分配,只能用于节点预测和边预测任务
归纳式学习,训练验证和测试在不同的图上,可以用于节点预测、边预测和图任务中。好的模型应该可以泛化到新图
例子:
a.节点分类:直推式和归纳式
b.图分类:归纳式
c.边预测:预测缺失的边
一个无监督/自我监督的任务。我们需要自己创建标签和数据集
具体来说,我们需要对GNN隐藏一些边,并让GNN预测这些边是否存在
第一步:创建数据集,一部分边作为message edges 一部分作为supervision edges(应该隐藏起来)
神经网络有万能近似定理
图神经网络的表达能力:区分不同图结构的能力
单个GNN layer
信息计算:
m
u
l
=
M
S
G
l
(
h
u
l
−
1
)
m_u^{l} =MSG^l \ (h_u^{l-1})
mul=MSGl (hul−1)
信息聚合:
h
u
l
=
A
G
G
l
(
m
u
l
−
1
,
u
∈
N
(
v
)
)
h_u^{l} =AGG^l \ (m_u^{l-1},u\in\N(v))
hul=AGGl (mul−1,u∈N(v))
GNN model
GCN 对应元素求均值+线性+ReLU非线性
GraphSAGE 多层感知器+d对应元素max-pooling
(1)从计算图入手,GNN的表达能力=区分计算图根节点嵌入的能力
在每一层,GNN聚合了邻居节点的嵌入信息,但是GNN 不关心节点编号,它只是聚合了不同节点的特征向量。
不同局部邻域定义不同的计算图,计算图与每个节点周围的根节点子树结构相同
(2)引入单射函数(每个输入对应唯一输出,包含了所有的输入信息)
将不同的根子树映射到不同的节点嵌入中,先获得树的单个级别的结构,然后利用递归算法得到树的整个结构
(3)如果GNN聚合的每一步都可以完全保留相邻信息,则生成的节点嵌入可以区分不同的有根子树
(4)理想GNN:不同的计算图根节点输出不同的Embedding
最具有表达力的GNN:聚合操作应该单射
最完美的单射聚合操作:哈希
理论分析聚合函数的表达力
邻居聚合可以概括为一个超集(multi-set,一个有重复元素的集合)函数
分析两个GNN模型的聚合函数
目标:
在信息传递GNN设计表达力最强的GNN,通过在多重集合上设计单射邻域聚合函数来实现
—>用神经网络拟合单射函数(神经网络的万能近似定理)
任何单射多集函数都可以表示为
Φ
(
∑
x
∈
S
f
(
x
)
)
\Phi(\sum\limits_{x\in\ S}f(x))
Φ(x∈ S∑f(x))
例子:f产生颜色,求和记录颜色个数,Φ是单射函数
如何建立Φ和f呢?GIN网络
万能近似定理,使用多层感知机
在具有一个隐藏层的MLP模型中,当隐藏层的维度足够大,且使用非线性函数可以将任何连续函数近似到任意精度
M
L
P
Φ
(
∑
x
∈
S
M
L
P
f
(
x
)
)
MLP_\Phi(\sum\limits_{x\in\ S}MLP_f(x))
MLPΦ(x∈ S∑MLPf(x))
实际中,MLP隐藏层的维度100-500是足够的
第三步:迭代停止得到节点 颜色
任何一个单射函数可以表述为以下形式: M L P Φ ( ( 1 + ϵ ) M L P f ( c ( k ) ( v ) + ∑ u ∈ N ( v ) M L P f ( c ( k ) ( u ) ) MLP_\Phi((1+\epsilon)MLP_f(c^{(k)}(v)+\sum\limits_{u\in\ N(v)}MLP_f(c^{(k)}(u)) MLPΦ((1+ϵ)MLPf(c(k)(v)+u∈ N(v)∑MLPf(c(k)(u))
如果输入特征
c
(
0
)
(
v
)
c^{(0)}(v)
c(0)(v)表示为独热向量,那么直接求和的函数就是单射函数(不需要f)
单射函数:
5. GIN 与 WL graph kernal
GIN可以理解为WL graph Kernel的可微神经版本
GIN相对于WL图内核的优点:
a.节点嵌入是低维的;因此,它们可以捕获不同节点的细粒度相似性
b.可以根据下游任务学习优化
有循环的依然不能区分
用pytorch比较好
GCN的基本思想: 把一个节点在图中的高纬度邻接信息降维到一个低维的向量表示。
首先,我们取其所有邻居节点的平均值,包括自身节点。然后,将平均值通过神经网络。请注意,在GCN中,我们仅仅使用一个全连接层。
GCN的优点:
有邻域和自己
邻域和自己权重可以不同
通过给每条边加了一个模型可学习的系数 ,进行带attention系数的node feature融合,使得在做卷积融合feature的过程,能够根据任务调整模型参数,变得自适应使得效果更好。
具体的思想就是分三步:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。