Bir modelin iki sürümüne A/B testi yapma

Yeni bir özel modeli eğittikten sonra, yeni modelin gerçek dünya koşullarındaki performansını, halihazırda kullandığınız modele kıyasla ne kadar iyi olduğunu görmek için A/B Testing kullanabilirsiniz. Yeni modelinizin iyileştirme sağladığını onayladıktan sonra, uygulama güncellemesi gerektirmeden yeni modeli tüm kullanıcılarınıza kolayca sunabilirsiniz.

Bu sayfada, varsayımsal bir görsel bitki arama özelliğine güç veren bir modelin iki sürümünü değerlendiren bir A/B testinin nasıl yürütülebileceği gösterilmektedir. Bu özellik, kullanıcıların bitki türlerini fotoğraflarından tanımasına yardımcı olmak için özel bir görüntü etiketleme modeli kullanır.

Yeni bir bitki etiketleme modeli yayınladığınızı plant_labeler_v2 ve bunu plant_labeler_v1 adlı mevcut modelinizle karşılaştıran bir deneme yapmak istediğinizi varsayalım. Aşağıdaki adımlarda, denemenin nasıl oluşturulacağı, uygulanacağı ve sonuçlarla ilgili nasıl işlem yapılacağı gösterilmektedir.

1. Modelinizi uzaktan yapılandırılabilir hale getirme

Modellerinizde A/B testi yapmanın ilk adımı, uygulamanızı hangi modeli kullanacağını belirlemek için bir Remote Config parametresini kullanacak şekilde değiştirmektir. Başlangıçta bu parametrenin varsayılan değerini, uygulamanızın kullandığı model olarak ayarlarsınız. Ancak model adı, uzaktan yapılandırılabilir bir parametre tarafından kontrol edildiğinden, her seferinde kullanıcılarınıza uygulama güncellemeleri göndermeniz gerekmeden farklı modellerle değişiklik yapabilir ve denemeler gerçekleştirebilirsiniz.

Bu nedenle, mevcut modelinizi plant_labeler_v1 adıyla yayınladıysanız uygulama başlatma kodunuzda plant_labeler_v1 parametresinin varsayılan değeri olarak plant_labeler_model değerini ayarlarsınız. Örneğin:

Kotlin

val remoteConfig = FirebaseRemoteConfig.getInstance()

val remoteConfigDefaults = HashMap<String, Any>()
remoteConfigDefaults["plant_labeler_model"] = "plant_labeler_v1"
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults))

remoteConfig.fetchAndActivate().addOnSuccessListener { success ->
    if (success) {
      // Okay to get remote values.
      // ...
    }
}

Java

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();

Map<String, Object> remoteConfigDefaults = new HashMap<>();
remoteConfigDefaults.put("plant_labeler_model", "plant_labeler_v1");
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults));

remoteConfig.fetchAndActivate().addOnSuccessListener(
        new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean success) {
                if (success) {
                  // Okay to get remote values.
                  // ...
                }
            }
        });

Ardından, model kurulum kodunuzu plant_labeler_model parametresiyle belirtilen modeli yükleyecek şekilde değiştirin:

Kotlin

val rcValue = remoteConfig.getValue("plant_labeler_model")
val remoteModelName = rcValue.asString()

// ...

val remoteModel = FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build()
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel)

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

Java

FirebaseRemoteConfigValue rcValue = remoteConfig.getValue("plant_labeler_model");
String remoteModelName = rcValue.asString();

// ...

FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build();
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel);

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

Uygulamanız artık hangi modelin yükleneceğini belirlemek için Remote Config parametresini kullandığından, yeni bir model yayınlayıp adını Remote Config parametresine atayarak modeli değiştirebilirsiniz. Bu özellik, A/B Testing'nın karşılaştırma amacıyla farklı kullanıcılara farklı modeller atamasına olanak tanır.

Devam etmeden önce model indirme kodunuza aşağıdaki eklemeyi de yapın:

Kotlin

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
    .addOnSuccessListener {
        // If the model downloaded was specified by a remote parameter, log an
        // event, which will be our experiment's activation event.
        if (rcValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
            FirebaseAnalytics.getInstance(this).logEvent("nondefault_model_downloaded", null)
        }
    }

Java

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                if (rcValue.getSource() == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
                    FirebaseAnalytics.getInstance(YourActivity.this)
                            .logEvent("nondefault_model_downloaded", null);
                }
            }
        });

Yukarıdaki kod, daha sonra denemenizin etkinleştirme etkinliği olarak kullanacağınız özel bir Analytics etkinliğini günlüğe kaydeder. Etkinleştirme etkinliği, kullanıcının deneye dahil edilmesi için tetiklemesi gereken bir etkinliktir. Bu sayede, cihazları özel makine öğrenimi modellerini indirmeyi tamamlamadan kullanıcıların A/B testinize dahil edilmemesi sağlanır.

2. Hedef metrik belirleme

Bir sonraki adım, modelinizin başarısını nasıl ölçeceğinize karar vermek ve uygulamanızın, modelin farklı sürümlerinin bu metriğe göre ne kadar iyi performans gösterdiğini test etmek için gerekli verileri topladığından emin olmaktır.

A/B Testing; gelir, günlük etkileşim ve kullanıcı elde tutma oranı gibi çeşitli yerleşik metriklere sahiptir. Bu metrikler genellikle farklı kullanıcı deneyimi akışlarını test etmek veya parametreleri hassas bir şekilde ayarlamak için yararlı olsa da modelinizi ve kullanım alanınızı değerlendirmek için anlamlı olmayabilir. Bu durumda, bunun yerine özel bir Analytics etkinliği için optimizasyon yapmayı deneyebilirsiniz.

