總結一下網絡表示學習 (network embedding/network representation learning) 的東西。
網絡表示學習即是將節點表示為向量。
為什么表示為向量,目前看來有以下幾點原因:
- 向量是一種分布式表示,比 one-hot 表示什么的更易於使用,如可以方便地作為 feature 喂給 classifier 等。而這其實也是因為分布式表示含有很多隱含信息,不像 one-hot 向量,丁是丁卯是卯。同時,分布式表示可以比 one-hot 表示短得多。
- 網絡 (graph) 是一種不夠結構化的數據結構。想要在網絡中獲取有用的信息,哪怕只關注一個節點,也必然要關注網絡中與之相關的一群節點,算法復雜度指數上升,解決問題的復雜性也是指數上升。這種級聯的問題使得在網絡上的研究很麻煩,千頭萬緒。而把每個節點表示為一個獨立的向量就很方便了。
- 網絡不規則。網絡中的節點有的度很大,有的度很小,每個節點的鄰居個數不一樣,在網絡上直接處理會很麻煩。轉化為向量后,向量長度都一樣,就規則了。
- 網絡很大時處理起來時間和空間復雜度都太高,鄰接矩陣和 laplacian 矩陣都是 \(N^2\) 大小,而處理成 embedding 向量后,長度就很短了,給下游任務使用時復雜度就小得多。
接下來的問題是怎么將節點表示成向量。
這里首先要確定的是要從哪個角度來確定節點間的相似性。目前我接觸到的主要是以下兩個角度:
- Homogeneity/proximity,這個主要是社區 (community) 角度,即相鄰的節點更可能在社區屬性上相似。在某篇論文上看到一個解釋說,從這個角度看,網絡是平滑的,感覺很形象很直覺。
- Structural similarity,這個主要是結構或功能角度,即周圍結構相似的節點更可能在功能上相似。
當然,社區很多時候也會和功能相關,功能相似的節點也很可能相鄰,所以這兩個角度會有一些相似或重疊的地方。
但如果兩個結構相似的節點相距很遠時,這兩個角度就幾乎是正交的了。
首先說第一個角度,第一個角度的基本假設是『相鄰節點相似』,這可以稱為是 first-order proximity。而另一方面,基於這個假設,與同一個節點相似的節點之間也更可能相似,那么兩個節點之間共同鄰居越多,它們也就更可能相似,這可以稱為 second-order proximity,這時,兩個節點之間相距為 2。當然,距離再遠些還可以有 high-order proximity。
那么如何捕捉 (capture) 這些 proximity 呢?
最早 DeepWalk 是以節點作為單詞,以隨機游走序列作為句子,得到句子序列之后喂給 word2vec 從而得到節點 embedding。word2vec 會將窗口內的節點作為上下文,所以 DeepWalk 捕捉的是 \(k\) (window size) 階proximity?
之后出現了 LINE,LINE 一方面針對大型網絡進行了優化,另一方面,給出了 objective function,這就使得對於網絡表示學習的改進更加容易。因為要在基於 random walk 的方法上繼續改進,一般只能在網絡結構 (如 HARP?) 或 random walk 的生成模式 (如 node2vec) 上做手腳,這樣改進或擴展起來就很不方便。而在 LINE 給出了 objective function 后,只要針對自己預想的改進,調整目標函數就好了。因此,后面看到的很多網絡表示學習的論文都是基於 LINE 做的改進,如加入社區結構、加入影響力模型等等。
之后,又出現了基於矩陣分解的網絡表示學習方法,如 GraRep,但這類方法速度比較慢。
除此之外,還有基於深度學習的方法,如 SDNE,本質上可以看作使用自編碼器對鄰接矩陣降維?
本質上,這些方法都可以看作用向量表示來模擬網絡中的概率分布,不同的是這個概率分布是從哪個角度計算的,以及是怎么計算的。如 LINE 中定義的網絡中的概率分布就比較簡單直接,基本是邊權重除以中心節點的度,然后以 sigmoid 或 softmax 來用向量表示表達這個概率,接下來就是用 KL-divergence 來最小化兩個分布的距離就可以了。對於基於 random walk 的方法,這個網絡中的概率分布就隱含在 random walk 中而沒有明確定義。
對於 DeepWalk 來說,random walk 相當於NLP里的句子,而在 NLP 中,word2vec 所做的事情相當於通過向量表示使句子生成的概率最大化,那么在 DeepWalk 中,節點相當於 vocabulary,DeepWalk 的目的就是用節點向量使 random walk 生成的概率最大化。
就好象給定 N 個節點,用這 N 個節點可以生成有不同連接方式的網絡,假設這些不同的網絡構成一個集合(空間?) S,那么我們見到的那個網絡 G 只是這個集合中的一個元素。用不同的向量表示這些節點,生成這些網絡的概率也會不同,我們要做的是調整這些向量,使生成給定網絡 G 的概率最大。那么此時問題在於如何表示『向量生成某個網絡 G 的概率』。DeepWalk 首先將網絡轉化為 random walk 序列,可以理解為在給出足夠多 random walk 序列時,這些序列在集合 S 中對應 G 的概率最大,從而我們可以用 random walk 序列近似表示網絡 G,接下來只要向量表示生成這些 random walk 序列的概率越大,就可以理解為生成網絡 G 的概率越大。然后我們再將 random walk 生成的概率近似用上下文生成中心詞(或反過來)的概率表示,就可以用 word2vec 的 CBOW 或 skipgram 學習了。這里 S,G 有點像監督學習里的 hypothesis set 和 ideal target function。
另,考慮另一個問題:給定一個 \(N \times N\) 的矩陣 \(A\),矩陣里每個元素 \(A_{ij}\) 表示兩個點 \(i\) 和 \(j\) 之間的距離,求給出每個節點的坐標,使滿足該矩陣。坐標維數不做限定。
如果該問題里的點對應網絡中的節點,矩陣中的值表示節點間的最短路徑距離或轉移概率,所求坐標對應向量表示,那么network embedding可以看作對這個問題的近似求解?
這個問題可以看作有兩個步驟,一是給出矩陣 \(A\),二是求節點坐標 (即embedding)。大多數network embedding方法其實可以看作是對於這兩個步驟給出了不同的解決方案。即以不同方式定義節點間的相似度,給出不同的矩陣 \(A\),或者以不同方式求解 embedding。
TODO:
結構相似性角度
graph kernel
link prediction