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

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

AI অ্যাপ্লিকেশনগুলিতে যেগুলি নিরাপত্তা-সমালোচনামূলক (যেমন, চিকিৎসা সংক্রান্ত সিদ্ধান্ত গ্রহণ এবং স্বায়ত্তশাসিত ড্রাইভিং) বা যেখানে ডেটা সহজাতভাবে কোলাহলপূর্ণ (যেমন, প্রাকৃতিক ভাষা বোঝা), এটি একটি গভীর শ্রেণিবিন্যাসকারীর জন্য তার অনিশ্চয়তাকে নির্ভরযোগ্যভাবে পরিমাপ করা গুরুত্বপূর্ণ। গভীর শ্রেণিবিন্যাসকারীকে তার নিজস্ব সীমাবদ্ধতা সম্পর্কে সচেতন হতে হবে এবং কখন এটি মানব বিশেষজ্ঞদের হাতে নিয়ন্ত্রণ হস্তান্তর করবে। এই টিউটোরিয়ালটি দেখায় কিভাবে স্পেকট্রাল-নর্মালাইজড নিউরাল গাউসিয়ান প্রসেস ( SNGP ) নামক একটি কৌশল ব্যবহার করে অনিশ্চয়তা পরিমাপ করার ক্ষেত্রে গভীর শ্রেণীবদ্ধকারীর ক্ষমতা উন্নত করা যায়।

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

এই টিউটোরিয়ালটি দুটি চাঁদের ডেটাসেটে একটি গভীর অবশিষ্ট নেটওয়ার্ক (ResNet)-ভিত্তিক SNGP মডেল প্রয়োগ করে, এবং এর অনিশ্চয়তার পৃষ্ঠকে অন্যান্য দুটি জনপ্রিয় অনিশ্চয়তা পদ্ধতির সাথে তুলনা করে - মন্টে কার্লো ড্রপআউট এবং ডিপ এনসেম্বল )।

এই টিউটোরিয়ালটি একটি খেলনা 2D ডেটাসেটে SNGP মডেলকে চিত্রিত করে। BERT-বেস ব্যবহার করে বাস্তব-বিশ্বের প্রাকৃতিক ভাষা বোঝার কাজে SNGP প্রয়োগ করার উদাহরণের জন্য, অনুগ্রহ করে SNGP-BERT টিউটোরিয়ালটি দেখুন। বিভিন্ন ধরণের বেঞ্চমার্ক ডেটাসেটে (যেমন, CIFAR-100 , ImageNet , Jigsaw বিষাক্ততা সনাক্তকরণ , ইত্যাদি) SNGP মডেলের (এবং অন্যান্য অনেক অনিশ্চয়তা পদ্ধতি) উচ্চ-মানের বাস্তবায়নের জন্য, অনুগ্রহ করে অনিশ্চয়তার বেসলাইন বেঞ্চমার্কটি দেখুন।

এসএনজিপি সম্পর্কে

স্পেকট্রাল-নর্মালাইজড নিউরাল গাউসিয়ান প্রসেস (SNGP) হল একটি গভীর শ্রেণীবিভাগের অনিশ্চয়তার গুণমান উন্নত করার জন্য একটি সহজ পদ্ধতি যা একই রকম নির্ভুলতা এবং লেটেন্সি বজায় রেখে। একটি গভীর অবশিষ্ট নেটওয়ার্ক দেওয়া, SNGP মডেলটিতে দুটি সহজ পরিবর্তন করে:

  • এটি লুকানো অবশিষ্ট স্তরগুলিতে বর্ণালী স্বাভাবিককরণ প্রয়োগ করে।
  • এটি একটি গাউসিয়ান প্রক্রিয়া স্তর দিয়ে ঘন আউটপুট স্তর প্রতিস্থাপন করে।

এসএনজিপি

অন্যান্য অনিশ্চয়তা পদ্ধতির তুলনায় (যেমন, মন্টে কার্লো ড্রপআউট বা ডিপ এনসেম্বল), SNGP-এর বেশ কিছু সুবিধা রয়েছে:

  • এটি বিস্তৃত অত্যাধুনিক অবশিষ্ট-ভিত্তিক আর্কিটেকচারের জন্য কাজ করে (যেমন, (প্রশস্ত) ResNet, DenseNet, BERT, ইত্যাদি)।
  • এটি একটি একক-মডেল পদ্ধতি (অর্থাৎ, ensemble গড় উপর নির্ভর করে না)। তাই SNGP-এর একক নির্ধারক নেটওয়ার্কের মতো একই স্তরের লেটেন্সি রয়েছে এবং ইমেজনেট এবং জিগস টক্সিক কমেন্ট শ্রেণীবিভাগের মতো বড় ডেটাসেটে সহজেই স্কেল করা যেতে পারে।
  • দূরত্ব-সচেতনতা সম্পত্তির কারণে এটির ডোমেনের বাইরের সনাক্তকরণ কার্যক্ষমতা রয়েছে।

এই পদ্ধতির খারাপ দিকগুলি হল:

  • একটি SNGP-এর ভবিষ্যদ্বাণীমূলক অনিশ্চয়তা ল্যাপ্লেস আনুমানিকতা ব্যবহার করে গণনা করা হয়। তাই তাত্ত্বিকভাবে, SNGP-এর উত্তরীয় অনিশ্চয়তা একটি সঠিক গাউসিয়ান প্রক্রিয়ার থেকে ভিন্ন।

  • একটি নতুন যুগের সূচনায় SNGP প্রশিক্ষণের জন্য একটি সহভরিতা রিসেট পদক্ষেপ প্রয়োজন। এটি একটি প্রশিক্ষণ পাইপলাইনে অল্প পরিমাণে অতিরিক্ত জটিলতা যোগ করতে পারে। এই টিউটোরিয়ালটি কেরাস কলব্যাক ব্যবহার করে এটি বাস্তবায়ন করার একটি সহজ উপায় দেখায়।

সেটআপ

pip install --use-deprecated=legacy-resolver tf-models-official
# refresh pkg_resources so it takes the changes into account.
import pkg_resources
import importlib
importlib.reload(pkg_resources)
<module 'pkg_resources' from '/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pkg_resources/__init__.py'>
import matplotlib.pyplot as plt
import matplotlib.colors as colors

import sklearn.datasets

import numpy as np
import tensorflow as tf

import official.nlp.modeling.layers as nlp_layers

ভিজ্যুয়ালাইজেশন ম্যাক্রো সংজ্ঞায়িত করুন

