Graph embedding: 從word2vec到DeepWalk

本文介紹的是2014年的一篇文章《DeepWalk: Online Learning of Social Representations》,附個鏈接https://arxiv.org/pdf/1403.6652.pdf,這是NLP中的表示學習算法第一次被引入到圖結構當中。如標題,本文先來介紹word2vec的基本概念,再來介紹下如何將利用word2vec來表示圖結構。

一、Skip-Gram

提到word2vec,主要有兩個算法,cbow和skip-gram,相對來說後者更爲常用。目標是通過訓練,用向量embedding來表示詞,向量embedding中包含了詞的語義和語法信息。

統計語言模型需要計算出一句話在詞袋空間中出現的概率,通常的優化目標是最大化概率​Pr(w_n|w_0,w_1,...,w_{n-1})。w表示詞袋中的單詞,序號表示了詞在句子中的順序關係。但是這個目標實現起來比較困難。

Skip-Gram放寬了限制,做了一些調整。1)不再用句子中前面的詞來預測下一個詞,而是用當前詞去預測句子中周圍的詞;2)周圍的詞包括當前詞左右兩側的詞;3)丟掉了詞序信息,在預測周圍詞的時候,不考慮與當前詞的距離。優化目標是最大化同一個句子中同時出現的詞的共現概率,如公式(1)所示,其中k表示滑窗大小。

maxmize(logPr( \{w_{i-k},...,w_{i-1},w_{i+1},...,w_{i+k} \}|w_i) )        (1)

Skip-Gram的模型結構如下圖所示,在整個詞袋vocabulary中預測上下文詞,在輸出端需要做一個|V|維度的分類,|V|表示詞袋vocabulary中詞的數量。每一次迭代計算量非常龐大,這是不可行的。爲了解決這個問題,採用了Hierarchical Softmax分類算法。

Hierarchical Softmax

如下圖所示,構建一個二叉樹,每一個詞或者分類結果都分佈在二叉樹的葉子節點上。在做實際分類的時候,從根節點一直走到對應的葉子節點,在每一個節點都做一個二分類即可。假設這是一顆均衡二叉樹,並且詞袋的大小是|V|,那麼從根走到葉子節點只需要進行​log_2|V|次計算,遠遠小於|V|次計算量。

標題

具體如何計算?我們以上圖中v_1​預測​v_5爲例進行介紹。樹的根部輸入的是​v_1的向量,用\phi(v_1)​表示。在二叉樹的每一個節點上都存放一個向量,需要通過學習得到,最後的葉子節點上沒有向量。顯而易見,整棵樹共有|V|個向量。規定在第k層的節點做分類時,節點左子樹爲正類別,節點右子樹是負類別,該節點的向量用​v(k)表示。那麼正負類的分數如公式(2)(3)所示。在預測v_5​的時候,需要按照藍色箭頭的方向做分類,第0層分類結果是負類,第1層分類結果是正類,第2層分類結果是正類,最後到達葉子節點​v_5。最後把所有節點的分類分數累乘起來,作爲​v_1預測​v_5的概率,如公式(4)所示,並通過反向傳播進行優化。​

p_k(left) = sigmoid(\phi(v_1) \cdot v(k))        (2)

p_k(right) =1- sigmoid(\phi(v_1) \cdot v(k)) = sigmoid(-\phi(v_1) \cdot v(k))       (3)

p(v_5|v_1) = \prod p_k = p_0(right) · p_1(left)· p_2(left)      (4)

Huffman編碼是一種熵編碼方式,對於出現頻率高的符號用較短的編碼表示,出現頻率較低的符號用較長的編碼表示,從而達到編碼壓縮的目的。Hierarchical Softmax樹也可以採用Huffman編碼的方式生成,高頻詞用較短的路徑到達,低頻詞用較長的路徑到達,可以進一步降低整個訓練過程的計算量。

順便提一句,如果輸出端是對所有詞的softmax分類的話,那麼在Skip-gram模型中,分別有輸入和輸出兩個矩陣,一般是採用輸出矩陣作爲表示向量。但是如果採用Hierarchical Softmax分類的話,輸出端就不存在輸出矩陣了,就只能採用輸入矩陣作爲表示向量了。

二、DeepWalk

DeepWalk的思路很簡單,將隨機遊走產生的序列當做句子,輸入給skip-gram算法,從而得到節點的向量表示,具體算法過程如下圖所示。其中,G表示表示網絡,包括節點V和邊E,\gamma表示要隨機遊走的輪數,t表示每一次隨機遊走的長度。第1步是初始化節點的表示向量,第2步構建Hierarchical Softmax Tree,第5步表示對所有的節點,都要作爲起點隨機遊走一次,第6步表示從節點v_i​出發,隨機遊走t步得到序列​W_{v_i},第7步表示將序列​進行Skip-Gram的訓練。

