谷歌官宣TensorFlow-GNN 1.0發布!動態和互動採樣,大規模建構圖神經網絡

WBOY
發布: 2024-02-07 21:50:26
轉載
484 人瀏覽過

2005年,劃時代之作「The Graph Neural Network Model」的問世,將圖神經網路帶到每個人面前。

在此之前,科學家處理圖資料的方式是,在資料預處理階段,將圖轉換為一組「向量表示」。

而CNN的出現徹底改變這種資訊遺失的弊端,近20年來,一代又一代模型不斷演變,推動ML領域進步。

今天,Google正式官方宣布TensorFlow GNN 1.0(TF-GNN)-用於大規模建構GNN的經過生產測試的函式庫。

谷歌官宣TensorFlow-GNN 1.0发布!动态和交互采样,大规模构建图神经网络

它既支援在TensorFlow中的建模和訓練,也支援從大型資料儲存中提取輸入圖。

TF-GNN是專為異構圖從頭開始建構的,其中物件和關係的類型由不同的節點和邊集合來表示。

現實世界中的物件及其關係以不同的類型出現,而TF-GNN的異質焦點,使得表示它們變得非常自然。

Google科學家Anton Tsitsulin表示,複雜的異構建模又回來了!

谷歌官宣TensorFlow-GNN 1.0发布!动态和交互采样,大规模构建图神经网络

TF-GNN 1.0首面世

物件及其相互之間的關係,在我們的世界中無所不在。

而關係對於理解一個物件的重要性,不亞於孤立地看待物件本身的屬性,例如交通網絡、生產網絡、知識圖譜或社交網絡。

離散數學和電腦科學長期以來一直將這類網路形式化為圖,由「節點」以各種不規則方式透過邊任意連接而成。

然而,大多數機器學習演算法只允許輸入物件之間存在規則統一的關係,如像素網格、單字序列,或完全沒有關係。

圖形神經網絡,簡稱GNN,是一種強大的技術,既能利用圖的連通性(如早期演算法DeepWalk和Node2Vec),又能利用不同節點和邊輸入特徵。

谷歌官宣TensorFlow-GNN 1.0发布!动态和交互采样,大规模构建图神经网络

GNN可以對圖的整體(這種分子是否以某種方式做出反應?)、單一節點(根據引用,這份文件的主題是什麼?)、潛在的邊(這種產品是否可能與另一種產品一起購買?)進行預測。

除了對圖形進行預測之外,GNN還是一個強大的工具——用於彌合與更典型的神經網路用例之間的鴻溝。

它們以連續的方式對圖的離散關係資訊進行編碼,從而可以將其自然地納入另一個深度學習系統。

Google在今天正式宣布用於大規模建構GNN的經過生產測試的函式庫-TensorFlow GNN 1.0(TF-GNN)。

在TensorFlow中,這樣的圖形由 tfgnn.GraphTensor 類型的物件表示。

這是一個複合張量類型(一個Python類別中的張量集合),在 tf.data.Dataset 、 tf.function 等中被接受為「頭等物件」。

它既能儲存圖結構,也能儲存節點、邊和整個圖的特徵。

GraphTensors的可訓練變換可以定義為高級Kera API中的Layers對象,或直接使用 tfgnn.GraphTensor 原語。

GNN:對上下文中的物件進行預測

#接下來,進一步解釋下TF-GNN,可以看下其中一個典型的應用:

預測一個龐大資料庫中,由交叉引用表定義的圖中某類節點的屬性

舉個例子,在電腦科學(CS)的引文資料庫arxiv論文中,有一對多的引用和多對一的引用關係,可以預測每篇論文的所在的主題領域。

與大多數神經網路一樣,GNN也是在許多標記樣本(約百萬個)的資料集上進行訓練的,但每個訓練步驟只包含一批小得多的訓練樣本(例如數百個)。

為了擴展到數百萬個樣本,GNN會在底層圖中合理小的子圖流上進行訓練。每個子圖包含足夠的原始數據,用於計算中心標記節點的GNN結果並訓練模型。

這個過程,通常被稱為子圖取樣,對於GNN訓練是極為重要的。

現有的大多數工具都是以批次方式完成取樣,產生用於訓練的靜態子圖。

而TF-GNN提供了,透過動態和互動取樣來改進這一點的工具。

谷歌官宣TensorFlow-GNN 1.0发布!动态和交互采样,大规模构建图神经网络

子圖抽樣過程,即從一個較大的圖中抽取小的、可操作的子圖,為GNN訓練建立輸入範例

TF-GNN 1.0推出了一個靈活的Python API,用於配置所有相關比例的動態或批次子圖採樣:在Colab筆記中互動採樣。

具體來說,對儲存在單一訓練主機主記憶體中的小型資料集進行「高效採樣」,或透過Apache Beam對儲存在網路檔案系統中的龐大資料集(多達數億節點和數十億邊)進行分散式取樣。

在這些相同的取樣子圖上,GNN的任務是,計算根節點的隱藏(或潛在)狀態;隱藏狀態聚集和編碼根節點鄰域的相關資訊。

常見的方法是「訊息傳遞神經網路」。