plt.rcParams['figure.dpi'] = 140

DEFAULT_X_RANGE = (-3.5, 3.5)
DEFAULT_Y_RANGE = (-2.5, 2.5)
DEFAULT_CMAP = colors.ListedColormap(["#377eb8", "#ff7f00"])
DEFAULT_NORM = colors.Normalize(vmin=0, vmax=1,)
DEFAULT_N_GRID = 100

দুই চাঁদের ডেটাসেট

দুটি চাঁদের ডেটাসেট থেকে প্রশিক্ষণ এবং মূল্যায়ন ডেটাসেট তৈরি করুন।

def make_training_data(sample_size=500):
  """Create two moon training dataset."""
  train_examples, train_labels = sklearn.datasets.make_moons(
      n_samples=2 * sample_size, noise=0.1)

  # Adjust data position slightly.
  train_examples[train_labels == 0] += [-0.1, 0.2]
  train_examples[train_labels == 1] += [0.1, -0.2]

  return train_examples, train_labels

সম্পূর্ণ 2D ইনপুট স্থানের উপর মডেলের ভবিষ্যদ্বাণীমূলক আচরণের মূল্যায়ন করুন।

def make_testing_data(x_range=DEFAULT_X_RANGE, y_range=DEFAULT_Y_RANGE, n_grid=DEFAULT_N_GRID):
  """Create a mesh grid in 2D space."""
  # testing data (mesh grid over data space)
  x = np.linspace(x_range[0], x_range[1], n_grid)
  y = np.linspace(y_range[0], y_range[1], n_grid)
  xv, yv = np.meshgrid(x, y)
  return np.stack([xv.flatten(), yv.flatten()], axis=-1)

মডেল অনিশ্চয়তা মূল্যায়ন করতে, একটি তৃতীয় শ্রেণীর অন্তর্গত একটি আউট-অফ-ডোমেন (OOD) ডেটাসেট যোগ করুন৷ প্রশিক্ষণের সময় মডেলটি কখনই এই OOD উদাহরণগুলি দেখে না।

def make_ood_data(sample_size=500, means=(2.5, -1.75), vars=(0.01, 0.01)):
  return np.random.multivariate_normal(
      means, cov=np.diag(vars), size=sample_size)
# Load the train, test and OOD datasets.
train_examples, train_labels = make_training_data(
    sample_size=500)
test_examples = make_testing_data()
ood_examples = make_ood_data(sample_size=500)

# Visualize
pos_examples = train_examples[train_labels == 0]
neg_examples = train_examples[train_labels == 1]

plt.figure(figsize=(7, 5.5))

plt.scatter(pos_examples[:, 0], pos_examples[:, 1], c="#377eb8", alpha=0.5)
plt.scatter(neg_examples[:, 0], neg_examples[:, 1], c="#ff7f00", alpha=0.5)
plt.scatter(ood_examples[:, 0], ood_examples[:, 1], c="red", alpha=0.1)

plt.legend(["Postive", "Negative", "Out-of-Domain"])

plt.ylim(DEFAULT_Y_RANGE)
plt.xlim(DEFAULT_X_RANGE)

plt.show()

png

এখানে নীল এবং কমলা ইতিবাচক এবং নেতিবাচক শ্রেণীর প্রতিনিধিত্ব করে, এবং লাল OOD ডেটার প্রতিনিধিত্ব করে। একটি মডেল যা অনিশ্চয়তাকে ভালভাবে পরিমাপ করে তা প্রশিক্ষণের ডেটার কাছাকাছি থাকাকালীন আত্মবিশ্বাসী হতে পারে (যেমন, \(p(x_{test})\) 0 বা 1 এর কাছাকাছি), এবং প্রশিক্ষণ ডেটা অঞ্চল থেকে দূরে থাকলে (যেমন, \(p(x_{test})\) 0.5 এর কাছাকাছি) অনিশ্চিত হবে )

নির্ধারক মডেল

মডেল সংজ্ঞায়িত করুন

(বেসলাইন) ডিটারমিনিস্টিক মডেল থেকে শুরু করুন: ড্রপআউট নিয়মিতকরণ সহ একটি মাল্টি-লেয়ার রেসিডুয়াল নেটওয়ার্ক (ResNet)।

এই টিউটোরিয়ালটি 128টি লুকানো ইউনিট সহ একটি 6-স্তর ResNet ব্যবহার করে।

resnet_config = dict(num_classes=2, num_layers=6, num_hidden=128)
resnet_model = DeepResNet(**resnet_config)
resnet_model.build((None, 2))
resnet_model.summary()
Model: "deep_res_net"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               multiple                  384       
                                                                 
 dense_1 (Dense)             multiple                  16512     
                                                                 
 dense_2 (Dense)             multiple                  16512     
                                                                 
 dense_3 (Dense)             multiple                  16512     
                                                                 
 dense_4 (Dense)             multiple                  16512     
                                                                 
 dense_5 (Dense)             multiple                  16512     
                                                                 
 dense_6 (Dense)             multiple                  16512     
                                                                 
 dense_7 (Dense)             multiple                  258       
                                                                 
=================================================================
Total params: 99,714
Trainable params: 99,330
Non-trainable params: 384
_________________________________________________________________

ট্রেন মডেল

লস ফাংশন এবং অ্যাডাম অপ্টিমাইজার হিসাবে SparseCategoricalCrossentropy ব্যবহার করার জন্য প্রশিক্ষণের পরামিতিগুলি কনফিগার করুন।

loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metrics = tf.keras.metrics.SparseCategoricalAccuracy(),
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)

train_config = dict(loss=loss, metrics=metrics, optimizer=optimizer)

ব্যাচ আকার 128 সহ 100 যুগের জন্য মডেলটিকে প্রশিক্ষণ দিন।

