BERT-SNGP এর সাথে অনিশ্চয়তা-সচেতন গভীর ভাষা শিক্ষা

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub এ দেখুন নোটবুক ডাউনলোড করুন TF হাব মডেল দেখুন

SNGP টিউটোরিয়ালে , আপনি শিখেছেন কিভাবে একটি গভীর অবশিষ্ট নেটওয়ার্কের উপরে SNGP মডেল তৈরি করতে হয় যাতে এর অনিশ্চয়তা পরিমাপ করার ক্ষমতা উন্নত করা যায়। এই টিউটোরিয়ালে, আপনি SNGP প্রয়োগ করবেন একটি ন্যাচারাল ল্যাঙ্গুয়েজ বোঝার (NLU) টাস্কে এটিকে একটি গভীর BERT এনকোডারের উপরে তৈরি করে গভীর NLU মডেলের সুযোগ-সুবিধা বহির্ভূত প্রশ্নগুলি সনাক্ত করার ক্ষমতা উন্নত করতে।

বিশেষ করে, আপনি করবেন:

  • BERT-SNGP তৈরি করুন, একটি SNGP- বর্ধিত BERT মডেল।
  • CLINC আউট-অফ-স্কোপ (OOS) অভিপ্রায় সনাক্তকরণ ডেটাসেট লোড করুন।
  • BERT-SNGP মডেলের প্রশিক্ষণ দিন।
  • অনিশ্চয়তা ক্রমাঙ্কন এবং ডোমেনের বাইরে সনাক্তকরণে BERT-SNGP মডেলের কর্মক্ষমতা মূল্যায়ন করুন।

CLINC OOS এর বাইরে, SNGP মডেলটি জিগস টক্সিসিটি সনাক্তকরণের মতো বড় আকারের ডেটাসেট এবং CIFAR-100 এবং ImageNet- এর মতো চিত্র ডেটাসেটে প্রয়োগ করা হয়েছে। SNGP এবং অন্যান্য অনিশ্চয়তা পদ্ধতির বেঞ্চমার্ক ফলাফলের জন্য, সেইসাথে শেষ থেকে শেষ প্রশিক্ষণ/মূল্যায়ন স্ক্রিপ্ট সহ উচ্চ-মানের বাস্তবায়নের জন্য, আপনি অনিশ্চয়তার বেসলাইন বেঞ্চমার্কটি দেখতে পারেন।

সেটআপ

pip uninstall -y tensorflow tf-text
pip install -U tensorflow-text-nightly
pip install -U tf-nightly
pip install -U tf-models-nightly
import matplotlib.pyplot as plt

import sklearn.metrics
import sklearn.calibration

import tensorflow_hub as hub
import tensorflow_datasets as tfds

import numpy as np
import tensorflow as tf

import official.nlp.modeling.layers as layers
import official.nlp.optimization as optimization
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_addons/utils/ensure_tf_install.py:43: UserWarning: You are currently using a nightly version of TensorFlow (2.9.0-dev20220203). 
TensorFlow Addons offers no support for the nightly versions of TensorFlow. Some things might work, some other might not. 
If you encounter a bug, do not file an issue on GitHub.
  UserWarning,

এই টিউটোরিয়ালটি দক্ষতার সাথে চালানোর জন্য GPU প্রয়োজন। জিপিইউ উপলব্ধ কিনা তা পরীক্ষা করুন।

tf.__version__
'2.9.0-dev20220203'
gpus = tf.config.list_physical_devices('GPU')
gpus
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
assert gpus, """
  No GPU(s) found! This tutorial will take many hours to run without a GPU.

  You may hit this error if the installed tensorflow package is not
  compatible with the CUDA and CUDNN versions."""

প্রথমে BERT টিউটোরিয়াল সহ শ্রেণীবদ্ধ টেক্সট অনুসরণ করে একটি আদর্শ BERT শ্রেণীবদ্ধকারী প্রয়োগ করুন। আমরা BERT-বেস এনকোডার এবং বিল্ট-ইন ClassificationHead ক্লাসিফায়ার হিসেবে ব্যবহার করব।

স্ট্যান্ডার্ড BERT মডেল

এসএনজিপি মডেল তৈরি করুন

