Node2Vec笔记
node2vec: Scalable Feature Learning for Networks
Github整理代碼鏈接,歡迎討論和交流,覺得有用的可以Star一下。
1.主要思想
???????目的:是將圖中的頂點映射到一個低維連續空間,并且能夠保存圖的空間結構。
???????論文的主要亮點,設計了與Deepwalk不同的隨機游走方式,每次隨機游走會選擇是進行寬度游走Breadth-first Sampling (BFS)還是深度游走Depth-first Sampling (DFS) ,如圖1所示 。
???????獲得游走路徑集合后,與Deepwalk類似使用Skip-Gram模型進行頂點的Embedding學習
2.流程
2.1 優化目標
???????設f(u)f(u)f(u)是將頂點uuu映射為Embedding向量的映射函數,Ns(u)N_{s}(u)Ns?(u)為通過采樣策略SSS采樣出的頂點uuu的近鄰頂點集合。
???????將現有的Skip-gram模型擴展到網絡中來,優化以下目標函數
???????優化目標函數:給定一個頂點,令其近鄰頂點出現的概率最大
max?f∑u∈VlogPr(Ns(u)∣f(u))\mathop {\max }\limits_{f}\sum_{u\in V}logPr(N_s(u)|f(u)) fmax?u∈V∑?logPr(Ns?(u)∣f(u))
??????為了使公式1能夠得到很好的優化求解,提出了兩個假設:
??????1.條件獨立
??????給定一個頂點,其近鄰頂點出現的概率與近鄰集合中的其他頂點無關,得到公式2:
Pr(Ns(u)∣f(u))=∏ni∈Ns(u)Pr(ni∣f(u))Pr(N_s(u)|f(u))=\prod_{n_i\in N_s(u)}Pr(n_i|f(u)) Pr(Ns?(u)∣f(u))=ni?∈Ns?(u)∏?Pr(ni?∣f(u))
??????2.特征空間中的對稱性
?????源頂點和近鄰頂點在特征空間中具有對稱性,不管頂點是源頂點還是近鄰點Embedding表達是一樣的。(對比Line中的二階相似度有所不同),得到公式3:
Pr(ni∣f(u))=exp(f(ni)?f(u))∑v∈Vexp(f(v)?f(u))Pr(n_i|f(u))=\frac{exp(f(n_i)\cdot f(u))}{\sum_{v\in V}exp(f(v)\cdot f(u))} Pr(ni?∣f(u))=∑v∈V?exp(f(v)?f(u))exp(f(ni?)?f(u))?
??????根據以上兩個假設條件,最終的目標函數公式1簡化為公式4,由于Zu=∑v∈Vexp(f(ni)?f(u))Z_u=\sum_{v\in V}exp(f(n_i)\cdot f(u))Zu?=∑v∈V?exp(f(ni?)?f(u))計算復雜度高,所以采用負采樣近似優化
max?f∑u∈V[?logZu+∑ni∈Ns(u)f(ni)?f(u)]\mathop {\max }\limits_{f}\sum_{u\in V}[-logZ_u+\sum_{n_i\in N_s(u)}f(n_i)\cdot f(u)] fmax?u∈V∑?[?logZu?+ni?∈Ns?(u)∑?f(ni?)?f(u)]
2.2 采樣策略
2.2.1 路徑采樣策略
??????Node2vec依然延續了Deepwalk采用隨機游走的方式獲取頂點的近鄰序列,Node2vec不同的是采用的是一種有偏的隨機游走。
??????給定當前頂點vvv ,訪問下一個頂點 xxx 的概率為公式5,其中πvx\pi_{vx}πvx?為頂點vvv和頂點xxx為歸一化的轉移概率,ZZZ為一個常量,設πvx=αpq(t,x)?wvx\pi_{vx}=\alpha_{pq}(t,x)\cdot w_{vx}πvx?=αpq?(t,x)?wvx?,αpq(t,x)\alpha_{pq}(t,x)αpq?(t,x)是ttt到xxx的游走策略生成的概率,wvxw_{vx}wvx?是頂點vvv和頂點xxx之間的邊權。
P(ci=x∣ci?1=v)={πvxZ(v,x)∈V0(v,x)?VP(c_i=x|c_{i-1}=v)=\left\{\begin{matrix} \frac{\pi_{vx}}{Z} &(v,x)\in V \\ 0 & (v,x)\notin V \end{matrix}\right. P(ci?=x∣ci?1?=v)={Zπvx??0?(v,x)∈V(v,x)∈/?V?
??????Node2vec引入兩個超參數ppp和 qqq來控制隨機游走的策略。如圖2所示,假設當前隨機游走頂點ttt經過邊 (t,v)(t,v)(t,v) 到達頂點vvv,頂點vvv的下一個訪問頂點xxx的概率根據公式6計算得到,公式6中dtxd_{tx}dtx?為下一個訪問頂點xxx和當前頂點vvv的上一個頂點ttt之間的距離
αpq(t,x)={1pdtx=01dtx=11qdtx=2\alpha_{pq}(t,x)=\left\{\begin{matrix} \frac{1}{p}& d_{tx}=0 \\ 1&d_{tx}=1\\ \frac{1}{q}&d_{tx}=2 \end{matrix}\right. αpq?(t,x)=????p1?1q1??dtx?=0dtx?=1dtx?=2?
- 返回參數ppp
??????僅作用于dtx=0d_{tx}=0dtx?=0的情況,控制頂點vvv重復訪問上一步頂點的概率,如果ppp較大,則下一步游走訪問上一步頂點的概率越小,反之越大。 - 輸入輸出參數qqq
僅作用于dtx=2d_{tx}=2dtx?=2的情況,控制頂點vvv隨機游走下一步的游走策略類型,BFS和DFS
如果qqq較大,則頂點vvv下一步游走傾向于訪問頂點vvv上一步頂點近鄰頂點,構成了寬度游走策略
如果qqq較小,則頂點vvv下一步游走傾向于訪問頂點vvv上一步頂點距離遠的頂點,構成了深度游走策略
2.2.2 頂點采樣策略
??????頂點采樣策略區別于Deepwalk,不是隨機采樣頂點,使用Alias Sample方法進行采樣。Alias Sample具體實現方式見Line論文整理3.3.4。本文中Alias Sample與Line中不同之處在于創建鄰居頂點的Node Alias Sample Table,而Line中是創建的全局Node Alias Sample Table。
3.向量學習
??????通過帶策略的隨機游走獲得路徑集合,根據所獲得的路徑集合,與Deepwalk類似使用Skip-Gram模型進行頂點的Embedding學習。具體Skip-Gram模型見Deepwalk論文整理。
4.代碼實現和實驗
4.1 游走策略代碼
?????Node2Vec中Edge Alias Sample根據公式6計算,給定一個頂點src,計算src的鄰居頂點訪問概率,為了在隨機游走下一個頂點中使用;Node Alias Sample根據頂點的出度歸一化生成概率計算得到
# _*_ coding: utf-8 _*_ """ Time: 2020/9/9 17:50 Author: Cheng Ding(Deeachain) Version: V 0.1 File: node2vec.py Describe: Write during the internship at Hikvison, Github link: https://github.com/Deeachain/GraphEmbeddings """ # Edge Alias Sample def get_alias_edge(self, src, dst):'''Get the alias edge setup lists for a given edge.'''G = self.Gp = self.pq = self.qunnormalized_probs = []for dst_nbr in sorted(G.neighbors(dst)):if dst_nbr == src: # dx=0unnormalized_probs.append(G[dst][dst_nbr]['weight'] / p)elif G.has_edge(dst_nbr, src): # dx=1unnormalized_probs.append(G[dst][dst_nbr]['weight'])else: # dx=2unnormalized_probs.append(G[dst][dst_nbr]['weight'] / q)norm_const = sum(unnormalized_probs)normalized_probs = [float(u_prob) / norm_const for u_prob in unnormalized_probs]return alias_setup(normalized_probs)''' Node Alias Sample ''' alias_nodes = {} for node in G.nodes():unnormalized_probs = [G[node][nbr]['weight'] for nbr in sorted(G.neighbors(node))]norm_const = sum(unnormalized_probs)normalized_probs = [float(u_prob) / norm_const for u_prob in unnormalized_probs]alias_nodes[node] = alias_setup(normalized_probs)- 游走策略代碼
4.2 實驗
????????Node2Vec源碼[1]中僅使用karate.edges數據集,該數據集是關于跆拳道俱樂部成員之間關系的社交網絡,節點沒有標簽,作者源碼沒有復現原文中的數據集。整理代碼采用了另外的三個公開數據集,分別是:Cora數據集由機器學習論文組成,總共有2708篇論文,應用關系有5429個,論文總共七類(基于案例、遺傳算法、神經網絡、概率方法、強化學習、規則學習、理論);DBLP數據集也是引文網絡組成的圖,只選用了4類;BlogCatalog數據集是Blog用戶之間關系構成的社交網絡,相關詳細參數見表1
表1 整理代碼使用數據集| V | 2708 | 17725 | 10312 |
| E | 5429 | 105781 | 333983 |
| Class | 7 | 4 | 39 |
????????實驗參數:
- Deepwalk:詞向量維度d=128d=128d=128、每個頂點游走路徑數γ=50\gamma=50γ=50、游走路徑長度t=20t=20t=20、Epoch=5Epoch=5Epoch=5、SkipGram窗口大小w=10w=10w=10
- Line:詞向量維度d=128d=128d=128、二階相似度生成128維詞向量、Epoch=150Epoch=150Epoch=150、lr=0.005lr=0.005lr=0.005、num_negative=5num\_negative=5num_negative=5。(目前Line模型存在一定問題,不能復現論文效果。)
- Cora數據集有向圖實驗,一階相似度:節點分類f1=0.44f1=0.44f1=0.44,可視化能區分一部分節點,;二階相似度節點分類f1=0.52f1=0.52f1=0.52,,可視化能區分一部分節點
- COra數據集無向圖實驗,一階相似度:節點分類f1=0.48f1=0.48f1=0.48,可視化能區分一部分節點,;二階相似度節點分類f1=0.62f1=0.62f1=0.62,,可視化能區分一部分節點
- Node2vec:詞向量維度d=128d=128d=128、返回參數p=0.25p=0.25p=0.25、輸入輸出參數q=0.25q=0.25q=0.25(p、q∈(0.25,0.5,1,2,4)p、q\in ({0.25,0.5,1,2,4})p、q∈(0.25,0.5,1,2,4)文中實驗證明ppp和qqq越小越好)、每個頂點游走路徑數γ=50\gamma=50γ=50、游走路徑長度t=20t=20t=20、Epoch=5Epoch=5Epoch=5、SkipGram窗口大小w=10w=10w=10
????????Node2Vec通過帶偏策略的游走得到路徑集合,接著SkipGram模型學習頂點的Embedding,最后使用Embedding設計頂點分類任務。數據集劃分80%的數據用于訓練,20%用于評估,分類任務使用SVM分類,得到頂點的分類指標f1-score如表2所示。
表2 頂點分類f1-score指標| Deepwalk(f1-micro) | 0.8542 | 0.8327 |
| Line(f1-micro) | 0.6218 | 0.6262 |
| Node2vec(f1-micro) | 0.8561 | 0.8386 |
????????節點Embedding表達在空間維度上,相同類別的節點距離會越靠近,最后將學習得到的Embedding進行可視化展示。可視化使用的是TSNE實現,將向量降維到二維平面上。可視化效果如圖3所示。
參考和引用
[1]. 論文源碼
總結
以上是生活随笔為你收集整理的Node2Vec笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PKCS8密钥格式
- 下一篇: 国密算法使用-SM3