在每一輪訊息傳遞中,節點沿著傳入邊接收來自鄰節點的訊息,並從這些邊更新自己的隱藏狀態。

在n輪之後,根節點的隱藏狀態反映了,n條邊內所有節點的聚合資訊(如下圖所示,n=2)。訊息和新的隱藏狀態由神經網路的隱層計算。

在異質圖中,對不同類型的節點和邊使用單獨訓練的隱藏層通常是有意義的。

谷歌官宣TensorFlow-GNN 1.0发布!动态和交互采样,大规模构建图神经网络

圖為一個簡單的「訊息傳遞神經網」,在該網路中,每一步節點狀態都會從外部節點傳播到內部節點,並在內部節點匯集計算出新的節點狀態。一旦到達根節點,就可以進行最終預測

訓練設定是,透過將輸出層放置在已標記節點的GNN的隱藏狀態之上、計算損失(以測量預測誤差)並透過反向傳播更新模型權重來完成的,這在任何神經網路訓練中都是常見的。

除了監督訓練之外,GNN也可以以無監督的方式訓練,可以讓我們計算節點及其特徵的離散圖結構的連續表示(或嵌入)。

然後,這些表示通常在其他ML系統中使用。

透過這種方式,由圖編碼的離散關係訊息,就能被納入更典型的神經網路用例中。 TF-GNN支援對異構圖的無監督目標進行細粒度規範。

建構GNN架構

TF-GNN函式庫支援建置與訓練,不同抽象層次的GNN。

在最高層,使用者​​可以使用與庫綁定在一起的任何預定義模型,這些模型以Kera層表示。

除了研究文獻中的一小部分模型外,TF-GNN還附帶了一個高度可配置的模型模板,該模板提供了精心挑選的建模選擇。

Google發現這些選擇,為我們的許多內部問題提供了強有力的基準。模板實作GNN層;使用者只需從Kera層開始初始化。

import tensorflow_gnn as tfgnnfrom tensorflow_gnn.models import mt_albisdef model_fn(graph_tensor_spec: tfgnn.GraphTensorSpec):"""Builds a GNN as a Keras model."""graph = inputs = tf.keras.Input(type_spec=graph_tensor_spec)# Encode input features (callback omitted for brevity).graph = tfgnn.keras.layers.MapFeatures(node_sets_fn=set_initial_node_states)(graph)# For each round of message passing...for _ in range(2):# ... create and apply a Keras layer.graph = mt_albis.MtAlbisGraphUpdate(units=128, message_dim=64,attention_type="none", simple_conv_reduce_type="mean",normalization_type="layer", next_state_type="residual",state_dropout_rate=0.2, l2_regularizatinotallow=1e-5,)(graph)return tf.keras.Model(inputs, graph)
登入後複製
#

在最低层,用户可以根据用于在图中传递数据的原语,从头开始编写GNN模型,比如将数据从节点广播到其所有传出边,或将数据从其所有传入边汇集到节点中。

当涉及到特征或隐藏状态时,TF-GNN 的图数据模型对节点、边和整个输入图一视同仁。

因此,它不仅可以直接表示像MPNN那样以节点为中心的模型,而且还可以表示更一般形式的的图网络。

这可以(但不一定)使用Kera作为核心TensorFlow顶部的建模框架来完成。

训练编排

虽然高级用户可以自由地进行定制模型训练,但TF-GNN Runner还提供了一种简洁的方法,在常见情况下协调Kera模型的训练。

一个简单的调用可能如下所示:

from tensorflow_gnn import runnerrunner.run( task=runner.RootNodeBinaryClassification("papers", ...), model_fn=model_fn, trainer=runner.KerasTrainer(tf.distribute.MirroredStrategy(), model_dir="/tmp/model"), optimizer_fn=tf.keras.optimizers.Adam, epochs=10, global_batch_size=128, train_ds_provider=runner.TFRecordDatasetProvider("/tmp/train*"), valid_ds_provider=runner.TFRecordDatasetProvider("/tmp/validation*"), gtspec=...,)
登入後複製

Runner为ML Pain提供了现成的解决方案,如分布式训练和云TPU上固定形状的 tfgnn.GraphTensor 填充。

除了单一任务的训练(如上所示)外,它还支持多个(两个或更多)任务的联合训练。

例如,非监督任务可以与监督任务混合,以形成具有特定于应用的归纳偏差的最终连续表示(或嵌入)。调用方只需将任务参数替换为任务映射:

from tensorflow_gnn import runnerfrom tensorflow_gnn.models import contrastive_lossesrunner.run( task={"classification": runner.RootNodeBinaryClassification("papers", ...),"dgi": contrastive_losses.DeepGraphInfomaxTask("papers"),},...)
登入後複製

此外,TF-GNN Runner还包括用于模型归因的集成梯度实现。

集成梯度输出是一个GraphTensor,其连接性与观察到的GraphTensor相同,但其特征用梯度值代替,在GNN预测中,较大的梯度值比较小的梯度值贡献更多。

总之,谷歌希望TF-GNN将有助于推动GNN在TensorFlow中的大规模应用,并推动该领域的进一步创新。

以上是谷歌官宣TensorFlow-GNN 1.0發布!動態和互動採樣,大規模建構圖神經網絡的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!