संश्लेषित ग्राफ का उपयोग करके भाव वर्गीकरण के लिए ग्राफ नियमितीकरण

TensorFlow.org पर देखें Google Colab में चलाएं GitHub पर स्रोत देखें

अवलोकन

यह नोटबुक समीक्षा के पाठ का उपयोग करके मूवी समीक्षाओं को सकारात्मक या नकारात्मक के रूप में वर्गीकृत करती है। यह द्विआधारी वर्गीकरण का एक उदाहरण है, एक महत्वपूर्ण और व्यापक रूप से लागू मशीन सीखने की समस्या।

हम दिए गए इनपुट से ग्राफ बनाकर इस नोटबुक में ग्राफ नियमितीकरण के उपयोग को प्रदर्शित करेंगे। तंत्रिका संरचित शिक्षण (NSL) ढांचे का उपयोग करते हुए एक ग्राफ-नियमित मॉडल बनाने के लिए सामान्य नुस्खा जब इनपुट में एक स्पष्ट ग्राफ नहीं होता है वह निम्नानुसार है:

  1. इनपुट में प्रत्येक पाठ नमूने के लिए एम्बेडिंग बनाएँ। यह पूर्व-प्रशिक्षित मॉडल जैसे शब्द 2vec , कुंडा , BERT आदि का उपयोग करके किया जा सकता है।
  2. एक समानता मीट्रिक का उपयोग करके इन एम्बेडिंग के आधार पर एक ग्राफ बनाएँ, जैसे कि 'L2' दूरी, 'कोसाइन' दूरी, आदि। ग्राफ़ में नोड्स नमूने के अनुरूप हैं और ग्राफ़ में किनारे नमूने के जोड़े के बीच समानता के अनुरूप हैं।
  3. उपरोक्त संश्लेषित ग्राफ और नमूना सुविधाओं से प्रशिक्षण डेटा उत्पन्न करें। परिणामी प्रशिक्षण डेटा में मूल नोड सुविधाओं के अतिरिक्त पड़ोसी विशेषताएं होंगी।
  4. करस अनुक्रमिक, कार्यात्मक, या उपवर्ग एपीआई का उपयोग करके आधार मॉडल के रूप में एक तंत्रिका नेटवर्क बनाएं।
  5. एक नया ग्राफ ग्राफ मॉडल बनाने के लिए, NSR ढांचे द्वारा प्रदान की गई GraphRegularization आवरण वर्ग के साथ बेस मॉडल को लपेटें। इस नए मॉडल में अपने प्रशिक्षण उद्देश्य में नियमितीकरण अवधि के रूप में एक ग्राफ नियमितीकरण हानि शामिल होगी।
  6. ट्रेन और ग्राफ केर मॉडल का मूल्यांकन करें।

आवश्यकताओं को

  1. तंत्रिका संरचित लर्निंग पैकेज स्थापित करें।
  2. टेंसरफ़्लो-हब स्थापित करें।
0a5571b80

निर्भरता और आयात

import matplotlib.pyplot as plt
import numpy as np

import neural_structured_learning as nsl

import tensorflow as tf
import tensorflow_hub as hub

# Resets notebook state
tf.keras.backend.clear_session()

print("Version: ", tf.__version__)
print("Eager mode: ", tf.executing_eagerly())
print("Hub version: ", hub.__version__)
print(
    "GPU is",
    "available" if tf.config.list_physical_devices("GPU") else "NOT AVAILABLE")
Version:  2.3.0
Eager mode:  True
Hub version:  0.8.0
GPU is NOT AVAILABLE

IMDB डेटासेट

IMDB डेटासेट में इंटरनेट मूवी डेटाबेस से 50,000 मूवी समीक्षाओं का पाठ होता है। ये प्रशिक्षण के लिए 25,000 समीक्षाओं और परीक्षण के लिए 25,000 समीक्षाओं में विभाजित हैं। प्रशिक्षण और परीक्षण सेट संतुलित हैं , जिसका अर्थ है कि उनमें समान संख्या में सकारात्मक और नकारात्मक समीक्षाएं हैं।

इस ट्यूटोरियल में, हम IMDB डेटासेट के एक पूर्व-संस्करण का उपयोग करेंगे।

पहले से तैयार IMDB डेटासेट डाउनलोड करें

IMDB डेटासेट TensorFlow के साथ पैक किया हुआ आता है। यह पहले से ही इस तरह से पूर्वनिर्मित किया गया है कि समीक्षाओं (शब्दों के अनुक्रम) को पूर्णांक के अनुक्रम में बदल दिया गया है, जहां प्रत्येक पूर्णांक एक शब्दकोश में एक विशिष्ट शब्द का प्रतिनिधित्व करता है।

निम्न कोड IMDB डेटासेट डाउनलोड करता है (या यदि यह पहले से डाउनलोड हो चुका है तो कैश्ड कॉपी का उपयोग करता है):

imdb = tf.keras.datasets.imdb
(pp_train_data, pp_train_labels), (pp_test_data, pp_test_labels) = (
    imdb.load_data(num_words=10000))
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
17465344/17464789 [==============================] - 0s 0us/step

संख्या num_words=10000 प्रशिक्षण डेटा में शीर्ष 10,000 सबसे अधिक बार होने वाले शब्दों को रखता है। शब्दावली के आकार को प्रबंधित करने के लिए दुर्लभ शब्दों को छोड़ दिया जाता है।

डेटा का अन्वेषण करें

आइए, डेटा के प्रारूप को समझने में कुछ समय लेते हैं। डेटासेट पहले से तैयार है: प्रत्येक उदाहरण मूवी रिव्यू के शब्दों को दर्शाने वाले पूर्णांकों की एक सरणी है। प्रत्येक लेबल 0 या 1 का पूर्णांक मान है, जहां 0 एक नकारात्मक समीक्षा है, और 1 एक सकारात्मक समीक्षा है।

print('Training entries: {}, labels: {}'.format(
    len(pp_train_data), len(pp_train_labels)))
training_samples_count = len(pp_train_data)
Training entries: 25000, labels: 25000

