圖的embedding問題

圖的embedding問題

[摘要]:隨着word2vec模型的提出,embedding問題開始逐漸引起大家的注意。在如今大數據背景的驅動下,商品、行爲、用戶等實體之間的關係越來越複雜化、網絡化,而word2vec是sequence embedding的,故其表示能力較弱,已不適合表示當下的複雜數據,因此人們又提出了graph embedding,即通過某種方法,將大型的圖進行embedding,從而得到數據相關性很強的低維稠密序列,方便我們進行分析處理。本文章針對graph embedding問題,使用deep walk方法解決一個簡單的圖嵌入問題。
關鍵詞:圖;embeding;word2vec

一、問題的提出

對向量進行embedding能夠使距離相近的向量對應的物體有相近的含義,在自然語言處理中,我們用詞距表示語義間的接近程度,進而通過用詞向量的方式表徵詞的語義信息,即通過一個嵌入空間使得語義上相似的單詞在該空間內距離很近,這便是word2vec的實質。這樣的處理方法,給人們了很大的啓示——我們可以對任意稀疏表示的向量、數據(例如圖)進行embedding,從而得到稠密、低維的向量表示。

在如今互聯網流行的世界中,我們最常見的數據結構可能會是圖,例如在電子商務的應用場景下,用戶行爲與物品關係可以組成一個有向圖,如圖1所示,在加入物品屬性後甚至會組成知識圖譜。

圖1 用戶行爲圖

在面對這樣複雜的圖結構時,傳統的sequence embedding方法顯得力不從心。因此,我們可以利用圖節點之間共同出現的關係(共現關係)來學習節點的向量表示。Deep walk算法通過隨機遊走(Radom walk)來進行圖中的節點採樣。Radom walk基於圖的深度優先遍歷,唯一不同的是該遍歷方法允許訪問已經訪問過的節點。

現在我們提出一個簡單的embeding問題:某社交網站擁有300名用戶(頂點),和450條用戶聯繫(無向邊),我們使用deep walk算法對該圖進行embeding從而得到編碼後的向量表示。
首先,通過networkx工具,將數據集中的連接關係進行可視化,結果如圖2所示。圖中的每個頂點代表一個用戶,頂點間的連線表示用戶之間擁有社會關係,同時,孤立的頂點表示該用戶與其他用戶沒有關係。

圖2 數據集的關係圖

通過對該圖做embeding,我們可以得到信息量較大(稠密)、維度較低的向量表示,得到向量表示以後,我們可以根據標籤等數據,去解決更爲複雜的問題,例如推薦系統、影響力最大化等。所以該問題具有較深刻的意義。接下來本報告將圍繞着該問題,通過deep walk算法來構建相關模型,求得最終結果,並且做出相應評估。

二、deep walk算法執行步驟

Deep Walk算法主要分爲兩個步驟,首先進行隨機遊走(Random Walk)採樣節點序列,其次是使用word2vec學習表達向量。具體的算法實現如圖3所示。

隨機遊走是基於圖的深度優先遍歷的,同時允許遍歷曾經遍歷過的節點。爲了容易說明隨機遊走的執行過程與結果,僅截取數據集的前9個頂點組成一個簡單的無向圖,如圖4所示。

圖3 算法的步驟

首先是隨機遊走的實現:先確定一個最大步長S、和迭代次數N,並隨機選取一個頂點Vi作爲起始點,之後隨機選取Vi的鄰接頂點作爲下一次遍歷起始頂點,整體遍歷方法屬於圖的深度優先遍歷,直到達到最大步長或者遍歷到度爲1的頂點,之後重複上述步驟,直到遍歷完爲止。

圖4 隨機遊走的實現

根據上述步驟,我們對圖4作隨機遊走,設定迭代次數爲1,步長爲2,那麼我們將得到結果:[[‘E’, ‘A’], [‘H’, ‘B’], [‘F’, ‘A’], [‘X’, ‘H’], [‘C’, ‘A’], [‘D’, ‘A’], [‘B’, ‘A’], [‘A’, ‘D’], [‘G’, ‘A’]],將結果繪製爲有向圖,可得到圖4。由於每次隨機選取起始節點,故每次運行的結果都不一樣,並且如果迭代次數設置的較大,那麼會重複地遍歷頂點。

圖5 隨機遊走結果

在得到了節點的採樣序列之後,我們將該序列輸入進word2vec模型,通過skip gram方法進行學習。該學習方法其實是對採樣序列進一步採樣,但是採樣方法不同於上一步中隨機深度優先的搜索,而是有概率控制的有偏的遍歷方式:通過引入兩個超參數p、q來將寬度優先與深度優先同時引入採樣方式中,這樣做的好處是在充分探索了圖的全局結構性(深度優先搜索)的同時也兼顧到了圖的局部相似性(寬度優先搜索)。因此,可以說node2vec是對deep walk的進一步拓展與延申。

核心源碼如下:

# 讀數據集
G = nx.read_edgelist('../data/wiki/edges.txt',
create_using=nx.DiGraph())
# deepwalk的實現,每次遊走9個頂點。外層迭代70次
model = DeepWalk(G, walk_length=9, num_walks=70)
# word2vec模型進行訓練
model.train(window_size=5, iter=3)
embeddings = model.get_embeddings()
print('embeding後的向量個數:' + str(len(embeddings.values())))
# 寫入文件
with open('embeding.txt') as file:
     file.write(embeddings)

最終將得到300個節點的embedding向量。如圖6所示。
在這裏插入圖片描述

圖6 頂點1397的embedding向量

三、進一步的應用

在得到了圖的embeding向量之後,爲了令這些向量發揮作用,我們爲每個頂點指定一個標籤或者說是種類(0-7)表示該頂點社會關係的複雜度,之後通過多分類的訓練方法,將embedding後的頂點向量作爲輸入進行模型訓練,並最終進行一定的可視化。可視化結果如圖7所示。(爲了便於可視化,通過fit_transform方法對向量進行了降維操作)

圖7 分類結果

四、總結

圖的embedding是圖論在機器學習與深度學習中的重要應用。在面對圖的數據集時,傳統的one-hot編碼會令訓練數據集過於稀疏或維度過高,不利於我們的模型提取特徵。通過embedding得到較爲稠密的數據向量表示會大大加快訓練速度與準確度,有利於處理大數據等及其複雜的數據集。

五、參考文獻

[1] 龔劬. 圖論與網絡最優化算法[M]. 重慶: 重慶大學版社.
[2] Bryan Perozzi, Rami Al-Rfou, Steven Skiena. DeepWalk: Online Learning of Social Representations[J].

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章