Graph Representation 圖神經網絡

Graph Representation 圖神經網絡html

圖表示學習(representation learning)——圖神經網絡框架,主要涉及PyG、DGL、Euler、NeuGraph和AliGraph五個框架。除了NeuGraph沒有開源外,其它框架都已開源。node

 

PyGgit

DGLgithub

Euler算法

NeuGraph數據庫

AliGraph編程

Dortmund緩存

NYU網絡

Alibaba架構

PKU

Alibaba

ICLR workshop’19

ICLR’19

N/A

ATC’19

VLDB’19

2018.5

2018.12

2019.1

2019

2019

Pytorch Geometric (PyG)

PyG在PyTorch上實現,最核心的類是torch_geometric.nn.MessagePassing,用戶只需定義消息傳遞$\phi$(message())、更新函數$\gamma$(update())和聚合函數$Agg$便可。

GCN的傳播規則用向量可表成

\[\mathbf{x}_i^{(k)} = \sum_{j \in \mathcal{N}(i) \cup \{ i \}} \frac{1}{\sqrt{\deg(i)} \cdot \sqrt{\deg(j)}} \cdot \left( \mathbf{\Theta} \cdot \mathbf{x}_j^{(k-1)} \right)\]

進而可表示成gatherscatter的兩個過程。

 

 

 PyTorch Geometric 使實現圖神經網絡變得簡單。例如,edge convolutional layer實現邊緣卷積層

import torch

from torch.nn import Sequential as Seq, Linear as Lin, ReLU

from torch_geometric.nn import MessagePassing

 

class EdgeConv(MessagePassing):

    def __init__(self, F_in, F_out):

        super(EdgeConv, self).__init__(aggr='max')  # "Max" aggregation.

        self.mlp = Seq(Lin(2 * F_in, F_out), ReLU(), Lin(F_out, F_out))

 

    def forward(self, x, edge_index):

        # x has shape [N, F_in]

        # edge_index has shape [2, E]

        return self.propagate(edge_index, x=x)  # shape [N, F_out]

 

    def message(self, x_i, x_j):

        # x_i has shape [E, F_in]

        # x_j has shape [E, F_in]

        edge_features = torch.cat([x_i, x_j - x_i], dim=1)  # shape [E, 2 * F_in]

        return self.mlp(edge_features)  # shape [E, F_out]

Deep Graph Library (DGL)

DGL和PyG都是目前運用得最普遍的圖神經網絡庫,原理都差很少,但各有優劣。好比DGL是無關平臺(platform-agnostic)的,只要底層是深度學習庫,均可以靈活支持;支持隨機遊走和隨機採樣。

 

 

 DGL將消息傳遞的式子拆分紅對邊應用(edge-wise)和對結點應用(node-wise)

\[\begin{cases}
\mathbf{m}_i^{(k+1)} = \phi^e\left(\mathbf{v}_i^{(k)},\mathbf{v}_j^{(k)},\mathbf{e}_{j,i}^{(k)}\right)\\\\
\mathbf{v}_i^{(k+1)} = \phi^v\left(\mathbf{v}_i^{(k)},\mathop{Agg}_{j\in\mathcal{N}_i}\mathbf{m}_i^{(k+1)}\right)
\end{cases}\]

其中$\phi^e$是消息函數,$\phi^v$是更新函數。

先前的庫都須要用戶用稀疏矩陣(CSR/COO)存儲圖,稠密張量存儲特徵,大量的底層設施會暴露給用戶;而DGL底層設施都交由runtime系統進行管理。

深度學習系統最大問題在於沒有辦法高效表示圖數據,而圖系統最大的問題在於無法自動微分!

現有用得最普遍的框架是前面兩個框架DGLPyG,但(早期版本的)DGL和PyG只是提供了一個編程框架(面向圖的消息傳遞模型),並無深度解決計算的問題(這很大程度也是GCN很難火起來的緣由,由於沒法作到很高的可擴展性)。在GCN的原做實現和GraphSAGE的原做實現中,都使用了TensorFlow進行編程,所採用的方法都是簡單暴力的矩陣乘,這樣其實很大程度忽略了圖計算框架這些年取得的成果。所以NeuGraph的出現也正是爲了彌合這二者,將圖計算與深度學習有機地融合起來。(這也是matrix-based和matrix-free兩種方法的對碰。)

NeuGraph把常見的GNN分爲三類:圖卷積、圖循環、圖注意力網絡。
進而提出了SAGA-NN (Scatter-ApplyEdge-Gather-ApplyVertex with Neural Networks)編程模型,其中SAGA部分屬於圖計算的消息傳遞,而兩個A則是深度學習神經網絡的應用。

 

 

 因爲GCN相比起傳統的圖算法(在圖計算層面上)要簡單不少,就是對全圖不斷進行遍歷,所以Scatter和Gather是肯定的,而兩個Apply階段則是用戶自定義的函數。(因此彷佛NeuGraph無法實現GraphSAGE,由於GraphSAGE的鄰域是由必定策略採樣出來的,而不是取所有鄰域)。

GPU Execution

目前的深度學習框架都很難處理大圖,由於GPU的內存沒法存儲這麼大規模的圖,所以NeuGraph在數據流抽象的基礎上進行了圖劃分。

(關於計算硬件,這裏是值得考慮的。GPU在稠密矩陣計算上具備先天優點,但若是換成稀疏陣優點是否還存在呢。圖處理框架的發展證實了CPU集羣有辦法承擔大規模的圖計算任務,從這種角度來看的話是否CPU在GNN的處理上也更存在優點呢?或者更加激進地,利用FPGA實現這樣既能高效遍歷又能高效算矩陣的架構是否有辦法呢?)

按邊劃分爲chunk(準確來講是把鄰接矩陣按列劃分),而後送到不一樣的GPU上進行計算,優化方法(streaming out of GPU core):

  • 使用selective scheduling,先用CPU篩一遍有用的邊,再把這些邊送去GPU算
  • 爲了確保足夠的局部性,採用了Kernighan-Lin算法進行圖劃分(METIS包),確保同一個chunk中的大部分邊都連向同一個節點
  • 用pipeline scheduling最大程度重疊IO和計算時間

AliGraph

AliGraph是Alibaba內部的圖計算系統,已經商用在淘寶各類預測任務上,而且取得了很好的效果。

提出目前GNN面臨着四個問題:大規模、異構、屬性、動態圖。

關於GNN的抽象,AliGraph就比NeuGraph要作得更好一些,考慮到了採樣過程。

 

 

 系統架構從上到下包括應用層、算法層、算子層、採樣層和存儲層,以下圖。

 

 

 Storage Level

  • 圖劃分:採用了四種方法(METIS、頂點/邊割、2D劃分、流式劃分),由用戶自行選擇
  • 圖屬性存儲:AliGraph考慮到了圖結構(structure)和圖屬性(attribute)的存儲方式,以索引方式並分開兩個表存,這就很數據庫了(確保第二範式)。也許會犧牲必定的計算時間,可是考慮到數據量過大,同時屬性信息千奇百怪,所以這樣存儲多是比較合適的。考慮到訪問時間的問題,加了兩個cache在這,用LRU策略。

 

  • 緩存鄰域結點:經過計算一個指標來衡量,選最大指標的那些進行緩存。

 

 

參考連接:

https://www.h5w3.com/128316.html

https://github.com/rusty1s/pytorch_geometric

 

人工智能芯片與自動駕駛
相關文章
相關標籤/搜索