外链论坛

 找回密码
 立即注册
搜索
查看: 39|回复: 1

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

[复制链接]

2898

主题

1万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96066395
发表于 2024-7-31 00:59:43 | 显示全部楼层 |阅读模式

编辑:桃子

【新智元导读】图神经网络诞生败兴得到广泛的应用,能将世界区别对象之间的关系暗示出来。今天,谷歌团队官宣发布TensorFlow-GNN 1.0,一个用于大规模构建GNN的经过生产测试的库。

2005年,划时代之作「The Graph Neural Network Model」的面世,将图神经网络带到每一个人面前。

这里之前,专家处理图数据的方式是,在数据预处理周期,将图转换为一组「向量暗示」。

而CNN的显现彻底改变这种信息丢失的坏处端,近20年来,一代又一代模型持续演变,推动ML行业进步。

今天,谷歌正式官宣发布TensorFlow GNN 1.0(TF-GNN)——用于大规模构建GNN的经过生产测试的库。

它既支持在TensorFlow中的建模和训练,支持从大型数据存储中提取输入图。

TF-GNN是专为异构图从头起始构建的,其中对象和关系的类型由区别的节点和边集合来暗示

现实世界中的对象及其关系以区别的类型显现,而TF-GNN的异构焦点,使得暗示它们变得非常自然。

谷歌专家Anton Tsitsulin暗示繁杂的异构建模又回来了!

TF-GNN 1.0首面世

对象及其相互之间的关系,在咱们的世界中无处不在。

而关系针对理解一个对象的重要性,不亚于孤立地看待对象本身的属性,例如交通网络、生产网络、知识图谱或社交网络。

离散数学和计算机科学长时间败兴始终将这类网络形式化为图,由「节点」以各样不规则方式经过边任意连接而成。

然而,大都数设备学习算法只准许输入对象之间存在规则统一的关系,如像素网格、单词序列,或完全关系。

图形神经网络,简叫作GNN,是一种强大的技术,既能利用图的连通性(如初期算法DeepWalk和Node2Vec),又能利用区别节点和边输入特征。

GNN能够对图的整体(这种分子是不是以某种方式做出反应?)、单个节点(按照引用,这份文档的主题是什么?)、潜在的边(这种制品是不是可能与另一种制品一块购买?)进行预测。

除了对图形进行预测之外,GNN还是一个强大的工具——用于弥合与更典型的神经网络用例之间的鸿沟。

它们以连续的方式对图的离散关系信息进行编码,从而能够将其自然地纳入另一个深度学习系统。

谷歌在今天正式宣布用于大规模构建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供给了,经过动态和交互采样来改进这一点的工具。

子图抽样过程,即从一个很强的图中抽取小的、可操作的子图,为GNN训练创建输入示例

TF-GNN 1.0推出了灵活的Python API,用于配置所有关联比例的动态或批处理子图采样:在Colab笔记中交互采样。

详细来讲,对存储在单个训练主机主内存中的小型数据集进行「有效采样」,或经过Apache Beam对存储在网络文件系统中的庞大数据集(多达数亿节点和数十亿条边)进行分布式采样。

在这些相同的采样子图上,GNN的任务是,计算根节点的隐匿(或潜在)状态;隐匿状态聚集和编码根节点邻域的关联信息。

一种平常办法是「信息传递神经网络」。

在每一轮信息传递中,节点沿着传入边接收来自邻节点的信息,并从这些边更新自己的隐匿状态。

在n轮之后,根节点的隐匿状态反映了,n条边内所有节点的聚合信息(如下图所示,n=2)。信息和新的隐匿状态由神经网络的隐层计算。

在异构图中,对区别类型的节点和边运用单独训练的隐匿一般是有道理的。

图为一个简单的「信息传递神经网」,在该网络中,每一步节点状态都会从外边节点传播到内部节点,并在内部节点汇集计算出新的节点状态。一旦到达根节点,就能够进行最后预测

训练设置是,经过将输出层安置在已标记节点的GNN的隐匿状态之上、计算损失(以测绘预测误差)并经过反向传播更新模型权重来完成的,这在任何神经网络训练中都是平常的。

除了监督训练之外,GNN能够以无监督的方式训练,能够咱们计算节点及其特征的离散图结构的连续暗示(或嵌入)。

而后,这些暗示一般在其他ML系统中运用

经过这种方式,由图编码的离散关系信息,就能被纳入更典型的神经网络用例中。TF-GNN支持对异构图的无监督目的进行细粒度规范。

构建GNN架构

TF-GNN库支持构建和训练,区别抽象层次的GNN。

在最高层,用户能够运用与库绑定在一块的任何预定义模型,这些模型以Kera层暗示

除了科研文献中的一小部分模型外,TF-GNN还附带了一个高度可配置的模型模板,该模板供给了经过精心挑选的建模选取

谷歌发掘这些选取,为咱们的许多内部问题供给了强有力的基线。模板实现GNN层;用户只需从Kera层起始初始化。

import tensorflow_gnn as tfgnn from tensorflow_gnn.models import mt_albis def 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_regularization=1e-5, )(graph) return tf.keras.Model(inputs, graph)

在最低层,用户能够按照用于在图中传递数据的原语,从头起始编写GNN模型,例如将数据从节点广播到其所有传出边,或将数据从其所有传入边汇集到节点中。

触及到特征或隐匿状态时,TF-GNN 的图数据模型对节点、边和全部输入图一视同仁。

因此呢,它不仅可以直接暗示像MPNN那样以节点为中心的模型,况且能够暗示通常形式的的图网络。

能够(但不必定运用Kera做为核心TensorFlow顶部的建模框架来完成。

训练编排

虽然高级用户能够自由地进行定制模型训练,但TF-GNN Runner还供给了一种简洁的办法,在平常状况下协调Kera模型的训练。

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

from tensorflow_gnn import runner runner.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 runner from tensorflow_gnn.models import contrastive_losses runner.run( task={ "classification": runner.RootNodeBinaryClassification("papers", ...), "dgi": contrastive_losses.DeepGraphInfomaxTask("papers"), }, ... )

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

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

总之,谷歌期盼TF-GNN将有助于推动GNN在TensorFlow中的大规模应用,并推动该行业的进一步创新。

回复

使用道具 举报

2

主题

752

回帖

-7

积分

限制会员

积分
-7
发表于 2024-8-29 08:21:24 | 显示全部楼层
祝福你、祝你幸福、早日实现等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-10-18 19:26 , Processed in 0.069161 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.