समीक्षाओं का पाठ पूर्णांक में बदल दिया गया है, जहां प्रत्येक पूर्णांक एक शब्दकोश में एक विशिष्ट शब्द का प्रतिनिधित्व करता है। यहाँ पहली समीक्षा कैसी दिखती है:

print(pp_train_data[0])
[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

मूवी समीक्षा अलग लंबाई हो सकती है। नीचे दिया गया कोड पहली और दूसरी समीक्षा में शब्दों की संख्या दर्शाता है। चूंकि तंत्रिका नेटवर्क के इनपुट समान लंबाई के होने चाहिए, इसलिए हमें इसे बाद में हल करना होगा।

len(pp_train_data[0]), len(pp_train_data[1])
(218, 189)

पूर्णांकों को शब्दों में बदलें

यह जानना उपयोगी हो सकता है कि पूर्णांक को संबंधित पाठ में कैसे परिवर्तित किया जाए। यहां, हम एक शब्दकोश ऑब्जेक्ट को क्वेरी करने के लिए एक सहायक फ़ंक्शन बनाएंगे जिसमें स्ट्रिंग मैपिंग के लिए पूर्णांक होता है:

def build_reverse_word_index():
  # A dictionary mapping words to an integer index
  word_index = imdb.get_word_index()

  # The first indices are reserved
  word_index = {k: (v + 3) for k, v in word_index.items()}
  word_index['<PAD>'] = 0
  word_index['<START>'] = 1
  word_index['<UNK>'] = 2  # unknown
  word_index['<UNUSED>'] = 3
  return dict((value, key) for (key, value) in word_index.items())

reverse_word_index = build_reverse_word_index()

def decode_review(text):
  return ' '.join([reverse_word_index.get(i, '?') for i in text])
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json
1646592/1641221 [==============================] - 0s 0us/step

अब हम पहली समीक्षा के लिए पाठ प्रदर्शित करने के लिए decode_review फ़ंक्शन का उपयोग कर सकते हैं:

decode_review(pp_train_data[0])
"<START> this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert <UNK> is an amazing actor and now the same being director <UNK> father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for <UNK> and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also <UNK> to the two little boy's that played the <UNK> of norman and paul they were just brilliant children are often left out of the <UNK> list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all"

ग्राफ निर्माण

ग्राफ़ निर्माण में पाठ नमूनों के लिए एम्बेडिंग बनाना और फिर एम्बेडिंग की तुलना करने के लिए समानता फ़ंक्शन का उपयोग करना शामिल है।

आगे बढ़ने से पहले, हम पहले इस ट्यूटोरियल द्वारा बनाई गई कलाकृतियों को संग्रहीत करने के लिए एक निर्देशिका बनाते हैं।

mkdir -p /tmp/imdb

नमूना एम्बेडिंग बनाएँ

हम इनपुट में प्रत्येक नमूने के लिए tf.train.Example प्रारूप में एम्बेडिंग बनाने के लिए tf.train.Example कुंडा एम्बेडिंग का उपयोग करेंगे। हम TFRecord प्रारूप में परिणामी एम्बेडिंग को एक अतिरिक्त सुविधा के साथ संग्रहीत करेंगे जो प्रत्येक नमूने की आईडी का प्रतिनिधित्व करती है। यह महत्वपूर्ण है और हमें बाद में ग्राफ में संबंधित नोड्स के साथ नमूना एम्बेडिंग मैच की अनुमति देगा।

pretrained_embedding = 'https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1'

hub_layer = hub.KerasLayer(
    pretrained_embedding, input_shape=[], dtype=tf.string, trainable=True)
def _int64_feature(value):
  """Returns int64 tf.train.Feature."""
  return tf.train.Feature(int64_list=tf.train.Int64List(value=value.tolist()))


def _bytes_feature(value):
  """Returns bytes tf.train.Feature."""
  return tf.train.Feature(
      bytes_list=tf.train.BytesList(value=[value.encode('utf-8')]))


def _float_feature(value):
  """Returns float tf.train.Feature."""
  return tf.train.Feature(float_list=tf.train.FloatList(value=value.tolist()))


def create_embedding_example(word_vector, record_id):
  """Create tf.Example containing the sample's embedding and its ID."""

  text = decode_review(word_vector)

  # Shape = [batch_size,].
  sentence_embedding = hub_layer(tf.reshape(text, shape=[-1,]))

  # Flatten the sentence embedding back to 1-D.
  sentence_embedding = tf.reshape(sentence_embedding, shape=[-1])

  features = {
      'id': _bytes_feature(str(record_id)),
      'embedding': _float_feature(sentence_embedding.numpy())
  }
  return tf.train.Example(features=tf.train.Features(feature=features))


def create_embeddings(word_vectors, output_path, starting_record_id):
  record_id = int(starting_record_id)
  with tf.io.TFRecordWriter(output_path) as writer:
    for word_vector in word_vectors:
      example = create_embedding_example(word_vector, record_id)
      record_id = record_id + 1
      writer.write(example.SerializeToString())
  return record_id


# Persist TF.Example features containing embeddings for training data in
# TFRecord format.
create_embeddings(pp_train_data, '/tmp/imdb/embeddings.tfr', 0)
25000

एक ग्राफ बनाएँ

अब जब हमारे पास नमूना एम्बेडिंग हैं, तो हम उनका उपयोग एक समानता ग्राफ बनाने के लिए करेंगे, अर्थात, इस ग्राफ़ में नोड्स नमूनों के अनुरूप होंगे और इस ग्राफ़ में किनारे नोड्स के जोड़े के बीच समानता के अनुरूप होंगे।

न्यूरल स्ट्रक्चर्ड लर्निंग, नमूना एम्बेडिंग के आधार पर एक ग्राफ बनाने के लिए एक ग्राफ बिल्डिंग लाइब्रेरी प्रदान करता है। यह कॉम्बिनेशन को तुलना करने और उनके बीच किनारों का निर्माण करने के लिए समानता माप के रूप में कॉशन समानता का उपयोग करता है। यह हमें एक समानता सीमा को निर्दिष्ट करने की भी अनुमति देता है, जिसका उपयोग अंतिम ग्राफ से भिन्न किनारों को त्यागने के लिए किया जा सकता है। इस उदाहरण में, 0.99 का उपयोग समानता की दहलीज और 12345 यादृच्छिक बीज के रूप में करते हैं, हम एक ग्राफ के साथ समाप्त होते हैं जिसमें 429,415 द्वि-दिशात्मक किनारे होते हैं। यहां हम ग्राफ निर्माण में तेजी लाने के लिए स्थानीय-संवेदनशील हैशिंग (एलएसएच) के लिए ग्राफ बिल्डर के समर्थन का उपयोग कर रहे हैं। ग्राफ़ बिल्डर के LSH समर्थन का उपयोग करने के विवरण के लिए, build_graph_from_config API दस्तावेज़ देखें।

graph_builder_config = nsl.configs.GraphBuilderConfig(
    similarity_threshold=0.99, lsh_splits=32, lsh_rounds=15, random_seed=12345)
nsl.tools.build_graph_from_config(['/tmp/imdb/embeddings.tfr'],
                                  '/tmp/imdb/graph_99.tsv',
                                  graph_builder_config)

प्रत्येक द्वि-दिशात्मक धार को आउटपुट टीएसवी फ़ाइल में दो निर्देशित किनारों द्वारा दर्शाया गया है, ताकि फ़ाइल में 429,415 * 2 = 858,830 कुल लाइनें हों:

wc -l /tmp/imdb/graph_99.tsv
858830 /tmp/imdb/graph_99.tsv

नमूना सुविधाएँ

हम tf.train.Example प्रारूप का उपयोग करके अपनी समस्या के लिए नमूना सुविधाएँ बनाते हैं और उन्हें TFRecord प्रारूप में जारी रखते हैं। प्रत्येक नमूने में निम्नलिखित तीन विशेषताएं शामिल होंगी:

  1. आईडी : नमूने की नोड आईडी।
  2. शब्द : एक int64 सूची जिसमें शब्द आईडी है।
  3. लेबल : एक एकल int64 समीक्षा के लक्ष्य वर्ग की पहचान।
def create_example(word_vector, label, record_id):
  """Create tf.Example containing the sample's word vector, label, and ID."""
  features = {
      'id': _bytes_feature(str(record_id)),
      'words': _int64_feature(np.asarray(word_vector)),
      'label': _int64_feature(np.asarray([label])),
  }
  return tf.train.Example(features=tf.train.Features(feature=features))

def create_records(word_vectors, labels, record_path, starting_record_id):
  record_id = int(starting_record_id)
  with tf.io.TFRecordWriter(record_path) as writer:
    for word_vector, label in zip(word_vectors, labels):
      example = create_example(word_vector, label, record_id)
      record_id = record_id + 1
      writer.write(example.SerializeToString())
  return record_id

# Persist TF.Example features (word vectors and labels) for training and test
# data in TFRecord format.
next_record_id = create_records(pp_train_data, pp_train_labels,
                                '/tmp/imdb/train_data.tfr', 0)
create_records(pp_test_data, pp_test_labels, '/tmp/imdb/test_data.tfr',
               next_record_id)
50000

ग्राफ पड़ोसियों के साथ ऑगमेंट ट्रेनिंग डेटा

चूंकि हमारे पास नमूना विशेषताएं और संश्लेषित ग्राफ हैं, इसलिए हम न्यूरल स्ट्रक्चर्ड लर्निंग के लिए संवर्धित प्रशिक्षण डेटा उत्पन्न कर सकते हैं। एनएसएल फ्रेमवर्क एक पुस्तकालय को ग्राफ और नमूना सुविधाओं को संयोजित करने के लिए प्रदान करता है ताकि ग्राफ नियमितीकरण के लिए अंतिम प्रशिक्षण डेटा का उत्पादन किया जा सके। परिणामी प्रशिक्षण डेटा में मूल नमूना सुविधाओं के साथ-साथ उनके संबंधित पड़ोसियों की विशेषताएं शामिल होंगी।

इस ट्यूटोरियल में, हम अप्रत्यक्ष किनारों पर विचार करते हैं और ग्राफ पड़ोसियों के साथ प्रशिक्षण डेटा को बढ़ाने के लिए प्रति नमूना अधिकतम 3 पड़ोसियों का उपयोग करते हैं।

nsl.tools.pack_nbrs(
    '/tmp/imdb/train_data.tfr',
    '',
    '/tmp/imdb/graph_99.tsv',
    '/tmp/imdb/nsl_train_data.tfr',
    add_undirected_edges=True,
    max_nbrs=3)

बेस मॉडल

अब हम बिना ग्राफ़ नियमितीकरण के आधार मॉडल बनाने के लिए तैयार हैं। इस मॉडल को बनाने के लिए, हम या तो उन एम्बेडिंग का उपयोग कर सकते हैं जिनका उपयोग ग्राफ बनाने में किया गया था, या हम वर्गीकरण कार्य के साथ-साथ नए एम्बेडिंग सीख सकते हैं। इस नोटबुक के उद्देश्य के लिए, हम बाद में करेंगे।

सार्वत्रिक चर

NBR_FEATURE_PREFIX = 'NL_nbr_'
NBR_WEIGHT_SUFFIX = '_weight'

हाइपरपैरामीटर

हम प्रशिक्षण और मूल्यांकन के लिए उपयोग किए जाने वाले विभिन्न HParams और स्थिरांक को HParams करने के लिए HParams उदाहरण का उपयोग करेंगे। हम उनमें से प्रत्येक का संक्षेप में वर्णन करते हैं:

  • num_classes : 2 वर्ग हैं - सकारात्मक और नकारात्मक

  • max_seq_length : इस उदाहरण में प्रत्येक फिल्म समीक्षा से माने जाने वाले शब्दों की अधिकतम संख्या है।

  • vocab_size : यह इस उदाहरण के लिए मानी जाने वाली शब्दावली का आकार है।

  • दूरी_टाइप : यह वह दूरी है जिसे मीट्रिक अपने पड़ोसियों के साथ नमूने को नियमित करने के लिए उपयोग करता है।

  • graph_ अनियमितकरण_ multiplier : यह समग्र नुकसान फ़ंक्शन में ग्राफ नियमितीकरण शब्द के सापेक्ष वजन को नियंत्रित करता है।

  • num_neighbors : ग्राफ नियमितीकरण के लिए उपयोग किए जाने वाले पड़ोसियों की संख्या। इस मान से कम या ज्यादा के बराबर हो गया है max_nbrs जब लागू, ऊपर उपयोग तर्कnsl.tools.pack_nbrs

  • num_fc_units : तंत्रिका नेटवर्क की पूरी तरह से जुड़ी परत में इकाइयों की संख्या।

  • train_epochs : प्रशिक्षण युगों की संख्या।

  • बैच_साइज : प्रशिक्षण और मूल्यांकन के लिए इस्तेमाल किया गया बैच आकार।

  • eval_steps : मूल्यांकन को पूरा करने से पहले बैचों की संख्या पूरी हो गई है। यदि None सेट None , तो परीक्षण सेट में सभी उदाहरणों का मूल्यांकन किया जाता है।

class HParams(object):
  """Hyperparameters used for training."""
  def __init__(self):
    ### dataset parameters
    self.num_classes = 2
    self.max_seq_length = 256
    self.vocab_size = 10000
    ### neural graph learning parameters
    self.distance_type = nsl.configs.DistanceType.L2
    self.graph_regularization_multiplier = 0.1
    self.num_neighbors = 2
    ### model architecture
    self.num_embedding_dims = 16
    self.num_lstm_dims = 64
    self.num_fc_units = 64
    ### training parameters
    self.train_epochs = 10
    self.batch_size = 128
    ### eval parameters
    self.eval_steps = None  # All instances in the test set are evaluated.

HPARAMS = HParams()

डेटा तैयार करें

समीक्षा-पूर्णांक के सरणियों को तंत्रिका नेटवर्क में खिलाए जाने से पहले दसियों में परिवर्तित किया जाना चाहिए। इस रूपांतरण को कुछ तरीकों से किया जा सकता है:

  • एक-गर्म एन्कोडिंग के समान, 0 एस और 1 एस को शब्द घटना के वैक्टर में सरणियों में परिवर्तित करें। उदाहरण के लिए, अनुक्रम [3, 5] एक 10000 -आयामी वेक्टर बन जाएगा जो सूचक 3 और 5 को छोड़कर सभी शून्य है, जो कि हैं। फिर, इसे हमारे नेटवर्क में पहली परत बनाएं - एक Dense परत - जो फ्लोटिंग पॉइंट वेक्टर डेटा को संभाल सकती है। यह दृष्टिकोण स्मृति गहन है, हालांकि, एक num_words * num_reviews आकार मैट्रिक्स की आवश्यकता होती है।

  • वैकल्पिक रूप से, हम सरणियों को पैड कर सकते हैं, ताकि उन सभी की लंबाई समान हो, फिर एक पूर्णांक टेंसर आकार का max_length * num_reviews । हम अपने नेटवर्क में पहली परत के रूप में इस आकार को संभालने में सक्षम एक एम्बेडिंग परत का उपयोग कर सकते हैं।

इस ट्यूटोरियल में, हम दूसरे दृष्टिकोण का उपयोग करेंगे।

चूँकि फिल्म की समीक्षाओं की लंबाई समान होनी चाहिए, इसलिए हम लंबाई को मानकीकृत करने के लिए नीचे परिभाषित pad_sequence फ़ंक्शन का उपयोग करेंगे।

def make_dataset(file_path, training=False):
  """Creates a `tf.data.TFRecordDataset`.

  Args:
    file_path: Name of the file in the `.tfrecord` format containing
      `tf.train.Example` objects.
    training: Boolean indicating if we are in training mode.

  Returns:
    An instance of `tf.data.TFRecordDataset` containing the `tf.train.Example`
    objects.
  """

  def pad_sequence(sequence, max_seq_length):
    """Pads the input sequence (a `tf.SparseTensor`) to `max_seq_length`."""
    pad_size = tf.maximum([0], max_seq_length - tf.shape(sequence)[0])
    padded = tf.concat(
        [sequence.values,
         tf.fill((pad_size), tf.cast(0, sequence.dtype))],
        axis=0)
    # The input sequence may be larger than max_seq_length. Truncate down if
    # necessary.
    return tf.slice(padded, [0], [max_seq_length])

  def parse_example(example_proto):
    """Extracts relevant fields from the `example_proto`.

    Args:
      example_proto: An instance of `tf.train.Example`.

    Returns:
      A pair whose first value is a dictionary containing relevant features
      and whose second value contains the ground truth labels.
    """
    # The 'words' feature is a variable length word ID vector.
    feature_spec = {
        'words': tf.io.VarLenFeature(tf.int64),
        'label': tf.io.FixedLenFeature((), tf.int64, default_value=-1),
    }
    # We also extract corresponding neighbor features in a similar manner to
    # the features above during training.
    if training:
      for i in range(HPARAMS.num_neighbors):
        nbr_feature_key = '{}{}_{}'.format(NBR_FEATURE_PREFIX, i, 'words')
        nbr_weight_key = '{}{}{}'.format(NBR_FEATURE_PREFIX, i,
                                         NBR_WEIGHT_SUFFIX)
        feature_spec[nbr_feature_key] = tf.io.VarLenFeature(tf.int64)

        # We assign a default value of 0.0 for the neighbor weight so that
        # graph regularization is done on samples based on their exact number
        # of neighbors. In other words, non-existent neighbors are discounted.
        feature_spec[nbr_weight_key] = tf.io.FixedLenFeature(
            [1], tf.float32, default_value=tf.constant([0.0]))

    features = tf.io.parse_single_example(example_proto, feature_spec)

    # Since the 'words' feature is a variable length word vector, we pad it to a
    # constant maximum length based on HPARAMS.max_seq_length
    features['words'] = pad_sequence(features['words'], HPARAMS.max_seq_length)
    if training:
      for i in range(HPARAMS.num_neighbors):
        nbr_feature_key = '{}{}_{}'.format(NBR_FEATURE_PREFIX, i, 'words')
        features[nbr_feature_key] = pad_sequence(features[nbr_feature_key],
                                                 HPARAMS.max_seq_length)

    labels = features.pop('label')
    return features, labels

  dataset = tf.data.TFRecordDataset([file_path])
  if training:
    dataset = dataset.shuffle(10000)
  dataset = dataset.map(parse_example)
  dataset = dataset.batch(HPARAMS.batch_size)
  return dataset


train_dataset = make_dataset('/tmp/imdb/nsl_train_data.tfr', True)
test_dataset = make_dataset('/tmp/imdb/test_data.tfr')

मॉडल बनाएं

एक तंत्रिका नेटवर्क परतों को ढेर करके बनाया गया है - इसके लिए दो मुख्य वास्तु निर्णय लेने की आवश्यकता है:

  • मॉडल में कितनी परतों का उपयोग करना है?
  • प्रत्येक परत के लिए कितनी छिपी हुई इकाइयों का उपयोग करना है?

इस उदाहरण में, इनपुट डेटा में शब्द-सूचक की एक सरणी होती है। भविष्यवाणी करने के लिए लेबल या तो 0 या 1 हैं।

हम इस ट्यूटोरियल में हमारे आधार मॉडल के रूप में एक द्वि-दिशात्मक LSTM का उपयोग करेंगे।

# This function exists as an alternative to the bi-LSTM model used in this
# notebook.
def make_feed_forward_model():
  """Builds a simple 2 layer feed forward neural network."""
  inputs = tf.keras.Input(
      shape=(HPARAMS.max_seq_length,), dtype='int64', name='words')
  embedding_layer = tf.keras.layers.Embedding(HPARAMS.vocab_size, 16)(inputs)
  pooling_layer = tf.keras.layers.GlobalAveragePooling1D()(embedding_layer)
  dense_layer = tf.keras.layers.Dense(16, activation='relu')(pooling_layer)
  outputs = tf.keras.layers.Dense(1, activation='sigmoid')(dense_layer)
  return tf.keras.Model(inputs=inputs, outputs=outputs)


def make_bilstm_model():
  """Builds a bi-directional LSTM model."""
  inputs = tf.keras.Input(
      shape=(HPARAMS.max_seq_length,), dtype='int64', name='words')
  embedding_layer = tf.keras.layers.Embedding(HPARAMS.vocab_size,
                                              HPARAMS.num_embedding_dims)(
                                                  inputs)
  lstm_layer = tf.keras.layers.Bidirectional(
      tf.keras.layers.LSTM(HPARAMS.num_lstm_dims))(
          embedding_layer)
  dense_layer = tf.keras.layers.Dense(
      HPARAMS.num_fc_units, activation='relu')(
          lstm_layer)
  outputs = tf.keras.layers.Dense(1, activation='sigmoid')(dense_layer)
  return tf.keras.Model(inputs=inputs, outputs=outputs)


# Feel free to use an architecture of your choice.
model = make_bilstm_model()
model.summary()
Model: "functional_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
words (InputLayer)           [(None, 256)]             0         
_________________________________________________________________
embedding (Embedding)        (None, 256, 16)           160000    
_________________________________________________________________
bidirectional (Bidirectional (None, 128)               41472     
_________________________________________________________________
dense (Dense)                (None, 64)                8256      
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 65        
=================================================================
Total params: 209,793
Trainable params: 209,793
Non-trainable params: 0
_________________________________________________________________

क्लासिफ़ायर बनाने के लिए परतों को प्रभावी ढंग से क्रमिक रूप से स्टैक्ड किया जाता है:

  1. पहली परत एक Input परत है जो पूर्णांक-एन्कोडेड शब्दावली लेती है।
  2. अगली परत एक Embedding परत है, जो पूर्णांक-एन्कोडेड शब्दावली को लेती है और प्रत्येक शब्द-सूचकांक के लिए एम्बेडिंग वेक्टर को देखती है। इन वैक्टर को मॉडल ट्रेनों के रूप में सीखा जाता है। वैक्टर आउटपुट सरणी में एक आयाम जोड़ते हैं। परिणामी आयाम हैं: (batch, sequence, embedding)
  3. अगला, एक द्विदिश LSTM परत प्रत्येक उदाहरण के लिए एक निश्चित-लंबाई आउटपुट वेक्टर देता है।
  4. यह निश्चित-लंबाई वाला आउटपुट वेक्टर 64 छिपी इकाइयों के साथ एक पूरी तरह से जुड़ा हुआ ( Dense ) परत के माध्यम से पाइप किया जाता है।
  5. अंतिम परत घनीभूत रूप से एकल आउटपुट नोड के साथ जुड़ा हुआ है। sigmoid सक्रियण फ़ंक्शन का उपयोग करते हुए, यह मान 0 और 1 के बीच एक फ्लोट है, जो एक संभावना या आत्मविश्वास स्तर का प्रतिनिधित्व करता है।

छिपी हुई इकाइयाँ

उपरोक्त मॉडल में इनपुट और आउटपुट के बीच दो मध्यवर्ती या "छिपी हुई" परतें हैं, और Embedding परत को छोड़कर। आउटपुट (इकाइयों, नोड्स या न्यूरॉन्स) की संख्या परत के लिए प्रतिनिधित्व स्थान का आयाम है। दूसरे शब्दों में, आंतरिक प्रतिनिधित्व सीखने के दौरान नेटवर्क की स्वतंत्रता की मात्रा की अनुमति है।

यदि किसी मॉडल में अधिक छिपी हुई इकाइयां (एक उच्च-आयामी प्रतिनिधित्व स्थान), और / या अधिक परतें हैं, तो नेटवर्क अधिक जटिल प्रतिनिधित्व सीख सकता है। हालांकि, यह नेटवर्क को अधिक कम्प्यूटेशनल रूप से महंगा बनाता है और अवांछित पैटर्न सीखने के लिए प्रेरित कर सकता है - पैटर्न जो प्रशिक्षण डेटा पर प्रदर्शन में सुधार करते हैं, लेकिन परीक्षण डेटा पर नहीं। इसे ओवरफिटिंग कहा जाता है

हानि समारोह और अनुकूलक

एक मॉडल को एक हानि समारोह और प्रशिक्षण के लिए एक अनुकूलक की आवश्यकता होती है। चूंकि यह एक द्विआधारी वर्गीकरण समस्या है और मॉडल एक प्रायिकता ( binary_crossentropy सक्रियण के साथ एक एकल-इकाई परत) को binary_crossentropy करता है, हम binary_crossentropy हानि फ़ंक्शन का उपयोग करेंगे।

model.compile(
    optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

एक सत्यापन सेट बनाएँ

प्रशिक्षण के दौरान, हम उस मॉडल की सटीकता की जांच करना चाहते हैं जो पहले नहीं देखी गई है। मूल प्रशिक्षण डेटा के एक अंश को अलग करके एक सत्यापन सेट बनाएं। (अब परीक्षण सेट का उपयोग क्यों नहीं करते? हमारा लक्ष्य केवल प्रशिक्षण डेटा का उपयोग करके हमारे मॉडल को विकसित और ट्यून करना है, फिर हमारी सटीकता का मूल्यांकन करने के लिए सिर्फ एक बार परीक्षण डेटा का उपयोग करें)।

इस ट्यूटोरियल में, हम प्रारंभिक प्रशिक्षण नमूनों का लगभग 10% (25000 का 10%) प्रशिक्षण के लिए लेबल किए गए डेटा के रूप में और शेष सत्यापन डेटा के रूप में लेते हैं। चूंकि प्रारंभिक ट्रेन / परीक्षण विभाजन 50/50 (प्रत्येक 25000 नमूने) थे, अब हमारे पास प्रभावी ट्रेन / सत्यापन / परीक्षण विभाजन 5/45/50 है।

ध्यान दें कि 'train_dataset' को पहले ही बैचेन और शिल्ड किया जा चुका है।

validation_fraction = 0.9
validation_size = int(validation_fraction *
                      int(training_samples_count / HPARAMS.batch_size))
print(validation_size)
validation_dataset = train_dataset.take(validation_size)
train_dataset = train_dataset.skip(validation_size)
175

मॉडल को प्रशिक्षित करें

मॉडल को मिनी-बैचों में प्रशिक्षित करें। प्रशिक्षण के दौरान, सत्यापन सेट पर मॉडल के नुकसान और सटीकता की निगरानी करें:

history = model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=HPARAMS.train_epochs,
    verbose=1)
Epoch 1/10
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/functional.py:543: UserWarning: Input dict contained keys ['NL_nbr_0_words', 'NL_nbr_1_words', 'NL_nbr_0_weight', 'NL_nbr_1_weight'] which did not match any model input. They will be ignored by the model.
  [n for n in tensors.keys() if n not in ref_input_names])
21/21 [==============================] - 19s 917ms/step - loss: 0.6930 - accuracy: 0.5081 - val_loss: 0.6924 - val_accuracy: 0.5518
Epoch 2/10
21/21 [==============================] - 18s 878ms/step - loss: 0.6902 - accuracy: 0.5319 - val_loss: 0.6587 - val_accuracy: 0.6465
Epoch 3/10
21/21 [==============================] - 18s 879ms/step - loss: 0.6338 - accuracy: 0.6731 - val_loss: 0.5882 - val_accuracy: 0.7310
Epoch 4/10
21/21 [==============================] - 18s 872ms/step - loss: 0.4889 - accuracy: 0.7854 - val_loss: 0.4445 - val_accuracy: 0.8047
Epoch 5/10
21/21 [==============================] - 18s 872ms/step - loss: 0.3911 - accuracy: 0.8369 - val_loss: 0.3870 - val_accuracy: 0.8352
Epoch 6/10
21/21 [==============================] - 18s 877ms/step - loss: 0.3544 - accuracy: 0.8542 - val_loss: 0.3420 - val_accuracy: 0.8571
Epoch 7/10
21/21 [==============================] - 19s 900ms/step - loss: 0.3262 - accuracy: 0.8700 - val_loss: 0.3135 - val_accuracy: 0.8762
Epoch 8/10
21/21 [==============================] - 18s 871ms/step - loss: 0.2770 - accuracy: 0.8977 - val_loss: 0.2739 - val_accuracy: 0.8923
Epoch 9/10
21/21 [==============================] - 18s 872ms/step - loss: 0.2863 - accuracy: 0.8958 - val_loss: 0.2703 - val_accuracy: 0.8942
Epoch 10/10
21/21 [==============================] - 18s 875ms/step - loss: 0.2232 - accuracy: 0.9150 - val_loss: 0.2543 - val_accuracy: 0.9037

मॉडल का मूल्यांकन करें

अब, आइए देखें कि मॉडल कैसे प्रदर्शन करता है। दो मान लौटाए जाएंगे। हानि (एक संख्या जो हमारी त्रुटि का प्रतिनिधित्व करती है, कम मूल्य बेहतर हैं), और सटीकता।

results = model.evaluate(test_dataset, steps=HPARAMS.eval_steps)
print(results)
196/196 [==============================] - 16s 82ms/step - loss: 0.3748 - accuracy: 0.8500
[0.37483155727386475, 0.8500000238418579]

समय के साथ सटीकता / हानि का ग्राफ बनाएं

model.fit() एक History वस्तु देता है जिसमें प्रशिक्षण के दौरान हुई हर चीज़ के साथ एक शब्दकोष होता है:

history_dict = history.history
history_dict.keys()
dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])

