Neural Structured Learning:使用结构化信号进行训练

Neural Structured Learning (NSL) 是一种新的学习范例,可以利用结构化信号以及特征输入来训练神经网络。结构可以是用图表示的显式结构,也可以是由对抗性扰动引起的隐式结构。

结构化信号通常用于表示可能已加标签或未加标签的样本之间的关系或相似性。因此,在神经网络训练期间利用这些信号可让您同时采用已加标签和未加标签的数据,从而提高模型准确率,特别是在已加标签的数据量相对较小时。此外,经验证明,如果在生成样本时添加对抗性扰动,然后使用这些样本训练模型,将能够防范恶意攻击,此类攻击旨在误导模型的预测或分类。

NSL 泛化到神经图学习对抗性学习。TensorFlow 中的 NSL 框架提供了以下易于使用的 API 和工具,供开发者使用结构化信号训练模型:

  • Keras API,支持使用图(显式结构)和对抗性扰动(隐式结构)进行训练。
  • TF 操作和函数,支持在使用较低阶的 TensorFlow API 时使用结构进行训练
  • 工具,用于构建图和构造图输入以进行训练

只有在训练期间才会加入结构化信号。因此,服务/推断工作流的性能保持不变。要详细了解 Neural Structured Learning,请参阅我们的框架说明。要开始使用,请参阅我们的安装指南;要查看实用的 NSL 简介,请参阅我们的教程

import tensorflow as tf
import neural_structured_learning as nsl

# Prepare data.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# Create a base model -- sequential, functional, or subclass.
model = tf.keras.Sequential([
    tf.keras.Input((28, 28), name='feature'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

# 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}, batch_size=32, epochs=5)
adv_model.evaluate({'feature': x_test, 'label': y_test})