对DeepWalk的理解

DeepWalk的理解

如今我们都处于大数据时代,同时我们也身处于各个网络当中,列如通信网络,交通网络等等。我们如何将网络中的信息用我们计算机能懂的方式展现出来,这就是网络表示。而deepwalk主要是用来表示网络的一种方式,让网络能够方便我们的模型进行学习。类似的方法还有很多比如line,node2vec等等

Deepwalk的主要算法

DeepWalk的伪代码
Skip-gram的伪代码
如以上图片所示,deepwalk主要是利用了自己的随机游走的方法在与word2vec中的skip-gram方法相结合,而skip-gram是2013年的word2vec中的主要方法,其中还有一种高效的训练方法叫做负采样方法(Negative Sampling)

随机游走

随机行走被用作各种问题的相似性度量。它们也是一类输出敏感算法的基础,这些算法利用它们来计算局部的社区结构信息,其时间线性小于输入图的大小正是这种与局部结构的联系促使我们使用短随机游动流作为从网络中提取信息的基本工具。除了捕获社区信息外,使用随机游动作为我们算法的基础,还提供了另外两个需要的特性。首先,本地勘探很容易并行化。几个随机漫游者(在不同的线程、进程或机器中)可以同时探索同一图的不同部分。其次,依靠从短随机游动中获得的信息,可以适应图结构中的小变化,而不需要全局重新计算。我们可以用新的随机游动从时间亚线性的变化区域迭代更新到整个图。

def build_deepwalk_corpus(G, num_paths, path_length, alpha=0,
                      rand=random.Random(0)):
  walks = []

  nodes = list(G.nodes())
  
  for cnt in range(num_paths):
    rand.shuffle(nodes)
    for node in nodes:
      walks.append(G.random_walk(path_length, rand=rand, alpha=alpha, start=node))
  
  return walks

如上图所示,在建立深度游走前首先需要获得随机游走的队列,所以将图中所拥有的节点带入随机游走中进行计算,然后将返回的序列添加到walk当中。

 def random_walk(self, path_length, alpha=0, rand=random.Random(), start=None):
    """ Returns a truncated random walk.

        path_length: Length of the random walk.
        alpha: probability of restarts.
        start: the start node of the random walk.
    """
    G = self
    if start:
      path = [start]
    else:
      # Sampling is uniform w.r.t V, and not w.r.t E
      path = [rand.choice(list(G.keys()))]

    while len(path) < path_length:
      cur = path[-1]
      if len(G[cur]) > 0:
        if rand.random() >= alpha:
          path.append(rand.choice(G[cur]))
        else:
          path.append(path[0])
      else:
        break
    return [str(node) for node in path]

如上图所示,程序获得局部变量node,然后根据随机游走的长度进行随机游走,随机过程主要是利用random生成一个随机数让它和0进行比较,如果结果大于0,就在他的邻居节点当中进行一个随机choice选取随机邻居,如果结果小于0就选取它自身加入随机游走的序列。

  print("Number of nodes: {}".format(len(G.nodes())))

  num_walks = len(G.nodes()) * args.number_walks

  print("Number of walks: {}".format(num_walks))

  data_size = num_walks * args.walk_length

  print("Data size (walks*length): {}".format(data_size))

  if data_size < args.max_memory_data_size:
    print("Walking...")
    walks = graph.build_deepwalk_corpus(G, num_paths=args.number_walks,
                                        path_length=args.walk_length, alpha=0, rand=random.Random(args.seed))
    print("Training...")
    model = Word2Vec(walks, size=args.representation_size, window=args.window_size, min_count=0, sg=1, hs=1, workers=args.workers)

通过上面的两段代码,我们成功得到了随机游走产生的序列,然后我们将序列带入word2vec当中进行一个训练。

Word2vec的理解

word2vec主要是用于NLP当中进行语言处理的,它主要有两种方式一个是skip-gram利用中心词预测周围的邻近词,还有一个是Continuous Bag-of-Word Model,利用邻近词预测中心词,接下来我将从这两个模型对word2vec进行理解

