GNN原理详解


之前写过一篇GNN的综述https://blog.csdn.net/weixin_45884316/article/details/115751272,但是感觉对于原理部分理解得不透彻,所以把原理单独拿出来,详细地过了一遍。


状态更新与输出

​ 给定一张图 G G G,每个结点都有其自己的特征(feature),用 x v x_v xv表示结点v自身的特征,连接两个结点的边也有自己的特征,用 x v , u x_{v,u} xv,u表示。GNN的学习目标是获得每个结点的隐藏状态 h v ∈ R s h_v∈R^s hvRs(state embedding),这就意味着:对于每个节点,它的隐藏状态包含了来自邻居节点的信息。那么,如何让每个结点都感知到图上其他的结点呢?GNN通过迭代更新所有结点的隐藏状态来实现,在 t + 1 t+1 t+1时刻,结点 v v v的隐藏状态按照如下方式更新,一共更新4部分内容
h v = f ( x v , x c o [ v ] , h n e [ v ] , x n e [ v ] ) (1) h_v=f(x_v,x_{co[v]},h_{ne[v]},x_{ne[v]})\tag{1} hv=f(xv,xco[v],hne[v],xne[v])(1)

  • 假设 f ( ⋅ ) f(\cdot) f()是带有参数的函数,叫做局部转移函数(local transition function)。 f f f就是隐藏状态的状态更新函数。注意: f f f在所有节点中共享(全局共享)
  • x c o [ v ] x_{co[v]} xco[v]:表示与节点v关联的边的特征向量
  • x n e [ v ] x_{ne[v]} xne[v]:表示节点v的邻居节点特征向量
  • h n e [ v ] h_{ne[v]} hne[v]:表示节点v的邻居节点在 t t t时刻的隐藏状态

直接看公式有点不直观,举个小例子,假设对于节点5,其隐藏状态的更新函数如下:

在这里插入图片描述

利用更新函数,不断地利用当前时刻邻居结点的隐藏状态作为部分输入来生成下一时刻中心结点的隐藏状态,直到每个结点的隐藏状态变化幅度很小。至此,每个结点都“知晓”了其邻居的信息。

除了不断的更新,最终我们需要一个输出函数,适应不同的下游任务,论文中称之为局部输出函数(local output function):
o v = g ( h v , x v ) (2) \large o_v=g(h_v,x_v)\tag{2} ov=g(hv,xv)(2)
在这里插入图片描述
在这里插入图片描述

对于不同的图,收敛的时刻可能不同(因为收敛是通过两个时刻 p − p- p范数​的差值是否小于某个阈值来判定的)

那么我们与深度学习结合呢?用神经网络来拟合复杂函数 f f f g g g

为什么会一定收敛输出

假设将所有的状态向量,所有的输出向量,所有的特征向量和所有的节点特征而得到的向量叠加起来,分别用 H , O , X , X N H,O,X,X_N H,O,X,XN表示,那么可以得到更加紧凑的表示:
H = F ( H , X ) (3) H=F(H,X)\tag{3} H=F(H,X)(3)

O = G ( H , X N ) (4) O=G(H,X_N)\tag{4} O=G(H,XN)(4)

根据Banach的不动点定理,GNN使用如下的传统迭代方法来计算状态参量:
H t + 1 = F ( H t , X ) (5) H^{t+1}=F(H^t,X)\tag{5} Ht+1=F(Ht,X)(5)
其中, H t H^t Ht 表示 H H H 的第 t t t 个迭代周期的张量。对于任意的初始值 H 0 H_0 H0,公式(5)能通过快速收敛来得到公式(3)最终的固定点的解。通过更新迭代,为什么一定会收敛呢?

就是因为不动点定理,就是说不管输入 H 0 H^0 H0是什么形式,如下图只要 F F F是个压缩的映射,不断迭代压缩,最终都会收敛到某一个固定的点,称之为不动点。

在这里插入图片描述

那么,又带来了一个新的问题:怎么保证 F F F是一个压缩函数?

f f f是用前馈神经网络实现,一种实现方法可以是把每个邻居结点的特征、隐藏状态、每条相连边的特征以及结点本身的特征简单拼接在一起,在经过前馈神经网络后做一次简单的加和。

h v t + 1 = f ( x v , x c o [ v ] , h n t e [ v ] , x n e [ v ] ) = ∑ u ∈ n e [ v ] F N N ( [ x v ; x ( u , v ) ; h u t ; x u ] ) \begin{array}{l} \mathbf{h}_{v}^{t+1}=f\left(\mathbf{x}_{v}, \mathbf{x}_{c} o[v], \mathbf{h}_{n}^{t} e[v], \mathbf{x}_{n} e[v]\right) \\ =\sum_{u \in n e[v]} F N N\left(\left[\mathbf{x}_{v} ; \mathbf{x}_{(u, v)} ; \mathbf{h}_{u}^{t} ; \mathbf{x}_{u}\right]\right) \end{array} hvt+1=f(xv,xco[v],hnte[v],xne[v])=une[v]FNN([xv;x(u,v);hut;xu])

f f f为压缩映射的等价条件是 f f f的梯度(导数)要小于1,我们可以通过对雅可比矩阵(Jacobian Matrix)的惩罚项(Penalty)来实现,限制 f f f H H H的偏导数矩阵的大小。