একটি BERT-SNGP মডেল বাস্তবায়ন করতে, আপনাকে শুধুমাত্র অন্তর্নির্মিত GaussianProcessClassificationHead দিয়ে ClassificationHead প্রতিস্থাপন করতে হবে। বর্ণালী স্বাভাবিকীকরণ ইতিমধ্যে এই শ্রেণীবিভাগের শিরোনামে প্রাক-প্যাকেজ করা হয়েছে। SNGP টিউটোরিয়ালের মতো, মডেলটিতে একটি কোভেরিয়েন্স রিসেট কলব্যাক যোগ করুন, তাই একই ডেটা দুবার গণনা এড়াতে মডেলটি একটি নতুন যুগের শুরুতে স্বয়ংক্রিয়ভাবে কোভেরিয়েন্স অনুমানকারী রিসেট করে।

class ResetCovarianceCallback(tf.keras.callbacks.Callback):

  def on_epoch_begin(self, epoch, logs=None):
    """Resets covariance matrix at the begining of the epoch."""
    if epoch > 0:
      self.model.classifier.reset_covariance_matrix()
class SNGPBertClassifier(BertClassifier):

  def make_classification_head(self, num_classes, inner_dim, dropout_rate):
    return layers.GaussianProcessClassificationHead(
        num_classes=num_classes, 
        inner_dim=inner_dim,
        dropout_rate=dropout_rate,
        gp_cov_momentum=-1,
        temperature=30.,
        **self.classifier_kwargs)

  def fit(self, *args, **kwargs):
    """Adds ResetCovarianceCallback to model callbacks."""
    kwargs['callbacks'] = list(kwargs.get('callbacks', []))
    kwargs['callbacks'].append(ResetCovarianceCallback())

    return super().fit(*args, **kwargs)

CLINC OOS ডেটাসেট লোড করুন

এখন CLINC OOS অভিপ্রায় সনাক্তকরণ ডেটাসেট লোড করুন। এই ডেটাসেটে রয়েছে 15000টি ব্যবহারকারীর কথ্য প্রশ্ন সংগৃহীত 150টি অভিপ্রায় ক্লাস, এটিতে 1000টি ডোমেনের বাইরের (OOD) বাক্যও রয়েছে যা পরিচিত কোনো শ্রেণির দ্বারা আচ্ছাদিত নয়।

(clinc_train, clinc_test, clinc_test_oos), ds_info = tfds.load(
    'clinc_oos', split=['train', 'test', 'test_oos'], with_info=True, batch_size=-1)

ট্রেন তৈরি করুন এবং ডেটা পরীক্ষা করুন।

train_examples = clinc_train['text']
train_labels = clinc_train['intent']

# Makes the in-domain (IND) evaluation data.
ind_eval_data = (clinc_test['text'], clinc_test['intent'])

একটি OOD মূল্যায়ন ডেটাসেট তৈরি করুন। এর জন্য, ইন-ডোমেন টেস্ট ডেটা clinc_test এবং ডোমেনের বাইরের ডেটা clinc_test_oos করুন। আমরা ইন-ডোমেন উদাহরণগুলিতে লেবেল 0 এবং ডোমেনের বাইরের উদাহরণগুলিতে 1 লেবেল বরাদ্দ করব।

test_data_size = ds_info.splits['test'].num_examples
oos_data_size = ds_info.splits['test_oos'].num_examples

# Combines the in-domain and out-of-domain test examples.
oos_texts = tf.concat([clinc_test['text'], clinc_test_oos['text']], axis=0)
oos_labels = tf.constant([0] * test_data_size + [1] * oos_data_size)

# Converts into a TF dataset.
ood_eval_dataset = tf.data.Dataset.from_tensor_slices(
    {"text": oos_texts, "label": oos_labels})

প্রশিক্ষণ এবং মূল্যায়ন

প্রথমে প্রাথমিক প্রশিক্ষণ কনফিগারেশন সেট আপ করুন।

TRAIN_EPOCHS = 3
TRAIN_BATCH_SIZE = 32
EVAL_BATCH_SIZE = 256

