1. 程式人生 > 實用技巧 >Graph Embedding-DeepWalk

Graph Embedding-DeepWalk

一言以蔽之,DeepWalk是在graph上,通過隨機遊走來產生一段定長的結點序列,並將其通過word2vec的方式獲得各個結點的embedding的演算法。
DeepWalk一共涉及以下幾個內容:

  • 隨機遊走的一些知識
  • DeepWalk如何做隨機遊走
  • Word2Vec的一種訓練方式

DeepWalk 使用圖中節點與節點的共現關係來學習節點的向量表示。在描述節點與節點的共現關係的過程中,DeepWalk 給出的方法是使用隨機遊走 (RandomWalk) 的方式在圖中進行節點取樣。

隨機遊走

隨機遊走(Random Walk)是一種數學統計模型,它是一連串的軌跡所組成,其中每一次都是隨機的。它能用來表示不規則的變動形式,如同一個人酒後亂步,所形成的隨機過程記錄.通常,隨機遊走一個簡單的隨機遊走的例子是在整數在數軸上的隨機遊走,它從0開始,然後每一步以相同的概率

移動+1或−1, 那麼在圖上的隨機遊走也按等概率的原則,隨機的選取當前結點的鄰居結點作為下一次訪問的結點:所以理論上,RandomWalk 是一種可重複訪問已訪問節點的深度優先遍歷演算法。給定當前訪問起始節點,從其鄰居中隨機取樣節點作為下一個訪問節點,重複此過程,直到訪問序列長度滿足預設條件。

DeepWalk的隨機遊走

這裡貼一張DeepWalk的演算法
uploading-image-790981.png
演算法包含幾個重要的引數:

  • \(w\): Word2Vec的取樣視窗大小
  • \(d\): 每個結點embedding的維度
  • \(\gamma\):這個引數意思是我要重複\(\gamma\)
    次從不同結點進行隨機遊走的次數,可以理解為進行\(\gamma\) 個 epoch
  • \(t\): 遊走的長度,也就是結點的數量
    上面的\(\gamma\)意思也就是希望多重複幾次相同開始結點的隨機遊走,作者認為這樣能加快隨機梯度下降的收斂速度。

具體實現層面:

我們可以把\(\gamma\)並行化處理,其次,演算法中的shuffle(V)的話其實就是把所有的node都全部打亂,然後挨個的遍歷一遍並做隨機遊走。在隨機遊走的時候,我們可能並不能保證每次都能拿到規定的長度,這時候可以不用管,直接break掉,有多少算多少,因為這些後面可以交給Word2Vec進行處理。
模擬一下隨機遊走:

def deepwalk_walk(walk_length, start_node):
        walk_seq = [start_node]

        while len(walk_seq) < walk_length:
            curr_node = walk[-1]
            cur_node_nbrs = list(G.neighbors(curr_node))
            if len(cur_node_nbrs) > 0:
                walk.append(random.choice(curr_node_nbrs))
            else:
                break
        return walk_seq

Word2Vec的訓練方式

拿到結點序列之後,我們將其看作是一段自然語言序列,這樣就可以順其自然的送到W2V裡面train。