تست A/B دو نسخه از یک مدل

پس از آموزش یک مدل سفارشی جدید، می‌توانید A/B Testing استفاده کنید تا ببینید مدل جدید در شرایط دنیای واقعی، در مقایسه با مدلی که قبلاً استفاده می‌کنید، چقدر خوب عمل می‌کند. پس از تأیید اینکه مدل جدید شما بهبود یافته است، می‌توانید به راحتی مدل جدید را بدون نیاز به به‌روزرسانی برنامه، برای همه کاربران خود منتشر کنید.

این صفحه نشان می‌دهد که چگونه می‌توانید یک تست A/B انجام دهید که دو نسخه از یک مدل را ارزیابی می‌کند که یک ویژگی جستجوی بصری فرضی گیاهان را پشتیبانی می‌کند. این ویژگی از یک مدل برچسب‌گذاری تصویر سفارشی برای کمک به کاربران در شناسایی گونه‌های گیاهی از تصاویر آنها استفاده می‌کند.

فرض کنید به تازگی یک مدل برچسب‌گذاری گیاه جدید، plant_labeler_v2 ، منتشر کرده‌اید و می‌خواهید آزمایشی اجرا کنید که آن را با مدل فعلی شما، به نام plant_labeler_v1 ، مقایسه کند. مراحل زیر نحوه تنظیم آزمایش، اجرای آن و انجام اقدامات لازم بر روی نتایج را نشان می‌دهد.

۱. مدل خود را از راه دور قابل پیکربندی کنید

اولین قدم برای تست A/B مدل‌های شما، اصلاح برنامه‌تان برای استفاده از پارامتر Remote Config است تا مشخص شود از کدام مدل استفاده می‌کند. در ابتدا، مقدار پیش‌فرض این پارامتر را روی مدلی که برنامه شما از قبل استفاده می‌کند، تنظیم خواهید کرد، اما از آنجا که نام مدل توسط یک پارامتر قابل تنظیم از راه دور کنترل می‌شود، می‌توانید بدون نیاز به ارسال به‌روزرسانی‌های برنامه به کاربران خود در هر بار، مدل‌های مختلف را تغییر داده و آزمایش کنید.

بنابراین، اگر مدل فعلی خود را با نام plant_labeler_v1 منتشر کرده‌اید، در کد مقداردهی اولیه برنامه خود، plant_labeler_v1 به عنوان مقدار پیش‌فرض پارامتر plant_labeler_model تنظیم می‌کنید، مانند مثال زیر:

سویفت

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

هدف-سی

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

سپس، کد تنظیم مدل خود را تغییر دهید تا مدل مشخص شده توسط پارامتر plant_labeler_model را بارگذاری کند:

سویفت

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

هدف-سی

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 اجازه می‌دهد مدل‌های مختلف را به کاربران مختلف اختصاص دهد تا آنها را با هم مقایسه کند.

قبل از ادامه، موارد زیر را نیز به کد دانلود مدل خود اضافه کنید:

سویفت

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

هدف-سی

__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 را ثبت می‌کند که بعداً به عنوان رویداد آزمایش خود از آن استفاده خواهید کرد. رویداد فعال‌سازی یک رویداد فعال‌سازی، رویدادی است که کاربر باید قبل از اینکه به عنوان بخشی از آزمایش در نظر گرفته شود، آن را فعال کند. این تضمین می‌کند که کاربران تا زمانی که دستگاهشان دانلود مدل یادگیری ماشین سفارشی خود را تمام نکرده باشد، در تست A/B شما ثبت نخواهند شد.

۲. یک معیار هدف تعیین کنید

مرحله بعدی این است که تصمیم بگیرید چگونه موفقیت مدل خود را اندازه‌گیری خواهید کرد و مطمئن شوید که برنامه شما داده‌های لازم را برای آزمایش میزان عملکرد نسخه‌های مختلف مدل بر اساس آن معیار جمع‌آوری می‌کند.

