今天,谷歌推出了新开源框架——神经结构学习(NSL),它使用神经图学习方法,来训练带有图(Graph)和结构化数据的神经网络,可以带来更强大的模型。
现在,通过TensorFlow就能获取和使用。
NSL有什么用?过去我们使用单独的图片来训练计算机视觉神经网络,这些训练样本之间彼此是孤立的,然而样本之间包含着丰富的关系信息。
如果用上这些数据的结构化信息,就能实现更高的模型精度,或者用更少的样本来训练模型,特别是在标记样本数量相对较少的情况。
另外,NSL也能用于抵御对抗攻击,因为对抗样本往往是在原来样本上做的一种微扰,利用这一层关系,可以提高模型在对抗攻击下的鲁棒性。
谷歌表示,这种NSL技术是通用的,可以应用于任意神经架构,包括前馈神经网络、CNN和RNN。NSL可以为计算机视觉模型、NLP训练模型,并在医疗记录或知识图谱等图形化数据集上进行预测。
谷歌已经将这项技术用于研究中,在今年2月发表的一篇学习图像语义嵌入的文章中,谷歌用它来提高模型的精度。
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
— 完 —
直播 | 揭秘最强中文NLP预训练模型
量子位 QbitAI · 头条号签约作者
վ'ᴗ' ի 追踪AI技术和产品新动态
喜欢就点「在看」吧 !