মডেলের দুটি ভার্সন নিয়ে A/B টেস্ট করা

নতুন কাস্টম মডেলকে ট্রেনিং দেওয়ার পরে, আপনি A/B Testing ব্যবহার করে দেখতে পারেন যে, নতুন মডেলটি বাস্তব-জগতের পরিস্থিতিতে কেমন পারফর্ম করছে, আপনার আগে থেকে ব্যবহার করা মডেলের তুলনায়। আপনার নতুন মডেলটি যে আরও উন্নত, তা কনফার্ম করার পরে, অ্যাপ আপডেট করার প্রয়োজন ছাড়াই আপনি সহজেই আপনার সব ব্যবহারকারীর জন্য নতুন মডেলটি রোল-আউট করতে পারবেন।

এই পৃষ্ঠায় দেখানো হয়েছে যে কীভাবে আপনি একটি A/B টেস্ট পরিচালনা করতে পারেন যা একটি কাল্পনিক ভিজ্যুয়াল প্ল্যান্ট সার্চ ফিচারের মডেলের দুটি ভার্সন মূল্যায়ন করে। এই ফিচার ব্যবহারকারীদের গাছের ছবি থেকে সেটির প্রজাতি শনাক্ত করতে সাহায্য করার জন্য কাস্টম ইমেজ লেবেলিং মডেল ব্যবহার করে।

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

১. আপনার মডেলকে রিমোট কনফিগারযোগ্য করে তোলা

আপনার মডেলের A/B টেস্টিংয়ের প্রথম ধাপ হল, কোন মডেল ব্যবহার করা হচ্ছে তা নির্ধারণ করতে আপনার অ্যাপকে একটি Remote Config প্যারামিটার ব্যবহার করার জন্য পরিবর্তন করা। প্রাথমিকভাবে, আপনার অ্যাপ যে মডেলটি আগে থেকেই ব্যবহার করে, এই প্যারামিটারের ডিফল্ট মান হিসেবে সেটি সেট করবেন। তবে, মডেলের নাম যেহেতু রিমোট কনফিগার করা যায় এমন প্যারামিটার দ্বারা নিয়ন্ত্রিত হয়, তাই প্রতিবার অ্যাপ আপডেট না করেই আপনি বিভিন্ন মডেল পরিবর্তন করতে ও সেগুলি নিয়ে এক্সপেরিমেন্ট করতে পারবেন।

তাই, আপনি যদি নিজের বর্তমান মডেলটি plant_labeler_v1 নামে প্রকাশ করে থাকেন, তাহলে আপনার অ্যাপ ইনিশিয়ালাইজেশন কোডে, আপনাকে plant_labeler_model প্যারামিটারের ডিফল্ট ভ্যালু হিসেবে plant_labeler_v1 সেট করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Swift

let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
    "plant_labeler_model": "plant_labeler_v1" as NSObject,
    // ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()

Objective-C

FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
  @"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
  // ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];

তারপর, plant_labeler_model প্যারামিটার দ্বারা নির্দিষ্ট করা মডেল লোড করতে আপনার মডেল সেট-আপ কোড পরিবর্তন করুন:

Swift

let rcValue = remoteConfig.configValue(forKey: "plant_labeler_model")
guard let remoteModelName = rcValue.stringValue else { return }

// ...

let remoteModel = RemoteModel(
    name: remoteModelName,
    allowsModelUpdates: true,
    initialConditions: initialConditions,
    updateConditions: updateConditions
)
ModelManager.modelManager().register(remoteModel)

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/ios/use-custom-models#configure_a_local_model

Objective-C

FIRRemoteConfigValue *rcValue = [remoteConfig configValueForKey:@"plant_labeler_model"];
NSString *remoteModelName = [rcValue stringValue];

// ...

FIRRemoteModel *remoteModel = [[FIRRemoteModel alloc] initWithName:remoteModelName
                                                allowsModelUpdates:YES
                                                 initialConditions:initialConditions
                                                  updateConditions:updateConditions];
[[FIRModelManager modelManager] registerRemoteModel:remoteModel];

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

আপনার অ্যাপ এখন কোন মডেল লোড করতে হবে তা নির্ধারণ করার জন্য Remote Config প্যারামিটার ব্যবহার করে। আপনি শুধু একটি নতুন মডেল প্রকাশ করে এবং Remote Config প্যারামিটারে সেটির নাম অ্যাসাইন করে মডেলটি পরিবর্তন করতে পারবেন। এই ক্ষমতা A/B Testingতুলনা করার উদ্দেশ্যে বিভিন্ন ব্যবহারকারীকে বিভিন্ন মডেল অ্যাসাইন করতে দেয়।