fit_config = dict(batch_size=128, epochs=100)
resnet_model.compile(**train_config)
resnet_model.fit(train_examples, train_labels, **fit_config)
Epoch 1/100
8/8 [==============================] - 1s 4ms/step - loss: 1.1251 - sparse_categorical_accuracy: 0.5050
Epoch 2/100
8/8 [==============================] - 0s 3ms/step - loss: 0.5538 - sparse_categorical_accuracy: 0.6920
Epoch 3/100
8/8 [==============================] - 0s 3ms/step - loss: 0.2881 - sparse_categorical_accuracy: 0.9160
Epoch 4/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1923 - sparse_categorical_accuracy: 0.9370
Epoch 5/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1550 - sparse_categorical_accuracy: 0.9420
Epoch 6/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1403 - sparse_categorical_accuracy: 0.9450
Epoch 7/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1269 - sparse_categorical_accuracy: 0.9430
Epoch 8/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1208 - sparse_categorical_accuracy: 0.9460
Epoch 9/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1158 - sparse_categorical_accuracy: 0.9510
Epoch 10/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1103 - sparse_categorical_accuracy: 0.9490
Epoch 11/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1051 - sparse_categorical_accuracy: 0.9510
Epoch 12/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1053 - sparse_categorical_accuracy: 0.9510
Epoch 13/100
8/8 [==============================] - 0s 3ms/step - loss: 0.1013 - sparse_categorical_accuracy: 0.9450
Epoch 14/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0967 - sparse_categorical_accuracy: 0.9500
Epoch 15/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0991 - sparse_categorical_accuracy: 0.9530
Epoch 16/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0984 - sparse_categorical_accuracy: 0.9500
Epoch 17/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0982 - sparse_categorical_accuracy: 0.9480
Epoch 18/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0918 - sparse_categorical_accuracy: 0.9510
Epoch 19/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0903 - sparse_categorical_accuracy: 0.9500
Epoch 20/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0883 - sparse_categorical_accuracy: 0.9510
Epoch 21/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0870 - sparse_categorical_accuracy: 0.9530
Epoch 22/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0884 - sparse_categorical_accuracy: 0.9560
Epoch 23/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0850 - sparse_categorical_accuracy: 0.9540
Epoch 24/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0808 - sparse_categorical_accuracy: 0.9580
Epoch 25/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0773 - sparse_categorical_accuracy: 0.9560
Epoch 26/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0801 - sparse_categorical_accuracy: 0.9590
Epoch 27/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0779 - sparse_categorical_accuracy: 0.9580
Epoch 28/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0807 - sparse_categorical_accuracy: 0.9580
Epoch 29/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0820 - sparse_categorical_accuracy: 0.9570
Epoch 30/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0730 - sparse_categorical_accuracy: 0.9600
Epoch 31/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0782 - sparse_categorical_accuracy: 0.9590
Epoch 32/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0704 - sparse_categorical_accuracy: 0.9600
Epoch 33/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0709 - sparse_categorical_accuracy: 0.9610
Epoch 34/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0758 - sparse_categorical_accuracy: 0.9580
Epoch 35/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0702 - sparse_categorical_accuracy: 0.9610
Epoch 36/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0688 - sparse_categorical_accuracy: 0.9600
Epoch 37/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0675 - sparse_categorical_accuracy: 0.9630
Epoch 38/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0636 - sparse_categorical_accuracy: 0.9690
Epoch 39/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0677 - sparse_categorical_accuracy: 0.9610
Epoch 40/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0702 - sparse_categorical_accuracy: 0.9650
Epoch 41/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0614 - sparse_categorical_accuracy: 0.9690
Epoch 42/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0663 - sparse_categorical_accuracy: 0.9680
Epoch 43/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0626 - sparse_categorical_accuracy: 0.9740
Epoch 44/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0590 - sparse_categorical_accuracy: 0.9760
Epoch 45/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0573 - sparse_categorical_accuracy: 0.9780
Epoch 46/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0568 - sparse_categorical_accuracy: 0.9770
Epoch 47/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0595 - sparse_categorical_accuracy: 0.9780
Epoch 48/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0482 - sparse_categorical_accuracy: 0.9840
Epoch 49/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0515 - sparse_categorical_accuracy: 0.9820
Epoch 50/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0525 - sparse_categorical_accuracy: 0.9830
Epoch 51/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0507 - sparse_categorical_accuracy: 0.9790
Epoch 52/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0433 - sparse_categorical_accuracy: 0.9850
Epoch 53/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0511 - sparse_categorical_accuracy: 0.9820
Epoch 54/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0501 - sparse_categorical_accuracy: 0.9820
Epoch 55/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0440 - sparse_categorical_accuracy: 0.9890
Epoch 56/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0438 - sparse_categorical_accuracy: 0.9850
Epoch 57/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0438 - sparse_categorical_accuracy: 0.9880
Epoch 58/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0416 - sparse_categorical_accuracy: 0.9860
Epoch 59/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0479 - sparse_categorical_accuracy: 0.9860
Epoch 60/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0434 - sparse_categorical_accuracy: 0.9860
Epoch 61/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0414 - sparse_categorical_accuracy: 0.9880
Epoch 62/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0402 - sparse_categorical_accuracy: 0.9870
Epoch 63/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0376 - sparse_categorical_accuracy: 0.9890
Epoch 64/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0337 - sparse_categorical_accuracy: 0.9900
Epoch 65/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0309 - sparse_categorical_accuracy: 0.9910
Epoch 66/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0336 - sparse_categorical_accuracy: 0.9910
Epoch 67/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0389 - sparse_categorical_accuracy: 0.9870
Epoch 68/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0333 - sparse_categorical_accuracy: 0.9920
Epoch 69/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0331 - sparse_categorical_accuracy: 0.9890
Epoch 70/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0346 - sparse_categorical_accuracy: 0.9900
Epoch 71/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0367 - sparse_categorical_accuracy: 0.9880
Epoch 72/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0283 - sparse_categorical_accuracy: 0.9920
Epoch 73/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0315 - sparse_categorical_accuracy: 0.9930
Epoch 74/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0271 - sparse_categorical_accuracy: 0.9900
Epoch 75/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0257 - sparse_categorical_accuracy: 0.9920
Epoch 76/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0289 - sparse_categorical_accuracy: 0.9900
Epoch 77/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0264 - sparse_categorical_accuracy: 0.9900
Epoch 78/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0272 - sparse_categorical_accuracy: 0.9910
Epoch 79/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0336 - sparse_categorical_accuracy: 0.9880
Epoch 80/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0249 - sparse_categorical_accuracy: 0.9900
Epoch 81/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0216 - sparse_categorical_accuracy: 0.9930
Epoch 82/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0279 - sparse_categorical_accuracy: 0.9890
Epoch 83/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0261 - sparse_categorical_accuracy: 0.9920
Epoch 84/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0235 - sparse_categorical_accuracy: 0.9920
Epoch 85/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0236 - sparse_categorical_accuracy: 0.9930
Epoch 86/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0219 - sparse_categorical_accuracy: 0.9920
Epoch 87/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0196 - sparse_categorical_accuracy: 0.9920
Epoch 88/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0215 - sparse_categorical_accuracy: 0.9900
Epoch 89/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0223 - sparse_categorical_accuracy: 0.9900
Epoch 90/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0200 - sparse_categorical_accuracy: 0.9950
Epoch 91/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0250 - sparse_categorical_accuracy: 0.9900
Epoch 92/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0160 - sparse_categorical_accuracy: 0.9940
Epoch 93/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0203 - sparse_categorical_accuracy: 0.9930
Epoch 94/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0203 - sparse_categorical_accuracy: 0.9930
Epoch 95/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0172 - sparse_categorical_accuracy: 0.9960
Epoch 96/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0209 - sparse_categorical_accuracy: 0.9940
Epoch 97/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0179 - sparse_categorical_accuracy: 0.9920
Epoch 98/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0195 - sparse_categorical_accuracy: 0.9940
Epoch 99/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0165 - sparse_categorical_accuracy: 0.9930
Epoch 100/100
8/8 [==============================] - 0s 3ms/step - loss: 0.0170 - sparse_categorical_accuracy: 0.9950
<keras.callbacks.History at 0x7ff7ac5c8fd0>

