网络表示学习总结
总结一下网络表示学习 (network embedding/network representation learning) 的东西。
网络表示学习即是将节点表示为向量。
为什么表示为向量,目前看来有以下几点原因:
- 向量是一种分布式表示,比 one-hot 表示什么的更易于使用,如可以方便地作为 feature 喂给 classifier 等。而这其实也是因为分布式表示含有很多隐含信息,不像 one-hot 向量,丁是丁卯是卯。同时,分布式表示可以比 one-hot 表示短得多。
- 网络 (graph) 是一种不够结构化的数据结构。想要在网络中获取有用的信息,哪怕只关注一个节点,也必然要关注网络中与之相关的一群节点,算法复杂度指数上升,解决问题的复杂性也是指数上升。这种级联的问题使得在网络上的研究很麻烦,千头万绪。而把每个节点表示为一个独立的向量就很方便了。
- 网络不规则。网络中的节点有的度很大,有的度很小,每个节点的邻居个数不一样,在网络上直接处理会很麻烦。转化为向量后,向量长度都一样,就规则了。
- 网络很大时处理起来时间和空间复杂度都太高,邻接矩阵和 laplacian 矩阵都是 \(N^2\) 大小,而处理成 embedding 向量后,长度就很短了,给下游任务使用时复杂度就小得多。
接下来的问题是怎么将节点表示成向量。
这里首先要确定的是要从哪个角度来确定节点间的相似性。目前我接触到的主要是以下两个角度:
- Homogeneity/proximity,这个主要是社区 (community) 角度,即相邻的节点更可能在社区属性上相似。在某篇论文上看到一个解释说,从这个角度看,网络是平滑的,感觉很形象很直觉。
- Structural similarity,这个主要是结构或功能角度,即周围结构相似的节点更可能在功能上相似。
当然,社区很多时候也会和功能相关,功能相似的节点也很可能相邻,所以这两个角度会有一些相似或重叠的地方。
但如果两个结构相似的节点相距很远时,这两个角度就几乎是正交的了。
首先说第一个角度,第一个角度的基本假设是『相邻节点相似』,这可以称为是 first-order proximity。而另一方面,基于这个假设,与同一个节点相似的节点之间也更可能相似,那么两个节点之间共同邻居越多,它们也就更可能相似,这可以称为 second-order proximity,这时,两个节点之间相距为 2。当然,距离再远些还可以有 high-order proximity。
那么如何捕捉 (capture) 这些 proximity 呢?
最早 DeepWalk 是以节点作为单词,以随机游走序列作为句子,得到句子序列之后喂给 word2vec 从而得到节点 embedding。word2vec 会将窗口内的节点作为上下文,所以 DeepWalk 捕捉的是 \(k\) (window size) 阶proximity?
之后出现了 LINE,LINE 一方面针对大型网络进行了优化,另一方面,给出了 objective function,这就使得对于网络表示学习的改进更加容易。因为要在基于 random walk 的方法上继续改进,一般只能在网络结构 (如 HARP?) 或 random walk 的生成模式 (如 node2vec) 上做手脚,这样改进或扩展起来就很不方便。而在 LINE 给出了 objective function 后,只要针对自己预想的改进,调整目标函数就好了。因此,后面看到的很多网络表示学习的论文都是基于 LINE 做的改进,如加入社区结构、加入影响力模型等等。
之后,又出现了基于矩阵分解的网络表示学习方法,如 GraRep,但这类方法速度比较慢。
除此之外,还有基于深度学习的方法,如 SDNE,本质上可以看作使用自编码器对邻接矩阵降维?
本质上,这些方法都可以看作用向量表示来模拟网络中的概率分布,不同的是这个概率分布是从哪个角度计算的,以及是怎么计算的。如 LINE 中定义的网络中的概率分布就比较简单直接,基本是边权重除以中心节点的度,然后以 sigmoid 或 softmax 来用向量表示表达这个概率,接下来就是用 KL-divergence 来最小化两个分布的距离就可以了。对于基于 random walk 的方法,这个网络中的概率分布就隐含在 random walk 中而没有明确定义。
对于 DeepWalk 来说,random walk 相当于NLP里的句子,而在 NLP 中,word2vec 所做的事情相当于通过向量表示使句子生成的概率最大化,那么在 DeepWalk 中,节点相当于 vocabulary,DeepWalk 的目的就是用节点向量使 random walk 生成的概率最大化。
就好象给定 N 个节点,用这 N 个节点可以生成有不同连接方式的网络,假设这些不同的网络构成一个集合(空间?) S,那么我们见到的那个网络 G 只是这个集合中的一个元素。用不同的向量表示这些节点,生成这些网络的概率也会不同,我们要做的是调整这些向量,使生成给定网络 G 的概率最大。那么此时问题在于如何表示『向量生成某个网络 G 的概率』。DeepWalk 首先将网络转化为 random walk 序列,可以理解为在给出足够多 random walk 序列时,这些序列在集合 S 中对应 G 的概率最大,从而我们可以用 random walk 序列近似表示网络 G,接下来只要向量表示生成这些 random walk 序列的概率越大,就可以理解为生成网络 G 的概率越大。然后我们再将 random walk 生成的概率近似用上下文生成中心词(或反过来)的概率表示,就可以用 word2vec 的 CBOW 或 skipgram 学习了。这里 S,G 有点像监督学习里的 hypothesis set 和 ideal target function。
另,考虑另一个问题:给定一个 \(N \times N\) 的矩阵 \(A\),矩阵里每个元素 \(A_{ij}\) 表示两个点 \(i\) 和 \(j\) 之间的距离,求给出每个节点的坐标,使满足该矩阵。坐标维数不做限定。
如果该问题里的点对应网络中的节点,矩阵中的值表示节点间的最短路径距离或转移概率,所求坐标对应向量表示,那么network embedding可以看作对这个问题的近似求解?
这个问题可以看作有两个步骤,一是给出矩阵 \(A\),二是求节点坐标 (即embedding)。大多数network embedding方法其实可以看作是对于这两个步骤给出了不同的解决方案。即以不同方式定义节点间的相似度,给出不同的矩阵 \(A\),或者以不同方式求解 embedding。
TODO:
结构相似性角度
graph kernel
link prediction