Pengujian A/B pada dua versi model

Setelah melatih model kustom atau model AutoML Vision Edge baru, Anda dapat menggunakan A/B Testing untuk melihat seberapa baik performa model baru dalam kondisi di dunia nyata, dibandingkan dengan model yang sudah Anda gunakan. Setelah mengonfirmasi bahwa model baru tersebut memiliki performa lebih baik, Anda dapat dengan mudah meluncurkannya ke semua pengguna Anda, tanpa memerlukan update aplikasi.

Halaman ini menunjukkan bagaimana Anda dapat melakukan pengujian A/B yang mengevaluasi dua versi model yang mendukung suatu fitur fiktif penelusuran tanaman secara visual. Fitur ini menggunakan model pelabelan gambar kustom untuk membantu pengguna mengidentifikasi spesies tanaman dari gambarnya.

Misalnya Anda baru saja memublikasikan model pelabelan tanaman baru, plant_labeler_v2 dan Anda ingin menjalankan eksperimen yang membandingkannya dengan model saat ini, yang bernama plant_labeler_v1. Langkah-langkah di bawah menunjukkan cara menyiapkan eksperimen, menjalankannya, dan mengambil tindakan atas hasilnya.

1. Membuat agar model dapat dikonfigurasi dari jarak jauh

Langkah pertama untuk menguji A/B model Anda adalah dengan memodifikasi aplikasi Anda menggunakan parameter Remote Config untuk menentukan model mana yang digunakannya. Awalnya, Anda akan menetapkan nilai default parameter ini sebagai model yang telah digunakan aplikasi. Namun, karena nama model dikontrol oleh parameter yang dapat dikonfigurasi dari jarak jauh, Anda dapat mengubah dan bereksperimen dengan model yang berbeda tanpa harus selalu mendorong update aplikasi kepada pengguna.

Jadi, jika memublikasikan model saat ini dengan nama plant_labeler_v1, Anda akan menetapkan plant_labeler_v1 sebagai nilai default parameter plant_labeler_model dalam kode inisialisasi aplikasi, seperti dalam contoh berikut:

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];

Kemudian, ubah kode penyiapan model Anda untuk memuat model yang ditentukan oleh parameter 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/label-images-with-automl#configure-a-local-model-source
// 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/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

Setelah aplikasi Anda menggunakan parameter Remote Config untuk menentukan model yang akan dimuat, Anda dapat mengubah model hanya dengan memublikasikan model baru dan menetapkan namanya ke parameter Remote Config. Dengan kemampuan ini, A/B Testing dapat menetapkan model yang berbeda untuk pengguna yang berbeda dengan tujuan membandingkannya.

Sebelum melanjutkan, masukkan tambahan berikut pada kode download model Anda:

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];
              }
            }];

Kode di atas mencatat peristiwa Analytics kustom yang nantinya akan Anda gunakan sebagai peristiwa aktivasi eksperimen. Peristiwa aktivasi adalah peristiwa yang harus dipicu pengguna sebelum dianggap sebagai bagian dari eksperimen. Ini untuk memastikan bahwa pengguna tidak akan direkam dalam pengujian A/B Anda sebelum perangkat mereka selesai mengunduh model ML kustom mereka.

2. Menentukan metrik sasaran

Langkah berikutnya adalah menentukan cara untuk mengukur keberhasilan model Anda, dan memastikan aplikasi mengumpulkan data yang diperlukan untuk menguji seberapa baik performa berbagai versi model sesuai dengan metrik tersebut.

A/B Testing memiliki beberapa metrik bawaan, termasuk pendapatan, interaksi harian, dan retensi pengguna. Metrik ini sering berguna untuk menguji berbagai aliran UX atau meningkatkan parameter, tetapi belum tentu cocok untuk mengevaluasi model dan kasus penggunaan Anda. Dalam situasi ini, Anda dapat mencoba melakukan pengoptimalan untuk peristiwa Analytics kustom.

Dengan menggunakan contoh fiktif fitur penelusuran tanaman secara visual, misalnya Anda menyajikan hasil penelusuran kepada pengguna dalam urutan keyakinan model pada masing-masing hasil. Salah satu cara untuk mendapatkan gambaran tentang keakuratan model Anda adalah dengan melihat seberapa sering pengguna membuka hasil penelusuran pertama.

Untuk menguji model mana yang paling baik mencapai sasaran untuk memaksimalkan klik hasil teratas, Anda perlu mencatat peristiwa kustom setiap kali pengguna mengetuk item pertama dalam daftar hasil.