অনিশ্চয়তা কল্পনা করুন

এখন নির্ধারক মডেলের ভবিষ্যদ্বাণীগুলি কল্পনা করুন। প্রথমে ক্লাসের সম্ভাব্যতা প্লট করুন:

\[p(x) = softmax(logit(x))\]

resnet_logits = resnet_model(test_examples)
resnet_probs = tf.nn.softmax(resnet_logits, axis=-1)[:, 0]  # Take the probability for class 0.
_, ax = plt.subplots(figsize=(7, 5.5))

pcm = plot_uncertainty_surface(resnet_probs, ax=ax)

plt.colorbar(pcm, ax=ax)
plt.title("Class Probability, Deterministic Model")

plt.show()

png

এই প্লটে, হলুদ এবং বেগুনি দুটি শ্রেণীর জন্য ভবিষ্যদ্বাণীমূলক সম্ভাব্যতা। একটি অরৈখিক সিদ্ধান্তের সীমানা সহ দুটি পরিচিত শ্রেণী (নীল এবং কমলা) শ্রেণীবদ্ধ করার ক্ষেত্রে নির্ধারণবাদী মডেলটি একটি ভাল কাজ করেছে। যাইহোক, এটি দূরত্ব-সচেতন নয়, এবং কমলা শ্রেণী হিসাবে আত্মবিশ্বাসের সাথে ডোমেন-এর বাইরে কখনো দেখা না যাওয়া লাল (OOD) উদাহরণগুলিকে শ্রেণীবদ্ধ করে৷

ভবিষ্যদ্বাণীমূলক ভিন্নতা গণনা করে মডেল অনিশ্চয়তা কল্পনা করুন:

\[var(x) = p(x) * (1 - p(x))\]

resnet_uncertainty = resnet_probs * (1 - resnet_probs)
_, ax = plt.subplots(figsize=(7, 5.5))

pcm = plot_uncertainty_surface(resnet_uncertainty, ax=ax)

plt.colorbar(pcm, ax=ax)
plt.title("Predictive Uncertainty, Deterministic Model")

plt.show()

png

এই প্লটে, হলুদ উচ্চ অনিশ্চয়তা নির্দেশ করে, এবং বেগুনি কম অনিশ্চয়তা নির্দেশ করে। একটি নির্ধারক ResNet এর অনিশ্চয়তা শুধুমাত্র পরীক্ষার উদাহরণের সিদ্ধান্তের সীমানা থেকে দূরত্বের উপর নির্ভর করে। এটি প্রশিক্ষণের ডোমেনের বাইরে থাকাকালীন মডেলটিকে অতিরিক্ত আত্মবিশ্বাসী হতে পরিচালিত করে। পরবর্তী বিভাগ দেখায় কিভাবে SNGP এই ডেটাসেটে ভিন্নভাবে আচরণ করে।

এসএনজিপি মডেল

SNGP মডেলের সংজ্ঞা দাও

এবার এসএনজিপি মডেল বাস্তবায়ন করা যাক। SNGP কম্পোনেন্ট, SpectralNormalization নরমালাইজেশন এবং র‍্যান্ডমফিচার গাউসিয়ানপ্রসেস, RandomFeatureGaussianProcess এর অন্তর্নির্মিত স্তরগুলিতে উপলব্ধ।

এসএনজিপি

আসুন আরো বিস্তারিতভাবে এই দুটি উপাদান তাকান. (সম্পূর্ণ মডেলটি কীভাবে বাস্তবায়িত হয় তা দেখতে আপনি SNGP মডেল বিভাগেও যেতে পারেন।)

বর্ণালী স্বাভাবিকীকরণ মোড়ক

SpectralNormalization স্বাভাবিককরণ একটি কেরাস স্তরের মোড়ক। এটি এই মত একটি বিদ্যমান ঘন স্তর প্রয়োগ করা যেতে পারে:

dense = tf.keras.layers.Dense(units=10)
dense = nlp_layers.SpectralNormalization(dense, norm_multiplier=0.9)

বর্ণালী স্বাভাবিকীকরণ লুকানো ওজন \(W\) কে ধীরে ধীরে তার বর্ণালী আদর্শ (অর্থাৎ, \(W\)এর বৃহত্তম eigenvalue) লক্ষ্য মান norm_multiplier এর দিকে পরিচালিত করে নিয়মিত করে।

গাউসিয়ান প্রসেস (GP) স্তর

RandomFeatureGaussianProcess একটি গাউসিয়ান প্রসেস মডেলের একটি র্যান্ডম-ফিচার ভিত্তিক আনুমানিকতা প্রয়োগ করে যা একটি গভীর নিউরাল নেটওয়ার্কের সাথে এন্ড-টু-এন্ড প্রশিক্ষণযোগ্য। হুডের নীচে, গাউসিয়ান প্রক্রিয়া স্তরটি একটি দ্বি-স্তর নেটওয়ার্ক প্রয়োগ করে:

\[logits(x) = \Phi(x) \beta, \quad \Phi(x)=\sqrt{\frac{2}{M} } * cos(Wx + b)\]

এখানে \(x\) হল ইনপুট, এবং \(W\) এবং \(b\) হিমায়িত ওজনগুলি যথাক্রমে গাউসিয়ান এবং অভিন্ন বন্টন থেকে এলোমেলোভাবে শুরু করা হয়েছে। (অতএব \(\Phi(x)\) কে "র্যান্ডম ফিচার" বলা হয়।) \(\beta\) হল একটি ঘন স্তরের মতই শেখার যোগ্য কার্নেলের ওজন।

