天天看點

原來GNN這麼好上手,OMG!用它!引言從一鍵運作到深度定制從裸資料到GNN樣本,隻差一行python那些Dirty work系統幫你做了總結

引言

GraphLearn(GL)是阿裡巴巴開源的一個大規模圖神經網絡平台,本文将對GL的接口做基本介紹,幫助使用者快速上手。項目位址:

https://github.com/alibaba/graph-learn

圖神經網絡(Graph Neural Networks, GNNs)将深度神經網絡技術應用于圖結構上,通過遞歸地聚合鄰域特征資訊來表征頂點,GNNs的算法架構通常為Sample-Aggregate-Combine,如下Algorithm 1所示。

原來GNN這麼好上手,OMG!用它!引言從一鍵運作到深度定制從裸資料到GNN樣本,隻差一行python那些Dirty work系統幫你做了總結

GNNs應用在推薦系統、資料挖掘、自然語言處理、知識圖譜等領域中,比如在阿裡的一個典型的推薦場景中,利用“使用者-商品”,“商品-商品”的二部圖預測一個使用者是否會購買某個商品。

根據圖神經網絡的Sample-Aggregate-Combine架構,我們不難想象,一個完整的圖神經網絡的任務從端到端,可以粗略地分為圖資料準備、構圖、采樣、查詢、模型建構、訓練、預測幾個階段。

從一鍵運作到深度定制

GL基于大規模異構圖的場景,提供了一套簡潔靈活的API,加速圖神經網絡的開發。

圖神經網絡學習有兩種方式,一種是在全圖上通過鄰接矩陣計算,比如GCN/GAT等算法,這種方式受到記憶體的限制;另一種方式是對圖采樣,做mini-batch的計算,比如GraphSAGE等,這種方式更具有擴充性。GL支援這兩大類型的算法,提供了GraphEngine API、Data Model API以及Graph learning models。

Graph Engine構造了一個全局唯一的Graph對象,在這個對象上進行查詢、采樣等操作。基于Graph Engine的接口,你可以周遊圖、得到鄰居樣本、得到所需屬性,進而自己組織資料,構造模型。

Data Model是GL的基礎資料模型,由種子節點(seed nodes/edges)和鄰域(receptive fields /multi-hops neighbors)組成。通過上層的Encoders可以轉換為多種NN引擎對應的資料格式。基于Data Model,系統接手了樣本資料的準備,你可以專注于模型的開發。

Graph learning models将Data model的資料轉換為Embedding,并提供了多個built-in的GNNs models。Graph learning models可以直接調用,如果在自己的資料上運作,隻需要簡單适配即可。

原來GNN這麼好上手,OMG!用它!引言從一鍵運作到深度定制從裸資料到GNN樣本,隻差一行python那些Dirty work系統幫你做了總結

從裸資料到GNN樣本,隻差一行python

Graph Engine包含圖對象子產品、采樣子產品和查詢子產品,這些 Graph 上的子產品接口通過一套Gremlin-like API表達。如何從裸資料構造單機或分布式的圖、如何在圖上遊走、如何周遊、如何采樣鄰域、查詢哪些field,以及如何用這些資料構造圖神經網絡模型所需的樣本,整個過程隻需要一句python表示,類似data-flow的查詢語句:

gl.Graph().node().edge().init().V().outV().sample().by().values()           

我們将這一行代碼拆分到圖對象子產品、采樣子產品和查詢子產品的接口中進行解釋。

圖對象

圖對象子產品用于将結構化的圖資料轉換為邏輯圖對象。GL的入口非常簡單,載入graphlearn庫,建構一個 Graph 邏輯對象,後續所有的操作都在這個 Graph 對象上進行。

import graphlearn as gl
g = gl.Graph()           

• 圖資料格式:靈活的schema,多變的資料類型

GL圖資料格式靈活,支援float,int,string類型的屬性,支援帶權重、标簽。在現實的場景中,資料格式多變,通過config檔案描述非常複雜,容易寫錯;有些GNN系統不支援多種類型的屬性。

下面的示例描述了資料中存在string和float類型的兩列屬性和權重、标簽列。

decoder = gl.Decoder(attr_types=["string", "float"], weighted=True, labeled=True)           

• 資料源載入和拓撲描述:同構、異構、多資料源,通通支援

GL提供了 node 和 edge 兩個簡單的接口來支援頂點和邊的資料源載入,同時在這兩個接口中描述圖的拓撲結構,比如“buy”邊的源頂點類型是“user”,目的頂點類型是“item”。這個拓撲結構在異構圖中十分重要,是後續采樣路徑meta-path的依據,也是查詢的實體類型的基礎。