চালিয়ে যাওয়ার আগে, আপনার মডেল ডাউনলোড কোডে নিম্নলিখিত বিষয়গুলিও যোগ করুন:

Swift

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let _ = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? RemoteModel,
        model.name == remoteModelName
        else { return }
    // If the model downloaded was specified by a remote parameter, log an
    // event, which will be our experiment's activation event.
    if rcValue.source == .remote {
        Analytics.logEvent("nondefault_model_downloaded", parameters: nil)
    }
}

Objective-C

__weak typeof(self) weakSelf = self;

[NSNotificationCenter.defaultCenter
    addObserverForName:FIRModelDownloadDidSucceedNotification
                object:nil
                 queue:nil
            usingBlock:^(NSNotification *_Nonnull note) {
              if (weakSelf == nil | note.userInfo == nil) {
                return;
              }

              FIRRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
              if ([model.name isEqualToString:remoteModelName] &&
                  rcValue.source == FIRRemoteConfigSourceRemote) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                [FIRAnalytics logEventWithName:@"nondefault_model_downloaded" parameters:nil];
              }
            }];

উপরের কোডটি একটি কাস্টম Analytics ইভেন্ট লগ করে যা আপনি পরে আপনার পরীক্ষার অ্যাক্টিভেশন ইভেন্ট হিসেবে ব্যবহার করবেন। অ্যাক্টিভেশন ইভেন্ট হল এমন একটি ইভেন্ট যা ব্যবহারকারীকে এক্সপেরিমেন্টের অংশ হিসেবে বিবেচনা করার আগে ট্রিগার করতে হবে। এটি নিশ্চিত করে যে ব্যবহারকারীর ডিভাইসে কাস্টম ML মডেল ডাউনলোড করা শেষ না হওয়া পর্যন্ত তাকে আপনার A/B টেস্টে রেকর্ড করা হবে না।

২. লক্ষ্য মেট্রিক নির্ধারণ করা

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

A/B Testing-এ উপার্জন, দৈনিক এনগেজমেন্ট ও ব্যবহারকারী রিটেনশন সহ একাধিক বিল্ট-ইন মেট্রিক আছে। এইসব মেট্রিক প্রায়ই আলাদা আলাদা UX ফ্লো পরীক্ষা করা বা প্যারামিটার ফাইন-টিউন করার জন্য উপযোগী হলেও, আপনার মডেল ও ইউজ কেস মূল্যায়ন করার জন্য উপযুক্ত নাও হতে পারে। এই পরিস্থিতিতে, আপনি এর পরিবর্তে কাস্টম Analytics ইভেন্টের জন্য অপ্টিমাইজ করার চেষ্টা করতে পারেন।

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

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

Swift

Analytics.logEvent("first_result_opened", parameters: nil)

Objective-C

[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];

আপনি কোন মেট্রিক পরীক্ষা করবেন তা আপনার অ্যাপ কীভাবে আপনার মডেল ব্যবহার করে তার উপর নির্ভর করে।

এই পর্যায়ে, আপনি App Store-এ আপনার অ্যাপ ডিপ্লয় করতে পারবেন। আপনার অ্যাপ আপনার আসল মডেল ব্যবহার করা চালিয়ে যাবে, কিন্তু আপনার যোগ করা Remote Config ও Analytics কোড আপনাকে শুধুমাত্র Firebase কনসোল ব্যবহার করে বিভিন্ন মডেলের সাথে এক্সপেরিমেন্ট করতে দেবে।

৩. A/B Testing এক্সপেরিমেন্ট চালান

এখন আপনার অ্যাপ ব্যবহারকারীদের হাতে পৌঁছে গেছে এবং অ্যানালিটিক্স ডেটা সংগ্রহ করছে, একটি A/B Testing পরীক্ষা তৈরি করুন যা বর্তমান মডেলের পরিবর্তে আপনার নতুন মডেল ব্যবহার করার প্রভাব পরীক্ষা করে।

