struc2vec 論文閱讀


論文目的

強調依據的 Graph 中的 structure info 對於 Node 的分類。這區別於以往的假設 “相鄰較近的節點具有相似的分類情況”
即用 “structure identity”。換句話說————“struc2vec is superior in a classification task where node labels depends more on structural identity”

實現方式

如何衡量結構相似性

從直覺上來說,兩個 Node 如果是結構相似的,那么他們應該會有相近的度。進一步來說,如果這兩個 Node 的相互的 neighbors 同樣也有相近的度,那么可以說這兩個 Node 的結構相似性更高了。【有點類似於 neighbors consensus】

具體來說,記
\(k\) 為某個節點的 k-hop(\(k\) 階鄰居)
\(R_k(u)\) 代表節點 u 的 k 階鄰居集合【the ring of nodes at distance k】
\(s(S)\) 對節點集合 S 按照度進行排序

下面公式衡量節點 u 和 v 之間的相似度:

\[\begin{aligned} f_{k}(u, v)=f_{k-1}(u, v)+g\left(s\left(R_{k}(u)\right), s\left(R_{k}(v)\right)\right) &, \\ k \geq 0 \text { and }\left|R_{k}(u)\right|,\left|R_{k}(v)\right|>0 \end{aligned}\]

這是一個遞歸式。\(f_{-1}=0\)\(g(D_1, D_2) \geq 0\) 表示度序列 \(D_{1}\)\(D_{2}\) 之間的 distance. \(g(D_1, D_2)\) 該值越大則序列差異越大。 【方便理解:類似衡量cosx 和 sinx 的差異度】
總之:\(f_{k}(u,v)\) 值越小,則節點 u 和 v 結構相似度越高

構建上下文圖(context graph)

層內

觀察上一節的公式,其中 k 是 k-hop,所以這一節,將針對 k=0,1,2....\(k^*\) 分別構建一個 context graph
同時如果兩個節點之間有 edge,那么給這條 edge 賦一個權重值 \(w_{k}(u, v)\)(用於下文的隨機游走)

\[w_{k}(u, v)=e^{-f_{k}(u, v)}, \quad k=0, \ldots, k^{*} \]

可以看到,\(f_k\) 越小 ==> 節點結構越相似 ==> \(w\) 越大 ==> 則權重值越大(用於隨機游走)

層間

那么 \(k\) 的變動,會有不同的層,不同層之間 graph 結構是不變的(類似堆成的千層餅),所以不同層之間同一個節點我們添加兩條通路:

\[\begin{array}{l} w\left(u_{k}, u_{k+1}\right)=\log \left(\Gamma_{k}(u)+e\right), \quad k=0, \ldots, k^{*}-1 \\ w\left(u_{k}, u_{k-1}\right)=1, \quad k=1, \ldots, k^{*} \end{array} \]

其中

\[\Gamma_{k}(u)=\sum_{v \in V} \mathbb{1}\left(w_{k}(u, v)>\overline{w_{k}}\right) \]

\[\overline{w_{k}}=\sum_{(u, v) \in\left(\begin{array}{c} v \\ 2 \end{array}\right)} w_{k}(u, v) /\left(\begin{array}{l} n \\ 2 \end{array}\right) \]

\(\overline{w_{k}}\) 是該層的平均權重,所以第一個式子表示,如果該層的\(\Gamma_{k}(u)\)較大,也就是該層同 u 節點結構相似的數量較多,該層的k-hop,的 k 需要變大,這樣包含的結構信息將會更多,才會找到更高層次的 structural similarity

隨走游走

通過以上,我們構建了層內和層間的權重連邊,這一切都是為了最終的隨機游走
每一跳,可能會在層內游走,假設概率 \(q\) ,也可能會在層間 \(1-q\)

層內

\[p_{k}(u, v)=\frac{e^{-f_{k}(u, v)}}{Z_{k}(u)} \]

\[Z_{k}(u)=\sum_{v \in V \atop v \neq u} e^{-f_{k}(u, v)} \]

其中第一個式子就是節點 u 到 v 在 k 層的游走概率

層間

\[\begin{aligned} p_{k}\left(u_{k}, u_{k+1}\right) &=\frac{w\left(u_{k}, u_{k+1}\right)}{w\left(u_{k}, u_{k+1}\right)+w\left(u_{k}, u_{k-1}\right)} &= \frac{\log \left(\Gamma_{k}(u)+e\right)}{\log \left(\Gamma_{k}(u)+e\right)+1} \\ p_{k}\left(u_{k}, u_{k-1}\right) &=1-p_{k}\left(u_{k}, u_{k+1}\right) \end{aligned} \]

可以看到第一個式子,如果該層同 u 相似的節點越大,則大概率可能往上走,即該式子 \(p_{k}\left(u_{k}, u_{k+1}\right)\) 較大

優化算法

優化DTW

上文的計算序列差異的 \(g(s(R_{k}(u)), s(R_{k}(v)))\) 的計算過程中,使用的是DTW算法。在這個計算過程中需要計算一個距離矩陣。作者就對這個距離矩陣的進行了優化。例如,節點 v 的鄰居度為4 4 5,對這個序列進行壓縮,<度,出現次數數>,<4, 2>,<5,1>
具體計算公式(用於計算距離矩陣)

\[\operatorname{dist}(\boldsymbol{a}, \boldsymbol{b})=\left(\frac{\max \left(a_{0}, b_{0}\right)}{\min \left(a_{0}, b_{0}\right)}-1\right) \max \left(a_{1}, b_{1}\right) \]

\(\boldsymbol{a}=\left(a_{0}, a_{1}\right) \text { and } \boldsymbol{b}=\left(b_{0}, b_{1}\right) \text { are tuples in } A^{\prime} \text { and } B^{\prime}\)
\(A^{\prime} \text { and } B^{\prime}\) 是壓縮之后的元組序列

優化節點對

上文已經知道,我們在 k 層中,需要對每一對節點進行計算權重,而其實有一些節點對如果在 k=0 初始層的時候,就已經相差較大,則沒必要在 k=1... 層之后不斷去計算。比如 n 節點度為1,v節點度為10.
所以在該網絡中對所有節點按照度排序,然后按照二分查找,來確定 u 和哪些節點需要計算一個相似度

減少層數

但是幾層最好呢——對於不同場景,可以測試較優情況

推薦閱讀

https://blog.acolyer.org/2017/09/15/struc2vec-learning-node-representations-from-structural-identity/ 圖文並茂

論文代碼

https://github.com/leoribeiro/struc2vec
將部分代碼修改成python3支持的即可運行。看了一下代碼,寫的還是很清晰的,這里就不貼出來解讀了~

驗證實驗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM