轉自本人:https://blog.csdn.net/New2World/article/details/105536633node
上一講介紹了對圖中節點進行分類的方法,涉及了節點自身的特徵以及圖的結構信息。然而當特徵這個概念出現就說明須要作特徵工程,這是至關費時費力的工做。最後的結果還不必定理想,由於或多或少會丟失一些信息。所以咱們但願能讓算法本身學習節點特徵,雖然這樣的到的特徵向量並不像傳統意義上的特徵那樣每一列有明確的意義,而更有一種對節點進行編碼(embedding)的味道。其中最簡單的例子就是 one-hot,但這種簡單 embedding 的方式存在不少問題,好比泛化性差,維度高,信息缺失等。所以咱們但願獲得的 embedding 有一些很好的性質,好比 embedding 的類似度能反映節點在網絡中的類似度。這裏的類似度是根據不一樣應用場景進行定義的,能夠是拓撲結構上的相鄰,也能夠是以前提到的相同的角色。embedding 的類似度計算也須要針對不用應用場景或需求來定義,但通常狀況下采用的仍是向量的內積。
有了這個大致思路咱們就能夠將這個學習節點 embedding 的過程簡單分爲 3 步:算法
隨機遊走,正如這個名字描述的那樣,節點從一個點開始沿着圖中的邊「亂」跑,途經的節點的 multiset(節點可重複) 就是咱們想要的東西。爲何咱們要這種看似無章可循的「亂」生成的結果?這實際上是定義節點類似度的一種方法。假設如今咱們須要節點 \(u\) 的 embedding,且咱們但願節點類似度定義爲結構上較爲接近的點具備更高類似度。那最容易想到的方法就是鄰接節點,這些點的類似度必定很高,這要能最大化這一部分點的 embedding 類似度就行了。想法很好也很正確,可是這樣作存在兩個問題。首先,若是隻找鄰接節點,那得到的信息就只有 \(1\) hop,這樣獲得的結果太侷限了。再說直觀上也說不通,就比如和節點 \(u\) 直接相連的節點和 \(u\) 很相似,而 \(u\) 鄰接點的鄰接點就和 \(u\) 徹底沒有關係了。那可能就有人說,大不了我多迭代幾回,考慮跑個 \(k\) hop。那麼這就涉及到第二個問題,對於大規模的網絡一部分節點的度很高,例如微軟 MSN 的網絡最高的度是指數級別的,所以找全部鄰接節點代價過高更別說還要找鄰接點的鄰接點了。
這麼一來,這個隨機遊走看起來是否是就很漂亮了。首先它隨機傳播,只要咱們控制好傳播距離就能實現多 hop。其次它不要求遍歷全部鄰接點,但只要隨機次數足夠它仍是能覆蓋大部分鄰接點。
而後根據隨機遊走的結果來定義類似度就很簡單了,即節點 \(u\) 和 \(v\) 的 embedding 類似度和這兩個節點同時出如今隨機遊走的結果中的機率成正比。你細品是否是這個道理。
有了類似度,接下來就是優化的過程。咱們用 log-likelihood 來作。這裏將隨機遊走的結果記爲 \(N_R(u)\)網絡
而後由於是機率,因此咱們用 softmax 來定義 \(P(v|z_u)\)app
爲何是 softmax ?
由於 \(\sum_i\exp(x_i)\approx\max_i\exp(x_i)\)dom
然而就算 numpy 再方便再快也經不起套娃的 sum 那 \(O(|V|^2)\) 的複雜度呀。因而採用了 negative sampling 的方法取代每次計算全部節點類似度和的步驟。negative sampling 說白了就是從全部節點中按照分佈 \(P_V\) 隨機選點。在這個場景下,每一個點被選中的機率和它自身的 degree 成正比。機器學習
隨機選一些點不是會損失不少精度嗎?看起來是的,但實際上這樣作沒什麼問題。爲何?這個過程很複雜,有空我再去看,paper 連接先放這兒 https://arxiv.org/pdf/1402.3722.pdf
這裏的 \(k\) 是 negative sampling 選點的超參數,通常來講 \(k\) 取 \(5\)~\(20\)。過高的 \(k\) 雖然能獲得更穩定的結果,但 bias 會增長,由於選點機率和度成正比。ide
上面提到的這種是長度固定的無偏隨機遊走。它的約束太強了致使獲得的 embedding 泛化能力有限。這也是一個很重要的點,即更寬鬆的約束條件下獲得的 embedding 更豐富。接下來介紹的這個也是隨機遊走,但它的規則不同。slide 裏介紹的這是一個有偏的二階隨機遊走,有偏會在下面介紹,但這裏我是沒看出來哪裏體現了二階。
node2vec 裏有兩個關鍵超參數,return \(p\) 和 in-out \(q\)。下圖很直觀地展現了這兩個參數的用途。首先從 \(s_1\) 出發到達 \(w\) 後須要決定下一步走哪裏,咱們按 \(1/p\) 的相對機率回到 \(s_1\),\(1\) 的相對機率進行 BFS 即 \(s_1\) 的下一個鄰接節點,或者按 \(1/q\) 的相對機率傳播出去即 DFS。如此一來就能 capture 到局部和全局特徵了。這種方法在節點分類任務裏效果很好。
注意,這裏並非機率,而是相對機率關係。學習
接下來就是用 SGD 作優化了。優化
TransE 其實也是一個學習節點 embedding 的算法。我對這個算法比較感興趣,由於我一直想涉足知識圖譜領域,並且我本科導師帶的研究生就在作 TransE 相關的東西,我也或多或少了解過一點它的神奇特性。好比如今咱們的圖譜裏有幾個實體:「北京」,「中國」,「華盛頓」,「美國」;同時還有關係:「中國」\(\rightarrow\)「北京」,「美國」\(\rightarrow\)「華盛頓」。顯而易見這個關係實際上是「首都」的含義,那麼 TransE 能作到 「中國」 - 「北京」 = 「美國」 - 「華盛頓」 = 「首都」 (固然,其實並無「首都」這麼一個實體,只是方便解釋)。而這一特性就能完成 link prediction 的任務。好比我如今有「巴黎」和「法國」但沒有這兩個實體見的關係,那咱們能夠作的就是計算出 「法國」 - 「首都」 而後計算獲得的結果和其它城市實體的類似度,而最終會發現「巴黎」的類似度最高。
之因此 TransE 能作到這一點,跟它的計算方式有關。它並不是採用的隨機遊走的方法,而是採用上面說到的這種特性來作的優化。首先將實體和關係定義爲三元組 \((h,l,t)\),分別表示頭實體、關係和尾實體 (有向)。而後編碼
因而可知,隨機遊走並非生成節點 embedding 的惟一方法,條條大路通羅馬。
最後一部分對整個圖作 embedding 講得很匆忙,我以前也沒有太多關心過這個問題。不過根據 slide 本身理解了下。大體有三種方法
這個玩意兒很神奇。它的定義和國內小學語文題相似,好比寫出形如 AABB 的詞語。可是這樣的話有個疑惑,圖中的 ABCDE 是怎麼標的?事先有標籤?仍是怎麼作?不是無監督學習嗎?這須要看看論文再回來解決。
利用 anon. walk 也有幾種方法來 embed 整個圖。
第一種方法,咱們先枚舉出長度爲 \(l\) 的全部 anon. walk,而後將圖的 embedding 表示爲這些遊走的機率分佈。好比長度爲 \(3\) 的話就有 \(5\) 中排列,那麼圖的 embedding 就是一個 5D 向量。
第二種方法,咱們生成 \(m\) 個隨機遊走的結果,而後根據這個結果計算經驗分佈。而這個 \(m\) 的取值是有下界的,咱們但願偏差大於 \(\varepsilon\) 的機率小於 \(\delta\) 的話
其中 \(\eta\) 是長度爲 \(l\) 的 anon. walk 的個數。
第三種方法,既然是機器學習那何不連遊走過程一塊兒學了?這裏的 idea 是但願能編碼遊走過程使得下一個遊走能被預測,即 \(P(w_t^u|w_{t-\Delta}^u,...,w_{t-1}^u)\) 這裏的 \(w_t^u\) 是從節點 \(u\) 出發的第 \(t\) 個隨機遊走。
這裏 \(b\in\R\),\(U\in\R^D\),\(z_i\) 是 anon. walk 的 embedding。詳細參考 Anonymous Walk Embeddings, ICML 2018
[1]: 這兒有一篇關於各類 embedding 方法的 survey:Goyal and Ferrara, 2017