graph embedding之node2vec

在上一篇文章中介紹了DeepWalk,這是第一次將word2vec的思路引入到graph或network中。這篇文章繼續介紹graph embedding之node2vec,附個鏈接http://snap.stanford.edu/node2vec/,其中有文章也有代碼。

一、基本思路

graph embedding也是一種特徵表示學習方式,借鑑了word2vec的思路。在graph中隨機遊走生成頂點序列,構成訓練集,然後採用skip-gram算法,訓練出低維稠密向量來表示頂點。之後再用學習出的向量解決下游問題,比如分類,或者連接預測問題等。可以看做是兩階段的學習任務,第一階段先做無監督訓練生成表示向量,第二階段再做有監督學習,解決下游問題。

在graph中主要存在兩種關係,用作者的原話叫homophily和structual equivalence。所謂homophily,即是在graph中緊密相連的鄰域,例如圖1中的​\{u, s_1, s_2, s_3, s_4\},他們之間的關係就是homophily,鄰域​\{s_5, s_6, s_7, s_8, s_9\}同理。具有這種關係的頂點之間,學習出來的向量應該接近或者相似。所謂structural equivalence,就是指在圖中具有相似作用的頂點,他們之間未必相鄰,甚至可能相隔較遠,比如圖1中的u和s_6​,都是所在鄰域的中心頂點。滿足這種關係的頂點之間,特徵向量也應該接近或者相似。通常在現實世界的graph中,會同時存在這兩種關係。

圖1

但是在不同的任務中需要關注的重點不同,可能有些任務需要關注網絡的homophily,而有些任務比較關注網絡的structual equivalence,可能還有些任務兩者兼而有之。在第一階段的表示向量學習過程中,如何學習出表示向量,會影響到下游任務的效果。在DeepWalk中,在採樣時作者只是單純地採用隨機遊走,無法靈活地捕捉這兩種關係,無法在這兩種關係中有所側重。

實際上,對於這兩種關係的偏好,可以通過不同的序列採樣方式來實現。有兩種極端的方式,一種是Breadth-First Sampling(BFS),廣度優先搜索,如圖1中紅色箭頭所示,從u出發做隨機遊走,但是每次都只採樣頂點u的直接鄰域,這樣生成的序列通過無監督訓練之後,特徵向量表現出來的是structual equivalence特性。另外一種是Depth-First Sampling(DFS),深度優先搜索,如圖1中藍色箭頭所示,從u出發越走越遠,學習得到的特徵向量反應的是圖中的homophily關係。

該如何在兩種隨機遊走中自由切換或者有所選擇?在介紹之前,我們先來公式化表達graph的隨機遊走。假設從某頂點出發開始隨機遊走,第i-1步走到當前頂點v,要探索第i步的頂點x。下面的公式表示從頂點v到x的轉移概率,E是graph中的邊緣集合,(v, x)表示頂點v和x之間的邊,​​\pi_{vx}可視作邊緣的權重w_{vx}​,Z是歸一化常數,是權重之和。對於無權重的網絡,​\pi_{vx}=1。最簡單的方式,就是按照這個轉移概率進行隨機遊走,但是無法對尋路方式進行控制。

P(c_i=x|c_{i-1}=v)=\begin{cases} \frac{\pi_{vx}}{Z} \quad if (v,x)\in E \\ 0 \quad otherwise \end{cases}

