Graph embedding之Deepwalk算法原理,實現和應用

圖網絡現在非常的流行,應用場景也十分的廣泛,在推薦領域應用也十分廣泛,在召回階段graph-embedding是很有效的一種方式。以下內容參考淺夢大神的筆記

圖神經網絡

主要包括Graph Embedding(基於隨機遊走)和Graph CNN(基於鄰居匯聚)兩部分。這裏先看下Graph Embedding的相關內容。Graph Embedding技術將圖中的節點以低維稠密向量的形式進行表達,要求在原始圖中相似(不同的方法對相似的定義不同)的節點其在低維表達空間也接近。得到的表達向量可以用來進行下游任務,如節點分類,鏈接預測,可視化或重構原始圖等。

DeepWalk 算法原理

雖然DeepWalk是KDD 2014的工作,但卻是我們瞭解Graph Embedding無法繞過的一個方法。

我們都知道在NLP任務中,word2vec是一種常用的word embedding方法,word2vec通過語料庫中的句子序列來描述詞與詞的共現關係,進而學習到詞語的向量表示。

DeepWalk的思想類似word2vec,使用圖中節點與節點的共現關係來學習節點的向量表示。那麼關鍵的問題就是如何來描述節點與節點的共現關係,DeepWalk給出的方法是使用隨機遊走(RandomWalk)的方式在圖中進行節點採樣。

RandomWalk是一種可重複訪問已訪問節點的深度優先遍歷算法。給定當前訪問起始節點,從其鄰居中隨機採樣節點作爲下一個訪問節點,重複此過程,直到訪問序列長度滿足預設條件。

獲取足夠數量的節點訪問序列後,使用skip-gram model 進行向量學習。

在這裏插入圖片描述

DeepWalk算法

DeepWalk算法主要包括兩個步驟,第一步爲隨機遊走採樣節點序列,第二步爲使用skip-gram modelword2vec學習表達向量。

①構建同構網絡,從網絡中的每個節點開始分別進行Random Walk 採樣,得到局部相關聯的訓練數據; ②對採樣數據進行SkipGram訓練,將離散的網絡節點表示成向量化,最大化節點共現,使用Hierarchical Softmax來做超大規模分類的分類器

def deepwalk_walk(self, walk_length, start_node):

    walk = [start_node]

    while len(walk) < walk_length:
        cur = walk[-1]
        cur_nbrs = list(self.G.neighbors(cur))
        if len(cur_nbrs) > 0:
            walk.append(random.choice(cur_nbrs))
        else:
            break
    return walk

def _simulate_walks(self, nodes, num_walks, walk_length,):
    walks = []
    for _ in range(num_walks):
        random.shuffle(nodes)
        for v in nodes:           
            walks.append(self.deepwalk_walk(alk_length=walk_length, start_node=v))
    return walks

results = Parallel(n_jobs=workers, verbose=verbose, )(
    delayed(self._simulate_walks)(nodes, num, walk_length) for num in
    partition_num(num_walks, workers))

walks = list(itertools.chain(*results))

Word2vec
可以直接用gensim裏的Word2Vec了。

from gensim.models import Word2Vec
w2v_model = Word2Vec(walks,sg=1,hs=1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章