DeepWalk[1]這篇文章挺有意思的, 主要是講怎么用Deep Learning的方法學圖結構, 學出每個節點的隱含表示(比較像LSA、LDA、word2vec那種)。 發在了14年的KDD上, 咱們看到的是預覽版本。
github地址作者也放出來了, github地址
下面大致講一下文章是怎么弄得, 是個閱讀筆記。
一、 介紹,優點
先說概念, 學出來什么樣。 圖a是輸入圖, 圖b是輸出。
例子是將一個輸入的圖轉化成了2維表示。 輸入是圖和圖的自身結構,輸出是二維表示。 例子應該是做的比較好的, 基本將本來是cluster的弄得也比較近, 不過這點比較容易。
優點:1) 與傳統cluster、降維方法比, 這個方法的優點是可以調試, 也就代表着這東西可以堆數據, 因而在知識圖譜,在社交網絡上是有應用的。
2) 與傳統cluster比能學到維度,能進一步利用。
3) 與降維比, 其實沒什么優點, 但是圖結構本身沒有什么比較正常、有可以大規模使用的降維方法。
應用: 1. 社交網絡學習特征;2. 知識圖譜學習表示;3. 推薦系統學習低維度關聯性。
二、 隨機游走和語言模型
1. 隨機游走
假設節點$v_i$處的隨機游走是$W_{v_i}$,則全過程表示為$W_{v_i}^1,W_{v_i}^2,W_{v_i}^3,\cdots,W_{v_i}^k$。
為什么要用隨機游走:增加隨機性,加速,可調,之類的。
2. zipfs law
這篇文章主要是說用word2vec的思想學圖的, 所以一個非常重要的問題是, 詞和圖的節點像不像, 對於社交網絡或者知識圖譜來說,是沒問題的, 見下圖。
這說明詞頻和社交網絡大致相等, 主要是要有那個比較劇烈的曲線。 這玩意也被叫做zipf 定律, 可以看統計自然語言處理,上面有詳細說明。
3. 語言模型
語言模型主要是學詞序列。詞序列為:$W_1^n = (w_0,w_1,\cdots ,w_n)$。
學的時候主要是學$Pr(w_n | w_0,w_1,\cdots, w_{n-1})$ , 最常見的方法當然是n-gram, 現在新興的是word2vec。
對於word2vec這樣的模型來說, 既然是詞向量, 那么學的也是概率表示,即:
$$ Pr(w_n | \Phi(w_0), \Phi(w_1),\cdots, \Phi(w_{n-1})) $$
隨着路徑長度增加, 學習難度會變困難。 一個比較好的(這段平心而論,我沒看懂)方式是,用一個詞去預測整個文章,且忽略詞順序。 優化問題如下
$$min(\Phi) -log Pr (\{w_{i-w},\cdots, v_{i-1},v_{i+1} , \cdots, v_{i+w} \} | \Phi(v_i) )$$
由於順序被忽略了, 所以比較適合圖學習, 因而有了這篇論文。 其實還是得感謝Minklov, 呵呵。
三、 訓練方法
將圖節點表示為詞表(V)。
算法分兩部分:1. 隨機游走;2.更新過程
隨機游走, 對圖G,隨機采樣1節點$v_i$, 作為根節點$W_{v_i}$, 然后一直向周圍采樣,直到達到最大路徑長度t。 算法如下:
其中3-9行是核心, 用skip-gram去更新。 skip-gram算法圖如下:
這玩意也就是通常說的隨機梯度。 后面還加了個層次softmax,用於加速。
核心流程: 1. 隨機游走, 2. 用sgd學向量。 我倒是感覺其實最有意思的是隨機游走那段。
四、 代碼賞析
talk is cheap, show me the code。
文件基本上沒幾個, 非常少, __init__ 沒啥用, main主要是調參數的, 這個沒啥講的, 自己看好了。
先看random walk怎么寫的, 這是graph類的一個函數, graph就是封裝了一個字典。 這個好水, 就是直接隨了n個點。 然后加進去。
然后是skip-gram,如下:
就是封裝了一下gensim的word2vec類,自己連動手都沒。
核心訓練過程,就下面這句
五、整體評價、實驗結果
實驗還行, 這玩意主要的有點是能學出結構, 實驗不是特別搓就行。
評價: 從技術的層面上,沒啥,random walk倒是用的很新穎。 沒有跟spreading activation比較過。
參考文獻:
[1] Perozzi B, Al-Rfou R, Skiena S. DeepWalk: Online Learning of Social Representations[J]. arXiv preprint arXiv:1403.6652, 2014.