चार प्रविष्टियाँ हैं: प्रशिक्षण और सत्यापन के दौरान प्रत्येक मॉनिटर किए गए मीट्रिक के लिए एक। हम इनका उपयोग प्रशिक्षण और सत्यापन हानि की तुलना करने के लिए कर सकते हैं, साथ ही प्रशिक्षण और सत्यापन सटीकता:

acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
loss = history_dict['loss']
val_loss = history_dict['val_loss']

epochs = range(1, len(acc) + 1)

# "-r^" is for solid red line with triangle markers.
plt.plot(epochs, loss, '-r^', label='Training loss')
# "-b0" is for solid blue line with circle markers.
plt.plot(epochs, val_loss, '-bo', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='best')

plt.show()

पींग

plt.clf()   # clear figure

plt.plot(epochs, acc, '-r^', label='Training acc')
plt.plot(epochs, val_acc, '-bo', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='best')

plt.show()

पींग

ध्यान दें कि प्रशिक्षण की अवधि प्रत्येक अवधि के साथ घट जाती है और प्रत्येक युग के साथ प्रशिक्षण सटीकता बढ़ जाती है । ग्रेडिएंट डिसेंट ऑप्टिमाइज़ेशन का उपयोग करते समय यह उम्मीद की जाती है - इसे प्रत्येक पुनरावृत्ति पर वांछित मात्रा को कम करना चाहिए।