batch_size = 32
input_dim = 1024
num_classes = 10
gp_layer = nlp_layers.RandomFeatureGaussianProcess(units=num_classes,
                                               num_inducing=1024,
                                               normalize_input=False,
                                               scale_random_features=True,
                                               gp_cov_momentum=-1)

জিপি স্তরগুলির প্রধান পরামিতিগুলি হল:

  • units : আউটপুট লগিটের মাত্রা।
  • num_inducing : লুকানো ওজন \(W\) \(M\) -placeholder14। ডিফল্ট 1024.
  • normalize_input : ইনপুট \(x\)এ লেয়ার নরমালাইজেশন প্রয়োগ করতে হবে কিনা।
  • scale_random_features : লুকানো আউটপুটে স্কেল \(\sqrt{2/M}\) প্রয়োগ করতে হবে কিনা।
  • gp_cov_momentum নিয়ন্ত্রণ করে কিভাবে মডেল কোভেরিয়েন্স গণনা করা হয়। যদি একটি ইতিবাচক মান সেট করা হয় (যেমন, 0.999), কোভেরিয়েন্স ম্যাট্রিক্সটি ভরবেগ-ভিত্তিক চলমান গড় আপডেট (ব্যাচ স্বাভাবিককরণের অনুরূপ) ব্যবহার করে গণনা করা হয়। যদি -1 তে সেট করা হয়, কোভেরিয়েন্স ম্যাট্রিক্স কোনো গতি ছাড়াই আপডেট হয়।

আকৃতি (batch_size, input_dim) সহ একটি ব্যাচ ইনপুট দেওয়া হলে, জিপি লেয়ার ভবিষ্যদ্বাণীর জন্য একটি logits টেনসর (আকৃতি (batch_size, num_classes) ) প্রদান করে এবং এছাড়াও covmat টেনসর (আকৃতি (batch_size, batch_size) ) প্রদান করে যা কোভ্যারিয়েন্সের পোস্টেরিয়র টেন্সর। ব্যাচ লগিট.

embedding = tf.random.normal(shape=(batch_size, input_dim))

logits, covmat = gp_layer(embedding)

তাত্ত্বিকভাবে, বিভিন্ন শ্রেণীর জন্য বিভিন্ন বৈচিত্র্যের মান গণনা করার জন্য অ্যালগরিদম প্রসারিত করা সম্ভব (যেমন মূল SNGP কাগজে প্রবর্তিত হয়েছে)। যাইহোক, বড় আউটপুট স্পেস (যেমন, ইমেজনেট বা ভাষা মডেলিং) এর সমস্যাগুলির স্কেল করা কঠিন।

সম্পূর্ণ SNGP মডেল

বেস ক্লাস DeepResNet দেওয়া, SNGP মডেলটি অবশিষ্ট নেটওয়ার্কের লুকানো এবং আউটপুট স্তরগুলি পরিবর্তন করে সহজেই প্রয়োগ করা যেতে পারে। model.fit() API-এর সাথে সামঞ্জস্যের জন্য, মডেলের call() পদ্ধতিটিও পরিবর্তন করুন যাতে এটি প্রশিক্ষণের সময় শুধুমাত্র logits আউটপুট করে।

class DeepResNetSNGP(DeepResNet):
  def __init__(self, spec_norm_bound=0.9, **kwargs):
    self.spec_norm_bound = spec_norm_bound
    super().__init__(**kwargs)

  def make_dense_layer(self):
    """Applies spectral normalization to the hidden layer."""
    dense_layer = super().make_dense_layer()
    return nlp_layers.SpectralNormalization(
        dense_layer, norm_multiplier=self.spec_norm_bound)

  def make_output_layer(self, num_classes):
    """Uses Gaussian process as the output layer."""
    return nlp_layers.RandomFeatureGaussianProcess(
        num_classes, 
        gp_cov_momentum=-1,
        **self.classifier_kwargs)

  def call(self, inputs, training=False, return_covmat=False):
    # Gets logits and covariance matrix from GP layer.
    logits, covmat = super().call(inputs)

    # Returns only logits during training.
    if not training and return_covmat:
      return logits, covmat

    return logits

নির্ধারক মডেল হিসাবে একই আর্কিটেকচার ব্যবহার করুন।

resnet_config
{'num_classes': 2, 'num_layers': 6, 'num_hidden': 128}
sngp_model = DeepResNetSNGP(**resnet_config)
sngp_model.build((None, 2))
sngp_model.summary()
Model: "deep_res_net_sngp"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_9 (Dense)             multiple                  384       
                                                                 
 spectral_normalization_1 (S  multiple                 16768     
 pectralNormalization)                                           
                                                                 
 spectral_normalization_2 (S  multiple                 16768     
 pectralNormalization)                                           
                                                                 
 spectral_normalization_3 (S  multiple                 16768     
 pectralNormalization)                                           
                                                                 
 spectral_normalization_4 (S  multiple                 16768     
 pectralNormalization)                                           
                                                                 
 spectral_normalization_5 (S  multiple                 16768     
 pectralNormalization)                                           
                                                                 
 spectral_normalization_6 (S  multiple                 16768     
 pectralNormalization)                                           
                                                                 
 random_feature_gaussian_pro  multiple                 1182722   
 cess (RandomFeatureGaussian                                     
 Process)                                                        
                                                                 
=================================================================
Total params: 1,283,714
Trainable params: 101,120
Non-trainable params: 1,182,594
_________________________________________________________________

একটি নতুন যুগের শুরুতে কোভেরিয়েন্স ম্যাট্রিক্স রিসেট করতে একটি Keras কলব্যাক প্রয়োগ করুন।

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

DeepResNetSNGP মডেল ক্লাসে এই কলব্যাক যোগ করুন।

class DeepResNetSNGPWithCovReset(DeepResNetSNGP):
  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)

ট্রেন মডেল

মডেলকে প্রশিক্ষণ দিতে tf.keras.model.fit ব্যবহার করুন।