A/B Testing چندین معیار داخلی دارد، از جمله درآمد، تعامل روزانه و حفظ کاربر. این معیارها اغلب برای آزمایش جریان‌های مختلف UX یا تنظیم دقیق پارامترها مفید هستند، اما ممکن است برای ارزیابی مدل و مورد استفاده شما منطقی نباشند. در این شرایط، می‌توانید به جای آن، بهینه‌سازی را برای یک رویداد تحلیلی سفارشی امتحان کنید.

با استفاده از ویژگی جستجوی بصری گیاهان فرضی به عنوان مثال، فرض کنید نتایج جستجو را به ترتیب اطمینان مدل به هر نتیجه به کاربر خود ارائه می‌دهید. یکی از راه‌هایی که می‌توانید از دقت مدل خود مطلع شوید، بررسی این است که کاربران چند بار اولین نتیجه جستجو را باز کرده‌اند.

برای آزمایش اینکه کدام مدل به بهترین شکل به هدف حداکثر کردن کلیک‌های نتایج برتر دست می‌یابد، هر زمان که کاربر روی اولین مورد در لیست نتایج ضربه می‌زند، یک رویداد سفارشی را ثبت می‌کنید.

سویفت

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

هدف-سی

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

معیاری که برای آن تست می‌کنید در نهایت به نحوه استفاده برنامه شما از مدل بستگی دارد.

در این مرحله، می‌توانید برنامه خود را در اپ استور منتشر کنید. برنامه شما همچنان از مدل اصلی شما استفاده خواهد کرد، اما کد 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) تنظیم نکنید، زیرا در برنامه خود، در حال آزمایش استفاده از یک مقدار از راه دور هستید.)

      برای نوع Experimental plant labeler ، پارامتر plant_labeler_model را روی plant_labeler_v2 تنظیم کنید (با فرض اینکه مدل جدید خود را با این نام منتشر کرده‌اید). کاربرانی که به این نوع اختصاص داده شده‌اند، از مدل جدید استفاده خواهند کرد.

    صفحه پیکربندی تست A/B

آزمایش را شروع کنید و بگذارید چند روز یا بیشتر ادامه یابد، تا زمانی که A/B Testing یک رهبر را اعلام کند. اگر آزمایش نتواند یک رهبر را تعیین کند، ممکن است لازم باشد آزمایش را به کاربران بیشتری گسترش دهید .

۴. نوع برنده را برای همه کاربران منتشر کنید

کارت نتایج تست A/B

پس از اینکه A/B Testing اطلاعات کافی برای اعلام یک گزینه پیشرو - در این مورد، گزینه‌ای که بیشترین کلیک را در نتایج جستجو داشته است - جمع‌آوری کرد، می‌توانید تصمیم بگیرید که آیا گزینه برنده (یا گزینه دیگری) را برای همه کاربران خود منتشر کنید یا خیر.

در بخش A/B Testing کنسول Firebase ، نمای جزئیات آزمایش تکمیل‌شده را باز کنید. از این نما، می‌توانید ببینید که هر نوع آزمایش با توجه به معیار هدف شما و هر معیار ثانویه‌ای که انتخاب کرده‌اید، چگونه عمل کرده است. با این اطلاعات، می‌توانید تصمیم بگیرید که آیا نوع پیشرو را منتشر کنید یا نوع دیگری را.

برای انتشار یک نسخه برای همه کاربران، در صفحه جزئیات آزمایش روی > انتشار نسخه کلیک کنید. پس از انجام این کار، مقدار پارامتر plant_labeler_model برای همه کاربران plant_labeler_v2 خواهد بود.

در به‌روزرسانی‌های بعدی برنامه، باید مقدار پیش‌فرض پارامتر plant_labeler_model را به plant_labeler_v2 تغییر دهید و در صورت استفاده از مدل همراه، آن را به‌روزرسانی کنید. با این حال، کاربران شما در حال حاضر از آخرین مدل استفاده می‌کنند، بنابراین می‌توانید این به‌روزرسانی را به عنوان بخشی از برنامه منتشر شده، هر زمان که مناسب باشد، مانند زمانی که به‌روزرسانی بعدی یک ویژگی را انجام می‌دهید، اعمال کنید.