發(fā)布人:Sibon Li、Jan Pfeifer、Bryan Perozzi 和 Douglas Yarrington
日前,我們很高興發(fā)布了 TensorFlow 圖神經(jīng)網(wǎng)絡(luò) (Graph Neural Networks, GNNs),此庫可以幫助開發(fā)者利用 TensorFlow 輕松處理圖結(jié)構(gòu)化數(shù)據(jù)。我們已在 Google 的多個(gè)生產(chǎn)環(huán)境中使用了該庫的早期版本(例如,垃圾郵件和異常檢測、數(shù)據(jù)流量估計(jì)、YouTube 內(nèi)容標(biāo)簽),并作為可擴(kuò)容的圖挖掘管道的一個(gè)組成部分。特別是,鑒于 Google 的數(shù)據(jù)類型繁多,我們的庫在設(shè)計(jì)時(shí)就考慮到了異構(gòu)圖。發(fā)布此庫的初衷是為了鼓勵(lì)與業(yè)界研究人員的合作。
TensorFlow 圖神經(jīng)網(wǎng)絡(luò)
https://github.com/tensorflow/gnn
為何使用 GNNs?
在現(xiàn)實(shí)世界和我們的工程系統(tǒng)中,“圖”無處不在。一組物體、地點(diǎn)或人以及它們之間的聯(lián)系通常都可以用圖來表述。通常情況下,我們在機(jī)器學(xué)習(xí)問題中看到的數(shù)據(jù)是結(jié)構(gòu)化或關(guān)系化的,因此也可以用圖來表述。雖然關(guān)于 GNNs 的基礎(chǔ)研究可能只有幾十年的歷史,但當(dāng)代 GNNs 最近取得的功能進(jìn)展已經(jīng)幫助推動(dòng)了多個(gè)領(lǐng)域的進(jìn)步,其中包括數(shù)據(jù)流量預(yù)測、謠言和假新聞檢測、疾病傳播建模、物理學(xué)模擬和理解分子有氣味的原因等。
數(shù)據(jù)流量預(yù)測
https://deepmind.com/blog/article/traffic-prediction-with-advanced-graph-neural-networks
謠言和假新聞檢測
https://arxiv.org/abs/2108.03548
疾病傳播建模
https://arxiv.org/abs/2007.03113
物理學(xué)模擬
http://proceedings.mlr.press/v80/sanchez-gonzalez18a/sanchez-gonzalez18a.pdf
理解分子有氣味的原因
https://arxiv.org/abs/1910.10685
圖可以對多種不同類型數(shù)據(jù)之間的關(guān)系進(jìn)行建模,
包括網(wǎng)頁(左)、社交關(guān)系(中)或分子(右)等
圖代表了一組實(shí)體(節(jié)點(diǎn)或頂點(diǎn))之間的關(guān)系(邊)。我們可以通過描述每個(gè)節(jié)點(diǎn)、邊或整個(gè)圖的特征,從而將信息存儲(chǔ)在圖的每一塊中。此外,我們還可以賦予邊方向性,來描述信息或數(shù)據(jù)流,等等。
若這些圖有多個(gè)特征,則可以用 GNNs 來解決這類問題。通過圖層級的研究,我們嘗試預(yù)測整個(gè)圖的特征。我們可以識別某些“形狀”的存在,如圖中的圓圈,可能代表亞分子,也可能代表密切的社會(huì)關(guān)系。GNNs 可以用于節(jié)點(diǎn)級的任務(wù),對圖的節(jié)點(diǎn)進(jìn)行分類,并預(yù)測圖中的分區(qū)和相似性,類似于圖像分類或分割。最后,我們可以在邊層級上使用 GNNs 來發(fā)現(xiàn)實(shí)體之間的聯(lián)系,或許可以使用 GNNs 來“修剪”邊,以確定場景中對象的狀態(tài)。
結(jié)構(gòu)
TF-GNN 提供了基本模塊,以便在 TensorFlow 中實(shí)現(xiàn) GNN 模型。除了建模 API,我們的庫還針對處理圖數(shù)據(jù)的困難任務(wù)提供了大量的工具:基于 Tensor 的圖數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)處理管道,以及一些供用戶快速上手的示例模型。
組成工作流的各種 TF-GNN 組件
TF-GNN庫的初始版本包含一些實(shí)用程序和功能,初學(xué)者和有經(jīng)驗(yàn)的用戶都能使用,其中包括:
TF-GNN 庫
https://github.com/tensorflow/gnn
高階 Keras 式 API,用于創(chuàng)建 GNN 模型,可以輕松地與其他類型的模型組合。GNNs 經(jīng)常與排名、深度檢索(雙編碼器)結(jié)合使用或與其他類型的模型(圖像、文本等)混合使用。
用于異構(gòu)圖的 GNN API。我們在 Google 和現(xiàn)實(shí)世界中處理的許多圖問題都包含不同類型的節(jié)點(diǎn)和邊。因此,我們選擇提供一種簡單的方法來對此建模。
定義明確的架構(gòu),用于聲明圖的拓?fù)洌约膀?yàn)證架構(gòu)的工具。此架構(gòu)描述了其訓(xùn)練數(shù)據(jù)的形狀,并用于指導(dǎo)其他工具。
GraphTensor 復(fù)合張量類型,它持有圖數(shù)據(jù),可以分批處理,還有圖操作例程可用。
關(guān)于 GraphTensor 結(jié)構(gòu)的操作庫:
對節(jié)點(diǎn)和邊的各種有效的廣播和池化運(yùn)算,以及相關(guān)工具。
標(biāo)準(zhǔn)并入的卷積庫,ML 工程師/研究人員可以輕松地對其進(jìn)行擴(kuò)展。
高階 API,幫助產(chǎn)品工程師快速構(gòu)建 GNN 模型,而不必?fù)?dān)心其細(xì)節(jié)問題。
磁盤上的圖形訓(xùn)練數(shù)據(jù)的編碼,以及用來將該數(shù)據(jù)解析為數(shù)據(jù)結(jié)構(gòu)的庫,您的模型可以從該庫中提取各種特征。
示例用法
在下面的例子中,我們使用 TF-GNN Keras API 構(gòu)建一個(gè)模型,根據(jù)用戶觀看的內(nèi)容和喜歡的類型向其推薦電影。
我們使用 ConvGNNBuilder 方法來指定邊類型和節(jié)點(diǎn)配置,即對邊使用 WeightedSumConvolution(定義如下)。每次通過 GNN 時(shí),我們將通過 Dense 互連層來更新節(jié)點(diǎn)值:
import tensorflow as tf import tensorflow_gnn as tfgnn # Model hyper-parameters: h_dims = {'user': 256, 'movie': 64, 'genre': 128} # Model builder initialization: gnn = tfgnn.keras.ConvGNNBuilder( lambda edge_set_name: WeightedSumConvolution(), lambda node_set_name: tfgnn.keras.layers.NextStateFromConcat( tf.keras.layers.Dense(h_dims[node_set_name])) ) # Two rounds of message passing to target node sets: model = tf.keras.models.Sequential([ gnn.Convolve({'genre'}), # sends messages from movie to genre gnn.Convolve({'user'}), # sends messages from movie and genre to users tfgnn.keras.layers.Readout(node_set_name="user"), tf.keras.layers.Dense(1) ])
以上代碼很好用,但有時(shí)我們可能想要為 GNNs 使用更強(qiáng)大的自定義模型架構(gòu)。例如,在之前的用例中,我們可能想指定某些電影或類型,讓它們在我們進(jìn)行推薦時(shí)擁有更多權(quán)重。在下列片段中,我們用自定義圖卷積定義了一個(gè)更高級的 GNN,例子中使用的是加權(quán)邊。我們定義了 WeightedSumConvolution 類來匯集邊值,讓其作為所有邊的權(quán)重之和:
class WeightedSumConvolution(tf.keras.layers.Layer): """Weighted sum of source nodes states.""" def call(self, graph: tfgnn.GraphTensor, edge_set_name: tfgnn.EdgeSetName) -> tfgnn.Field: messages = tfgnn.broadcast_node_to_edges( graph, edge_set_name, tfgnn.SOURCE, feature_name=tfgnn.DEFAULT_STATE_NAME) weights = graph.edge_sets[edge_set_name]['weight'] weighted_messages = tf.expand_dims(weights, -1) * messages pooled_messages = tfgnn.pool_edges_to_node( graph, edge_set_name, tfgnn.TARGET, reduce_type='sum', feature_value=weighted_messages) return pooled_messages
請注意,盡管卷積的編寫只考慮了源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn),但 TF-GNN 保障了其適用性,讓其能夠在異構(gòu)圖(有各種類型的節(jié)點(diǎn)和邊)上無縫工作。
更多信息
您可以查看 TF-GNNGitHub repo,以獲得更多信息。
GitHub repo
https://github.com/tensorflow/gnn
歡迎加入 TensorFlow 論壇,隨時(shí)關(guān)注 TensorFlow 博客、Twitter 或 YouTube,獲悉最新消息。
TensorFlow 論壇
https://discuss.tensorflow.google.cn/
博客
https://blog.tensorflow.google.cn/
http://twitter.com/tensorflow
YouTube
http://youtube.com/tensorflow
您還可以通過 Community Spotlight 計(jì)劃向我們提交作品,分享您的構(gòu)建成果。如需提供反饋,您可以在 GitHub 上提交問題。我們歡迎您的貢獻(xiàn)和參與,謝謝!
Community Spotlight 計(jì)劃
http://goo.gle/TFCS
GitHub
https://github.com/tensorflow/gnn/issues
致謝
本文所介紹的研究來自以下各位的合作成果:來自 Google 的 Oleksandr Ferludin?、Martin Blais、Jan Pfeifer?、Arno Eigenwillig、Dustin Zelle、Bryan Perozzi 和 Da-Cheng Juan,以及來自 DeepMind 的 Sibon Li、Alvaro Sanchez-Gonzalez、Peter Battaglia、Kevin Villela、Jennifer She 和 David Wong。
原文標(biāo)題:推出 TensorFlow 圖神經(jīng)網(wǎng)絡(luò) (GNNs)
文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
5G
+關(guān)注
關(guān)注
1354文章
48436瀏覽量
563969
發(fā)布評論請先 登錄
相關(guān)推薦
評論