TensorFlow 中的神经结构化学习简介
2019 年 9 月 3 日
作者:Sujith Ravi(高级研究员)和 Juan Da-Cheng(高级软件工程师)

我们很高兴地宣布推出 TensorFlow 中的神经结构化学习,这是一个易于使用的框架,无论是新手还是高级开发者都可以使用它来训练具有结构化信号的神经网络。神经结构化学习 (NSL) 可以应用于构建准确且稳健的模型,用于视觉、语言理解和一般的预测。

Diagram of structured signals in addition to regular images being used as training data for a neural network
许多机器学习任务受益于使用结构化数据,其中包含样本之间丰富的关联信息。例如,对引用网络进行建模,知识图谱 推理和对句子语言结构的推理,以及学习分子指纹,都需要一个模型从结构化输入中学习,而不是仅仅从单个样本中学习。这些结构可以是显式给定的(例如,作为图),也可以是隐式推断的(例如,作为对抗样本)。在训练期间利用结构化信号,使开发者能够实现更高的模型精度,尤其是在标记数据量相对较少的情况下。使用结构化信号进行训练也会导致更稳健的模型。这些技术已广泛应用于 Google,用于提高模型性能,例如学习图像语义嵌入
神经结构化学习 (NSL) 是一个用于训练具有结构化信号的深度神经网络的开源框架。它实现了神经图学习,使开发者能够使用图来训练神经网络。图可以来自多个来源,例如知识图谱、医疗记录、基因组数据或多模态关系(例如,图像-文本对)。NSL 也推广到对抗学习,其中输入示例之间的结构是使用对抗性扰动动态构建的。
NSL 允许 TensorFlow 用户轻松地将各种结构化信号整合到神经网络的训练中,并且适用于不同的学习场景:监督、半监督和无监督(表示)设置。

神经结构化学习 (NSL) 的工作原理

Diagram of structured signals and examples
在神经结构化学习 (NSL) 中,结构化信号(无论是显式定义为图还是隐式学习为对抗样本)都用于规范神经网络的训练,迫使模型学习准确的预测(通过最小化监督损失),同时保持来自相同结构的输入之间的相似性(通过最小化邻居损失,参见上图)。这种技术是通用的,可以应用于任意神经架构,例如前馈神经网络、卷积神经网络和循环神经网络。

使用神经结构化学习 (NSL) 创建模型

使用 NSL,构建一个利用结构化信号的模型变得简单而直接。给定一个图(作为显式结构)和训练样本,NSL 提供了一个工具,可以将这些样本处理并组合成TFRecords,用于后续训练。
python pack_nbrs.py --max_nbrs=5 \
labeled_data.tfr \
unlabeled_data.tfr \
graph.tsv \
merged_examples.tfr 
接下来,NSL 提供了 API 来“围绕”自定义模型,以使用处理后的示例并启用图正则化。让我们直接看看代码示例。

import neural_structured_learning as nsl
# Create a custom model — sequential, functional, or subclass. 
base_model = tf.keras.Sequential(…)

# Wrap the custom model with graph regularization. 
graph_config = nsl.configs.GraphRegConfig(neighbor_config=nsl.configs.GraphNeighborConfig(max_neighbors=1)) 
graph_model = nsl.keras.GraphRegularization(base_model, graph_config)

# Compile, train, and evaluate. 
graph_model.compile(optimizer=’adam’, loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[‘accuracy’]) 
graph_model.fit(train_dataset, epochs=5) 
graph_model.evaluate(test_dataset)

用不到 5 行代码(包括注释!),我们就得到了一个在训练期间利用图信号的神经模型。根据经验,使用图结构允许模型能够使用更少的标记数据进行训练,而不会损失太多精度(例如,原始监督的 10% 甚至 1%)。

如果没有任何显式结构怎么办?

如果显式结构(例如图)不可用或未作为输入提供,NSL 为开发者提供了一些工具,可以从原始数据中构建图;或者,NSL 还提供了 API 来“诱导”对抗性样本作为隐式结构化信号。对抗样本被构造为故意混淆模型 - 使用此类样本进行训练通常会导致模型对小的输入扰动具有鲁棒性。让我们看看下面的代码示例,了解 NSL 如何实现使用对抗性样本进行训练。


import neural_structured_learning as nsl

# Create a base model — sequential, functional, or subclass. 
model = tf.keras.Sequential(…)

# Wrap the model with adversarial regularization. 
adv_config = nsl.configs.make_adv_reg_config(multiplier=0.2, adv_step_size=0.05) 
adv_model = nsl.keras.AdversarialRegularization(model, adv_config=adv_config)

# Compile, train, and evaluate. 
adv_model.compile(optimizer=’adam’, loss=’sparse_categorical_crossentropy’, metrics=[‘accuracy’]) 
adv_model.fit({‘feature’: x_train, ‘label’: y_train}, epochs=5)
adv_model.evaluate({‘feature’: x_test, ‘label’: y_test})


用不到 5 行代码(包括注释!),我们就得到了一个使用对抗性样本进行训练的神经模型,提供了隐式结构。根据经验,没有使用对抗性样本训练的模型,在输入中添加恶意但非人类可检测的扰动时,会遭受显著的精度损失(例如,降低 30%)。
准备好了吗?
请访问 https://tensorflowcn.cn/neural_structured_learning/,并立即试用 NSL!

致谢


我们要感谢 Chun-Sung Ferng、Arjun Gopalan、Allan Heydon、Yicheng Fan、Chun-Ta Lu、Philip Pham 和 Andrew Tomkins 的核心贡献。我们还要感谢 Daniel ‘Wolff’ Dobson 和 Karmel Allison 的技术建议,Mark Daoust、Billy Lamberta 和 Yash Katariya 在创建教程方面的帮助,以及 Google Expander 团队的反馈。

TensorFlow


TensorFlow 是一个端到端的机器学习开源平台。

下一篇文章
Introducing Neural Structured Learning in TensorFlow

作者:Juan Da-Cheng(高级软件工程师)和 Sujith Ravi (高级研究员)

我们很高兴推出 TensorFlow 中的神经结构化学习,这是一个易于使用的框架,初级和高级开发人员都可以使用它来训练具有结构化信号的神经网络。神经结构化学习 (NSL) 可用于构建用于视觉、l… 的准确而鲁棒的模型。