GNN(Graph neural networks)图神经网络,GCN(Graph convolutional network) GraphSage理解

一、GNN

图神经网络与传统神经网络的最大区别在于:对于图中节点的信息,应当考虑其邻居的特征,即包括邻居节点和自身的信息,然后将其输入到全连接层,去完成任务。

根据节点连接状态,建立邻接矩阵A

\begin{bmatrix} 0& 0 & 0& 0& 1 \\ 0& 0 & 0& 1& 1 \\ 0& 0 & 0& 1& 1 \\ 0& 1 & 1& 0& 1\\ 1& 1 & 1& 1& 0\end{bmatrix}

为了能够将点的自身特征也加入进去,我们加入一个\lambda倍的单位阵:

{A}' = A + \lambda I_{N}

\lambda的取值,决定了各节点本身特征的重要性。当\lambda的取值为1时,意味着节点本身特征的重要性与其邻居重要性一样。\lambda是一个可训练得到的参数(怎么训练?最速下降法?)。我们取\lambda为1.

{A}'矩阵为:\begin{bmatrix} 1& 0 & 0& 0& 1 \\ 0& 1 & 0& 1& 1 \\ 0& 0 & 1& 1& 1 \\ 0& 1 & 1& 1& 1\\ 1& 1 & 1& 1& 1\end{bmatrix}

通过将新的邻接矩阵与特征向量相乘,可以得到包括节点自身信息和邻居节点信息的新的特征:

\begin{bmatrix} 1& 0 & 0& 0& 1 \\ 0& 1 & 0& 1& 1 \\ 0& 0 & 1& 1& 1 \\ 0& 1 & 1& 1& 1\\ 1& 1 & 1& 1& 1\end{bmatrix} * \begin{bmatrix} -1.1& 3.2 & 4.2 \\ 0.4& 5.1 & -1.2 \\ 1.2& 1.3 & 2.1 \\ 1.4& -1.2 & 2.5 \\ 1.4& 2.5 & 4.5\end{bmatrix} = new matrix

二、GCN

GCN网络是GNN网络的进化版,在GNN结构的基础上加入一个新的变量:度矩阵(degree matrix),添加度矩阵的意义在于可以过滤数据,使特征标准化,避免在迭代的过程无效信息掩盖了有效信息。那么,度矩阵是如何避免这些数据冗余的问题呢?

给定无相网络G = \left ( V, E \right ),其中,V中包含网络中所有的N个节点,v_{i} \in V,E代表节点之间的边\left ( v_{i},v_{j} \right ) \in E, 邻接矩阵A中的原始可以为\left ( 1,0 \right )的二进制编码,也可以是权重;度矩阵D_{ii} = \sum _{j} A_{ij}。节点的特征向量矩阵X\in R^{N \times C},其中N为节点数,C为特征向量维度。

邻接矩阵A:\begin{bmatrix} 0& 0 & 0& 0& 1 \\ 0& 0 & 0& 1& 1 \\ 0& 0 & 0& 1& 1 \\ 0& 1 & 1& 0& 1\\ 1& 1 & 1& 1& 0\end{bmatrix}

度矩阵D:\begin{bmatrix} 1& 0 & 0& 0& 0 \\ 0& 2 & 0& 0& 0 \\ 0& 0 & 2& 0& 0 \\ 0& 0 & 0& 3& 0\\ 0& 0 & 0& 0& 4\end{bmatrix}

特征向量矩阵:\begin{bmatrix} -1.1& 3.2 & 4.2 \\ 0.4& 5.1 & -1.2 \\ 1.2& 1.3 & 2.1 \\ 1.4& -1.2 & 2.5 \\ 1.4& 2.5 & 4.5\end{bmatrix}

在GNN中,我们已经通过加入单位阵来引入了节点自身对自己的影响。

{A}' = A + \lambda I_{N}

我们就可以得到新的邻接矩阵:

新的邻接矩阵{A}' =\begin{bmatrix} 1& 0 & 0& 0& 1 \\ 0& 1 & 0& 1& 1 \\ 0& 0 & 1& 1& 1 \\ 0& 1 & 1& 1& 1\\ 1& 1 & 1& 1& 1\end{bmatrix}

度矩阵我们能看到,对角线上的数目为节点的边的数量。为了加上节点自身的影响,我们将度矩阵加上一个单位阵,获得新的度矩阵{D}'

{D}' =\begin{bmatrix} 2& 0 & 0& 0& 0 \\ 0& 3 & 0& 0& 0 \\ 0& 0 & 3& 0& 0 \\ 0& 0 & 0& 4& 0\\ 0& 0 & 0& 0& 5\end{bmatrix}

随后,我们需要对邻接矩阵进行标准化,也就是平均。这里我们可以借助度矩阵D的逆。

{D}'^{-1} =\begin{bmatrix} 1/2& 0 & 0& 0& 0 \\ 0& 1/3 & 0& 0& 0 \\ 0& 0 & 1/3& 0& 0 \\ 0& 0 & 0& 1/4& 0\\ 0& 0 & 0& 0& 1/5\end{bmatrix}

这里将节点A平均分成两份的意义为,节点A对节点E有一份影响,节点A对本身又有一份影响。那么,我们就将节点A的特征平均分为两份进行赋值。

我们的新的节点特征就为:{D}'^{-1}({A}'X)

但是,由于我们只对行进行了标准化,需要对列也进行标准化。

{D}'^{-1}{A}'{D}'^{-1}X

另一种解释:由于为该计算为图,表示边的矩阵必须为对角阵,所以必须左乘后进行右乘。

再进一步优化,为了避免两次标准化,我们可以{D}'^{-1/2}{A}'{D}'^{-1/2}X来进行单次标准化。