ग्राफ नियमितीकरण

अब हम ऊपर बनाए गए बेस मॉडल का उपयोग करके ग्राफ नियमितीकरण की कोशिश करने के लिए तैयार हैं। हम ग्राफ नियमितीकरण को शामिल करने के लिए आधार (द्वि-LSTM) मॉडल को लपेटने के लिए न्यूरल स्ट्रक्चर्ड लर्निंग फ्रेमवर्क द्वारा प्रदान की गई GraphRegularization आवरण श्रेणी का उपयोग करेंगे। ग्राफ-नियमित मॉडल के प्रशिक्षण और मूल्यांकन के लिए बाकी चरण आधार मॉडल के समान हैं।

ग्राफ-नियमित मॉडल बनाएं

ग्राफ नियमितीकरण के वृद्धिशील लाभ का आकलन करने के लिए, हम एक नया आधार मॉडल उदाहरण बनाएंगे। इसका कारण यह है है model पहले से ही कुछ पुनरावृत्तियों के लिए प्रशिक्षित किया गया है, और इस प्रशिक्षित मॉडल पुन: उपयोग एक ग्राफ-नियमित मॉडल बनाने के लिए के लिए एक निष्पक्ष तुलना नहीं होगा model

# Build a new base LSTM model.
base_reg_model = make_bilstm_model()
# Wrap the base model with graph regularization.
graph_reg_config = nsl.configs.make_graph_reg_config(
    max_neighbors=HPARAMS.num_neighbors,
    multiplier=HPARAMS.graph_regularization_multiplier,
    distance_type=HPARAMS.distance_type,
    sum_over_axis=-1)