作者提出了二階隨機遊走,通過修改轉移概率的方式來實現控制。假設剛剛從頂點t走到v,並且停在v,現在要決定下一步去哪裏,如圖2所示。下面兩個公式對轉移概率做了修改,其中​d_{tx}表示下一步頂點x和頂點t之間的最短距離。只有3種情況,如果又回到頂點t,那麼​d_{tx}=0;如果x和t直接相鄰,那麼d_{tx}=1​;其他情況​d_{tx}=2,如圖2所示。參數p控制着重新返回頂點t的概率。如果​p>max(q,1),那麼下一步較小概率重新返回t;如果p<max(q,1)​,那麼下一步會更傾向於回到頂點t。對於參數q,如果q>1,那麼下一步傾向於回到t或者t的臨近頂點,這接近於BFS的探索方式;如果q<1,那麼下一步傾向於走到離t更遠的頂點,接近於DFS尋路方式。因此,可以通過設置p和q來控制遊走網絡的方式。所謂的二階隨機遊走,意思是說下一步去哪,不僅跟當前頂點的邊的權重相關,還跟上一步頂點相關。在文中試驗部分,作者對p和q的設置一般是2的指數,比如\{1/8, 1/4,1/2, 1, 2, 4,8\}​。

\pi_{vx}=\alpha(t,x) \cdot w_{vx} 

\alpha(t,x)=\begin{cases} \frac{1}{p}, \quad if\quad d_{tx}=0\\1,\quad if \quad d_{tx}=1\\ \frac{1}{q},\quad if \quad d_{tx}=2 \end{cases}

圖2

二、具體算法

接下來介紹一下node2vec的具體實現,整個過程主要包括三步,第一步是計算轉移概率矩陣,第二步是做採樣,生成訓練樣本序列,第三步是用梯度下降做優化,具體如圖3所示。

圖4中的Part1介紹了算法的流程。在第1行中,G=(V, E, W),其中V表示node集合,E表示edge集合,W表示edge的權重集合。l表示隨機遊走的長度,k表示訓練樣本的長度。這裏有個技巧要介紹一下,每一次隨機遊走生成長度爲​l的序列,例如\{u, s_4,s_5,s_6,s_8,s_9\}​,然後從第1個頂點作爲起始點,截斷k長度的序列,假設k=3,那麼N_s(u)=\{s_4,s_5,s_6\}​;然後是第2個頂點,​N_s(s_4)=\{s_5,s_6,s_8\};接着是第3個頂點,N_s(s_5)=\{s_6,s_8,s_9\}​,然後到此爲止,因爲再往後邊走長度就不足k了。因此做一次長度爲l​的序列採樣,可以生成l-k​個長度爲k的訓練樣本序列。最後,Return p和In-Out q就是上文中介紹的兩個參數。

第2,3行是計算新的轉移概率矩陣,並且對G做更新。第4行將遊走序列集合walks初始化爲空集合。第5行到第8行進行隨機遊走生成頂點序列,一共進行r輪,每一輪都對圖中的所有頂點作爲起始點來一次長度爲​的隨機遊走,並且將序列添加到集合walks中。

第9行是做梯度下降優化。這裏作者不再採用DeepWalk中的Hierarchical Softmax,而是採用負採樣的方式,同樣可以加速訓練。

圖3

Part2是對Part1中第7行的node2vecWalk函數的具體描述。第1步初始化序列walk,然後進行​步隨機遊走。第3行獲取當前頂點curr,第4行是獲取當前頂點curr的直接相鄰頂點集合V_{curr}​,第5行是根據轉移概率得到下一步的頂點s,並加入序列walk。

三、應用

對頂點的表示學習只是第一步,目的還是爲了解決下游任務,下游任務一般有兩類,第一類是對頂點的多標籤分類,第一類是預測頂點之間是否存在連接。這裏主要介紹一下第二類。對於graph中的任意兩個頂點對,例如(u, v),假設學到特徵向量爲f(u)和f(v),f爲頂點到特徵向量的映射函數。通過一些算子,生成頂點對(u,v)的表示向量。不管頂點對之間存在連接,都要生成頂點對的表示向量用於後續使用。作者給出了一些算子作參考,如圖4所示,在多個試驗中,Hadamard表現最佳。

圖4

最後,相對於DeepWalk,node2vec更加靈活,而且作者也通過試驗證明了nodevec效果確實優於DeepWalk。

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