A/B 測試一個模型的兩個版本

在訓練新的自定義模型或 AutoML Vision Edge 模型後,您可以使用 A/B 測試來查看新模型與您已經使用的模型相比在現實條件下的表現如何。在您確認您的新模型是一項改進之後,您可以輕鬆地向所有用戶推出新模型,而無需更新應用程序。

此頁面展示瞭如何進行 A/B 測試,以評估支持假設的可視化植物搜索功能的模型的兩個版本。此功能使用自定義圖像標記模型來幫助用戶從它們的圖像中識別植物物種。

假設你剛剛出版了一本新廠的標籤模式, plant_labeler_v2並且要運行,它與您當前的模型,命名比較實驗plant_labeler_v1 。下面的步驟顯示瞭如何設置實驗、運行它以及對結果採取措施。

1. 使您的模型可遠程配置

對您的模型進行 A/B 測試的第一步是修改您的應用程序以使用遠程配置參數來確定它使用的模型。最初,您將此參數的默認值設置為您的應用程序已經使用的模型,但由於模型名稱由遠程配置參數控制,您可以更改和試驗不同的模型,而無需將應用程序更新推送到您的應用程序。用戶每次。

所以,如果你的名義發布當前模型plant_labeler_v1 ,你會在你的應用程序初始化代碼,集plant_labeler_v1為默認值plant_labeler_model參數,如下面的例子:

科特林+KTX

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.
      // ...
    }
}

爪哇

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.
                  // ...
                }
            }
        });

然後,更改模型設置代碼加載由指定型號plant_labeler_model參數:

科特林+KTX

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

爪哇

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

現在您的應用程序使用遠程配置參數來確定要加載的模型,您只需發布新模型並將其名稱分配給遠程配置參數即可更改模型。此功能允許 A/B 測試將不同的模型分配給不同的用戶,以便進行比較。

在繼續之前,還要在模型下載代碼中添加以下內容:

科特林+KTX

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

爪哇

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

上面的代碼記錄了一個自定義 Analytics 事件,您稍後將使用該事件作為實驗的激活事件.激活事件是用戶在被視為實驗的一部分之前必須觸發的事件。這可確保用戶在設備完成下載自定義 ML 模型之前不會被記錄在您的 A/B 測試中。

2. 確定目標指標

下一步是決定如何衡量模型的成功,並確保您的應用程序正在收集必要的數據,以根據該指標測試模型的不同版本的表現。

A/B 測試有幾個內置指標,包括收入、每日參與度和用戶保留率。這些指標通常可用於測試不同的 UX 流程或微調參數,但對於評估您的模型和用例可能沒有意義。在這種情況下,您可以嘗試針對自定義 Analytics 事件進行優化。

以假設的可視化植物搜索功能為例,假設您按照模型對每個結果的置信度的順序向用戶呈現搜索結果。了解模型準確性的一種方法是查看用戶打開第一個搜索結果的頻率。

為了測試哪個模型最能實現最大化結果點擊的目標,​​每當用戶點擊結果列表中的第一項時,您將記錄一個自定義事件。

科特林+KTX

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

爪哇

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

您測試的指標最終取決於您的應用如何使用您的模型。

此時,您可以將您的應用部署到 Play 商店。您的應用將繼續使用您的原始模型,但您添加的遠程配置和分析代碼將允許您僅使用 Firebase 控制台來試驗不同的模型。

3. 運行 A/B 測試實驗

現在您的應用已掌握在您的用戶手中並且正在收集分析數據,創建一個 A/B 測試實驗來測試使用新模型而不是當前模型的效果。

創建實驗:

  1. 活動的火力地堡控制台的頁面,確認你正在登錄的相關分析事件:激活事件和目標指標。

    您的應用需要在每個事件出現在 Firebase 控制台之前至少記錄一次。

  2. 在火力地堡控制台,打開A / B測試部分。

  3. 創建一個新實驗:

    1. 點擊創建實驗>遠程配置

    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 測試宣布領導者。如果實驗不能確定一個領導者,你可能需要實驗擴展到更多的用戶

4. 向所有用戶推出獲勝的變體

A/B 測試結果卡

在 A/B 測試收集了足夠的信息來宣布領先者(在這種情況下,是最大化搜索結果點擊次數的變體)之後,您可以決定是否向所有用戶推出獲勝變體(或其他變體)。

在的A / B測試火力地堡控制台,打開細節查看已完成的實驗。在此視圖中,您可以查看每個變體根據您的目標指標和您選擇的任何次要指標的表現。使用此信息,您可以決定是推出主要變體還是其他變體。

推出一個變種給所有用戶,請單擊 >鋪開變體實驗的詳情頁上。一旦你這樣做,值plant_labeler_model參數將是plant_labeler_v2為所有用戶。

在未來的應用更新,您應該默認值改為plant_labeler_model參數plant_labeler_v2 ,如果你使用一個更新的捆綁模式。不過,您的用戶已經在使用最新模型,因此您可以在方便時將此更新作為已發布應用程序的一部分推送,例如在您下次進行功能更新時。