সাহায্য Kaggle উপর TensorFlow সঙ্গে গ্রেট বেরিয়ার রিফ রক্ষা চ্যালেঞ্জ যোগদান

চলচ্চিত্রের প্রস্তাব: পুনরুদ্ধার

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

বাস্তব-বিশ্বের সুপারিশকারী সিস্টেমগুলি প্রায়শই দুটি পর্যায়ে গঠিত হয়:

  1. পুনরুদ্ধার পর্যায় সমস্ত সম্ভাব্য প্রার্থীদের থেকে শত শত প্রার্থীর একটি প্রাথমিক সেট নির্বাচন করার জন্য দায়ী। এই মডেলটির মূল উদ্দেশ্য হল ব্যবহারকারীর আগ্রহ নেই এমন সমস্ত প্রার্থীকে দক্ষতার সাথে আউট করা। কারণ পুনরুদ্ধার মডেলটি লক্ষ লক্ষ প্রার্থীর সাথে কাজ করতে পারে, এটি গণনাগতভাবে দক্ষ হতে হবে।
  2. র‌্যাঙ্কিং পর্যায়টি পুনরুদ্ধার মডেলের আউটপুট নেয় এবং সেরা সম্ভাব্য মুষ্টিমেয় সুপারিশগুলি নির্বাচন করতে তাদের সূক্ষ্ম সুর করে। এর কাজ হল সম্ভাব্য প্রার্থীদের একটি সংক্ষিপ্ত তালিকায় ব্যবহারকারী আগ্রহী হতে পারে এমন আইটেমগুলির সেটকে সংকুচিত করা।

এই টিউটোরিয়ালে, আমরা প্রথম পর্যায়ে, পুনরুদ্ধারের উপর ফোকাস করতে যাচ্ছি। আপনি র্যাংকিং পর্যায়ে আগ্রহী, আমাদের কটাক্ষপাত আছে র্যাংকিং টিউটোরিয়াল।

পুনরুদ্ধার মডেলগুলি প্রায়শই দুটি উপ-মডেল নিয়ে গঠিত:

  1. একটি ক্যোয়ারী মডেল ক্যোয়ারী বৈশিষ্ট্য ব্যবহার করে ক্যোয়ারী উপস্থাপনা (সাধারণত একটি স্থির-মাত্রিকতা এম্বেডিং ভেক্টর) গণনা করে।
  2. প্রার্থীর বৈশিষ্ট্যগুলি ব্যবহার করে প্রার্থীর প্রতিনিধিত্ব (একটি সমান আকারের ভেক্টর) গণনা করা একটি প্রার্থী মডেল

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

এই টিউটোরিয়ালে, আমরা মুভিলেন্স ডেটাসেট ব্যবহার করে এমন একটি টু-টাওয়ার মডেল তৈরি এবং প্রশিক্ষণ দিতে যাচ্ছি।

আমরা যাচ্ছি:

  1. আমাদের ডেটা পান এবং এটিকে একটি প্রশিক্ষণ এবং পরীক্ষার সেটে ভাগ করুন।
  2. একটি পুনরুদ্ধার মডেল বাস্তবায়ন.
  3. ফিট এবং এটি মূল্যায়ন.
  4. একটি আনুমানিক নিকটতম প্রতিবেশী (ANN) সূচক তৈরি করে দক্ষ পরিবেশনের জন্য এটি রপ্তানি করুন।

ডেটাসেট

Movielens ডেটা সেটটি থেকে একটি ক্লাসিক ডেটা সেটটি হয় GroupLens মিনেসোটা বিশ্ববিদ্যালয়ের গ্রুপ খোঁজ খবর নেন। এটিতে ব্যবহারকারীদের একটি সেট দ্বারা সিনেমাগুলিকে দেওয়া রেটিংগুলির একটি সেট রয়েছে এবং এটি সুপারিশকারী সিস্টেম গবেষণার একটি ওয়ার্কহরস।

