介紹一下TensorFlow圖譜神經網路
釋出者:Sibon Li, Jan Pfeifer and Bryan Perozzi and Douglas Yarrington
今天,我們很高興地釋出了TensorFlow圖形神經網路(GNNs),這是一個旨在使用TensorFlow輕鬆處理圖形結構化資料的庫。我們已經在谷歌的生產中使用了這個庫的早期版本,在各種情況下(例如,垃圾郵件和異常檢測,流量估計,YouTube內容標籤),並作為我們可擴充套件的圖形挖掘管道中的一個組成部分。特別是,鑑於谷歌的資料型別繁多,我們的庫在設計時考慮到了異質圖。我們釋出這個庫的目的是為了鼓勵與業界的研究人員合作。
為什麼使用GNNs?
圖在我們身邊,在現實世界和我們的工程系統中無處不在。一組物體、地點或人以及它們之間的聯絡通常可以被描述為一個圖。更多時候,我們在機器學習問題中看到的資料是結構化或關係化的,因此也可以用圖來描述。雖然關於GNN的基礎研究可能已經有幾十年的歷史了,但現代GNN能力的最新進展已經在交通預測、謠言和假新聞檢測、疾病傳播建模、 物理模擬和理解分子氣味的原因等不同領域帶來了進展。
圖可以模擬許多不同型別的資料之間的關係,包括網頁(左)、社會聯絡(中)或分子(右)。 |
圖表示一組實體(節點或頂點)之間的關係(邊)。我們可以對每個節點、邊或整個圖進行定性,從而將資訊儲存在圖的每一塊中。此外,我們可以賦予邊以方向性,以描述資訊或交通流,例如。
GNN可以用來回答關於這些圖的多種特徵的問題。通過在圖層面的工作,我們試圖預測整個圖的特徵。我們可以識別某些 "形狀 "的存在,比如圖中的圓圈可能代表子分子,也可能代表密切的社會關係。GNN可以用於節點級的任務,對圖的節點進行分類,並預測圖中的分割槽和親和力,類似於影象分類或分割。最後,我們可以在邊緣層面上使用GNN來發現實體之間的聯絡,也許使用GNN來 "修剪 "邊緣,以確定場景中物體的狀態。
結構
TF-GNN提供了在TensorFlow中實現GNN模型的構建塊。除了建模API,我們的庫還圍繞著處理圖資料的困難任務提供了廣泛的工具:一個基於Tensor的圖資料結構,一個數據處理管道,以及一些供使用者快速上手的例子模型。
組成工作流程的TF-GNN的各個組成部分。 |
TF-GNN庫的初始版本包含了許多實用程式和功能,供初學者和有經驗的使用者使用,包括。
-
一個高階的Keras風格的API,用於建立GNN模型,可以很容易地與其他型別的模型組成。GNN經常與排名、深度檢索(雙編碼器)或與其他型別的模型(影象、文字等)混合使用。
- 用於異質圖的GNN API。我們在谷歌和現實世界中處理的許多圖問題都包含不同型別的節點和邊。因此,我們選擇提供一種簡單的方法來建模。
-
一個定義明確的模式來宣告圖的拓撲結構,以及驗證它的工具。這種模式描述了其訓練資料的形狀,並用於指導其他工具。
-
一個
GraphTensor
複合張量型別,它持有圖資料,可以被分批處理,並有圖操作例程可用。 -
一個關於
GraphTensor
結構的操作庫。- 節點和邊上的各種有效的廣播和集合操作,以及相關工具。
- 一個標準的烘焙卷積庫,可以由ML工程師/研究人員輕鬆擴充套件。
- 一個高層次的API,供產品工程師快速建立GNN模型,而不一定要擔心其細節問題。
-
一個在磁碟上的圖形訓練資料的編碼,以及一個用於將這些資料解析為資料結構的庫,你的模型可以從中提取各種特徵。
使用例項
在下面的例子中,我們使用TF-GNN Keras API建立了一個模型,根據使用者觀看的內容和喜歡的型別向其推薦電影。
我們使用ConvGNNBuilder
方法來指定邊緣和節點的配置型別,即對邊緣使用WeightedSumConvolution
(定義見下文)。而在每次通過GNN時,我們將通過Dense互聯層更新節點值。
python”
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) ])
上面的程式碼很好用,但有時我們可能想為我們的GNN使用一個更強大的自定義模型架構。例如,在我們之前的用例中,我們可能想指定某些電影或流派在我們給出推薦時佔有更多的權重。在下面的片段中,我們用自定義圖卷積定義了一個更高階的GNN,在這種情況下是用加權邊。我們定義了WeightedSumConvolution
類來彙集邊緣值,作為所有邊緣的權重之和。
python”
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
請注意,即使卷積是在只考慮源節點和目標節點的情況下編寫的,TF-GNN也能確保它的適用性,並能在異質圖(有各種型別的節點和邊緣)上無縫工作。
接下來的步驟
你可以檢視TF-GNN的GitHub repo,瞭解更多資訊。為了保持最新的資訊,你可以閱讀TensorFlow部落格,加入TensorFlow論壇discussion.tensorflow.org,關注twitter.com/tensorflow,或者訂閱youtube.com/tensorflow。如果你已經建立了一些你想分享的東西,請提交給我們的社群焦點,網址是goo.gle/TFCS。如需反饋,請在GitHub上提交問題。謝謝您的支援!
鳴謝
這裡描述的工作是谷歌的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之間的合作研究。
- 將機器學習帶入每個開發者的工具箱中
- 介紹一下TensorFlow圖譜神經網路
- 介紹一下TensorFlow圖譜神經網路
- 目的驅動的微服務設計
- 目的驅動的微服務設計
- 目的驅動的微服務設計(附程式碼示例)
- 在Cadence音訊數字訊號處理器上加速TensorFlow Lite Micro
- 將機器學習帶入每個開發者的工具箱中
- 如何用Kubernetes進行容器編排的超詳細指南
- 使用apt的Linux軟體包管理
- 如何使用持續測試雲加速應用程式的測試
- 如何用Selenium獲取JavaScript中的屬性資料
- 如何使用python為多處理器系統建立一個基於DAG的任務排程工具
- 【譯】常見的架構要素筆記(附用例)
- 【譯】如何現在就從GitOps中獲得最大收益
- 將Go API部署到AWS Lambda和API上
- 如何在應用平臺上部署預先訓練好的問題和答案TensorFlow.js模型
- 如何用Laravel Sail和Tailwind CSS建立一個新的Laravel應用程式
- MongoDB shell使用指南
- 如何在Ubuntu 20.04上使用PyMongo在MongoDB中執行CRUD操作