DeepWalk: Online Learning of Social Representations
Github整理代码链接,欢迎讨论和交流,觉得有用的可以Star一下。
1.主要思想
Deepwalk是一种将随机游走(Random walk)和Word2Vec两种算法相结合的图表示算法。网络的输入是一张图或者一个网络,输出为网络中顶点的低维向量表示(Embedding)。图1(b)为了可视化将向量映射到二维平面上,相同颜色的顶点具有更近的距离。
![](https://i-blog.csdnimg.cn/blog_migrate/bddd3c23bcb8c9680c9f12e30695521a.png#pic_center)
引入Word2Vec的原因,随机游走的路径集合中的顶点频率和NLP中语料库的词频分布比较相似。
![](https://i-blog.csdnimg.cn/blog_migrate/ee1c003ef6b514793840b6c58f438b28.png#pic_center)
2.总体流程
①输入一张图,随机给定当前访问起始点,从邻居中随机采样顶点作为下一个顶点,重复此过程,直到访问序列长度和序列个数满足预设条件
②获得顶点访问序列后,采用Word2vec中的Skip-Gram模型进行向量学习,将离散的网络节点向量化,最大化节点共现,就能得到每个节点的Embedding,在计算上使用Hierarchical Softmax进行优化,降低计算复杂度
2.1 Random walk
![](https://i-blog.csdnimg.cn/blog_migrate/9935eb1eacd7c0395a2882212167474f.png#pic_center)
如图3红色线段所示,以V1顶点为起始点,每次从邻居顶点中随机选择一个顶点作为下一步顶点,游走8步到达V9顶点,即可得到一条顶点数为9的随机游走路径。n个顶点不断重复随机游走k条路径构成一个k*n大小的路径集合。
2.2 Skip-Gram
2.2.1 介绍
NLP中Word2Vec中Skip-Gram目的是将一个高维的onehot向量映射到一个低维连续的向量。将该方式引入图嵌入上,将路径集合中的不重复的顶点构成大小为V的字典,方便以onehot方式表达每个顶点,将随机游走得到的一条路径看作一个序列,例如V1->V2->V3-V4->V5->V6->V7->V8->V9序列长度为9。
Skip-Gram主要思想是利用中心词预测其上下文单词,最大化上下文共现,设置窗口 w w w(句子中当前词与预测词之间的最大距离)大小为4,用中心顶点V5预测其前面4个顶点和后面4个顶点(称之为上下文),公式中 x i x_i xi为顶点的向量表达,最大化优化目标P(x1,x2,x3,x4,x6,x7,x8,x9|x5)。
![](https://i-blog.csdnimg.cn/blog_migrate/199f6444ab7da213704f43609b48f0ae.png#pic_center)
2.2.2 举例
以图3为例,图中总共包含10个不重复顶点,构成大小为10的字典。V1->V2->V3-V4->V5->V6->V7->V8->V9序列输入Skip-Gram模型,输入V5在字典中onehot表达向量x5,预测V1,V2,V3,V4,V6,V7,V8,V9的表达向量x1,x2,x3,x4,x6,x7,x8,x9,如图5所示(图中D为需要映射的维度)
-
输入:V5在字典中onehot表达向量x5=[0,0,0,0,1,0,0,0,0,0],维度1x10
-
映射:x5经过10xD的映射得到1xD的向量(V5的Embedding表达),再经过8个Dx10的映射得到8个1x10维度的向量,8个维度1x10的向量是预测得到的上下文的表达向量
-
输出:8个1x10维度的向量分别经过softmax归一化得到1X10维度的概率值,如第一个向量对应着x1,应该索引0的概率值最大;第二个向量对应着x2,应该索引1的概率值最大,依次类推。如果该向量表示顶点不是我们需要预测的,则会反向传播更新映射矩阵,经过训练模型得到一个最优解,此时输入onehot向量经过10xD的映射得到1xD的向量即该输入顶点的Embedding表达。
![](https://i-blog.csdnimg.cn/blog_migrate/35ffb40f5953b9792448ccb0415f4013.png#pic_center)
2.3 数学公式推导
2.3.1 优化目标
最大化优化目标:
P ( V 1 , V 2 , V 3 , V 4 , V 6 , V 7 , V 8 , V 9 ∣ V 5 ) = P ( V 1 ∣ V 5 ) ⋅ P ( V 2 ∣ V 5 ) ⋅ P ( V 3 ∣ V 5 ) ⋅ P ( V 4 ∣ V 5 ) ⋅ P ( V 6 ∣ V 5 ) ⋅ P ( V 7 ∣ V 5 ) ⋅ P ( V 8 ∣ V 5 ) ⋅ P ( V 9 ∣ V 5 ) P(V_1,V_2,V_3,V_4,V_6,V_7,V_8,V_9|V_5)=P(V_1|V_5)·P(V_2|V_5)·P(V_3|V_5)·P(V_4|V_5)·P(V_6|V_5)·P(V_7|V_5)·P(V_8|V_5)·P(V_9|V_5) P(V1,V2,V3,V4,V6,V7,V8,V9∣V5)=P(V1∣V5)⋅P(V2∣V5)⋅P(V3∣V5)⋅P(V4∣V5)⋅P(V6∣V5)⋅P(V7∣V5)⋅P(V8∣V5