graph_reg_model = nsl.keras.GraphRegularization(base_reg_model,
                                                graph_reg_config)
graph_reg_model.compile(
    optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

मॉडल को प्रशिक्षित करें

graph_reg_history = graph_reg_model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=HPARAMS.train_epochs,
    verbose=1)
Epoch 1/10
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/framework/indexed_slices.py:432: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.
  "Converting sparse IndexedSlices to a dense Tensor of unknown shape. "
21/21 [==============================] - 22s 1s/step - loss: 0.6925 - accuracy: 0.5135 - scaled_graph_loss: 7.8682e-06 - val_loss: 0.6925 - val_accuracy: 0.5207
Epoch 2/10
21/21 [==============================] - 22s 1s/step - loss: 0.6902 - accuracy: 0.5373 - scaled_graph_loss: 2.3502e-05 - val_loss: 0.6591 - val_accuracy: 0.6627
Epoch 3/10
21/21 [==============================] - 21s 981ms/step - loss: 0.6376 - accuracy: 0.6942 - scaled_graph_loss: 0.0028 - val_loss: 0.6867 - val_accuracy: 0.5343
Epoch 4/10
21/21 [==============================] - 20s 975ms/step - loss: 0.6240 - accuracy: 0.7031 - scaled_graph_loss: 9.6606e-04 - val_loss: 0.5891 - val_accuracy: 0.7572
Epoch 5/10
21/21 [==============================] - 20s 973ms/step - loss: 0.5111 - accuracy: 0.7896 - scaled_graph_loss: 0.0059 - val_loss: 0.4260 - val_accuracy: 0.8207
Epoch 6/10
21/21 [==============================] - 21s 981ms/step - loss: 0.3816 - accuracy: 0.8508 - scaled_graph_loss: 0.0157 - val_loss: 0.3182 - val_accuracy: 0.8682
Epoch 7/10
21/21 [==============================] - 20s 976ms/step - loss: 0.3488 - accuracy: 0.8704 - scaled_graph_loss: 0.0202 - val_loss: 0.3156 - val_accuracy: 0.8749
Epoch 8/10
21/21 [==============================] - 20s 973ms/step - loss: 0.3227 - accuracy: 0.8815 - scaled_graph_loss: 0.0198 - val_loss: 0.2746 - val_accuracy: 0.8932
Epoch 9/10
21/21 [==============================] - 21s 1s/step - loss: 0.3058 - accuracy: 0.8958 - scaled_graph_loss: 0.0220 - val_loss: 0.2938 - val_accuracy: 0.8833
Epoch 10/10
21/21 [==============================] - 21s 979ms/step - loss: 0.2789 - accuracy: 0.9008 - scaled_graph_loss: 0.0233 - val_loss: 0.2622 - val_accuracy: 0.8981

