GraphSAGE圖神經網絡算法詳解

GraphSAGE 是 17 年的文章了,可是一直在工業界受到重視,最主要的就是它論文名字中的兩個關鍵詞:inductive 和 large graph。今天咱們就梳理一下這篇文章的核心思路,和一些容易被忽視的細節。node

爲何要用 GraphSAGE算法

你們先想一想圖爲何這麼火,主要有這麼幾點緣由,圖的數據來源豐富,圖包含的信息多。因此如今都在考慮如何更好的使用圖的信息。網絡

那麼咱們用圖須要作到什麼呢?最核心的就是利用圖的結構信息,爲每一個 node 學到一個合適的 embedding vector。只要有了合適的 embedding 的結果,接下來不管作什麼工做,咱們就能夠直接拿去套模型了。機器學習

在 GraphSAGE 以前,主要的方法有 DeepWalk,GCN 這些,可是不足在於須要對全圖進行學習。並且是以 transductive learning 爲主,也就是說須要在訓練的時候,圖就已經包含了要預測的節點。ide

考慮到實際應用中,圖的結構會頻繁變化,在最終的預測階段,可能會往圖中新添加一些節點。那麼該怎麼辦呢?GraphSAGE 就是爲此而提出的,它的核心思路其實就是它的名字 GraphSAGE = Graph Sample Aggregate。也就是說對圖進行 sample 和 aggregate。函數

GraphSAGE 的思路學習

咱們提到了 sample 和 aggregate,具體指的是什麼呢?這個步驟如何進行?爲何它能夠應用到大規模的圖上?接下來就爲你們用通俗易懂的語言描述清楚。測試

顧名思義,sample 就是選一些點出來,aggregate 就是再把它們的信息聚合起來。那麼整個流程怎麼走?看下面這張圖:人工智能

咱們在第一幅圖上先學習 sample 的過程。假如我有一張這樣的圖,須要對最中心的節點進行 mebedding 的更新,先從它的鄰居中選擇 S1 個(這裏的例子中是選擇 3 個)節點,假如 K=2,那麼咱們對第 2 層再進行採樣,也就是對剛纔選擇的 S1 個鄰居再選擇它們的鄰居。spa

在第二幅圖上,咱們就能夠看到對於聚合的操做,也就是說先拿鄰居的鄰居來更新鄰居的信息,再用更新後的鄰居的信息來更新目標節點(也就是中間的紅色點)的信息。聽起來可能稍微有點囉嗦,可是思路上並不繞,你們仔細梳理一下就明白了。

第三幅圖中,若是咱們要預測一個未知節點的信息,只須要用它的鄰居們來進行預測就能夠了。

咱們再梳理一下這個思路:若是我想知道小明是一個什麼性格的人,我去找幾個他關係好的小夥伴觀察一下,而後我爲了進一步確認,我再去選擇他的小夥伴們的其餘小夥伴,再觀察一下。也就是說,經過小明的小夥伴們的小夥伴,來判斷小明的小夥伴們是哪一類人,而後再根據他的小夥伴們,我就能夠粗略的得知,小明是哪一類性格的人了。

GraphSAGE 思路補充

如今咱們知道了 GraphSAGE 的基本思路,可能小夥伴們還有一些困惑:單個節點的思路是這樣子,那麼總體的訓練過程該怎麼進行呢?至今也沒有告訴咱們 GraphSAGE 爲何能夠應用在大規模的圖上,爲何是 inductive 的呢?

接下來咱們就補充一下 GraphSAGE 的訓練過程,以及在這個過程它有哪些優點。

首先是考慮到咱們要從初始特徵開始,一層一層的作 embedding 的更新,咱們該如何知道本身須要對哪些點進行聚合呢?應用前面提到的 sample 的思路,具體的方法來看一看算法:

首先看算法的第 2-7 行,其實就是一個 sample 的過程,而且將 sample 的結果保存到 B 中。接下來的 9-15 行,就是一個 aggregate 的過程,按照前面 sample 的結果,將對應的鄰居信息 aggregate 到目標節點上來。

細心的小夥伴確定發現了 sample 的過程是從 K 到 1 的(看第 2 行),而 aggregate 的過程是從 1 到 K 的(第 9 行)。這個道理很明顯,採樣的時候,咱們先從整張圖選擇本身要給哪些節點 embedding,而後對這些節點的鄰居進行採樣,而且逐漸採樣到遠一點的鄰居上。

