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 參數的預設值,如以下範例所示:

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

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

然後,變更模型設定程式碼,以載入 plant_labeler_model 參數指定的模型:

Kotlin+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

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/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 測試指派不同的模型給不同的使用者,以便進行比較。

繼續之前,請一併在模型下載程式碼中加入下列項目:

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

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

以上程式碼會記錄一個自訂 Analytics (分析) 事件,您稍後會使用這個事件做為實驗的啟用事件。啟用事件是指使用者必須先觸發的事件,才能納入實驗。確保在 A/B 版本測試中,系統不會將使用者記錄到裝置下載完成自訂機器學習模型為止。

2. 決定目標指標

下一步是決定要如何評估模型成效,並確保應用程式收集必要的資料,以測試不同模型版本根據該指標的成效。

A/B 測試有數種內建指標,包括收益、每日參與度和使用者留存率。這些指標通常有助於測試不同的使用者體驗流程或微調參數,但對於評估模型和用途來說可能並不合理。在這種情況下,您可以改為針對自訂 Analytics (分析) 事件進行最佳化。

以假想視覺植物搜尋功能為例,假設您按照模型對每項結果的信心順序,向使用者顯示搜尋結果。您可以查看使用者開啟第一個搜尋結果的頻率,藉此瞭解模型的準確度。

如要測試哪個模型最能達成「盡量提高熱門搜尋結果點擊次數」的目標,您需要記錄使用者輕觸結果清單中第一個項目時產生的自訂事件。

Kotlin+KTX

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

Java

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

最終測試的指標取決於應用程式使用模型的方式。

此時,您可以將應用程式部署至 Play 商店。應用程式會繼續使用原始模型,但新增的遠端設定和 Analytics (分析) 程式碼,則可讓您透過 Firebase 控制台測試不同的模型。

3. 執行 A/B 測試實驗

現在,您的應用程式已進入使用者手中,並且正在收集數據分析資料,請建立 A/B 測試實驗,測試使用新模型 (而非目前模型) 的效果。

如要建立實驗,請按照下列步驟操作:

  1. 在 Firebase 控制台的「事件」頁面中,確認您記錄的是相關 Analytics (分析) 事件:啟用事件和目標指標。

    應用程式至少需要記錄一次事件,事件才會顯示在 Firebase 控制台中。

  2. 在 Firebase 控制台中開啟「A/B 測試」部分。

  3. 建立新實驗:

    1. 依序按一下「建立實驗」>「遠端設定」

    2. 在「指定目標」部分中:

      • 從清單中選擇應用程式
      • 指定要納入實驗的使用者人數
      • 選取您開始記錄的啟用事件 (在此範例中為 nondefault_model_downloaded)
    3. 在「目標」區段,從目標指標清單中選擇您在上個部分決定的目標指標 (在此範例中為 first_result_opened),然後選取您想追蹤的其他指標,例如購買收益或未發生當機情形的使用者。

    4. 在「Variants」區段中定義兩個變化版本:

      • 控制組 (自動建立)
      • 實驗用植物標籤人員

      針對「Control group」,建立 plant_labeler_model 參數並設為 plant_labeler_v1。指派給控制組的使用者會使用舊模式。(請勿將參數設為 (no change),因為您是在應用程式中測試正在使用遠端值)。

      針對「實驗版植物標籤工具」變化版本,將 plant_labeler_model 參數設為 plant_labeler_v2 (假設您以該名稱發布新模型)。指派給這個變化版本的使用者會使用新模型。

    A/B 版本測試設定畫面

開始實驗,並讓實驗執行數天以上,直到 A/B 測試宣告主要版本為止。如果實驗無法決定勝出版本,您可能需要 讓更多使用者參與實驗

4. 向所有使用者推出成效最佳的變化版本

A/B 測試結果資訊卡

A/B 測試收集了足夠的資訊,可以宣告主要搜尋結果勝出版本 (在此範例中為獲得最多搜尋結果點擊次數的變化版本),您可以決定是否要向所有使用者推出成效最佳的變化版本 (或其他變化版本)。

Firebase 主控台的「A/B Testing」部分,開啟已完成實驗的詳細資料檢視畫面。在這個檢視畫面中,您可以查看根據目標指標和您選取的所有次要指標,每個變化版本的成效。透過這項資訊,您可以決定要推出主要的變化版本,還是其他變化版本。

如要向所有使用者推出變化版本,請在實驗詳細資料頁面上依序點選 > [推出變化版本]。如此一來,所有使用者的 plant_labeler_model 參數值就會為 plant_labeler_v2

日後的應用程式更新應將 plant_labeler_model 參數的預設值變更為 plant_labeler_v2,並更新隨附的模型 (如有使用)。不過,使用者已經在使用最新模型,因此您可以視需要在已發布的應用程式中推送這項更新,例如下次進行功能更新時。