मॉडल का मूल्यांकन करें

graph_reg_results = graph_reg_model.evaluate(test_dataset, steps=HPARAMS.eval_steps)
print(graph_reg_results)
196/196 [==============================] - 16s 82ms/step - loss: 0.3543 - accuracy: 0.8508
[0.354336142539978, 0.8507599830627441]

समय के साथ सटीकता / हानि का ग्राफ बनाएं

graph_reg_history_dict = graph_reg_history.history
graph_reg_history_dict.keys()
dict_keys(['loss', 'accuracy', 'scaled_graph_loss', 'val_loss', 'val_accuracy'])

शब्दकोश में कुल पाँच प्रविष्टियाँ हैं: प्रशिक्षण हानि, प्रशिक्षण सटीकता, प्रशिक्षण ग्राफ़ हानि, सत्यापन हानि, और सत्यापन सटीकता। हम उन सभी को एक साथ तुलना के लिए साजिश कर सकते हैं। ध्यान दें कि प्रशिक्षण के दौरान केवल ग्राफ़ हानि की गणना की जाती है।

acc = graph_reg_history_dict['accuracy']
val_acc = graph_reg_history_dict['val_accuracy']
loss = graph_reg_history_dict['loss']
graph_loss = graph_reg_history_dict['scaled_graph_loss']
val_loss = graph_reg_history_dict['val_loss']