前文提到過,Skip-Gram丟掉了句子中的詞序信息,以及詞與詞之間的距離信息,這也適合網絡表示學習,丟掉隨機遊走的順序信息能夠靈活地捕獲節點之間的鄰近關係。如果兩個節點具有相同的鄰域,Skip-Gram學習出來的表示向量也接近或者相似,有利於在下游任務上取得好的效果。

不管是在NLP中,還是在graph中,學習到的向量只是中間結果,用於作爲下游任務的輸入。例如在圖中對節點做多標籤分類任務時,第一步先通過DeepWalk進行無監督訓練,得到所有節點的特徵向量;第二步,通過一些分類器對節點進行分類。不同於傳統的方法,DeepWalk將標籤和表示空間分割開來,標籤和表示向量相互獨立,學習到的特徵向量可以應用於各種不同的任務。而且試驗證明,特徵向量和最簡單的分類算法相結合,比如邏輯迴歸,也能獲得好的效果。

算法中有一個參數t,是隨機遊走的步長,即需要限定隨機遊走的長度,不要過長,有幾個好處,1)可以捕獲網絡中局部區域的結構信息;2)易於實現並行化,多個線程,進程,甚至服務器,可以同時隨機遊走網絡的不同部分,實現分佈式計算,這個後邊還會再提一下;3)能夠適應網絡的變化,網絡局部發生變化時,可以只對局部網絡進行學習和訓練,而不需要對整個網絡重新學習。

算法變種

1)streaming

訓練前看不到整個網絡,實時的將遊走的序列丟到網絡中進行訓練。這對於構建hierarchical Softmax Tree比較麻煩,如果能夠事先知道有多少個節點,以及節點的出現頻率,就可以事先構建一個Huffman二叉樹。否則的話,每次新遇到一個節點,將節點加到二叉樹的葉子節點中。

2)Non-Random Walks

用戶在訪問某些網站的時候,可能會受到網站的引導而進行一些操作,因此訪問過程可能並不隨機,不過這並沒有關係。對這些非隨機的訪問過程的訓練,使得算法可以學習到網絡的結構信息,以及訪問路徑的頻次情況。

良好的可伸縮性

DeepWalk具有良好的可伸縮性,可以多臺機器同時訓練網絡的不同部分。而且節點的出現頻次符合指數分佈,大部分低頻節點都分佈在長尾。多臺機機器同時訓練也不太會發生衝突,文中提出可以採用異步的隨機梯度下降(ASGD)。下圖中左邊表示訓練時間和機器數量的關係,服務器增加,訓練時間也線性減少;右邊表示服務器數量和效果的關係,隨着服務器增加,訓練出來的模型效果幾乎沒什麼變化。

效果評估

爲了衡量DeepWalk的效果,作者在3組數據上進行了測試,包括Blogcatalog,Flickr,Youtube。數據集中包含用戶,用戶間的關係,以及興趣標籤或者用戶組標籤。

整個流程應該是兩階段任務。第一階段,在整個網絡結構上做無監督訓練,得到網絡中每個節點的向量。第二階段,根據已有的向量,劃分一部分節點並給出標籤作爲訓練集,剩下的節點作爲測試集,訓練一個分類器,預測測試集上的標籤。

作者用​Macro-F_1和​Micro-F_1做指標。分類器採用邏輯迴歸做one-vs-rest的分類,用的是LibLinear這個庫。參數​\gamma=80​w=10​,d=128​。

從實驗結果來看,大部分情況下DeepWalk都要優於傳統算法。在達到相同的效果時,DeepWalk 相比傳統算法所需要的有標籤訓練數據更少。在大規模網絡上,有些傳統算法已經跑不動了,DeepWalk也有不錯的表現。

 

附錄:

介紹文中用於評估的幾個指標:

1)​F_1

F_1=2.0 * precision * recall/(precision + recall)

2)​Micro-F_1

在多標籤分類任務中,計算全部類別的所有樣本的precision和recall,並且帶入上面公式中計算得到Micro-F_1​,樣本數量較多的類別可能會對指標影響較大。

3)​Macro-F_1

在多標籤分類任務中,對每個類別i分別計算f_1^i​ ,然後對所有類別求平均,如下公式所示,其中n表示類別的個數。每個類別的樣本數量無論多少,在指標中都有相同的權重,因此即便是某些類別中樣本數量較少,對於指標也有相當的影響。

Macro-F_1=1/k\sum_{i=0}^n(f_1^i)

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