图神经网络-LINE

在这里插入图片描述

文章目录

动机

这篇论文的初衷是解决两个问题:

  1. 大规模图节点的表示学习
  2. 有向、有权图的节点表示学习

这篇论文首先指出了DeepWalk的缺点:1. 无法建模有权重的图;2.只捕获了图中节点的二阶相似性(second-order proximity )

定义1. 一阶相似性
通俗来讲,一阶相似性刻画了图本身的结构,即节点-边-节点,它是能直接从图中观察到的图的基本结构,是图的局部结构。利用一阶相似性来建模图中节点表示,那么两个节点相连则它们的表示相似,如果两个节点没有边相连,则它们的一阶相似性为0。比如在社交网络中,互为朋友的两个人倾向于有相似的兴趣。但是,由于网络中边经常是缺失的,所以只依靠观察到的边来建模节点的表示是远远不够的。这就需要二阶相似性。

定义2. 二阶相似性
二阶相似性不同于一阶相似性那么直观。它的基本思想是,两个节点拥有越多共同的邻居,那么它们越相似。如果不存在节点同时连着这两个节点,则这两个节点的二阶相似性为0。二阶相似性刻画了图的全局结构

DeepWalk是一种基于dfs的算法,所以它着重于探索节点间的二阶相似性,即社区发现。缺少了对图中节点最直观的一阶相似性建模。针对这个缺陷,LINE的想法是结合一阶相似性和二阶相似性来求节点表示。


模型

  1. 一阶相似性建模

一阶相似性把边看成无向的。首先定义两个节点的联合概率:
p 1 ( v i , v j ) = 1 1 + e x p ( − u ⃗ i T ⋅ u ⃗ j ) p_1(v_i,v_j)=\frac{1}{1+exp(-\vec{u}_i^T·\vec{u}_j)} p1(vi,vj)=1+exp(u iTu j)1

图中任意两个节点的概率都可以用上式来计算,这里 u ⃗ i T \vec{u}_i^T u iT u ⃗ j \vec{u}_j u j就是我 们要学习的节点表示。为了进行有监督学习,需要知道两个节点出现的经验概率(Empirical probability),或者说,真实分布。这里利用图中边的权重分布做为两个节点的真实分布,即权重越大,说明两个节点的概率越大:
p ^ 1 ( v i , v j ) = w i j ∑ ( i , j ) ∈ E w i j \widehat{p}_1(v_i,v_j)=\frac{w_{ij}}{\sum_{(i,j)\in E}w_{ij}} p 1(vi,vj)=(i,j)Ewijwij
然后利用KL散度来刻画 p 1 p_1 p1 p ^ 1 \widehat{p}_1 p 1的差异:
在这里插入图片描述
其中d(·)为KL散度。然后将各项带入,并省略常数项,得到:
在这里插入图片描述

注:这里的化简很简单,这里省略化简步骤。下同。

这样就得到了一阶相似性下的目标函数,通过最小化 O 1 O_1 O1,就可以得到各节点基于一阶相似性的表示。

  1. 二阶相似性建模

由于二阶相似性刻画的是节点邻居间的相似性,所以首先刻画给定一个节点 v i v_i vi,它的上下文(邻居) v j v_j vj的条件概率:
在这里插入图片描述

注:这里通常是利用softmax来最大化 u ⃗ i T ⋅ u ⃗ j \vec{u}_i^T·\vec{u}_j u iTu j,即拟合相应标签1,最小化 u ⃗ k T ⋅ u ⃗ j ( k ! = j ) \vec{u}_k^T·\vec{u}_j(k!=j) u kTu j(k!=j),即拟合相应标签0。所以softmax需要计算的参数量非常大,后面会介绍如何通过负采样来减少计算量。

