在数据量越来越大的今天,
word2vec是通过字词的共现关系来学习字词的向量表示,Graph Embeding的思想类似于word2vec,通过图中节点与节点的共现关系来学习节点的向量表示,构成文本序列从而计算相互关联出现的词的概率,从而计算词向量表示文本。那么在图模型中的关键的问题就是如何来描述节点与节点的共现关系,于是方法是利用DeepWalk来采样这样的文本序列,通过随机游走(RandomWalk)的方式在图中进行节点采样,从而就能够输入序列计算图的向量表示。所以deepwalk算法核心的步骤就是两步:
- RandomWalk
- Skip-Gram
RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问起始节点,从其邻居中随机采样节点作为下一个访问节点,重复此过程,直到访问序列长度满足预设条件。
算法过程就是输入一个图,输出节点表示的矩阵,简单对步骤进行解析:
- 初始化:从 U ∣ V ∣ × d \mathcal{U}^{|V| \times d} U∣V∣×d 样本空间中采样,embedding的大小为 d d d
- 构建一棵二叉树Hierarchical Softmax
- 开始做 γ \gamma γ 步的随机游走,这里的 γ \gamma γ 是初始化好的超参数
- 打乱采样得到的节点
- 这个循环是开始以每个节点为根节点开始做长度为 t t t 的随机游走,这里的 t t t 为初始化的超参数。然后按窗口 w w w 进行SkipGram学习文本序列
SkipGram
一般提到word2vec有两种主要的算法,Cbow和Skip-Gram,都是在统计语言模型的基础上计算一个词在文本中出现的概率用来作为这个词的表示向量,于是优化目标就是最大化 P r ( w n ∣ w 0 , w 1 , . . . , w n − 1 ) Pr(w_n|w_0,w_1,...,w_{n-1}) Pr(wn∣w0,w1,...,wn−1) 。 w w w 表示的就是词。
SkipGram就是用当前词来预测上下文。丢掉了词序并且不考虑与当前词的距离。优化目标是最大化同一个句子中同时出现的词的共现概率:
m a x ( l o g P r ( w i − k , . . . , w i − 1 , w i , w i + 1 , . . . , w i + k ∣ w i ) ) max(logPr({w_{i-k},...,w_{i-1},w_i,w_{i+1},...,w_{i+k}|w_i})) max(logPr(wi−k,...,<