【Graph Embedding】: SDNE算法

論文“Structural Deep Network Embedding”發表在kdd2016

論文下載地址:https://www.kdd.org/kdd2016/papers/files/rfp0191-wangAemb.pdf

論文利用深度自編碼器來學習圖中節點的embedding向量,結合一階和二階相似度進行聯合訓練,將二階相似度作爲無監督信息,捕獲全局網絡結構信息,一階相似度作爲有監督信息,用於捕獲局部網絡結構。

提出問題

文章提出 graph embedding存在一下幾個問題:

1.高非線性(high non-linearity):圖的潛在結構是高非線性的,因此淺層模型很難捕獲全面的非線性結構。

2.結構保持(structure-preserving): 學習出來的節點embedding需要能保留住圖的全局和局部結構信息。

3.稀疏性(sparsity): 真實環境下,網絡通常都是稀疏的,會有大量合理的鏈接丟失。

如何解決問題

解決高非線性問題:淺層模型很難學習好高非線性結構,所以本文采用深度模型來擬合非線性結構。

解決結構保持和稀疏性問題:聯合訓練一階和二階相似性,一階指的是直接有邊相連的鄰近節點,用於學習局部網絡結構。但是真實的網絡往往都是稀疏的,缺失了大量合理鏈接,所以一階相似性節點的數據少,需要利用二階相似度來做擴展,二階相似度表示不同定點之間的鄰域結構的相似性,以捕獲全局網絡結構。

問題定義

定義圖爲G=(V,E),其中V= \{v_1,...,v_n\}表示n個節點,E=\{e_{i,j}\}^n_{i,j=1}表示節點i和j之間的邊。每條邊e_{i,j}分配有一個權重s_{i,j}\geqslant 0,如果節點i和j沒有邊相連的話,那麼s_{i,j}=0,否則的話,無權圖s_{i,j}=1,加權圖s_{i,j}>0

一階相似度(First-Order Proximity)

一階相似其實就是指的節點的鄰域節點,對於任意一對節點,如果s_{i,j}>0,那麼節點i和j之間就存在正的一階相似度,否則爲0。

二階相似度(Second-Order Proximity)

二級相似描述的是兩個節點,它們的鄰域節點相似的情況。令N_u=\{s_{u,1},...,s_{u,|V|}\}表示節點u和其他所有節點的所有一階相似度。

那麼兩個節點的二階相似度就由N_uN_v表示。

圖embedding(Network Embedding)

給定一個圖G=(V,E),圖embedding 的目標是學習每個節點的映射函數,使得將節點映射到一個d維的低緯空間。即學習一個映射函數f:v_i\mapsto y_i\subset R^d,而優化的目標就是利用一階和二階相似度優化y_iy_j的相似度。

模型

                                 

整個模型的框架如圖所示,是一個雙通道的自編碼器,兩個通道共享全值。具體的一階相似和二階相似在損失函數中體現。

損失函數

                      

上圖爲文章定義的表示符號,其中帶^的帽子的符號是網絡重建的輸出結構。

1.自編碼器重建二階相似度,即輸入當前節點和其他所有節點的鏈接權重,沒有鏈接則權重爲0。然後用自編碼器重建所有數據。那麼正常的自編碼器損失函數爲:

                                                         

但是鄰域鏈接的節點很稀疏,這樣的話輸入數據Xi,即N_i的大部分維度上都是0,那樣網絡只要輸出全0,也能達到很好的效果,所以這裏損失函數對非零項做了加權。

                                                 

這裏的⊙表示哈達馬乘積(即對應元素相乘),b_i=\{b_{i,j}\}^n_j=1,如果s_{i,j}=0,即節點i和j沒有邊連接,那麼b_{i,j}=1,否則b_{i,j}=\beta >1這樣就起到來加權的效果。

2.損失函數引入一階相似度限制,如果兩個節點有邊直接相連,那麼讓兩個節點的embedding向量儘量的靠近,所以可以直接最小化兩個embedding向量的最小二乘:

                                                   

這裏的y^{(K)}_iy^{(K)}_j就是自編碼器中間編碼出來的向量,也就是最後要提取出來的節點embedding。因爲網絡結構是雙通道的,所以可以直接在損失函數中加入這項損失。

3.加入L2正則,這個就不多說了。

                                                        

那麼將上面的三項合併起來就可以獲得最終的損失函數:

                                                       

然後就可以訓練自編碼器了,把訓練好的中間向量提取出來就是最終的節點embedding啦。

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