ডেটা দুটি উপায়ে চিকিত্সা করা যেতে পারে:

  1. ব্যবহারকারীরা কোন সিনেমা দেখেছেন (এবং রেট দিয়েছেন) এবং কোনটি দেখেননি তা প্রকাশ করার জন্য এটিকে ব্যাখ্যা করা যেতে পারে। এটি একটি অন্তর্নিহিত প্রতিক্রিয়া, যেখানে ব্যবহারকারীদের ঘড়ি আমাদের বলে যে তারা কোন জিনিসগুলি দেখতে পছন্দ করে এবং কোনটি তারা দেখতে চায় না৷
  2. ব্যবহারকারীরা তাদের দেখেছেন এমন সিনেমাগুলি কতটা পছন্দ করেছে তা প্রকাশ করার জন্য এটিও দেখা যেতে পারে। এটি সুস্পষ্ট প্রতিক্রিয়ার একটি রূপ: একজন ব্যবহারকারী একটি সিনেমা দেখেছেন, আমরা তাদের দেওয়া রেটিং দেখে মোটামুটিভাবে বলতে পারি যে তারা কতটা পছন্দ করেছে।

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

আমদানি

চলুন প্রথমে আমাদের আমদানি বন্ধ করে দেওয়া যাক।

pip install -q tensorflow-recommenders
pip install -q --upgrade tensorflow-datasets
pip install -q scann
import os
import pprint
import tempfile

from typing import Dict, Text

import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_recommenders as tfrs

ডেটাসেট প্রস্তুত করা হচ্ছে

আসুন প্রথমে তথ্যটি দেখে নেওয়া যাক।

আমরা থেকে MovieLens ডেটা সেটটি ব্যবহার Tensorflow ডেটাসেটস । লোড হচ্ছে movielens/100k_ratings একটি উৎপাদ tf.data.Dataset রেটিং ডেটা এবং লোডিং ধারণকারী বস্তুর movielens/100k_movies উৎপাদনের একটি tf.data.Dataset শুধুমাত্র চলচ্চিত্র তথ্য ধারণকারী অবজেক্ট।

লক্ষ্য করুন MovieLens নেই ডেটা সেটটি টুকরা পূর্বনির্ধারিত না যেহেতু, সমস্ত ডেটা অধীনে আছে train বিভক্ত।

# Ratings data.
ratings = tfds.load("movielens/100k-ratings", split="train")
# Features of all the available movies.
movies = tfds.load("movielens/100k-movies", split="train")
2021-10-02 11:05:34.633747: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected

রেটিং ডেটাসেট মুভি আইডি, ব্যবহারকারী আইডি, নির্ধারিত রেটিং, টাইমস্ট্যাম্প, চলচ্চিত্রের তথ্য এবং ব্যবহারকারীর তথ্যের একটি অভিধান প্রদান করে:

for x in ratings.take(1).as_numpy_iterator():
  pprint.pprint(x)
{'bucketized_user_age': 45.0,
 'movie_genres': array([7]),
 'movie_id': b'357',
 'movie_title': b"One Flew Over the Cuckoo's Nest (1975)",
 'raw_user_age': 46.0,
 'timestamp': 879024327,
 'user_gender': True,
 'user_id': b'138',
 'user_occupation_label': 4,
 'user_occupation_text': b'doctor',
 'user_rating': 4.0,
 'user_zip_code': b'53211'}
2021-10-02 11:05:35.718641: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

মুভি ডেটাসেটে মুভি আইডি, মুভির শিরোনাম এবং এটি কোন জেনারের সাথে সম্পর্কিত ডেটা থাকে৷ লক্ষ্য করুন যে জেনারগুলি পূর্ণসংখ্যা লেবেলগুলির সাথে এনকোড করা হয়েছে৷

for x in movies.take(1).as_numpy_iterator():
  pprint.pprint(x)
{'movie_genres': array([4]),
 'movie_id': b'1681',
 'movie_title': b'You So Crazy (1994)'}
2021-10-02 11:05:35.893098: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

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

আমরা কেবলমাত্র রাখা user_id এবং movie_title ডেটাসেটে ক্ষেত্র।

