[图神经网络] 图节点Node表示(DeepWalk与Node2Vec)
一 前言
在圖中,如果能把節點表示成合適的數值,能做很多任務,例如節點分類,關系預測,聚類等等。如何把節點表示成計算機能看懂的數值目前也有很多方法,本文主要為大家介紹基于DeepWalk的節點表示方法。
從某個節點的鄰居中隨機挑選一個節點作為下一跳節點的過程稱為隨機游走(Random Walk,下文簡稱游走),多次重復游走過程可產生游走序列。
隨機游走負責對圖進行采樣,獲得圖中節點與節點的共現關系。產生的序列可以作為訓練樣本輸送到模型(如word2vec)中進行訓練,進而得到圖上節點嵌入向量,即embedding。
Graph Embedding技術將圖中的節點以低維稠密向量的形式進行表達,要求在原始圖中相似(不同的方法對相似的定義不同)的節點其在低維表達空間也接近。得到的表達向量可以用來進行下游任務,如節點分類,鏈接預測,可視化或重構原始圖等。
二 DeepWalk 算法原理
雖然DeepWalk是KDD 2014的工作,但卻是我們了解Graph Embedding無法繞過的一個方法。
我們都知道在NLP任務中,word2vec是一種常用的word embedding方法,word2vec通過語料庫中的句子序列來描述詞與詞的共現關系,進而學習到詞語的向量表示。
DeepWalk的思想類似word2vec,使用圖中節點與節點的共現關系來學習節點的向量表示。那么關鍵的問題就是如何來描述節點與節點的共現關系,DeepWalk給出的方法是使用隨機游走(RandomWalk)的方式在圖中進行節點采樣。
RandomWalk是一種可重復訪問已訪問節點的深度優先遍歷算法。給定當前訪問起始節點,從其鄰居中隨機采樣節點作為下一個訪問節點,重復此過程,直到訪問序列長度滿足預設條件。
獲取足夠數量的節點訪問序列后,使用skip-gram model 進行向量學習。
首先根據用戶的行為構建出一個圖網絡;隨后通過Random walk隨機采樣的方式構建出結點序列(例如:一開始在A結點,A->B,B又跳到了它的鄰居結點E,最后到F,得到"A->B->E->F"序列);對于序列的問題就是NLP中的語言模型,因為我們的句子就是單詞構成的序列。接下來我們的問題就變成Word2vec(詞用向量表示)的問題,采用Skip-gram的模型來得到最終的結點向量??梢哉f這種想法確實是十分精妙,將圖結構轉化為序列問題確實是非常創新的出發點。在這里,結點走向其鄰居結點的概率是均等的。當然,在有向圖和無向圖中,游走的方式也不一樣。無向圖中的游走方式為相連即可走;而有向圖中則是只沿著“出邊”的方向走。
上圖出自阿里Embedding實踐paper:Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba
?
DeepWalk算法
DeepWalk算法主要包括兩個步驟:
第一步為隨機游走采樣節點序列,構建同構網絡,從網絡中的每個節點開始分別進行Random Walk 采樣,得到局部相關聯的訓練數據;
第二步為使用skip-gram modelword2vec學習表達向量,對采樣數據進行SkipGram訓練,將離散的網絡節點表示成向量化,最大化節點共現,使用Hierarchical Softmax來做超大規模分類的分類器
DeepWalk采用DFS即深度優先遍歷,這里貼淺夢大佬的實現
需要注意的是,DeepWalk中的DFS和數據結構與算法中的dfs思想類似,但是細節存在差異,在deepwalk中游走到死胡同直接break,而數據結構與算法中游走到死胡同返回初始點繼續游走
?
?
Skip-gram介紹
skip-gram 和 CBOW 是兩種 word2vec 算法,前者是通過中間的詞預測兩邊的詞,后者是通過周邊的詞預測中間的詞。就實際效果而言,skip-gram 效果更好。skip-gram 的結構如下圖所示。
直接用gensim里的Word2Vec
from gensim.models import Word2Vec model = Word2Vec(walks, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)walks是訓練所需語料(Node Embedding Sentences)
1.sg=1是skip-gram算法,對低頻詞敏感;默認sg=0為CBOW算法。
2.size是輸出詞向量的維數,值太小會導致詞映射因為沖突而影響結果,值太大則會耗內存并使算法計算變慢,一般值取為100到200之間。
3.window是句子中當前詞與目標詞之間的最大距離,3表示在目標詞前看3-b個詞,后面看b個詞(b在0-3之間隨機)。
4.min_count是對詞進行過濾,頻率小于min-count的單詞則會被忽視,默認值為5。
5.negative和sample可根據訓練結果進行微調,sample表示更高頻率的詞被隨機下采樣到所設置的閾值,默認值為1e-3。
6.hs=1表示層級softmax將會被使用,默認hs=0且negative不為0,則負采樣將會被選擇使用。
7.workers控制訓練的并行,此參數只有在安裝了Cpython后才有效,否則只能使用單核。
?
三 Node2Vec 算法原理
2016年出現的node2vec,node2vec的思想同DeepWalk一樣,生成隨機游走,對隨機游走采樣得到(節點,上下文)的組合,然后用處理詞向量的方法對這樣的組合建模得到網絡節點的表示。不過在生成隨機游走過程中做了一些創新,node2vec改進了DeepWalk中隨機游走的生成方式(通過調整隨機游走權重的方法使graph embedding的結果在網絡的同質性(homophily)和結構性(structural equivalence)中進行權衡),使得生成的隨機游走可以反映深度優先和廣度優先兩種采樣的特性,從而提高網絡嵌入的效果。
node2vec提出在圖網絡中很多節點往往有一些類似的結構特征。一種結構特征是很多節點會聚集在一起,內部的連接遠比外部的連接多,稱之為社區。另一種結構特征是網絡中兩個可能相聚很遠的點,在邊的連接上有著類似的特征。
網絡的“同質性”指的是距離相近節點的embedding應該盡量近似,如圖,節點u與其相連的節點s1、s2、s3、s4的embedding表達應該是接近的,這就是“同質性“的體現。
網絡的“結構性”指的是結構上相似的節點的embedding應該盡量接近,圖中節點u和節點s6都是各自局域網絡的中心節點,結構上相似,其embedding的表達也應該近似,這是“結構性”的體現。
node2vec論文中提出一個好的網絡表示學習算法的目標必須滿足這兩點:
?
node2vec算法
?
node2vec游走方式
node2vec的主要創新點通過改進游走方式
就如上圖的標注所示,深度優先游走策略將會限制游走序列中出現重復的結點,防止游走掉頭,促進游走向更遠的地方進行。而廣度優先游走策略相反將會促進游走不斷的回頭,去訪問上一步結點的其他鄰居結點。這樣一來,當使用廣度優先策略時,游走將會在一個社區內長時間停留,使得一個社區內的結點互相成為context,這也就達到了第一條優化目標。相反,當使用深度優先的策略的時候,游走很難在同一個社區內停留,也就達到了第二條優化目標。
?
復雜網絡處理的任務離不開兩種特性:一種是同質性,就是上文所說的社區。一種就是結構相似性。廣度優先搜索BFS傾向于在初始節點的周圍游走,可以反映出一個節點的鄰居的微觀特性;而深度優先游走DFS一般會跑的離初始節點越來越遠,可以反映出一個節點鄰居的宏觀特性。
node2vec區別于deepwalk,主要是通過節點間的跳轉概率。跳轉概率是三階關系,即考慮當前跳轉節點,以及前一個節點 到下一個節點的“距離”,通過返回參數p和進出(或叫遠離)參數q控制游走的方向(返回還是繼續向前)
對于節點v,其下一步要采樣的節點x,通過下面的轉移概率公式計算
其中d(t, x)代表t結點到下一步結點x的最短路,最多為2。
- 如果t與x相等,那么采樣x的概率為 1/p,當d(t, x)=0時,表示下一步游走是回到上一步的結點;
- 如果t與x相連,那么采樣x的概率1,當d(t, x)=1時,表示下一步游走跳向t的另外一個鄰居結點;
- 如果t與x不相連,那么采樣x概率為 1/q,當d(t, x)=2時,表示下一步游走向更遠的結點移動。
參數p、q的意義分別如下:
返回概率p:
- 如果 p > max(q,1) p>max(q,1) p>max(q,1) ,那么采樣會盡量不往回走,對應上圖的情況,就是下一個節點不太可能是上一個節點t。
- 如果 p < max( q,1) p<max(q,1) p<max(q,1) ,那么采樣會更傾向于返回上一個節點,這樣就會一直在起始點周圍某些節點來回轉來轉去。
出入參數q:
- 如果 q > 1 q>1 q>1,那么游走會傾向于在起始點周圍的節點之間跑,可以反映出一個節點的BFS特性。
- 如果 q < 1 q<1 q<1 ,那么游走會傾向于往遠處跑,反映出DFS特性。
當p=1,q=1時,游走方式就等同于DeepWalk中的隨機游走
?
四 node2vec和deep walk 捕捉網絡什么特性
?
| ? | ? |
顏色接近的節點代表其embedding的相似性更強
?????? BFS的搜索策略非常類似于社區發現所得到的社區相似性,即更加接近一種直觀容易解釋的思路,偏向于一階和二階近鄰這類的相似性,也就是距離接近,特別是直接連接的nodes之間的embedding結果接近,也就是“結構性”,可以理解為,BFS的搜索策略能夠捕捉到“近鄰相似性”;
?????? DFS則看起來不那么直觀了,但是其實從傳統graph的一些評價指標可以進行分析和總結,例如pagerank,pagerank值計算的是節點的流行度,比如說中國的明星和美國的明星,二者的近鄰相似度肯定是非常低的,但是它們都在“演藝圈”這個巨大的graph中扮演著相似的角色,這一點我們可以通過pagerank這類統計方法來得到,成龍和杰森斯坦森之間的pagerank值的差異相對于成龍或杰森斯坦森和其它18線小明星的pagerank值的差異明顯要小得多,而我們的dfs捕捉的相似性指的就是這種相似性,即 節點在更大的范圍內(可能橫跨多個社區而形成的大子圖,具體根據random walk的步數來決定)中扮演的角色(同質性,同樣性質的相似性),例如我們看第二幅圖,連接不同nodes的“樞紐節點”其embedding的相似度往往比較高,從社交網絡的角度來說,這些樞紐節點都是“交際花”,雖然她們彼此之間的直接相連的近鄰相似度可能非常低,但是它們“交際”的性質是非常相似的,即在局部的子圖中扮演著相似的角色;
??????? p和q均為1的時候,node2vec退化為deepwalk,因此實際上我們可以知道,deepwalk本身并不是基于什么dfs之類的做游走的,就是一個純粹的隨機亂走,它即可以捕捉到部分結構性也可以捕捉到部分同質性,具體deepwalk能夠捕捉到什么樣的性質,就看天意了,所以我們不能說deepwalk就是基于dfs的游走策略游走主要捕捉同質性,而應該說deepwalk同時捕捉兩種特性然而兩種特性都捕捉的不是非常到位,而node2vec更像是基于deepwalk上的一個靈活的框架,因為我們可以通過指定超參數來改變我們想要進行embedding的目的,如果我們面臨的實際問題,定義相似性為同質性,
?????? 因此,只能說deepwalk能夠捕捉節點之間的共現性,這個共現性可能包含了同質性也可能包含了結構性,而node2vec可以讓使用者靈活的定義我們要捕捉更多的結構性還是更多的同質性,置于基于整個graph的同質性,比如上面所說的遠距離局部社區相同或者相似角色的embedding問題,我們就需要考慮使用別的embedding算法來解決了,比如計算復雜度非常高基本沒法在大規模graph上運行的struc2vec。
?
https://zhuanlan.zhihu.com/p/56380812
https://cloud.tencent.com/developer/article/1547385
https://zhuanlan.zhihu.com/p/231753603
總結
以上是生活随笔為你收集整理的[图神经网络] 图节点Node表示(DeepWalk与Node2Vec)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 便宜海外vps怎么租用
- 下一篇: 计算机经历的四个时代是什么?