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})