optimizer = bert_optimizer(learning_rate=1e-4)
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metrics = tf.metrics.SparseCategoricalAccuracy()
fit_configs = dict(batch_size=TRAIN_BATCH_SIZE,
                   epochs=TRAIN_EPOCHS,
                   validation_batch_size=EVAL_BATCH_SIZE, 
                   validation_data=ind_eval_data)
sngp_model = SNGPBertClassifier()
sngp_model.compile(optimizer=optimizer, loss=loss, metrics=metrics)
sngp_model.fit(train_examples, train_labels, **fit_configs)
Epoch 1/3
469/469 [==============================] - 219s 427ms/step - loss: 1.0725 - sparse_categorical_accuracy: 0.7870 - val_loss: 0.4358 - val_sparse_categorical_accuracy: 0.9380
Epoch 2/3
469/469 [==============================] - 198s 422ms/step - loss: 0.0885 - sparse_categorical_accuracy: 0.9797 - val_loss: 0.2424 - val_sparse_categorical_accuracy: 0.9518
Epoch 3/3
469/469 [==============================] - 199s 424ms/step - loss: 0.0259 - sparse_categorical_accuracy: 0.9951 - val_loss: 0.1927 - val_sparse_categorical_accuracy: 0.9642
<keras.callbacks.History at 0x7fe24c0a7090>

OOD কর্মক্ষমতা মূল্যায়ন

মডেলটি কতটা ভালভাবে ডোমেনের বাইরের অচেনা প্রশ্নগুলি সনাক্ত করতে পারে তা মূল্যায়ন করুন৷ কঠোর মূল্যায়নের জন্য, আগে তৈরি করা OOD মূল্যায়ন ডেটাসেট ood_eval_dataset ব্যবহার করুন।

\(1 - p(x)\)হিসাবে OOD সম্ভাব্যতা গণনা করে, যেখানে \(p(x)=softmax(logit(x))\) হল ভবিষ্যদ্বাণীমূলক সম্ভাব্যতা।

sngp_probs, ood_labels = oos_predict(sngp_model, ood_eval_dataset)
ood_probs = 1 - sngp_probs

এখন মডেলের অনিশ্চয়তা স্কোর ood_probs কতটা ভালোভাবে ডোমেনের বাইরের লেবেলের পূর্বাভাস দেয় তা মূল্যায়ন করুন। OOD সম্ভাব্যতা বনাম OOD সনাক্তকরণ নির্ভুলতার জন্য প্রথমে প্রিসিশন-রিকল কার্ভ (AUPRC) এর অধীনে এলাকা গণনা করুন।

precision, recall, _ = sklearn.metrics.precision_recall_curve(ood_labels, ood_probs)
auprc = sklearn.metrics.auc(recall, precision)
print(f'SNGP AUPRC: {auprc:.4f}')
SNGP AUPRC: 0.9039

এটি অনিশ্চয়তার ভিত্তিরেখার অধীনে CLINC OOS বেঞ্চমার্কে রিপোর্ট করা SNGP কর্মক্ষমতার সাথে মেলে।

এরপরে, অনিশ্চয়তা ক্রমাঙ্কনে মডেলের গুণমান পরীক্ষা করুন, অর্থাৎ, মডেলের ভবিষ্যদ্বাণীমূলক সম্ভাব্যতা তার ভবিষ্যদ্বাণীমূলক নির্ভুলতার সাথে মিলে যায় কিনা। একটি ভাল-ক্যালিব্রেটেড মডেল বিশ্বাসযোগ্য বলে বিবেচিত হয়, যেহেতু, উদাহরণস্বরূপ, এর ভবিষ্যদ্বাণীমূলক সম্ভাবনা \(p(x)=0.8\) এর অর্থ হল মডেলটি 80% সময় সঠিক।

prob_true, prob_pred = sklearn.calibration.calibration_curve(
    ood_labels, ood_probs, n_bins=10, strategy='quantile')
plt.plot(prob_pred, prob_true)

plt.plot([0., 1.], [0., 1.], c='k', linestyle="--")
plt.xlabel('Predictive Probability')
plt.ylabel('Predictive Accuracy')
plt.title('Calibration Plots, SNGP')

plt.show()

png

সম্পদ এবং আরও পড়া