g.node(data_source, node_type, decoder) \
 .node(data_source, node_type, decoder) \
 .edge(data_source, (src_node_type, dst_node_type, edge_type), decoder)           

• Graph Engine啟動:快速拉起大規模分布式圖引擎

GL提供單機的版本, 通過init 接口快速啟動Graph Engine,至此,圖對象已經構造完畢,查詢、采樣操作就可以在 Graph 上進行了。

g.init()           

在大規模的場景下,圖頂點可達億級别,邊可達千億級别,不管是圖結構還是圖屬性,都無法完全載入單機記憶體。GL提供分布式的Graph Engine,速度非常快,使用上也非常簡單,隻需要在 init 中加幾個參數。

g.init({"server_count": N, "client_count": M}, task_name, job_index)           

采樣

采樣在GL中通過遊走路徑和采樣政策進行描述。如下示例中,表達的是一個周遊和二跳鄰居采樣,即周遊圖獲得64個使用者,對每個使用者根據邊的權重采樣50個他們購買的商品的相似商品。

q = g.V("user").bath(64).outV("buy").sample(5).outV("similar-to").sample(10).by("edge_weight").values()           

除了采樣鄰居,GL也提供了負采樣,隻需要将示例中的 outV 改為 outNeg 即可。GL提供了多種内置的采樣政策,也支援自定義采樣政策的實作,詳細内容可見我們的系列文檔中關于“采樣算法”的文章。

查詢

GL提供了

Nods

Edges

兩個基礎的資料類型,作為周遊、采樣的結果。為了擷取 Nodes 的int類型的屬性,可以調用如下接口進行查詢,得到的是numpy array資料結構。

nodes = g.run(q)
nodes[2].int_atrs # nodes is a list of Nodes, include Nodes of user,
                  # Nodes of item for 1 hop, Nodes of item of 2 hop.           

g.run(q)

可以多次執行,周遊圖中的頂點和他們的邊,直到周遊完畢。是以,上述采樣和查詢的結果可以作為generator接入tf或pytorch等NN引擎作為資料源,進而深度定制GNN模型。

GL也提供了資料模型的封裝,接管資料采樣流程和樣本組織,下文将簡要描述資料模型。

那些Dirty work系統幫你做了

為了便于使用者能更專注于探索模型,而非資料采樣和樣本組織,在模型程式設計接口層面我們封裝了EgoGraph,用于産生接管樣本和鄰域産生的過程。

EgoGraph包含多種内置采樣器和負采樣器,覆寫有監督學習和無監督學習場景。EgoGraph 中的資料類型為numpy array,可以根據不同的NN引擎轉化為不同的格式的 EgoTensor 。EgoFlow 用于将 EgoGraoh 處理并轉換為 EgoTensor ,并構成資料産生的pipline。

原來GNN這麼好上手,OMG!用它!引言從一鍵運作到深度定制從裸資料到GNN樣本,隻差一行python那些Dirty work系統幫你做了總結

GL提供Encoder的子產品,用于将頂點、邊或子圖根據他們的鄰域資訊轉換為Embedding。

原來GNN這麼好上手,OMG!用它!引言從一鍵運作到深度定制從裸資料到GNN樣本,隻差一行python那些Dirty work系統幫你做了總結

基于Embedding進行模型建構,GL封裝了多個built-in的模型,包括:

• GraphSAGE

• GCN

• GAT

• DeepWalk

• TransE

• ...

在GL中運作以上模型,隻需要一鍵執行python腳本。比如我們要執行一個二部圖的GraphSAGE算法,樣例資料已經準備好了,在examples/data目錄下,運作腳本就可以得到資料,模型訓練可直接調用如下腳本。

cd examples/tf/bipartite_graphsage
python train_unsupervised.py           

我們也将模型進行了抽象,包括Layers、Aggregators的複用,以賦予開發者和使用者快速開發更多GNNs模型的能力。GNNs是近年來圖資料分析與應用的熱點研究問題,學術屆和工業界都在不斷提出新的模型,我們也将繼續探索,不斷完善模型,并提升大規模下的性能。

總結

GL的接口設計緻力為不同需求的使用者提供dive into GNNs的入口,從圖語義的角度提供簡單、高效的算子,為使用者快速實作和調試GNNs算法提供端到端的解決方式,詳細的API手冊見:

https://github.com/alibaba/graph-learn/blob/master/docs/concept_api.md

GL上的GNNs模型正在快速發展疊代,我們也将把更多在阿裡的大規模業務上經過驗證的GNNs模型開源出來,歡迎大家加入到GL的共建中。

項目位址:

本文作者:沈雯婷