Örnek olarak, varsayımsal görsel bitki arama özelliğini ele alalım. Kullanıcınıza arama sonuçlarını, modelin her bir sonuçtaki güven düzeyine göre sıralayarak sunduğunuzu varsayalım. Modelinizin doğruluğu hakkında fikir edinmenin bir yolu, kullanıcıların ilk arama sonucunu ne sıklıkta açtığına bakmaktır.

En üstteki sonuç tıklamalarını en üst düzeye çıkarma hedefine en iyi hangi modelin ulaştığını test etmek için, kullanıcı sonuç listesindeki ilk öğeye her dokunduğunda özel bir etkinlik kaydedersiniz.

Kotlin

FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)

Java

FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);

Sonuç olarak, test edeceğiniz metrik, uygulamanızın modelinizi nasıl kullandığına bağlıdır.

Bu noktada, uygulamanızı Play Store'da dağıtabilirsiniz. Uygulamanız orijinal modelinizi kullanmaya devam eder ancak eklediğiniz Remote Config ve Analytics kodu, yalnızca Firebase konsolunu kullanarak farklı modellerle deneme yapmanıza olanak tanır.

3. A/B Testing denemesi yapma

Uygulamanız artık kullanıcılarınızın elinde ve analiz verileri topluyor. Bu aşamada, mevcut model yerine yeni modelinizi kullanmanın etkisini test eden bir A/B Testing deneme oluşturun.

Denemeyi oluşturmak için:

  1. Firebase konsolunun Etkinlikler sayfasında, alakalı Analytics etkinliklerini (etkinleştirme etkinliği ve hedef metriği) kaydettiğinizi doğrulayın.

    Uygulamanızın, Firebase konsolunda görünmeden önce her etkinliği en az bir kez günlüğe kaydetmesi gerekir.

  2. Firebase konsolunda A/B Testing bölümünü açın.

  3. Yeni bir deneme oluşturma:

    1. Deneme oluştur > Remote Config seçeneğini tıklayın.

    2. Hedefleme bölümünde:

      • Listeden uygulamanızı seçin.
      • Denemeye kaç kullanıcınızı dahil etmek istediğinizi belirtin.
      • Günlüğe kaydetmeye başladığınız etkinleştirme etkinliğini seçin (bu örnekte, nondefault_model_downloaded)
    3. Hedefler bölümünde, hedef metrikler listesinden önceki bölümde belirlediğiniz hedef metriği (bu örnekte first_result_opened) seçin ve izlemek istediğiniz ek metrikleri (ör. satın alma geliri veya hatasız kullanıcılar) belirleyin.

    4. Varyantlar bölümünde iki varyant tanımlayın:

      • Kontrol grubu (otomatik olarak oluşturulur)
      • Deneysel bitki etiketleme aracı

      Kontrol grubu için bir plant_labeler_model parametresi oluşturun ve bunu plant_labeler_v1 olarak ayarlayın. Kontrol grubuna atanan kullanıcılar eski modeli kullanır. (Uygulamanızda uzak bir değer kullandığınızı test ettiğiniz için parametreyi (no change) olarak ayarlamayın.)

      Experimental plant labeler varyantı için plant_labeler_model parametresini plant_labeler_v2 olarak ayarlayın (yeni modelinizi bu adla yayınladığınızı varsayarak). Bu varyanta atanan kullanıcılar yeni modeli kullanır.

    A/B testi yapılandırma ekranı

Denemeyi başlatın ve A/B Testing bir lider ilan edene kadar birkaç gün veya daha uzun süre çalışmasına izin verin. Deneme sonucunda bir lider belirlenemezse denemeyi daha fazla kullanıcıya genişletmeniz gerekebilir.

4. Kazanan varyantı tüm kullanıcılara sunma

A/B testi sonuç kartı

A/B Testing, bir en iyi varyantı (bu örnekte, üstteki arama sonucu tıklamalarını en üst düzeye çıkaran varyant) ilan etmek için yeterli bilgiyi topladıktan sonra kazanan varyantı (veya başka bir varyantı) tüm kullanıcılarınıza kullanıma sunup sunmayacağınıza karar verebilirsiniz.

Firebase konsolunun A/B Testing bölümünde, tamamlanan denemenin ayrıntılar görünümünü açın. Bu görünümde, her varyantın hedef metriğinize ve seçtiğiniz ikincil metriklere göre nasıl performans gösterdiğini görebilirsiniz. Bu bilgiler sayesinde, en iyi performansı gösteren varyantı veya başka bir varyantı kullanıma sunup sunmayacağınıza karar verebilirsiniz.

Bir varyantı tüm kullanıcılara sunmak için denemenin ayrıntılar sayfasında > Varyantı kullanıma sun'u tıklayın. Bunu yaptığınızda, tüm kullanıcılar için plant_labeler_model parametresinin değeri plant_labeler_v2 olur.

Gelecekteki bir uygulama güncellemesinde, plant_labeler_model parametresinin varsayılan değerini plant_labeler_v2 olarak değiştirmeniz ve paketlenmiş bir model kullanıyorsanız bu modeli güncellemeniz gerekir. Ancak kullanıcılarınız zaten en yeni modeli kullanıyor. Bu nedenle, bu güncellemeyi yayınlanan uygulamanın bir parçası olarak istediğiniz zaman (ör. bir sonraki özellik güncellemesini yaptığınızda) gönderebilirsiniz.