同样为了有监督学习,定义 p 2 p_2 p2的经验分布(真实分布):
p ^ 2 ( v j ∣ v i ) = w i j ∑ k ∈ N ( i ) w i k \widehat{p}_2(v_j|v_i)=\frac{w_{ij}}{\sum_{k \in N(i)}w_{ik}} p 2(vjvi)=kN(i)wikwij
这里 w i j w_{ij} wij同样是边的权重, ∑ k ∈ N ( i ) w i k \sum_{k \in N(i)}w_{ik} kN(i)wik v i v_i vi出边的权重和。其实就是对从 v i v_i vi到它邻居的边的权重进行了归一化。

疑问:计算 p ^ 2 \widehat{p}_2 p 2时分母只计算了节点i的出边,而计算 p 2 p_2 p2时分母是在所有节点上进行的,两个概率分布感觉是不统一的,这样利用KL散度衡量差异会不会存在误差?我觉得这里有待商榷。

然后依旧利用KL散度衡量两个分布的差异,得到:
在这里插入图片描述
注意这里加了一个权重项 λ i \lambda_i λi,这一项代表了节点 v i v_i vi的重要程度,可以用节点的度或者PageRank等算法得到。这里采用 λ i = ∑ k ∈ N ( i ) w i k \lambda_i=\sum_{k \in N(i)}w_{ik} λi=kN(i)wik即节点的出边权重和。
然后把各项带入并省略常数项得到:
在这里插入图片描述
通过最小化 O 2 O_2 O2,可以得到各节点的基于二阶相似性的表示。

  1. 融合一阶相似性和二阶相似性

作者分开训练基于一阶相似性的节点表示和基于二阶相似性的节点表示,然后将两者拼接做为最终表示。

  1. 模型优化

4.1 负采样

前面也说到,建模二阶相似性时,利用softmax对 p 2 p_2 p2计算损失非常耗时。于是作者采用了负采样的方法。将 O 2 O_2 O2 l o g p 2 ( y j ∣ v i ) log p_2(y_j|v_i) logp2(yjvi)改为:
在这里插入图片描述
这里前面的一项为图中真实存在的从 v i v_i vi v j v_j vj的边,后面是采样的K个负样本(不一定存在),所以在向量相乘( u ⃗ i T ⋅ u ⃗ j \vec{u}_i^T·\vec{u}_j u iTu j)前加了负号。通过这种负采样,就不用在图中所有节点上计算了,而只需采样 K K K个负样本节点,然后进行 K + 1 K+1 K+1次二分类。

注:这个负采样公式和word2vec中的负采样一样,所以说LINE和DeepWalk其实都借鉴了自然语言处理中的单词预训练方式。

此外,在建模一阶相似性时,最小化 O 1 O_1 O1可能会导致 p 1 p_1 p1中的节点表示 u ⃗ i \vec{u}_i u i的各个分量趋近于无穷,从而产生无效解(trivial solution)。为了解决这一潜在问题,也可以对一阶相似性进行负采样,即把 p 1 p_1 p1的计算改成上面的公式。由于后面一项的存在(向量前加了负号),就能尽量避免节点表示的各分量为无穷的情况。

4.2 边采样

模型采用梯度下降法更新参数,在计算参数的导数时,有:
在这里插入图片描述
注意导数会有一个 w i j w_{ij} wij项,这个 w i j w_{ij} wij会影响每次参数更新的程度,当 w i j w_{ij} wij过大时,可能会造成梯度爆炸,过小时,又可能会造成梯度消失,当然可以通过设置合理的学习率来控制步长,但是需要根据 w i j w_{ij} wij的大小不断变换学习率,这在训练阶段是非常不方便的。所以针对这一问题,作者提出了 边采样(Edge Sampling) 算法。
边采样算法的目的就是为了去除 w i j w_{ij} wij对梯度的影响,但是针对有权图,如何才能统一边的权重,而又不丢失权重信息呢?作者创新性地想到利用采样的算法来解决这一问题。将所有的边看成二值边,即存在或不存在,然后利用边的权重做为概率,来对边进行采样,然后计算无边权重下的梯度。直观上讲,边的权重越大说明两个节点的关联性越高,即越能代表图的结构,所以以更大概率来抽取到此边来进行模型参数更新。为了使边的采样更有效率,作者采用了alias table方法,可以在O(1)时间内进行采样。这样一来,进行梯度更新时,不再是均匀采样图中各边(batch),而是按照权重的概率分布采样。