sngp_model = DeepResNetSNGPWithCovReset(**resnet_config)
sngp_model.compile(**train_config)
sngp_model.fit(train_examples, train_labels, **fit_config)
Epoch 1/100
8/8 [==============================] - 2s 5ms/step - loss: 0.6223 - sparse_categorical_accuracy: 0.9570
Epoch 2/100
8/8 [==============================] - 0s 4ms/step - loss: 0.5310 - sparse_categorical_accuracy: 0.9980
Epoch 3/100
8/8 [==============================] - 0s 4ms/step - loss: 0.4766 - sparse_categorical_accuracy: 0.9990
Epoch 4/100
8/8 [==============================] - 0s 5ms/step - loss: 0.4346 - sparse_categorical_accuracy: 0.9980
Epoch 5/100
8/8 [==============================] - 0s 5ms/step - loss: 0.4015 - sparse_categorical_accuracy: 0.9980
Epoch 6/100
8/8 [==============================] - 0s 5ms/step - loss: 0.3757 - sparse_categorical_accuracy: 0.9990
Epoch 7/100
8/8 [==============================] - 0s 4ms/step - loss: 0.3525 - sparse_categorical_accuracy: 0.9990
Epoch 8/100
8/8 [==============================] - 0s 4ms/step - loss: 0.3305 - sparse_categorical_accuracy: 0.9990
Epoch 9/100
8/8 [==============================] - 0s 5ms/step - loss: 0.3144 - sparse_categorical_accuracy: 0.9980
Epoch 10/100
8/8 [==============================] - 0s 5ms/step - loss: 0.2975 - sparse_categorical_accuracy: 0.9990
Epoch 11/100
8/8 [==============================] - 0s 4ms/step - loss: 0.2832 - sparse_categorical_accuracy: 0.9990
Epoch 12/100
8/8 [==============================] - 0s 5ms/step - loss: 0.2707 - sparse_categorical_accuracy: 0.9990
Epoch 13/100
8/8 [==============================] - 0s 4ms/step - loss: 0.2568 - sparse_categorical_accuracy: 0.9990
Epoch 14/100
8/8 [==============================] - 0s 4ms/step - loss: 0.2470 - sparse_categorical_accuracy: 0.9970
Epoch 15/100
8/8 [==============================] - 0s 4ms/step - loss: 0.2361 - sparse_categorical_accuracy: 0.9990
Epoch 16/100
8/8 [==============================] - 0s 5ms/step - loss: 0.2271 - sparse_categorical_accuracy: 0.9990
Epoch 17/100
8/8 [==============================] - 0s 5ms/step - loss: 0.2182 - sparse_categorical_accuracy: 0.9990
Epoch 18/100
8/8 [==============================] - 0s 4ms/step - loss: 0.2097 - sparse_categorical_accuracy: 0.9990
Epoch 19/100
8/8 [==============================] - 0s 4ms/step - loss: 0.2018 - sparse_categorical_accuracy: 0.9990
Epoch 20/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1940 - sparse_categorical_accuracy: 0.9980
Epoch 21/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1892 - sparse_categorical_accuracy: 0.9990
Epoch 22/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1821 - sparse_categorical_accuracy: 0.9980
Epoch 23/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1768 - sparse_categorical_accuracy: 0.9990
Epoch 24/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1702 - sparse_categorical_accuracy: 0.9980
Epoch 25/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1664 - sparse_categorical_accuracy: 0.9990
Epoch 26/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1604 - sparse_categorical_accuracy: 0.9990
Epoch 27/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1565 - sparse_categorical_accuracy: 0.9990
Epoch 28/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1517 - sparse_categorical_accuracy: 0.9990
Epoch 29/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1469 - sparse_categorical_accuracy: 0.9990
Epoch 30/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1431 - sparse_categorical_accuracy: 0.9980
Epoch 31/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1385 - sparse_categorical_accuracy: 0.9980
Epoch 32/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1351 - sparse_categorical_accuracy: 0.9990
Epoch 33/100
8/8 [==============================] - 0s 5ms/step - loss: 0.1312 - sparse_categorical_accuracy: 0.9980
Epoch 34/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1289 - sparse_categorical_accuracy: 0.9990
Epoch 35/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1254 - sparse_categorical_accuracy: 0.9980
Epoch 36/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1223 - sparse_categorical_accuracy: 0.9980
Epoch 37/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1180 - sparse_categorical_accuracy: 0.9990
Epoch 38/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1167 - sparse_categorical_accuracy: 0.9990
Epoch 39/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1132 - sparse_categorical_accuracy: 0.9980
Epoch 40/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1110 - sparse_categorical_accuracy: 0.9990
Epoch 41/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1075 - sparse_categorical_accuracy: 0.9990
Epoch 42/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1067 - sparse_categorical_accuracy: 0.9990
Epoch 43/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1034 - sparse_categorical_accuracy: 0.9990
Epoch 44/100
8/8 [==============================] - 0s 4ms/step - loss: 0.1006 - sparse_categorical_accuracy: 0.9990
Epoch 45/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0991 - sparse_categorical_accuracy: 0.9990
Epoch 46/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0963 - sparse_categorical_accuracy: 0.9990
Epoch 47/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0943 - sparse_categorical_accuracy: 0.9980
Epoch 48/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0925 - sparse_categorical_accuracy: 0.9990
Epoch 49/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0905 - sparse_categorical_accuracy: 0.9990
Epoch 50/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0889 - sparse_categorical_accuracy: 0.9990
Epoch 51/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0863 - sparse_categorical_accuracy: 0.9980
Epoch 52/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0847 - sparse_categorical_accuracy: 0.9990
Epoch 53/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0831 - sparse_categorical_accuracy: 0.9980
Epoch 54/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0818 - sparse_categorical_accuracy: 0.9990
Epoch 55/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0799 - sparse_categorical_accuracy: 0.9990
Epoch 56/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0780 - sparse_categorical_accuracy: 0.9990
Epoch 57/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0768 - sparse_categorical_accuracy: 0.9990
Epoch 58/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0751 - sparse_categorical_accuracy: 0.9990
Epoch 59/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0748 - sparse_categorical_accuracy: 0.9990
Epoch 60/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0723 - sparse_categorical_accuracy: 0.9990
Epoch 61/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0712 - sparse_categorical_accuracy: 0.9990
Epoch 62/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0701 - sparse_categorical_accuracy: 0.9990
Epoch 63/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0701 - sparse_categorical_accuracy: 0.9990
Epoch 64/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0683 - sparse_categorical_accuracy: 0.9990
Epoch 65/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0665 - sparse_categorical_accuracy: 0.9990
Epoch 66/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0661 - sparse_categorical_accuracy: 0.9990
Epoch 67/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0636 - sparse_categorical_accuracy: 0.9990
Epoch 68/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0631 - sparse_categorical_accuracy: 0.9990
Epoch 69/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0620 - sparse_categorical_accuracy: 0.9990
Epoch 70/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0606 - sparse_categorical_accuracy: 0.9990
Epoch 71/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0601 - sparse_categorical_accuracy: 0.9980
Epoch 72/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0590 - sparse_categorical_accuracy: 0.9990
Epoch 73/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0586 - sparse_categorical_accuracy: 0.9990
Epoch 74/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0574 - sparse_categorical_accuracy: 0.9990
Epoch 75/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0565 - sparse_categorical_accuracy: 1.0000
Epoch 76/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0559 - sparse_categorical_accuracy: 0.9990
Epoch 77/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0549 - sparse_categorical_accuracy: 0.9990
Epoch 78/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0534 - sparse_categorical_accuracy: 1.0000
Epoch 79/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0532 - sparse_categorical_accuracy: 0.9990
Epoch 80/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0519 - sparse_categorical_accuracy: 1.0000
Epoch 81/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0511 - sparse_categorical_accuracy: 1.0000
Epoch 82/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0508 - sparse_categorical_accuracy: 0.9990
Epoch 83/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0499 - sparse_categorical_accuracy: 1.0000
Epoch 84/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0490 - sparse_categorical_accuracy: 1.0000
Epoch 85/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0490 - sparse_categorical_accuracy: 0.9990
Epoch 86/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0470 - sparse_categorical_accuracy: 1.0000
Epoch 87/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0468 - sparse_categorical_accuracy: 1.0000
Epoch 88/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0468 - sparse_categorical_accuracy: 1.0000
Epoch 89/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0453 - sparse_categorical_accuracy: 1.0000
Epoch 90/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0448 - sparse_categorical_accuracy: 1.0000
Epoch 91/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0441 - sparse_categorical_accuracy: 1.0000
Epoch 92/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0434 - sparse_categorical_accuracy: 1.0000
Epoch 93/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0431 - sparse_categorical_accuracy: 1.0000
Epoch 94/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0424 - sparse_categorical_accuracy: 1.0000
Epoch 95/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0420 - sparse_categorical_accuracy: 1.0000
Epoch 96/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0415 - sparse_categorical_accuracy: 1.0000
Epoch 97/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0409 - sparse_categorical_accuracy: 1.0000
Epoch 98/100
8/8 [==============================] - 0s 4ms/step - loss: 0.0401 - sparse_categorical_accuracy: 1.0000
Epoch 99/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0396 - sparse_categorical_accuracy: 1.0000
Epoch 100/100
8/8 [==============================] - 0s 5ms/step - loss: 0.0392 - sparse_categorical_accuracy: 1.0000
<keras.callbacks.History at 0x7ff7ac0f83d0>