ratings = ratings.map(lambda x: {
    "movie_title": x["movie_title"],
    "user_id": x["user_id"],
})
movies = movies.map(lambda x: x["movie_title"])

মডেলটি মানানসই এবং মূল্যায়ন করার জন্য, আমাদের এটিকে একটি প্রশিক্ষণ এবং মূল্যায়ন সেটে বিভক্ত করতে হবে। একটি শিল্প recommender ব্যবস্থায়, এই সম্ভবত সময় দ্বারা সম্পন্ন করা হবে: সময় পর্যন্ত ডেটা \(T\) পর পারস্পরিক ক্রিয়ার ভবিষ্যদ্বাণী করা ব্যবহার করা হবে \(T\)।

এই সাধারণ উদাহরণে, যাইহোক, চলুন একটি র্যান্ডম স্প্লিট ব্যবহার করা যাক, 80% রেটিং ট্রেন সেটে এবং 20% পরীক্ষা সেটে।

tf.random.set_seed(42)
shuffled = ratings.shuffle(100_000, seed=42, reshuffle_each_iteration=False)

train = shuffled.take(80_000)
test = shuffled.skip(80_000).take(20_000)

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

এটি গুরুত্বপূর্ণ কারণ আমাদের মডেলগুলিতে এম্বেডিং ভেক্টরগুলিতে আমাদের শ্রেণীবদ্ধ বৈশিষ্ট্যগুলির কাঁচা মানগুলিকে ম্যাপ করতে সক্ষম হতে হবে। এটি করার জন্য, আমাদের একটি শব্দভাণ্ডার প্রয়োজন যা একটি সংলগ্ন পরিসরে একটি পূর্ণসংখ্যার সাথে একটি কাঁচা বৈশিষ্ট্য মান ম্যাপ করে: এটি আমাদের এম্বেডিং টেবিলে সংশ্লিষ্ট এমবেডিংগুলি সন্ধান করতে দেয়৷

movie_titles = movies.batch(1_000)
user_ids = ratings.batch(1_000_000).map(lambda x: x["user_id"])

unique_movie_titles = np.unique(np.concatenate(list(movie_titles)))
unique_user_ids = np.unique(np.concatenate(list(user_ids)))

unique_movie_titles[:10]
array([b"'Til There Was You (1997)", b'1-900 (1994)',
       b'101 Dalmatians (1996)', b'12 Angry Men (1957)', b'187 (1997)',
       b'2 Days in the Valley (1996)',
       b'20,000 Leagues Under the Sea (1954)',
       b'2001: A Space Odyssey (1968)',
       b'3 Ninjas: High Noon At Mega Mountain (1998)',
       b'39 Steps, The (1935)'], dtype=object)

একটি মডেল বাস্তবায়ন

আমাদের মডেলের আর্কিটেকচার নির্বাচন করা মডেলিংয়ের একটি মূল অংশ।

যেহেতু আমরা একটি দুই-টাওয়ার পুনরুদ্ধার মডেল তৈরি করছি, আমরা প্রতিটি টাওয়ার আলাদাভাবে তৈরি করতে পারি এবং তারপরে চূড়ান্ত মডেলে তাদের একত্রিত করতে পারি।

কোয়েরি টাওয়ার

ক্যোয়ারী টাওয়ার দিয়ে শুরু করা যাক।

প্রথম ধাপ হল ক্যোয়ারী এবং প্রার্থীর প্রতিনিধিত্বের মাত্রার উপর সিদ্ধান্ত নেওয়া:

embedding_dimension = 32

উচ্চতর মানগুলি এমন মডেলগুলির সাথে মিলে যাবে যেগুলি আরও নির্ভুল হতে পারে, তবে ফিট হতে ধীর হবে এবং অতিরিক্ত ফিট করার প্রবণতাও বেশি হবে৷