f f f g g g的参数学习

不一定所有结点都是有监督的,模型的损失只通过有监督信号的结点得到,可以将损失函数定义为如下形式:
l o s s = ∑ i = 1 p ( t i − o i ) (6) loss=\sum_{i=1}^p{(t_i-o_i)}\tag{6} loss=i=1p(tioi)(6)
p p p 表示监督节点的数目, t i t_i ti o i o_i oi 分别表示节点的真实值和预测值。损失函数的学习基于梯度下降策略,由以下步骤组成:

  1. 状态 h v t h_v^t hvt按照方公式 f f f迭代更新 T T T轮次,直到到达接近公式(3)的定点解的时刻 T T T, 这时得到的 H H H会接近不动点的解 H T ≈ H H^T\approx H HTH
  2. 对于有监督信号的结点,将其隐藏状态通过 g g g得到输出,进而算出模型的损失
  3. 反向传播时,权重 W W W 的梯度从loss计算得到,所以可以直接求出 f f f g g g对最终隐藏状态 h v T n h_v^{{T_n}} hvTn的梯度,然后 W W W根据上一步中计算的梯度不断更新,经过 T T T次,得到对 h v 0 h_v^0 hv0的梯度,然后该梯度用于更新模型的参数。
  • 30
    点赞
  • 160
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
GNN(Graph Neural Networks)是一种基于图结构数据的深度学习模型,它可以对节点和边进行建模,并通过学习节点之间的关系来实现图的表示学习、节点分类、图分类、链接预测等任务。下面是 GNN原理图和原理详解: ## 原理GNN原理图如下所示: ![GNN原理图](https://i.imgur.com/7OaImoB.png) 在 GNN 中,输入的图数据可以表示为一个有向图 $G=(V,E)$,其中 $V$ 表示节点集合,$E$ 表示边集合。每个节点 $v_i$ 都有一个特征向量 $h_i$,它可以表示节点的属性信息,如节点的位置、关系、类型等。每个边 $e_{ij}$ 都有一个特征向量 $w_{ij}$,它可以表示边的属性信息,如边的权重、方向、类型等。 GNN 的核心是通过神经网络学习节点的表示,并且通过节点之间的关系来传播信息。具体来说,GNN 通过迭代更新每个节点的表示向量 $h_i^{(k)}$,其中 $k$ 表示迭代次数。每次迭代都会从当前节点的邻居节点中收集信息,并更新当前节点的表示向量。具体来说,每个节点的表示向量可以表示为: $$h_i^{(k)} = f\left(h_i^{(k-1)},\sum_{j\in N(i)}\frac{1}{\sqrt{d_id_j}}h_j^{(k-1)}\right)$$ 其中 $N(i)$ 表示节点 $i$ 的邻居节点集合,$d_i$ 和 $d_j$ 分别表示节点 $i$ 和节点 $j$ 的度数,$f$ 是一个非线性变换函数,如 ReLU 或 tanh 等。 通过多次迭代更新节点的表示向量,GNN 可以学习到节点之间的关系,从而实现图的表示学习、节点分类、图分类、链接预测等任务。 ## 原理详解 GNN原理详解如下: 1. 节点表示向量的初始化 在 GNN 中,每个节点都有一个表示向量 $h_i^{(0)}$,它可以表示节点的初始状态。通常情况下,节点的表示向量可以初始化为节点的属性向量,如节点的位置、关系、类型等。 2. 邻居节点信息的聚合 在每次迭代中,GNN 需要从邻居节点中聚合信息,并更新当前节点的表示向量。具体来说,对于节点 $i$,它的邻居节点集合为 $N(i)$,邻居节点 $j$ 的表示向量为 $h_j^{(k-1)}$,邻居节点 $j$ 到节点 $i$ 的边的特征向量为 $w_{ij}$。那么,节点 $i$ 的聚合信息可以表示为: $$m_i^{(k)} = \sum_{j\in N(i)} w_{ij}h_j^{(k-1)}$$ 其中 $m_i^{(k)}$ 表示节点 $i$ 在第 $k$ 次迭代中从邻居节点中收集到的信息。需要注意的是,边的特征向量 $w_{ij}$ 可以被视为一个可学习的参数,它可以表示边的权重、方向、类型等信息。 3. 节点表示向量的更新 在每次迭代中,GNN 需要通过聚合邻居节点的信息来更新当前节点的表示向量。具体来说,节点 $i$ 的表示向量可以表示为: $$h_i^{(k)} = f\left(h_i^{(k-1)},m_i^{(k)}\right)$$ 其中 $f$ 是一个非线性变换函数,如 ReLU 或 tanh 等。这个函数可以帮助 GNN 学习节点之间的非线性关系,并更新节点的表示向量。 4. GNN 的输出 在多次迭代后,GNN 可以得到每个节点的表示向量,这些表示向量可以用于实现图的表示学习、节点分类、图分类、链接预测等任务。具体来说,对于节点分类任务,可以通过节点的表示向量来预测每个节点的标签;对于图分类任务,可以通过所有节点的表示向量来预测整个图的标签;对于链接预测任务,可以通过边的表示向量来预测两个节点之间是否存在边。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值