这篇文章提出的LINE可适用于百万级边的大型网络,不基于random walk而是通过网络结构(1阶相似度与2阶相似度)设计优化目标函数,通过SGD来学习得到node embedding,是一篇开拓性的工作。
简单说就是两点之间边的真实权重,和预测权重之间的差距,通过KL散度来度量,得到目标函数,然后进行优化学习。
图神经网络的研究背景都差不多,传统的算法对邻接矩阵进行分解,学到的是每一个node的特征向量(背后数学知识较复杂),就是可理解为模型认为邻接矩阵的每一行都表示了该节点的情况,就将其认为是特征向量来进行处理了。
这样方法的缺陷,类似于NLP里面的one-hot表示法的问题,没法计算两个结点具体的远近,就像是one-hot一样没法表示语义信息,没法表示词意相近程度。
网络表征后可以做很多下游任务,例如结点分类,边预测,推荐系统。还可以学习词向量,比如将两个词共现的频率作为边权,词作为结点,这样就构成了图,可以拿来训练得到结点表征也就是词向量。
传统的方法使用的是1阶相似度,就是只关注两个相邻的节点之间的连接,但是这并不足以完整表征图的信息,例如下面的图网络
两个橘黄色的点之间虽然没有边,但是其实是相近的,这就是2阶相似度要解决的问题。就好像两个人之间共同朋友的数量和他们两个之间的关系是相关的,也好像你了解一个单词是通过上下文的单词了解的。
这篇论文有下面几个意义(部分源于摘要)
首先要了解KL散度和交叉熵的概念。
了解之后,详细介绍一下一阶相似度和二阶相似度的具体概念。
对于无向边i-j来说,一阶相似度的真实值为:
p ^ 1 ( v i , v j ) = w i j ∑ ( m , n ) ∈ E w m n \hat{p}_{1}\left(v_{i}, v_{j}\right)=\frac{w_{i j}}{\sum_{(m, n) \in E} w_{m n}} p^1(vi,vj)=∑(m,n)∈Ewmnwij
这里分母是全网络上所有边的和。而如果训练好了模型,得到i和j节点的embedding向量u之后,模型计算的一阶相似度的值为
p 1 ( v i , v j ) = exp ( u ⃗ i T u ⃗ j ) ∑ ( m , n ) ∈ V × V exp ( u ⃗ m T u ⃗ n ) p_{1}\left(v_{i}, v_{j}\right)=\frac{\exp \left(\vec{u}_{i}^{T} \vec{u}_{j}\right)}{\sum_{(m, n) \in V \times V} \exp \left(\vec{u}_{m}^{T} \vec{u}_{n}\right)} p1(vi,vj)=∑(m,n)∈V×Vexp(umTun)exp(uiTuj)
所以,如果综合考虑一整张图的预测精确程度,目标就是希望模型预测的所有边的一阶相似度和所有真实的一阶相似度一样,这里就用到了KL散度的概念,用KL散度衡量两个概率分布的近似程度,训练起来就是用模型预测的分布来逼近真实分布:
O 1 = K L ( p ^ 1 , p 1 ) = − ∑ ( i , j ) ∈ E w i j log p 1 ( v i , v j ) O_{1}=K L\left(\hat{p}_{1}, p_{1}\right)=-\sum_{(i, j) \in E} w_{i j} \log p_{1}\left(v_{i}, v_{j}\right) O1=KL(p^1,p1)=−(i,j)∈E∑wijlogp1(vi,vj)
值得注意的是,一阶相似度只能做无向网络。
2阶相似度是定义在有向边上的,对于有向边i -> j,二阶相似度的真实值为
p ^ 2 ( v j ∣ v i ) = w i j ∑ k ∈ V w i k \hat{p}_{2}\left(v_{j} \mid v_{i}\right)=\frac{w_{i j}}{\sum_{k \in V} w_{i k}} p^2(vj∣vi)=∑k∈Vwikwij
可以看见和一阶相似度不同的是,分母变了,这里变成了和i相邻的边的所有权重之和。
用模型来预测,得到的分布就是
p 2 ( v j ∣ v i ) = exp ( u ⃗ i ′ T u ⃗ j ) ∑ k ∈ V exp ( u ⃗ k ′ T u ⃗ i ) p_{2}\left(v_{j} \mid v_{i}\right)=\frac{\exp \left(\vec{u}_{i}^{\prime T} \vec{u}_{j}\right)}{\sum_{k \in V} \exp \left(\vec{u}_{k}^{\prime T} \vec{u}_{i}\right)} p2(vj∣vi)=∑k∈Vexp(uk′Tui)exp(ui′Tuj)
相应的,目标函数就是
O 2 = ∑ i K L ( p ^ 2 ( ⋅ ∣ v i ) , p 2 ( ⋅ ∣ v i ) ) = − ∑ ( i , j ) ∈ E w i j log p 2 ( v j ∣ v i ) O_{2}=\sum_{i} K L\left(\hat{p}_{2}\left(\cdot \mid v_{i}\right), p_{2}\left(\cdot \mid v_{i}\right)\right)=-\sum_{(i, j) \in E} w_{i j} \log p_{2}\left(v_{j} \mid v_{i}\right) O2=i∑KL(p^2(⋅∣vi),p2(⋅∣vi))=−(i,j)∈E∑wijlogp2(vj∣vi)
总结一下,2阶相似度是可以算有向图和无向图的。
但其上面目标函数的推导过程具体如下。由于每个点的重要性不一样,所以有的点需要着重学习,有的点重要性就没那么高,所以目标函数一开始是:
O 2 = ∑ i ∈ V λ i d ( p ^ 2 ( ⋅ ∣ v i ) , p 2 ( ⋅ ∣ v i ) ) O_{2}=\sum_{i \in V} \lambda_{i} d\left(\hat{p}_{2}\left(\cdot \mid v_{i}\right), p_{2}\left(\cdot \mid v_{i}\right)\right) O2=i∈V∑λid(p^2(⋅∣vi),p2(⋅∣vi))
这里的 λ \lambda λ就代表了节点的重要程度,其计算方式类似PageRank,是和出度成正比的。
然后用KL散度来表示这个距离函数d,并且忽略了所有的常数项,最后公式的结果为
O 2 = − ∑ ( i , j ) ∈ E w i j log p 2 ( v j ∣ v i ) O_{2}=-\sum_{(i, j) \in E} w_{i j} \log p_{2}\left(v_{j} \mid v_{i}\right) O2=−(i,j)∈E∑wijlogp2(vj∣vi)
这里看一下上面二阶相似度的表达式,这个表达式计算起来是很麻烦的,一个图有多少节点就要计算多少次,这里p的分母的计算量就非常大。所以作者提出了优化,借鉴了word2vec中提到的负采样算法,其本质就是:正样本可以促进训练,但其实负样本也可以促进训练,原理就是训练目标希望正样本让其成立的概率最高,希望负样本模型预测出的不成立的概率最高。
于是综合写一下有链接的边有链接的概率p,和没链接的边没链接概率1-p,写成在所有样本上概率连乘积的形式(最大似然),最后就可以推导出结果
log σ ( u ⃗ j ′ T ⋅ u ⃗ i ) + ∑ i = 1 K E v n ∼ P n ( v ) [ log σ ( − u ⃗ n ′ T ⋅ u ⃗ i ) ] \log \sigma\left(\vec{u}_{j}^{\prime T} \cdot \vec{u}_{i}\right)+\sum_{i=1}^{K} E_{v_{n} \sim P_{n}(v)}\left[\log \sigma\left(-\vec{u}_{n}^{\prime T} \cdot \vec{u}_{i}\right)\right] logσ(uj′T⋅ui)+i=1∑KEvn∼Pn(v)[logσ(−un′T⋅ui)]
第一项是有链接的边,第二项是负采样的没链接的K个边。P采用的是word2vec里面的表达
P n ( v ) ∝ d v 3 / 4 P_{n}(v) \propto d_{v}^{3 / 4} Pn(v)∝dv3/4
意为,采取具有影响力的负样本。影响力自然就和出度有关,而出度d的计算式为
d i = ∑ k ∈ N ( i ) w i k d_{i}=\sum_{k \in N(i)} w_{i k} di=k∈N(i)∑wik
此时得到的公式,就可以替代上面O2目标函数里面对每一条边的计算公式了,也就是代替了 w i j log p 2 ( v j ∣ v i ) w_{i j} \log p_{2}\left(v_{j} \mid v_{i}\right) wijlogp2(vj∣vi)。
随机梯度下降的时候,会得到这个公式
∂ O 2 ∂ u ⃗ i = w i j ⋅ ∂ log p 2 ( v j ∣ v i ) ∂ u ⃗ i \frac{\partial O_{2}}{\partial \vec{u}_{i}}=w_{i j} \cdot \frac{\partial \log p_{2}\left(v_{j} \mid v_{i}\right)}{\partial \vec{u}_{i}} ∂ui∂O2=wij⋅∂ui∂logp2(vj∣vi)
注意这里的w代表边权,边权如果很大或很小,很容易就造成梯度爆炸或者梯度消失的问题了,作者这里如何解决呢?
概括起来很简单,就是令边的采样概率正比于边权大小,然后把边变为01边,有权值的都至1,没权值的都是0。