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

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

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

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

1. مدل خود را از راه دور قابل تنظیم کنید

اولین گام برای آزمایش 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()

هدف-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 بارگیری شود:

سریع

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/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/ios/use-custom-models#configure_a_local_model

هدف-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/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

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

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

سریع

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

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

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

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

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

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

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

سریع

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

هدف-C

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

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

در این مرحله، می توانید برنامه خود را در اپ استور مستقر کنید. برنامه شما همچنان از مدل اصلی شما استفاده می‌کند، اما کد Remote Config و Analytics که اضافه کرده‌اید به شما امکان می‌دهد مدل‌های مختلف را فقط با استفاده از کنسول Firebase آزمایش کنید.

3. یک آزمایش A/B Testing را اجرا کنید

اکنون که برنامه شما در دست کاربران شماست و داده های تحلیلی را جمع آوری می کند، یک آزمایش A/B Testing ایجاد کنید که تأثیر استفاده از مدل جدید شما را به جای مدل فعلی آزمایش می کند.

برای ایجاد آزمایش:

  1. در صفحه رویدادهای کنسول Firebase، تأیید کنید که رویدادهای Analytics مربوطه را ثبت می‌کنید: رویداد فعال‌سازی و معیار هدف.

    برنامه شما باید حداقل یک بار هر رویداد را قبل از نمایش در کنسول Firebase ثبت کند.

  2. در کنسول Firebase، بخش A/B Testing را باز کنید.

  3. یک آزمایش جدید ایجاد کنید:

    1. روی ایجاد آزمایش > پیکربندی از راه دور کلیک کنید.

    2. در بخش هدف گذاری :

      • برنامه خود را از لیست انتخاب کنید
      • مشخص کنید که چه تعداد از کاربران خود را می خواهید در آزمایش بگنجانید
      • رویداد فعال‌سازی را که شروع به ثبت نام کرده‌اید انتخاب کنید (در این مثال، nondefault_model_downloaded )
    3. در بخش اهداف ، معیار هدفی را که در بخش قبلی تعیین کردید (در این مثال، first_result_opened ) از فهرست معیارهای هدف انتخاب کنید، و هر معیار دیگری را که می‌خواهید ردیابی کنید، مانند درآمد خرید یا کاربران بدون خرابی، انتخاب کنید.

    4. در قسمت Variants دو نوع تعریف کنید:

      • گروه کنترل (به طور خودکار ایجاد می شود)
      • برچسب زنی گیاهان آزمایشی

      برای گروه Control ، یک پارامتر plant_labeler_model ایجاد کنید و آن را روی plant_labeler_v1 قرار دهید. کاربرانی که به گروه کنترل اختصاص داده شده اند از مدل قدیمی استفاده خواهند کرد. (پارامتر را روی (no change) تنظیم نکنید، زیرا در برنامه خود، در حال آزمایش این هستید که از یک مقدار راه دور استفاده می کنید.)

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

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

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

4. نسخه برنده را برای همه کاربران عرضه کنید

کارت نتیجه آزمون A/B

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

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

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

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