অনিশ্চয়তা কল্পনা করুন

প্রথমে ভবিষ্যদ্বাণীমূলক লগিট এবং বৈচিত্রগুলি গণনা করুন।

sngp_logits, sngp_covmat = sngp_model(test_examples, return_covmat=True)
sngp_variance = tf.linalg.diag_part(sngp_covmat)[:, None]

এখন পোস্টেরিয়র ভবিষ্যদ্বাণীমূলক সম্ভাব্যতা গণনা করুন। একটি সম্ভাব্য মডেলের ভবিষ্যদ্বাণীমূলক সম্ভাব্যতা গণনার ক্লাসিক পদ্ধতি হল মন্টে কার্লো স্যাম্পলিং ব্যবহার করা, অর্থাৎ,

\[E(p(x)) = \frac{1}{M} \sum_{m=1}^M logit_m(x), \]

যেখানে \(M\) হল নমুনার আকার, এবং \(logit_m(x)\) হল SNGP পোস্টেরিয়র \(MultivariateNormal\)( sngp_logits , sngp_covmat ) থেকে র্যান্ডম নমুনা৷ যাইহোক, স্বায়ত্তশাসিত ড্রাইভিং বা রিয়েল-টাইম বিডিংয়ের মতো লেটেন্সি-সংবেদনশীল অ্যাপ্লিকেশনগুলির জন্য এই পদ্ধতিটি ধীর হতে পারে। পরিবর্তে, গড়-ক্ষেত্র পদ্ধতি ব্যবহার করে \(E(p(x))\) আনুমানিক করতে পারে:

\[E(p(x)) \approx softmax(\frac{logit(x)}{\sqrt{1+ \lambda * \sigma^2(x)} })\]

যেখানে \(\sigma^2(x)\) হল SNGP ভ্যারিয়েন্স, এবং \(\lambda\) প্রায়ই \(\pi/8\) বা \(3/\pi^2\)placeholder29 হিসাবে বেছে নেওয়া হয়।

sngp_logits_adjusted = sngp_logits / tf.sqrt(1. + (np.pi / 8.) * sngp_variance)
sngp_probs = tf.nn.softmax(sngp_logits_adjusted, axis=-1)[:, 0]

এই গড়-ক্ষেত্র পদ্ধতিটি একটি অন্তর্নির্মিত ফাংশন হিসাবে প্রয়োগ করা হয় layers.gaussian_process.mean_field_logits :

def compute_posterior_mean_probability(logits, covmat, lambda_param=np.pi / 8.):
  # Computes uncertainty-adjusted logits using the built-in method.
  logits_adjusted = nlp_layers.gaussian_process.mean_field_logits(
      logits, covmat, mean_field_factor=lambda_param)

  return tf.nn.softmax(logits_adjusted, axis=-1)[:, 0]
sngp_logits, sngp_covmat = sngp_model(test_examples, return_covmat=True)
sngp_probs = compute_posterior_mean_probability(sngp_logits, sngp_covmat)

SNGP সারাংশ

সবকিছু একসাথে রাখুন। সম্পূর্ণ পদ্ধতি (প্রশিক্ষণ, মূল্যায়ন এবং অনিশ্চয়তা গণনা) মাত্র পাঁচটি লাইনে করা যেতে পারে:

def train_and_test_sngp(train_examples, test_examples):
  sngp_model = DeepResNetSNGPWithCovReset(**resnet_config)

  sngp_model.compile(**train_config)
  sngp_model.fit(train_examples, train_labels, verbose=0, **fit_config)

  sngp_logits, sngp_covmat = sngp_model(test_examples, return_covmat=True)
  sngp_probs = compute_posterior_mean_probability(sngp_logits, sngp_covmat)

  return sngp_probs
sngp_probs = train_and_test_sngp(train_examples, test_examples)