注:alias table方法是一种采样算法,在论文“Reducing the sampling complexity of topic models”中被提出。

4.3 其他技巧

  1. 对于度比较小的顶点,模型很难去捕捉它的二阶相似性,因为二阶相似性是依赖于邻居的表示的。一个简单的方法是”扩展“它的邻居,定义它的邻居可以是二阶邻居,即邻居的邻居,这样就增加了它的邻居数。对于这样的二阶邻居 v j v_j vj,权重计算如下:
    在这里插入图片描述
  2. 对于新加入的节点。只更新它自己的表示,保持其他节点的表示不变。目标函数中也只使用它周围的节点:
    在这里插入图片描述

实验

作者在三种网络结构,语言网络(Language Network)、社会网络和引文网络中进行了实验。
语言网络中节点是单词,进行了两种任务:词语类比(Word Analogy)和文档分类。词语类比任务是仿照给定的一对单词,来补全另一对单词。比如给定(北京,中国),推断(?,法国),显然这里需要推断出“巴黎”。实验结果表明,在这类任务上,二阶相似性比一阶相似性更好,原因也很明显,词语类比任务考察的是单词的语义,而不是单词的共现。二阶相似性更能捕捉到词语间的语义相似性。对于文档分类任务,作者直接把文档中单词在图中的表示进行了平均,做为此文档的表示,然后进行分类。此外,作者还展示了在一阶和二阶相似度下,单词间的相似性:
在这里插入图片描述
可以看出,一阶相似性下,最相似的单词混合了句法和语义相似(syntactically and semantically);而二阶相似性主要捕捉了语义相似性。

社会网络主要进行了节点的多标签分类任务。由于社会网络比语言网络稀疏,所以作者采用了前面提到的扩展邻居的方法。

引文网络同样是稀疏图,而且是异质图。直接利用二阶相似性建模不如DeepWalk,采用了扩展邻居的方法可以使二阶相似性的效果超过DeepWalk。

从以上可以看出,二阶相似性对网络稀疏程度比较敏感。

### 图神经网络 (GNN) 学习资源 对于希望深入了解图神经网络(Graph Neural Networks, GNNs)的学习者来说,有多种高质量的教程、论文和技术博客可以作为参考资料。 #### 论文阅读 一些重要的研究工作奠定了现代GNN的基础。例如,《DeepWalk: Online Learning of Social Representations》探讨了如何通过随机游走的方式捕捉社交网络中的节点特征[^1];《node2vec: Scalable Feature Learning for Networks》则进一步扩展了这一思路,提出了更灵活的方法来生成节点嵌入表示;而《Semi-Supervised Classification with Graph Convolutional Networks》引入了一种基于卷积操作处理图形数据的新框架——GCN(Graph Convolutional Network),它能够有效地利用未标记的数据进行半监督分类任务。 #### 教程视频 除了学术文章外,在线教育平台也提供了许多易于理解的教学材料。比如B站上有一个名为“GNN从入门到精通”的系列课程,该课程由浅入深地讲解了有关GNN的知识点,并配有实际案例分析和编程练习[^3]。 #### 技术文档与笔记整理 为了帮助初学者更好地掌握理论概念并应用于实践当中,“【GNN】图神经网络学习小结and笔记汇总”这份总结性的资料非常有价值。这里不仅包含了对核心算法原理详尽解释的文字描述,还有配套代码实现供读者参考学习[^2]。 ```python import torch from torch_geometric.nn import GCNConv class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = GCNConv(dataset.num_node_features, 16) self.conv2 = GCNConv(16, dataset.num_classes) def forward(self, data): x, edge_index = data.x, data.edge_index x = self.conv1(x, edge_index) x = F.relu(x) x = F.dropout(x, training=self.training) x = self.conv2(x, edge_index) return F.log_softmax(x, dim=1) ``` 上述Python代码片段展示了如何使用PyTorch Geometric库构建简单的两层GCN模型来进行节点分类预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值