最终,我们的2-layer GCN表达式为:

Z = f(X,\hat{A}) = softmax(\hat{A}ReLU(\hat{A}XW^{(0)})W^{(1)})

其中\hat{A} = {D}'^{-1/2}{A}'{D}'^{-1/2}

GCN的层数含义

网络的层数代表着节点特征所能到达的最远距离。比如一层的GCN,每个节点只能得到其一阶邻居身上的信息。对于所有结点来说,信息获取的过程是独立、同时开展的。

当我们层数设定为2~3时,预测效果较好。

三、GraphSage(Graph SAmple and aggreGatE)

GraphSage与上述结构的差别在于不使用邻接矩阵取全部的邻居节点,而是使用采样的方法,采取固定数量的邻居节点,随后进行聚合。GraphSage可以用于监督学习(Cora的点标签预测,化学式的图预测),也可以用于非监督学习(将节点进行聚合分类)。

节点聚合的方式也由相加变为了concat(邻居节点的特征聚合后,再与节点自身进行拼接。如果节点自身和邻居节点特征一起聚合,会在n次聚合之后出现over-smoothing的问题,即节点特征经过多次融合后难以区分。例如:节点B和节点D的邻居相同。)

h_{v}^{k}=\operatorname{CONCAT}\left(h_{v}^{k-1}, A G G R E G A T E_{k}\left(\left\{h_{u}^{k-1} \forall u \in \mathcal{N}(v)\right\}\right)\right) \\

h_{v}^{k}表示经过k次聚合后的节点embedding,v表示节点vuv的邻居节点。

接下来添加非线性函数转换\sigma获得更强的特征表达:

h_{v}^{k}=\sigma\left[W^{(k)} \cdot \operatorname{CONCAT}\left(h_{v}^{k-1}, A G G R E G A T E_{k}\left(\left\{h_{u}^{k-1} \forall u \in \mathcal{N}(v)\right\}\right)\right)\right] \\

W^{(k)}为可训练参数。

随后进行使用L2标准化,得到整体的GraphSAGE的聚合算法。(L2标准化就是对向量的每一个值都除以向量的平方和的开方)。经过标准化的点v结果为\mathbf{z}_{v}

针对不同的任务:

对于无监督学习,目标函数如下:

J_{\mathcal{G}}\left(\mathbf{z}_{v}\right)=-\log \left(\sigma\left(\mathbf{z}_{v}^{\top} \mathbf{z}_{u}\right)\right)-Q \cdot \mathbb{E}_{u_{n} \sim P_{n}(u)} \log \left(\sigma\left(-\mathbf{z}_{v}^{\top} \mathbf{z}_{u_{n}}\right)\right) \\

其中

v为目标节点,u为节点v随机游走的邻居节点

Q表示负样本数量

z_{v}z_{u}分别表示节点u和节点n的表示向量。

\sigma(x)是sigmoid函数,定义为\sigma(x) = \frac{1}{1+e^{-x}},其值在0到1之间

P_{n}(u)表示负样本采集分布

分析:

第一项:-\log \left(\sigma\left(\mathbf{z}_{v}^{\top} \mathbf{z}_{u}\right)\right)

 当节点v与节点u相似时,\left(\mathbf{z}_{v}^{\top} \mathbf{z}_{u}\right) 为很大的一个正数,经过sigmoid标准化后趋近于1,取对数后  -\log \left(\sigma\left(\mathbf{z}_{v}^{\top} \mathbf{z}_{u}\right)\right)趋近于0

第二项:     -Q \cdot \mathbb{E}_{u_{n} \sim P_{n}(u)} \log \left(\sigma\left(-\mathbf{z}_{v}^{\top} \mathbf{z}_{u_{n}}\right)\right) \\    

当从v的近邻节点集合un中取样本时,我们取负样本,即与节点v不相似的节点un。那么-\mathbf{z}_{v}^{\top} \mathbf{z}_{u_{n}}为一个很大的一个正数,经过sigmoid标准化后趋近于1,取对数后 \log \left(\sigma\left(-\mathbf{z}_{v}^{\top} \mathbf{z}_{u_{n}}\right)\right)趋近于0,随后乘上选取概率期望以及选取数量,获得这一部分的损失函数

对于监督学习:

监督学习形式根据任务的不同直接设置目标函数即可,如最常用的节点分类任务使用交叉熵损失函数。

Inductive capability

Graphsage可以进行参数共享,当寻良好两层的Aggregator layers后得到权重W_{k}B_{k}时,可以通过参数共享用于其他的图结构。

GraphSage的优缺点

优点

通过邻居采样的方式解决了GCN的内存爆炸问题,适用于大规模图的表示学习

将 transductive 转化为 inductive learning,而且支持增量特征(transductive表示测试数据也参与了训练,即模型没有迁移性;inductive learning参数可以随时迁移,解决新来的问题)

引入邻居采样,防止过拟合,提升泛化能力

根据不同领域的图场景来定义图聚合方式

缺点

无法处理加权图,仅可以邻居节点等权聚合

邻居采样引入随机过程,推理阶段同一节点 embedding 特征不稳定,且邻居采样会导致反向传播时梯度不稳定

邻居采样的过程会造成信息缺失

GCN 网络层太多会引起 over-smoothing 问题,即嵌入多个节点时共享邻居过多,导致节点嵌入十分相似。

参考:

图卷积网络(Graph Convolutional Networks, GCN)详细介绍-优快云博客

GNNs入门(一)GNN和GCN-优快云博客

深度探索:机器学习中的GraphSAGE算法(基于深度学习的图神经网络算法)原理及其应用-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值