দ্বিতীয়টি হল মডেল নিজেই সংজ্ঞায়িত করা। এখানে, আমরা পূর্ণসংখ্যার প্রথম ধর্মান্তরিত ব্যবহারকারী আইডি থেকে Keras preprocessing স্তর ব্যবহার, এবং তারপর একটি মাধ্যমে ব্যবহারকারী embeddings সেই রূপান্তর করতে যাচ্ছেন Embedding স্তর। মনে রাখবেন যে আমরা একটি শব্দভাণ্ডার হিসাবে আগে গণনা করা অনন্য ব্যবহারকারী আইডিগুলির তালিকা ব্যবহার করি:

user_model = tf.keras.Sequential([
  tf.keras.layers.StringLookup(
      vocabulary=unique_user_ids, mask_token=None),
  # We add an additional embedding to account for unknown tokens.
  tf.keras.layers.Embedding(len(unique_user_ids) + 1, embedding_dimension)
])

এই মত সরল মডেল একটি ক্লাসিক থেকে হুবহু অনুরূপ ম্যাট্রিক্স গুণকনির্ণয় পদ্ধতির। একটি উপশ্রেণী সংজ্ঞা যদিও tf.keras.Model এই সহজ মডেল জন্য Overkill হতে পারে, আমরা সহজেই এটি একটি ইচ্ছামত জটিল মডেলের মান Keras উপাদান ব্যবহার করে প্রসারিত করতে পারেন, যতদিন আমরা একটি আসতে embedding_dimension শেষে -wide আউটপুট।

প্রার্থী টাওয়ার

প্রার্থী টাওয়ারের ক্ষেত্রেও আমরা একই কাজ করতে পারি।

movie_model = tf.keras.Sequential([
  tf.keras.layers.StringLookup(
      vocabulary=unique_movie_titles, mask_token=None),
  tf.keras.layers.Embedding(len(unique_movie_titles) + 1, embedding_dimension)
])

মেট্রিক্স

আমাদের প্রশিক্ষণ ডেটাতে আমাদের ইতিবাচক (ব্যবহারকারী, চলচ্চিত্র) জোড়া রয়েছে। আমাদের মডেলটি কতটা ভাল তা বোঝার জন্য, আমাদের মডেলটি এই জুটির জন্য অন্যান্য সম্ভাব্য প্রার্থীদের স্কোরের সাথে যে অ্যাফিনিটি স্কোর গণনা করে তা তুলনা করতে হবে: যদি ইতিবাচক জুটির স্কোর অন্য সমস্ত প্রার্থীদের চেয়ে বেশি হয়, আমাদের মডেল অত্যন্ত নির্ভুল।

এই কাজের জন্য, আমরা ব্যবহার করতে পারি tfrs.metrics.FactorizedTopK মেট্রিক। মেট্রিকের একটি প্রয়োজনীয় যুক্তি রয়েছে: প্রার্থীদের ডেটাসেট যা মূল্যায়নের জন্য অন্তর্নিহিত নেতিবাচক হিসাবে ব্যবহৃত হয়।

আমাদের ক্ষেত্রে, যে সালে movies ডেটা সেটটি, আমাদের সিনেমা মডেল মাধ্যমে embeddings রূপান্তরিত:

metrics = tfrs.metrics.FactorizedTopK(
  candidates=movies.batch(128).map(movie_model)
)

ক্ষতি

পরবর্তী উপাদান আমাদের মডেল প্রশিক্ষণ ব্যবহৃত ক্ষতি. এটি সহজ করার জন্য TFRS-এর বেশ কয়েকটি ক্ষতির স্তর এবং কাজ রয়েছে।

এই ইনস্ট্যান্সের মধ্যে, আমরা ব্যবহার করতে পাবেন Retrieval যে থোকায় থোকায় একসঙ্গে ক্ষতি ফাংশন এবং মেট্রিক গণনার মোড়কের একটি সুবিধার: কাজের বস্তু:

task = tfrs.tasks.Retrieval(
  metrics=metrics
)

টাস্কটি নিজেই একটি কেরাস স্তর যা ক্যোয়ারী এবং প্রার্থী এমবেডিংগুলিকে আর্গুমেন্ট হিসাবে নেয় এবং গণনাকৃত ক্ষতি ফেরত দেয়: আমরা মডেলের প্রশিক্ষণ লুপ বাস্তবায়ন করতে এটি ব্যবহার করব।

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

