发布者Da-Cheng Juan(高级软件工程师)和Sujith Ravi(高级职员研究科学家)
我们很高兴在TensorFlow中引入神经结构化学习,这是一个易于使用的框架,新手和高级开发人员都可以使用它来训练具有结构化信号的神经网络。神经结构学习(NSL)可用于构建精确且稳健的视觉,语言理解和预测模型。
许多机器学习任务受益于使用结构化数据,其中包含样本之间的丰富关系信息。例如,建模引文网络,知识图推理和句子语言结构的推理,以及学习分子指纹都需要一个模型来学习结构化输入,而不仅仅是单个样本。可以明确地给出这些结构(例如,作为图形),或隐式推断(例如,作为对抗性示例)。在训练期间利用结构化信号允许开发人员实现更高的模型精度,特别是当标记数据量相对较小时。结构化信号的训练也可以带来更强大的模型。这些技术已在Google中广泛用于提高模型性能,例如学习图像语义嵌入。
神经结构学习(NSL)是一种用于训练具有结构化信号的深度神经网络的开源框架。它实现了神经图学习,使开发人员能够使用图表训练神经网络。图表可以来自多个来源,例如知识图,医疗记录,基因组数据或多模式关系(例如,图像 - 文本对)。NSL还推广到对抗性学习,其中输入实例之间的结构是使用对抗性扰动动态构建的。
NSL允许TensorFlow用户轻松地结合各种结构化信号来训练神经网络,并适用于不同的学习场景:监督,半监督和无监督(表示)设置。
在神经结构学习(NSL)中,结构化信号 - 无论是明确定义为图形还是隐式学习为对抗性实例 - 用于规范神经网络的训练,迫使模型学习准确的预测(通过最小化监督损失),同时保持来自同一结构的输入之间的相似性(通过最小化邻居损失,见上图)。该技术是通用的,可以应用于任意神经架构,例如前馈NN,卷积NN和循环NN。
使用NSL,构建模型以利用结构化信号变得简单而直接。给定图形(作为显式结构)和训练样本,NSL提供了一个工具来处理这些示例并将其组合到TFRecords中以进行下游培训:
python pack_nbrs.py --max_nbrs = 5 \
labeled_data.tfr
\
unlabeled_data.tfr \
graph.tsv \ merged_examples.tfr
接下来,NSL提供API以“环绕”自定义模型以使用已处理的示例并启用图形正则化。我们直接看看代码示例。
将neural_structured_learning导入为nsl #创建自定义模型 - 顺序,功能或子类。
base_model = tf.keras.Sequential(...)#用图形正则化包装自定义模型。
graph_config = nsl.configs.GraphRegConfig(
neighbor_config = nsl.configs.GraphNeighborConfig(max_neighbors = 1))
graph_model = nsl.keras.GraphRegularization(base_model,graph_config)#编译,训练和评估。
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如何通过对抗示例进行培训。
将neural_structured_learning导入为nsl #创建基本模型 - 顺序,功能或子类。
model = tf.keras.Sequential(...)#用对抗正则化包裹模型。
adv_config = nsl.configs.make_adv_reg_config(乘数= 0.2,adv_step_size = 0.05)
adv_model = nsl.keras.AdversarialRegularization(model,adv_config)#编译,训练和评估。
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://www.tensorflow.org/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团队的反馈意见。
评论专区