谷歌推出TensorFlow新工具:只需添加5行代码,就能提高模型准确度和鲁棒性

晓查 发自 凹非寺

量子位 出品 | 公众号 QbitAI

今天,谷歌推出了新开源框架——神经结构学习(NSL),它使用神经图学习方法,来训练带有图(Graph)和结构化数据的神经网络,可以带来更强大的模型。

现在,通过TensorFlow就能获取和使用。

NSL有什么用?过去我们使用单独的图片来训练计算机视觉神经网络,这些训练样本之间彼此是孤立的,然而样本之间包含着丰富的关系信息。

如果用上这些数据的结构化信息,就能实现更高的模型精度,或者用更少的样本来训练模型,特别是在标记样本数量相对较少的情况。

另外,NSL也能用于抵御对抗攻击,因为对抗样本往往是在原来样本上做的一种微扰,利用这一层关系,可以提高模型在对抗攻击下的鲁棒性。

谷歌表示,这种NSL技术是通用的,可以应用于任意神经架构,包括前馈神经网络、CNN和RNN。NSL可以为计算机视觉模型、NLP训练模型,并在医疗记录或知识图谱等图形化数据集上进行预测。

谷歌已经将这项技术用于研究中,在今年2月发表的一篇学习图像语义嵌入的文章中,谷歌用它来提高模型的精度。

NSL原理

NSL用到了训练样本之间的结构化信号,它通常用于表示标记或未标记的样品之间的关系或相似性。

这种结构化信号有时是以图的方式显式地包含在数据集中,有时是通过人为构造出来的,前面说到的用微扰生成对抗攻击样本,就是一种隐式表达结构化信号的方式。

如何让结构化信号包含在神经网络之中呢?2018年,谷歌在提交的一篇关于“神经图学习”的论文中,构造了一种考虑数据结构关系的损失函数。

这个损失函数不仅包含常规的监督学习损失项,还引入了一项最近邻损失,如下图所示。通过在训练中让后一项最小化,来保持来自同一结构的输入之间的相似性。

使用方法

在TensorFlow中使用NSL,首先需要安装虚拟环境,设置完虚拟环境后,用pip安装:

pip install --upgrade neural_structured_learning

使用NSL,让我们用结构化信号构建模型变得简单而直接。对于给定图(显式结构)和训练样本的情况,NSL提供了一个工具来处理这些样本并将其组合到TFRecords中进行接下来的训练:

python pack_nbrs.py --max_nbrs=5 \
labeled_data.tfr \
unlabeled_data.tfr \
graph.tsv \
merged_examples.tfr 

对于用图表示的结构信号的数据,调用NSL中的API,只需添加不超过5行代码就可以训练一个新的神经网络模型。

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)

这种方法可以使用较少标记的数据进行训练,而不会损失太多精度,一般不超过原始监督数据的10%甚至1%。

然而大部分数据是没有图作为显式结构信号的,这种情况应该怎么办?谷歌在NSL中提供了从原始数据构建图形的工具,NSL通过API构造对抗样本,以此作为隐式结构信号。

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)
# 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%。

传送门

TensorFlow介绍页面:

https://www.tensorflow.org/neural_structured_learning/

代码地址:

https://github.com/tensorflow/neural-structured-learning

版权所有,未经授权不得以任何形式转载及使用,违者必究。