আমরা এখন একটি মডেল হিসাবে এটি সব একসাথে রাখতে পারেন. TFRS একটি বেস মডেল শ্রেণী (অনাবৃত tfrs.models.Model ) যা বিল্ডিং মডেল streamlines: সব আমরা কি করতে প্রয়োজন উপাদান স্থাপন হয় __init__ পদ্ধতি, এবং বাস্তবায়ন compute_loss পদ্ধতি, কাঁচা বৈশিষ্ট্য গ্রহণ এবং একটি ক্ষতি মান ফিরে .

বেস মডেল তখন আমাদের মডেলের সাথে মানানসই উপযুক্ত প্রশিক্ষণ লুপ তৈরি করার যত্ন নেবে।

class MovielensModel(tfrs.Model):

  def __init__(self, user_model, movie_model):
    super().__init__()
    self.movie_model: tf.keras.Model = movie_model
    self.user_model: tf.keras.Model = user_model
    self.task: tf.keras.layers.Layer = task

  def compute_loss(self, features: Dict[Text, tf.Tensor], training=False) -> tf.Tensor:
    # We pick out the user features and pass them into the user model.
    user_embeddings = self.user_model(features["user_id"])
    # And pick out the movie features and pass them into the movie model,
    # getting embeddings back.
    positive_movie_embeddings = self.movie_model(features["movie_title"])

    # The task computes the loss and the metrics.
    return self.task(user_embeddings, positive_movie_embeddings)

tfrs.Model বেস বর্গ একটি কেবল সুবিধার বর্গ: এটি আমাদের একই পদ্ধতি ব্যবহার করে উভয় প্রশিক্ষণ ও পরীক্ষা লোকসান গনা করতে পারবেন।

হুডের নীচে, এটি এখনও একটি সাধারণ কেরাস মডেল। আপনি এর থেকে উত্তরাধিকার সূত্রে প্রাপ্ত একই কার্যকারিতা অর্জন করতে পারে tf.keras.Model এবং অগ্রাহ্য train_step এবং test_step ফাংশন (দেখুন নির্দেশিকা বিস্তারিত জানার জন্য):

class NoBaseClassMovielensModel(tf.keras.Model):

  def __init__(self, user_model, movie_model):
    super().__init__()
    self.movie_model: tf.keras.Model = movie_model
    self.user_model: tf.keras.Model = user_model
    self.task: tf.keras.layers.Layer = task

  def train_step(self, features: Dict[Text, tf.Tensor]) -> tf.Tensor:

    # Set up a gradient tape to record gradients.
    with tf.GradientTape() as tape:

      # Loss computation.
      user_embeddings = self.user_model(features["user_id"])
      positive_movie_embeddings = self.movie_model(features["movie_title"])
      loss = self.task(user_embeddings, positive_movie_embeddings)

      # Handle regularization losses as well.
      regularization_loss = sum(self.losses)

      total_loss = loss + regularization_loss

    gradients = tape.gradient(total_loss, self.trainable_variables)
    self.optimizer.apply_gradients(zip(gradients, self.trainable_variables))

    metrics = {metric.name: metric.result() for metric in self.metrics}
    metrics["loss"] = loss
    metrics["regularization_loss"] = regularization_loss
    metrics["total_loss"] = total_loss

    return metrics

  def test_step(self, features: Dict[Text, tf.Tensor]) -> tf.Tensor:

    # Loss computation.
    user_embeddings = self.user_model(features["user_id"])
    positive_movie_embeddings = self.movie_model(features["movie_title"])
    loss = self.task(user_embeddings, positive_movie_embeddings)

    # Handle regularization losses as well.
    regularization_loss = sum(self.losses)

    total_loss = loss + regularization_loss

    metrics = {metric.name: metric.result() for metric in self.metrics}
    metrics["loss"] = loss
    metrics["regularization_loss"] = regularization_loss
    metrics["total_loss"] = total_loss

    return metrics