এক্সপেরিমেন্ট তৈরি করতে:

  1. Firebase কনসোলের ইভেন্ট পৃষ্ঠায়, আপনি প্রাসঙ্গিক Analytics ইভেন্ট লগ করছেন কিনা তা যাচাই করুন: অ্যাক্টিভেশন ইভেন্ট ও লক্ষ্য মেট্রিক।

    Firebase কনসোলে দেখানোর আগে আপনার অ্যাপকে প্রতিটি ইভেন্ট অন্তত একবার লগ করতে হবে।

  2. Firebase কনসোলে, A/B Testing বিভাগটি খুলুন।

  3. নতুন এক্সপেরিমেন্ট তৈরি করুন:

    1. পরীক্ষা তৈরি করুন > Remote Config বিকল্পে ক্লিক করুন।

    2. টার্গেটিং বিভাগে:

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

    4. ভেরিয়েন্ট বিভাগে, দুটি ভেরিয়েন্ট নির্দিষ্ট করুন:

      • কন্ট্রোল গ্রুপ (অটোমেটিক তৈরি করা হয়)
      • পরীক্ষামূলক প্ল্যান্ট লেবেলার

      কন্ট্রোল গ্রুপের জন্য, একটি plant_labeler_model প্যারামিটার তৈরি করুন এবং এটিকে plant_labeler_v1 হিসেবে সেট করুন। কন্ট্রোল গ্রুপে অ্যাসাইন করা ব্যবহারকারীরা পুরনো মডেল ব্যবহার করবেন। (প্যারামিটারকে (no change) হিসেবে সেট করবেন না, কারণ আপনার অ্যাপে, আপনি পরীক্ষা করছেন যে আপনি একটি রিমোট ভ্যালু ব্যবহার করছেন।)

      এক্সপেরিমেন্টাল প্ল্যান্ট লেবেলার ভেরিয়েন্টের জন্য, plant_labeler_model প্যারামিটারকে plant_labeler_v2 হিসেবে সেট করুন (ধরে নেওয়া হচ্ছে যে আপনি সেই নামে আপনার নতুন মডেল প্রকাশ করেছেন)। এই ভ্যারিয়েন্টে অ্যাসাইন করা ব্যবহারকারীরা নতুন মডেল ব্যবহার করবেন।

    A/B টেস্ট কনফিগারেশন স্ক্রিন

এক্সপেরিমেন্ট শুরু করুন এবং এটি কয়েক দিন বা তার বেশি সময় ধরে চলতে দিন, যতক্ষণ না A/B Testing কোনও লিডার ঘোষণা করে। পরীক্ষা যদি কোনও লিডার নির্ধারণ করতে না পারে, তাহলে আপনাকে হয়ত আরও বেশি ব্যবহারকারীর জন্য পরীক্ষাটি প্রসারিত করতে হবে।

৪. সব ব্যবহারকারীর জন্য সবচেয়ে ভালো ফলাফল পাওয়া ভ্যারিয়েন্ট রিলিজ করা

A/B টেস্টের ফলাফল কার্ড

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

Firebase কনসোলের A/B Testing বিভাগে, সম্পূর্ণ হওয়া এক্সপেরিমেন্টের বিবরণ দেখুন। এই ভিউ থেকে, আপনার লক্ষ্য মেট্রিক এবং আপনার বেছে নেওয়া যেকোনও সেকেন্ডারি মেট্রিক অনুযায়ী প্রতিটি ভ্যারিয়েন্ট কেমন পারফর্ম করেছে তা দেখতে পাবেন। এই তথ্যের সাহায্যে, আপনি সিদ্ধান্ত নিতে পারবেন যে লিডিং ভ্যারিয়েন্ট বা অন্য কোনও ভ্যারিয়েন্ট রোল-আউট করবেন কিনা।

সব ব্যবহারকারীর জন্য কোনও ভ্যারিয়েন্ট রোল-আউট করতে, এক্সপেরিমেন্টের বিবরণ পৃষ্ঠায় গিয়ে > ভ্যারিয়েন্ট রোল-আউট করুন বিকল্পে ক্লিক করুন। আপনি এটি করলে, সব ব্যবহারকারীর জন্য plant_labeler_model প্যারামিটারের ভ্যালু plant_labeler_v2 হয়ে যাবে।

ভবিষ্যতে অ্যাপ আপডেট করার সময়, আপনাকে plant_labeler_model প্যারামিটারের ডিফল্ট ভ্যালু পরিবর্তন করে plant_labeler_v2 করতে হবে এবং আপনি কোনও বান্ডেল মডেল ব্যবহার করলে সেটি আপডেট করতে হবে। তবে, আপনার ব্যবহারকারীরা ইতিমধ্যেই লেটেস্ট মডেল ব্যবহার করছেন, তাই আপনি প্রকাশিত অ্যাপের অংশ হিসেবে এই আপডেটটি যখনই সুবিধা হবে তখনই পুশ করতে পারবেন, যেমন, আপনি যখন পরবর্তীকালে কোনও ফিচার আপডেট করবেন।