Neural Structured Learning: 구조화된 신호를 사용한 학습

NSL(Neural Structured Learning)은 특성 입력 외에도 구조화된 신호를 활용하여 신경망을 학습시키는 새로운 학습 패러다임입니다. 구조는 그래프로 표현된 것과 같이 명시적이거나, 적대적인 작은 변화(Perturbation)에 의해 초래되는 것처럼 암시적일 수도 있습니다.

구조화된 신호는 일반적으로 라벨이 지정되거나 라벨이 지정되지 않을 수 있는 샘플 간의 관계 또는 유사성을 나타내는 데 사용됩니다. 따라서 신경망 학습 과정에서 이러한 신호를 활용하면 라벨이 지정된 데이터와 라벨이 지정되지 않은 데이터를 모두 활용하므로 라벨이 지정된 데이터의 양이 상대적으로 적을 때 특히 모델 정확도가 향상될 수 있습니다. 또한 적대적인 작은 변화를 추가하여 생성된 샘플로 학습된 모델은 모델의 예측 또는 분류를 오도하도록 설계된 악의적인 공격에 강력한 것으로 나타났습니다.

NSL은 적대적 학습뿐만 아니라 신경 그래프 학습으로 일반화됩니다. TensorFlow의 NSL 프레임워크는 개발자가 구조화된 신호를 사용하여 모델을 학습시킬 수 있도록 다음과 같은 사용하기 쉬운 API 및 도구를 제공합니다.

  • Keras API - 그래프(명시적 구조) 및 적대적인 작은 변화(암시적 구조)로 학습을 가능하게 합니다.
  • TF 작업 및 함수 - 하위 수준의 TensorFlow API를 사용할 때 구조로 학습을 가능하게 합니다.
  • 도구 - 학습을 위한 그래프 빌드 및 그래프 입력 구성 도구

구조화된 신호의 통합은 학습이 진행되는 동안에만 완료됩니다. 따라서 서빙/추론 워크플로의 성능은 변하지 않고 유지됩니다. NSL(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})