এই টিউটোরিয়াল তবে আমরা ব্যবহার বিদ্ধ tfrs.Model boilerplate, কিছু মডেলিং এবং দূরে বিমূর্ত আমাদের ফোকাস রাখার বেস বর্গ।

মানানসই এবং মূল্যায়ন

মডেলটি সংজ্ঞায়িত করার পরে, আমরা মডেলটিকে মানানসই এবং মূল্যায়ন করতে মানক কেরাস ফিটিং এবং মূল্যায়ন রুটিন ব্যবহার করতে পারি।

আসুন প্রথমে মডেলটি ইনস্ট্যান্টিয়েট করি।

model = MovielensModel(user_model, movie_model)
model.compile(optimizer=tf.keras.optimizers.Adagrad(learning_rate=0.1))

তারপর প্রশিক্ষণ এবং মূল্যায়ন ডেটা শাফেল করুন, ব্যাচ করুন এবং ক্যাশে করুন।

cached_train = train.shuffle(100_000).batch(8192).cache()
cached_test = test.batch(4096).cache()

তারপর মডেল প্রশিক্ষণ:

model.fit(cached_train, epochs=3)
Epoch 1/3
10/10 [==============================] - 6s 302ms/step - factorized_top_k/top_1_categorical_accuracy: 0.0011 - factorized_top_k/top_5_categorical_accuracy: 0.0094 - factorized_top_k/top_10_categorical_accuracy: 0.0203 - factorized_top_k/top_50_categorical_accuracy: 0.1001 - factorized_top_k/top_100_categorical_accuracy: 0.1772 - loss: 69885.1129 - regularization_loss: 0.0000e+00 - total_loss: 69885.1129
Epoch 2/3
10/10 [==============================] - 3s 286ms/step - factorized_top_k/top_1_categorical_accuracy: 0.0029 - factorized_top_k/top_5_categorical_accuracy: 0.0186 - factorized_top_k/top_10_categorical_accuracy: 0.0376 - factorized_top_k/top_50_categorical_accuracy: 0.1689 - factorized_top_k/top_100_categorical_accuracy: 0.2923 - loss: 67523.3707 - regularization_loss: 0.0000e+00 - total_loss: 67523.3707
Epoch 3/3
10/10 [==============================] - 3s 269ms/step - factorized_top_k/top_1_categorical_accuracy: 0.0036 - factorized_top_k/top_5_categorical_accuracy: 0.0224 - factorized_top_k/top_10_categorical_accuracy: 0.0459 - factorized_top_k/top_50_categorical_accuracy: 0.1880 - factorized_top_k/top_100_categorical_accuracy: 0.3162 - loss: 66302.9609 - regularization_loss: 0.0000e+00 - total_loss: 66302.9609
<keras.callbacks.History at 0x7f560e5ea090>

আপনি TensorBoard সঙ্গে ট্রেনিং প্রক্রিয়াটির নিরীক্ষণ করতে চান, আপনি মাপসই () ফাংশনে একটি TensorBoard কলব্যাক যোগ করতে পারেন এবং তারপর ব্যবহার TensorBoard শুরু %tensorboard --logdir logs/fit । পড়ুন দয়া করে TensorBoard ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য।

মডেল ট্রেনের সাথে সাথে, ক্ষতি কমছে এবং টপ-কে পুনরুদ্ধার মেট্রিক্সের একটি সেট আপডেট করা হয়েছে। এগুলি আমাদের বলে যে সত্যিকারের ইতিবাচকটি সম্পূর্ণ প্রার্থী সেট থেকে পুনরুদ্ধার করা শীর্ষ-কে আইটেমগুলিতে রয়েছে কিনা৷ উদাহরণ স্বরূপ, 0.2-এর একটি টপ-5 ক্যাটাগরিকাল অ্যাকুরেসি মেট্রিক আমাদের বলবে যে, গড়ে, সত্যিকারের ইতিবাচক হল শীর্ষ 5টি পুনরুদ্ধার করা আইটেমের 20% সময়ে।

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