SNGP মডেলের ক্লাস সম্ভাব্যতা (বাম) এবং ভবিষ্যদ্বাণীমূলক অনিশ্চয়তা (ডান) কল্পনা করুন।

plot_predictions(sngp_probs, model_name="SNGP")

png

মনে রাখবেন যে ক্লাস সম্ভাব্যতা প্লটে (বাম), হলুদ এবং বেগুনি হল শ্রেণী সম্ভাব্যতা। প্রশিক্ষণ ডেটা ডোমেনের কাছাকাছি থাকাকালীন, SNGP উচ্চ আত্মবিশ্বাসের সাথে উদাহরণগুলিকে সঠিকভাবে শ্রেণীবদ্ধ করে (অর্থাৎ, 0 বা 1 সম্ভাব্যতার কাছাকাছি বরাদ্দ করা)। প্রশিক্ষণের তথ্য থেকে দূরে থাকাকালীন, SNGP ধীরে ধীরে কম আত্মবিশ্বাসী হয়ে ওঠে এবং এর ভবিষ্যদ্বাণীমূলক সম্ভাবনা 0.5 এর কাছাকাছি হয়ে যায় যখন (সাধারণকৃত) মডেলের অনিশ্চয়তা 1-এ উঠে যায়।

এটিকে নির্ধারক মডেলের অনিশ্চয়তা পৃষ্ঠের সাথে তুলনা করুন:

plot_predictions(resnet_probs, model_name="Deterministic")

png

যেমন আগে উল্লিখিত হয়েছে, একটি নির্ধারক মডেল দূরত্ব-সচেতন নয়। এর অনিশ্চয়তা সিদ্ধান্তের সীমানা থেকে পরীক্ষার উদাহরণের দূরত্ব দ্বারা সংজ্ঞায়িত করা হয়। এটি ডোমেনের বাইরের উদাহরণগুলির (লাল) জন্য অতিরিক্ত আত্মবিশ্বাসী ভবিষ্যদ্বাণী তৈরি করতে মডেলটিকে নেতৃত্ব দেয়।

অন্যান্য অনিশ্চয়তা পদ্ধতির সাথে তুলনা

এই বিভাগটি মন্টে কার্লো ড্রপআউট এবং ডিপ এনসেম্বলের সাথে SNGP-এর অনিশ্চয়তার তুলনা করে।

এই উভয় পদ্ধতিই মন্টে কার্লোর নির্ধারক মডেলের একাধিক ফরোয়ার্ড পাসের গড় উপর ভিত্তি করে। প্রথমে ensemble আকার \(M\)সেট করুন।

num_ensemble = 10

মন্টে কার্লো ড্রপআউট

ড্রপআউট স্তর সহ একটি প্রশিক্ষিত নিউরাল নেটওয়ার্ক দেওয়া, মন্টে কার্লো ড্রপআউট গড় ভবিষ্যদ্বাণীমূলক সম্ভাব্যতা গণনা করে

\[E(p(x)) = \frac{1}{M}\sum_{m=1}^M softmax(logit_m(x))\]

একাধিক ড্রপআউট-সক্ষম ফরওয়ার্ড পাস \(\{logit_m(x)\}_{m=1}^M\)এর বেশি গড় করে।

def mc_dropout_sampling(test_examples):
  # Enable dropout during inference.
  return resnet_model(test_examples, training=True)
# Monte Carlo dropout inference.
dropout_logit_samples = [mc_dropout_sampling(test_examples) for _ in range(num_ensemble)]
dropout_prob_samples = [tf.nn.softmax(dropout_logits, axis=-1)[:, 0] for dropout_logits in dropout_logit_samples]
dropout_probs = tf.reduce_mean(dropout_prob_samples, axis=0)
dropout_probs = tf.reduce_mean(dropout_prob_samples, axis=0)
plot_predictions(dropout_probs, model_name="MC Dropout")

png

গভীর ensemble

ডিপ এনসেম্বল হল গভীর শিক্ষার অনিশ্চয়তার জন্য একটি অত্যাধুনিক (কিন্তু ব্যয়বহুল) পদ্ধতি। একটি ডিপ এনসেম্বল প্রশিক্ষণের জন্য, প্রথমে \(M\) ensemble সদস্যদের প্রশিক্ষণ দিন।

# Deep ensemble training
resnet_ensemble = []
for _ in range(num_ensemble):
  resnet_model = DeepResNet(**resnet_config)
  resnet_model.compile(optimizer=optimizer, loss=loss, metrics=metrics)
  resnet_model.fit(train_examples, train_labels, verbose=0, **fit_config)  

  resnet_ensemble.append(resnet_model)

লগিট সংগ্রহ করুন এবং গড় ভবিষ্যদ্বাণীমূলক সম্ভাব্যতা \(E(p(x)) = \frac{1}{M}\sum_{m=1}^M softmax(logit_m(x))\)গণনা করুন।

# Deep ensemble inference
ensemble_logit_samples = [model(test_examples) for model in resnet_ensemble]
ensemble_prob_samples = [tf.nn.softmax(logits, axis=-1)[:, 0] for logits in ensemble_logit_samples]
ensemble_probs = tf.reduce_mean(ensemble_prob_samples, axis=0)
plot_predictions(ensemble_probs, model_name="Deep ensemble")

png

এমসি ড্রপআউট এবং ডিপ এনসেম্বল উভয়ই সিদ্ধান্তের সীমানা কম নির্দিষ্ট করে একটি মডেলের অনিশ্চয়তার ক্ষমতাকে উন্নত করে। যাইহোক, তারা উভয়ই দূরত্ব সচেতনতার অভাবের কারণে ডিটারমিনিস্টিক গভীর নেটওয়ার্কের সীমাবদ্ধতার উত্তরাধিকারী।

সারসংক্ষেপ

এই টিউটোরিয়ালে, আপনার আছে:

  • এর দূরত্ব সচেতনতা উন্নত করতে একটি গভীর শ্রেণিবিন্যাসকারীতে একটি SNGP মডেল প্রয়োগ করেছে৷
  • Keras model.fit() API ব্যবহার করে SNGP মডেল এন্ড-টু-এন্ড প্রশিক্ষিত।
  • SNGP-এর অনিশ্চয়তা আচরণকে কল্পনা করা হয়েছে।
  • SNGP, মন্টে কার্লো ড্রপআউট এবং ডিপ এনসেম্বল মডেলের মধ্যে অনিশ্চয়তার আচরণের তুলনা।

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