Skip-gram模型

Skip-gram模型
如上图所示,skip-gram模型是利用中心词预测邻近词的模型,我们可以首先将中心词进行一个one-hot编码,one-hot编码就是将单词用0,1表示出来,例如我爱你的我可以表示为100,爱为010,你为001。我们类似的将我们需要处理的内容进行一个one-hot编码后进行带入。首先回进行一个降维的操作,就是将用one-hot编码表示的词与一个V*N的矩阵相乘,其中N<V,一般取128或300。这样我们就得到了维度为N的隐藏层,且隐藏层也不需要激活。然后我们再将隐藏层乘以一个N ∗ * V的转移矩阵得到输出层,然后需将输出层进行一个softmax。
skip-gram
如上图公式所示,skip-gram是利用中心词预测邻近词的模型,故求的是在wt为中心词的条件下他的邻近词为wt+j的概率,其中m是滑动窗口大小。这里利用了极大似然估计,我们假设每一个词成为中心词的概率是一样的,所以我们将这些概率进行了一个连乘。而我们的目的是要让这个公式实现概率最大化。
最小化损失函数
如上图所示,我们最大化公式1的概率就可以等价为最小化这个loss函数,而我们的输出层是经过了softmax的,所以
输出层函数
上图是一个进行了softmax的输出层函数,我们现在需要把他带入进行求导,从而使得损失函数最小化。其中o表示邻近词,c表示中心词。
带入公式求导
如上图所示,我们将P带入公式求导可以得出以上公式,且我们发现要让函数最小化我们的时间复杂度和我们的V有关,但是一旦我们有许多词向量的话,这个复杂度是相当高的,所以我们需要对它进行优化。

连续词袋模型cbow

连续词袋模型其实和skip-gram类似,只不过它是根据邻近词对中心词进行预测,它所对应的模型是
cbow
我们将多个邻近词和一个V*N的转移矩阵相乘,得到从而得到多个N维的向量,这里需要注意的是我们把这多个向量进行了一个sum然后求平均,而不是把他们拼接在一起。
cbow公式
如上图所示,我们可以得到连续词袋模型的公式。即在邻近词的条件下,得到的中心词概率。
cbow损失函数
如上图所示,我们需要最小化损失函数。
softmax
如之前所描述的那样,我们是对它的向量进行了一个求和再取平均,从而他的向量表示需要除以2m,其中m是窗口大小。
进行求导
我们很容易对它进行求导,然后我们可以看出cbow模型的时间复杂度也是和我们的V相关,当语料库很大时这是十分不好的。

负采样(Negative Sampling)

正如之前所说,虽然每个模型都能进行优化,但是它所需要的时间复杂度过高,所以我们需要对它进行优化,因此word2vec论文提出了负采样的优化方法。就是通过噪声词的加入从而对复杂度进行优化。简单来说就是将中心词wc生成背景词wo用一下两个相互独立的事件联合组成来近似。
1.即中心词wc和背景词wo同时出现在该训练窗口
2.即中心词和第K个噪声词不同时出现在训练窗口
同时出现
如上图所示,我们表现的是背景词和中心词同时出现在训练窗口的概率,并用sigmod函数进行表示。
联合概率
如上图所示,表示的是背景词和中心词同时出现并且噪声词和中心词不同时出现的概率,此概率即等价为在中心词为wc的时候邻近词为wo的概率。
带入公式
带入公式
如上图所示,我们需要最小化此函数。类似的连续词袋模型公式如下
词袋模型
从以上公式可以看出,我们已经成功地将复杂度从O(V)下降到了O(K),从而实现了训练优化。

层序softmax

层序softmax主要是利用了二叉树帮助我们进行计算
二叉树模型

其中的概率公式如下图所示
层序softmax公式
即判断当前节点的下一个节点是不是左孩子节点,如果是的话就设为1不是则设为-1,一次类推
w3公式
词向量详解链接(B站大佬): B站词向量
DeepWalk论文链接: DeepWalk
Word2vec论文链接:Word2vec

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值