অবশেষে, আমরা পরীক্ষা সেটে আমাদের মডেল মূল্যায়ন করতে পারি:

model.evaluate(cached_test, return_dict=True)
5/5 [==============================] - 2s 149ms/step - factorized_top_k/top_1_categorical_accuracy: 7.5000e-04 - factorized_top_k/top_5_categorical_accuracy: 0.0099 - factorized_top_k/top_10_categorical_accuracy: 0.0226 - factorized_top_k/top_50_categorical_accuracy: 0.1245 - factorized_top_k/top_100_categorical_accuracy: 0.2324 - loss: 31079.0635 - regularization_loss: 0.0000e+00 - total_loss: 31079.0635
{'factorized_top_k/top_1_categorical_accuracy': 0.000750000006519258,
 'factorized_top_k/top_5_categorical_accuracy': 0.009850000031292439,
 'factorized_top_k/top_10_categorical_accuracy': 0.02264999970793724,
 'factorized_top_k/top_50_categorical_accuracy': 0.12449999898672104,
 'factorized_top_k/top_100_categorical_accuracy': 0.23235000669956207,
 'loss': 28244.771484375,
 'regularization_loss': 0,
 'total_loss': 28244.771484375}

টেস্ট সেটের পারফরম্যান্স ট্রেনিং পারফরম্যান্সের চেয়ে অনেক খারাপ। এটি দুটি কারণের কারণে:

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

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

ভবিষ্যদ্বাণী করা

এখন যেহেতু আমাদের একটি মডেল আছে, আমরা ভবিষ্যদ্বাণী করতে সক্ষম হতে চাই। আমরা ব্যবহার করতে পারি tfrs.layers.factorized_top_k.BruteForce স্তর এই কাজ করতে।

# Create a model that takes in raw query features, and
index = tfrs.layers.factorized_top_k.BruteForce(model.user_model)
# recommends movies out of the entire movies dataset.
index.index_from_dataset(
  tf.data.Dataset.zip((movies.batch(100), movies.batch(100).map(model.movie_model)))
)

# Get recommendations.
_, titles = index(tf.constant(["42"]))
print(f"Recommendations for user 42: {titles[0, :3]}")
Recommendations for user 42: [b'Bridges of Madison County, The (1995)'
 b'Father of the Bride Part II (1995)' b'Rudy (1993)']

অবশ্যই, BruteForce স্তর অনেকগুলি সম্ভাব্য প্রার্থী সঙ্গে একটি মডেল সেবা করার জন্য ধীর হতে যাচ্ছে। নিম্নলিখিত বিভাগগুলি আনুমানিক পুনরুদ্ধার সূচক ব্যবহার করে কীভাবে এটির গতি বাড়ানো যায় তা দেখায়।

মডেল পরিবেশন

মডেলটি প্রশিক্ষিত হওয়ার পরে, আমাদের এটি স্থাপন করার একটি উপায় প্রয়োজন।

একটি দ্বি-টাওয়ার পুনরুদ্ধার মডেলে, পরিবেশনের দুটি উপাদান রয়েছে:

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

TFRS-এ, উভয় উপাদানই একটি একক রপ্তানিযোগ্য মডেলে প্যাকেজ করা যেতে পারে, আমাদের একটি মডেল দেয় যা কাঁচা ব্যবহারকারী আইডি নেয় এবং সেই ব্যবহারকারীর জন্য সেরা চলচ্চিত্রের শিরোনাম প্রদান করে। এই করতে মডেল রপ্তানি মাধ্যমে সম্পন্ন করা হয় SavedModel বিন্যাস, যা এটি ব্যবহার সেবা করার জন্য সম্ভব করে তোলে TensorFlow পরিবেশন করছে

এই মত একটি মডেল স্থাপন করার জন্য, আমরা কেবল রপ্তানি BruteForce স্তর আমরা উপরোক্ত তৈরি করা হয়েছে:

# Export the query model.
with tempfile.TemporaryDirectory() as tmp:
  path = os.path.join(tmp, "model")

  # Save the index.
  tf.saved_model.save(index, path)

  # Load it back; can also be done in TensorFlow Serving.
  loaded = tf.saved_model.load(path)

  # Pass a user id in, get top predicted movie titles back.
  scores, titles = loaded(["42"])

  print(f"Recommendations: {titles[0][:3]}")
2021-10-02 11:05:54.109254: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
WARNING:absl:Found untraced functions such as query_with_exclusions while saving (showing 1 of 1). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/tmp7otg6id7/model/assets
INFO:tensorflow:Assets written to: /tmp/tmp7otg6id7/model/assets
Recommendations: [b'Bridges of Madison County, The (1995)'
 b'Father of the Bride Part II (1995)' b'Rudy (1993)']

আমরা ভবিষ্যদ্বাণীর গতি বাড়ানোর জন্য একটি আনুমানিক পুনরুদ্ধার সূচকও রপ্তানি করতে পারি। এটি কয়েক মিলিয়ন প্রার্থীর সেট থেকে দক্ষতার সাথে সুপারিশগুলি প্রকাশ করা সম্ভব করবে।

এটা করার জন্য, আমরা ব্যবহার করতে পারি scann প্যাকেজ। এই TFRS একজন ঐচ্ছিক নির্ভরতা, এবং আমরা এটা কল করে এই টিউটোরিয়ালের শুরুতে আলাদাভাবে ইনস্টল !pip install -q scann

একবার ইনস্টল আমরা TFRS ব্যবহার করতে পারেন ScaNN স্তর:

scann_index = tfrs.layers.factorized_top_k.ScaNN(model.user_model)
scann_index.index_from_dataset(
  tf.data.Dataset.zip((movies.batch(100), movies.batch(100).map(model.movie_model)))
)
<tensorflow_recommenders.layers.factorized_top_k.ScaNN at 0x7f560caffc10>

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

# Get recommendations.
_, titles = scann_index(tf.constant(["42"]))
print(f"Recommendations for user 42: {titles[0, :3]}")
Recommendations for user 42: [b'Sleepless in Seattle (1993)' b'Father of the Bride Part II (1995)'
 b'Hunchback of Notre Dame, The (1996)']

ভজনা জন্য এটা এক্সপোর্ট রপ্তানি মতই সহজ BruteForce স্তর:

# Export the query model.
with tempfile.TemporaryDirectory() as tmp:
  path = os.path.join(tmp, "model")

  # Save the index.
  tf.saved_model.save(
      index,
      path,
      options=tf.saved_model.SaveOptions(namespace_whitelist=["Scann"])
  )

  # Load it back; can also be done in TensorFlow Serving.
  loaded = tf.saved_model.load(path)

  # Pass a user id in, get top predicted movie titles back.
  scores, titles = loaded(["42"])

  print(f"Recommendations: {titles[0][:3]}")
WARNING:absl:Found untraced functions such as query_with_exclusions while saving (showing 1 of 1). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/tmp_rde8grm/model/assets
INFO:tensorflow:Assets written to: /tmp/tmp_rde8grm/model/assets
Recommendations: [b'Bridges of Madison County, The (1995)'
 b'Father of the Bride Part II (1995)' b'Rudy (1993)']

ব্যবহার করে এবং সুরকরণ ফাস্ট আনুমানিক আহরণ মডেল সম্পর্কে আরো জানতে, আমাদের কটাক্ষপাত আছে দক্ষ ভজনা টিউটোরিয়াল।

আইটেম থেকে আইটেম সুপারিশ

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

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

পরবর্তী পদক্ষেপ

এটি পুনরুদ্ধার টিউটোরিয়াল শেষ করে।

এখানে যা উপস্থাপন করা হয়েছে তা প্রসারিত করতে, দেখুন:

  1. মাল্টি-টাস্ক মডেল শেখা: যৌথভাবে রেটিং এবং ক্লিকের জন্য অপ্টিমাইজ করা।
  2. মুভি মেটাডেটা ব্যবহার করা: কোল্ড-স্টার্ট কমাতে আরও জটিল মুভি মডেল তৈরি করা।