Swift

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

Objective-C

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

Metrik yang Anda uji pada akhirnya bergantung pada bagaimana aplikasi menggunakan model tersebut.

Kini Anda dapat men-deploy aplikasi ke App Store. Aplikasi Anda akan terus menggunakan model asli, tetapi Remote Config dan kode Analytics yang Anda tambahkan akan memungkinkan Anda bereksperimen dengan model yang berbeda hanya dengan menggunakan Firebase console.

3. Menjalankan eksperimen A/B Testing

Setelah aplikasi diterima pengguna dan aplikasi tersebut mengumpulkan data analisis, buat eksperimen A/B Testing yang menguji pengaruh penggunaan model baru, bukan model saat ini.

Untuk membuat eksperimen:

  1. Pada halaman Events di Firebase console, verifikasikan bahwa Anda sedang mencatat peristiwa Analytics yang relevan: peristiwa aktivasi dan metrik sasaran.

    Aplikasi Anda perlu mencatat setiap peristiwa setidaknya satu kali sebelum muncul di Firebase console.

  2. Di Firebase console, buka bagian A/B Testing.

  3. Buat eksperimen baru:

    1. Klik Create experiment > Remote Config.

    2. Di bagian Targeting:

      • Pilih aplikasi Anda dari daftar
      • Tentukan jumlah pengguna yang ingin Anda sertakan dalam eksperimen
      • Pilih peristiwa aktivasi yang Anda mulai catat dalam log (dalam contoh ini, nondefault_model_downloaded)
    3. Di bagian Goals, pilih metrik sasaran yang Anda tetapkan di bagian sebelumnya (dalam contoh ini, first_result_opened) dari daftar metrik sasaran, lalu pilih metrik tambahan yang ingin Anda lacak, seperti pendapatan pembelian atau pengguna bebas error.

    4. Di bagian Variants, tentukan dua varian:

      • Grup kontrol (dibuat secara otomatis)
      • Pemberi label tanaman eksperimental

      Untuk Grup kontrol, buat parameter plant_labeler_model dan tetapkan ke plant_labeler_v1. Pengguna yang ditetapkan ke grup kontrol akan menggunakan model lama. (Jangan tetapkan parameter ke (no change) karena Anda menguji bahwa Anda menggunakan nilai jarak jauh di aplikasi.)

      Untuk varian Experimental plant labeler, tetapkan parameter plant_labeler_model ke plant_labeler_v2 (dengan asumsi Anda telah memublikasikan model baru dengan nama tersebut). Pengguna yang ditetapkan ke varian ini akan menggunakan model baru.

    Layar konfigurasi pengujian A/B

Mulai eksperimen dan biarkan berjalan selama beberapa hari atau lebih, sampai A/B Testing menetapkan varian dominan. Jika eksperimen tidak dapat menentukan varian dominan, Anda mungkin perlu memperluas eksperimen ke lebih banyak pengguna.

4. Meluncurkan varian dominan ke semua pengguna

Kartu hasil pengujian A/B

Setelah A/B Testing mengumpulkan cukup informasi untuk mendeklarasikan varian dominan, dalam hal ini varian yang telah memaksimalkan klik hasil penelusuran teratas, Anda dapat memutuskan apakah akan meluncurkan varian dominan (atau varian lain) ke semua pengguna.

Di bagian A/B Testing dari Firebase console, buka tampilan detail eksperimen yang telah diselesaikan. Dari tampilan ini, Anda dapat melihat performa setiap varian menurut metrik sasaran dan metrik sekunder mana pun yang Anda pilih. Dengan informasi ini, Anda dapat memutuskan apakah akan meluncurkan varian dominan atau varian lainnya.

Untuk meluncurkan varian kepada semua pengguna, klik > Roll out variant di halaman detail eksperimen. Setelah Anda melakukannya, nilai parameter plant_labeler_model akan menjadi plant_labeler_v2 untuk semua pengguna.

Dalam update aplikasi mendatang, Anda harus mengubah nilai default parameter plant_labeler_model ke plant_labeler_v2 dan memperbarui model yang dipaketkan jika Anda menggunakannya. Namun, pengguna Anda sudah menggunakan model terbaru, sehingga Anda dapat mendorong update ini sebagai bagian dari aplikasi yang dipublikasikan kapan pun diinginkan, seperti saat Anda membuat update fitur berikutnya.