可是在聚合時,確定先從最遠處的鄰居上開始進行聚合,最後第 K 層的時候,才能聚合到目標節點上來。這就是 GraphSAGE 的完整思路。

那麼須要思考一下的是,這麼簡單的思路其中有哪些奧妙呢?

GraphSAGE 的精妙之處

首先是爲何要提出 GraphSAGE 呢?其實最主要的是 inductive learning 這一點。這兩天在幾個討論羣同時看到有同窗對 transductive learning 和 inductive learning 有一些討論,整體來講,inductive learning 無疑是能夠在測試時,對新加入的內容進行推理的。

所以,GraphSAGE 的一大優勢就是,訓練好了之後,能夠對新加入圖網絡中的節點也進行推理,這在實際場景的應用中是很是重要的。

另外一方面,在圖網絡的運用中,每每是數據集都很是大,所以 mini batch 的能力就很是重要了。可是正由於 GraphSAGE 的思路,咱們只須要對本身採樣的數據進行聚合,無需考慮其它節點。每一個 batch 能夠是一批 sample 結果的組合。

再考慮一下聚合函數的部分,這裏訓練的結果中,聚合函數佔很大的重要性。關於聚合函數的選擇有兩個條件:

  首先要可導,由於要反向傳遞來訓練目標的聚合函數參數;

  其次是對稱,這裏的對稱指的是對輸入不敏感,由於咱們在聚合的時候,圖中的節點關係並無順序上的特徵。

因此在做者原文中選擇的都是諸如 Mean,max pooling 之類的聚合器,雖然做者也使用了 LSTM,可是在輸入前會將節點進行 shuffle 操做,也就是說 LSTM 從序列順序中並不能學到什麼知識。

此外在論文中還有一個小細節,我初次看的時候沒有細讀論文,被一位朋友指出後才發現果真如此,先貼一下原文:

這裏的 lines 4 and 5 in Algorithm 1,也就是咱們前面給出的算法中的第 11 和 12 行。

也就是說,做者在文中提到的 GraphSAGE-GCN 其實就是用上面這個聚合函數,替代掉其它方法中先聚合,再 concat 的操做,而且做者指出這種方法是局部譜卷積的線性近似,所以將其稱爲 GCN 聚合器。

來點善後工做

最後咱們就簡單的補充一些喜聞樂見,且比較簡單的東西吧。用 GraphSAGE 通常用來作什麼?

首先做者提出,它既能夠用來作無監督學習,也能夠用來作有監督學習,有監督學習咱們就能夠直接使用最終預測的損失函數爲目標,反向傳播來訓練。那麼無監督學習呢?

其實不管是哪一種用途,須要注意的是圖自己,咱們仍是主要用它來完成 embedding 的操做。也就是獲得一個節點的 embedding 後比較有效的 feature vector。那麼作無監督時,如何知道它的 embedding 結果是對是錯呢?

做者選擇了一個很容易理解的思路,就是鄰居的關係。默認當兩個節點距離相近時,就會讓它們的 embedding 結果比較類似,若是距離遠,那 embedding 的結果天然應該區別較大。這樣一來下面的損失函數就很容易理解了:

z_v 表示是目標節點 u 的鄰居,而 v_n 則表示不是,P_n(v) 是負樣本的分佈,Q 是負樣本的數量。

那麼如今剩下惟一的問題就是鄰居怎麼定義?

做者選擇了一個很簡單的思路:直接使用 DeepWalk 進行隨機遊走,步長爲 5,測試 50 次,走獲得的都是鄰居。

總結

實驗結果咱們就不展現了,其實能夠看到做者在不少地方都用了一些比較 baseline 的思路,你們能夠在對應的地方進行更換和調整,以適應本身的業務需求。

後面咱們也會繼續分享 GNN 和 embedding 方面比較經典和啓發性的一些 paper,歡迎你們持續關注~~~

【編輯推薦】

  1. 人工智能初創公司創辦過程當中的三個關鍵教訓

  2. 74KB圖片也高清,谷歌用神經網絡打造圖像壓縮新算法

  3. 人工智能和機器學習買家指南

  4. 用Python實現多層感知器神經網絡

  5. 基於人工神經網絡分類器的領域自適應(DA)技術

【責任編輯:龐桂玉 TEL:(010)68476606】

相關文章
相關標籤/搜索