TensorFlow图形神经元网络的介绍

2022-03-07   出处: TensorFlowBlog  作/译者:Sibon Li, Jan Pfeifer等/晓敏

       TensorFlow图形神经元网络(Graph Neural Networks, GNNs),是一个旨在可以使用TensorFlow轻松处理图形结构化数据的集成库。我们在Google 的各种环境(例如,垃圾邮件和异常检测、流量估算、YouTube的内容标记)中使用了这个库的早期版本,并作为我们可扩展的图挖掘渲染流水线(graph mining pipelines)中的一个组件。特别是,鉴于 Google 的数据种类繁多,我们在这个库设计时就考虑到了异构图。这个库发布的目的也是鼓励业界研究人员可以互相协作促进图形神经元网络的发展。

为什么使用GNNs
       在现实世界和工程系统中,图形无处不在,一组对象、地点或人以及他们之间的关联都可以用图来展现。通常情况下,我们在机器学习问题中看到的数据是结构化的或相关联的,它们也可以用图来展现。虽然GNN 的基础研究已有数十年的历史,但现代 GNN 的研究发展已经促进如交通预测、谣言和假新闻检测、疾病传播建模、物理模拟以及分子为何产生气味等领域向前取得了大的进展。

图形可以对许多不同类型的数据之间的关系进行建模,如网页数据(左)、社交关系(中)或分子(右)

       图形表示一个集合中实体(节点或顶点)间的关系(边), 我们可以表征每个节点、边或整个图,从而将这些信息存储在图中的每个片段中。 此外,我们可以给边冠以方向性,如来表述信息流或交通流。

       GNN可以用于指明有关于图形的多个特征。通过在整个图级别的研判,我们可以用GNN尝试预测整个图形的特征,也可以识别图中某些“形状”的存在,例如图中圆圈可能代表亚分子也可能代表密切的社会关系。 GNN 可用于节点级操作,对图的节点进行分类,并预测图中的分区和近似性,类似于图像分类或分割。 最后,我们使用 GNN通过边来探测实体之间的关系,如使用 GNN 来“修剪”边来识别场景中对象的状态。

                                                               组成GNN工作流程的不同模块

       在TF-GNN原始发布版本包含了许多供初学者和有经验的用户使用实用程序和功能,主要包括:

  • 高级 Keras样式API,用于创建可轻松与其他类型模型组合的 GNN 模型。 GNN 通常与排位(ranking)、深度检索(双编码器)结合使用或与其他类型的模型(图像、文本等)混合使用
    • GNN API可用于异构图。我们在Google和现实世界中处理的许多图形问题都包含不同类型的节点和边。因此,我们选择提供一种简单的方法来对此进行建模。
  • 明确定义的规范模式,用其声明图的拓扑结构,以及验证它的工具。 该规范模式描述了其训练数据的形状,并用于指导其他工具的使用。
  • GraphTensor复合张量类型(composite tensor type),它保存图形数据,可以进行批处理,并具有可用的图形操作例程。
  • 用于GraphTensor结构的操作库:
    • 针对于边和节点的各种高效广播(broadcast)和池化操作,以及相关工具。
    • 一个标准baked卷积(convolutions)库,可以由ML工程师/研究人员轻松扩展。
    • 产品工程师无需担心其细节即可快速构建GNN模型的高级API。
  • 磁盘上图形训练数据的编码,以及用于将这些数据解析为一个有结构数据的库,构建的模型可以从中提取各种特征。

应用示例
       在下面的示例中,我们使用TF-GNN Keras API构建了一个模型,该模型根据用户观看和喜欢的电影类型向他人推荐电影。我们使用ConvGNNBuilder方法来指定边的类型和节点配置,即对边使用 WeightedSumConvolution(定义如下)。 每次通过 GNN处理后,节点的值会通过密集互连层(Dense interconnected layer)得到更新:

    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更强大的自定义模型体系结构。例如,在我们之前的例子中,我们希望给予某些电影或电影类型在给出的建议时能够占有更大的权重。在下面的代码段中,我们使用自定义图卷积(graph convolutions)创建了一个更高级的GNN应用示例,在本例中使用了加权边(weighted edges)。我们定义WeightedSumConvolution类将所有边的权重之和作为边的值:

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以获取更多信息,要了解最新信息,您可以阅读TensorFlow博客、在discuss.tensorflow.org加入TensorFlow论坛、关注twitter.com/tensorflow或订阅 youtube.com/tensorflow。如果您有想要分享的内容,可以将其提交到我们的社区goo.gle/TFCS。如有反馈问题,请在GitHub上提交。谢谢!

致谢
       本文是由以下人员研究合作完成: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.


声明:本文为本站编辑转载,文章版权归原作者所有。文章内容为作者个人观点,本站只提供转载参考(依行业惯例严格标明出处和作译者),目的在于传递更多专业信息,普惠测试相关从业者,开源分享,推动行业交流和进步。 如涉及作品内容、版权和其它问题,请原作者及时与本站联系(QQ:1017718740),我们将第一时间进行处理。本站拥有对此声明的最终解释权!欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,与我们的编辑和其他窝友交流。
298° /2987 人阅读/0 条评论 发表评论

登录 后发表评论