epochs = range(1, len(acc) + 1)

plt.clf()   # clear figure

# "-r^" is for solid red line with triangle markers.
plt.plot(epochs, loss, '-r^', label='Training loss')
# "-gD" is for solid green line with diamond markers.
plt.plot(epochs, graph_loss, '-gD', label='Training graph loss')
# "-b0" is for solid blue line with circle markers.
plt.plot(epochs, val_loss, '-bo', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(loc='best')

plt.show()

पींग

plt.clf()   # clear figure

plt.plot(epochs, acc, '-r^', label='Training acc')
plt.plot(epochs, val_acc, '-bo', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(loc='best')

plt.show()

पींग

अर्ध-पर्यवेक्षित सीखने की शक्ति

अर्ध-पर्यवेक्षित शिक्षण और अधिक विशेष रूप से, इस ट्यूटोरियल के संदर्भ में ग्राफ नियमितीकरण, वास्तव में शक्तिशाली हो सकता है जब प्रशिक्षण डेटा की मात्रा छोटी होती है। प्रशिक्षण के आंकड़ों की कमी की भरपाई प्रशिक्षण के नमूनों के बीच समानता का लाभ उठाकर की जाती है, जो कि पारंपरिक पर्यवेक्षित शिक्षण में संभव नहीं है।

हम पर्यवेक्षण के अनुपात को प्रशिक्षण के नमूने के अनुपात के रूप में परिभाषित करते हैं, जिसमें कुल नमूनों की संख्या शामिल है जिसमें प्रशिक्षण, सत्यापन और परीक्षण नमूने शामिल हैं। इस नोटबुक में, हमने बेस मॉडल के साथ-साथ ग्राफ-नियमित मॉडल दोनों के प्रशिक्षण के लिए 0.05 (यानी लेबल डेटा का 5%) का पर्यवेक्षण अनुपात का उपयोग किया है। हम नीचे दिए गए सेल में मॉडल सटीकता पर पर्यवेक्षण अनुपात के प्रभाव का वर्णन करते हैं।

# Accuracy values for both the Bi-LSTM model and the feed forward NN model have
# been precomputed for the following supervision ratios.

supervision_ratios = [0.3, 0.15, 0.05, 0.03, 0.02, 0.01, 0.005]

model_tags = ['Bi-LSTM model', 'Feed Forward NN model']
base_model_accs = [[84, 84, 83, 80, 65, 52, 50], [87, 86, 76, 74, 67, 52, 51]]
graph_reg_model_accs = [[84, 84, 83, 83, 65, 63, 50],
                        [87, 86, 80, 75, 67, 52, 50]]

plt.clf()  # clear figure

fig, axes = plt.subplots(1, 2)
fig.set_size_inches((12, 5))

for ax, model_tag, base_model_acc, graph_reg_model_acc in zip(
    axes, model_tags, base_model_accs, graph_reg_model_accs):

  # "-r^" is for solid red line with triangle markers.
  ax.plot(base_model_acc, '-r^', label='Base model')
  # "-gD" is for solid green line with diamond markers.
  ax.plot(graph_reg_model_acc, '-gD', label='Graph-regularized model')
  ax.set_title(model_tag)
  ax.set_xlabel('Supervision ratio')
  ax.set_ylabel('Accuracy(%)')
  ax.set_ylim((25, 100))
  ax.set_xticks(range(len(supervision_ratios)))
  ax.set_xticklabels(supervision_ratios)
  ax.legend(loc='best')

plt.show()
<Figure size 432x288 with 0 Axes>

पींग

यह देखा जा सकता है कि जैसे-जैसे सुपरविजन अनुपात घटता है, मॉडल की सटीकता भी घटती जाती है। यह बेस मॉडल के लिए और ग्राफ-नियमित मॉडल के लिए उपयोग किए गए मॉडल आर्किटेक्चर की परवाह किए बिना दोनों के लिए सही है। हालांकि, ध्यान दें कि ग्राफ़-नियमित मॉडल दोनों आर्किटेक्चर के लिए आधार मॉडल से बेहतर प्रदर्शन करता है। विशेष रूप से, द्वि-LSTM मॉडल के लिए, जब पर्यवेक्षण अनुपात 0.01 है, ग्राफ-नियमित मॉडल की सटीकता बेस मॉडल की तुलना में ~ 20% अधिक है। यह मुख्य रूप से ग्राफ-नियमित मॉडल के लिए अर्ध-पर्यवेक्षणीय सीखने के कारण है, जहां प्रशिक्षण नमूनों के बीच संरचनात्मक समानता स्वयं प्रशिक्षण नमूनों के अलावा उपयोग की जाती है।

निष्कर्ष

जब हम इनपुट में एक स्पष्ट ग्राफ नहीं है तब भी हमने न्यूरो स्ट्रक्चर्ड लर्निंग (NSL) ढांचे का उपयोग करके ग्राफ नियमितीकरण के उपयोग का प्रदर्शन किया है। हमने IMDB मूवी रिव्यू के सेंटिमेंट वर्गीकरण के कार्य पर विचार किया, जिसके लिए हमने समीक्षा एम्बेडिंग के आधार पर एक समानता ग्राफ को संश्लेषित किया। हम उपयोगकर्ताओं को हाइपरपरमेटर्स, पर्यवेक्षण की मात्रा और विभिन्न मॉडल आर्किटेक्चर का उपयोग करके आगे प्रयोग करने के लिए प्रोत्साहित करते हैं।