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

訓練新的自訂模型後,您可以透過 A/B Testing 比較新模型與現有模型在實際情況下的成效。確認新模型有所改善後,即可輕鬆向所有使用者推出新模型,不必進行應用程式更新。

本頁說明如何進行 A/B 版本測試,評估兩個版本的模型,這些模型為假設的植物圖片搜尋功能提供支援。這項功能會使用自訂圖片標籤模型,協助使用者從植物圖片中辨識物種。

假設您剛發布新的植物標籤模型,plant_labeler_v2並想進行實驗,將其與名為 plant_labeler_v1 的現有模型進行比較。以下步驟說明如何設定及運作執行實驗,並根據結果採取行動。

1. 讓模型可從遠端設定

如要對模型進行 A/B 測試,首先要修改應用程式,使用Remote Config參數判斷要使用哪個模型。一開始,您會將這個參數的預設值設為應用程式已使用的模型,但由於模型名稱是由可遠端設定的參數控管,因此您可以變更及實驗不同的模型,不必每次都向使用者推送應用程式更新。

因此,如果您以 plant_labeler_v1 為名發布目前的模型,您會在應用程式初始化程式碼中,將 plant_labeler_v1 設為 plant_labeler_model 參數的預設值,如下列範例所示:

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

接著,變更模型設定程式碼,載入 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/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/use-custom-models#configure_a_local_model

現在應用程式會使用 Remote Config 參數判斷要載入哪個模型,因此只要發布新模型並將其名稱指派給 Remote Config 參數,即可變更模型。這項功能可讓 A/B Testing 為不同使用者指派不同模型,以便進行比較。

繼續操作前,請在模型下載程式碼中新增下列內容:

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

上述程式碼會記錄自訂 Analytics 事件,您稍後會將這個事件做為實驗的啟用事件。啟用事件是指使用者必須觸發的事件,系統才會將使用者視為實驗的一部分。這樣可確保使用者裝置完成自訂 ML 模型下載作業後,才會記錄在 A/B 測試中。

2. 決定目標指標

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

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

以假設的植物圖片搜尋結果功能為例,假設您向使用者顯示搜尋結果時,是依據模型對每個結果的信心程度排序。如要瞭解模型的準確度,可以查看使用者開啟第一個搜尋結果的頻率。

如要測試哪種模型最能達成「盡量爭取頂端結果點擊次數」的目標,您可以在使用者輕觸結果清單中的第一個項目時,記錄自訂事件。

Swift

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

Objective-C

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

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

此時,您就可以將應用程式部署到 App Store。應用程式會繼續使用原始模型,但您加入的 Remote Config 和 Analytics 程式碼可讓您只透過 Firebase 控制台,實驗使用不同模型。

3. 執行A/B Testing實驗

現在使用者已開始使用您的應用程式,且應用程式正在收集 Analytics 資料,請建立A/B Testing實驗,測試使用新模型而非目前模型的效果。

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

  1. Firebase 控制台的「事件」頁面,確認您已記錄相關的 Analytics 事件:啟用事件和目標指標。

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

  2. Firebase 控制台中,開啟「A/B Testing」部分。

  3. 建立新實驗:

    1. 依序點選「建立實驗」> Remote Config

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

      • 從清單中選擇應用程式
      • 指定要納入實驗的使用者人數
      • 選取您開始記錄的啟用事件 (在本例中為「nondefault_model_downloaded」)
    3. 在「目標」部分中,從目標指標清單中選擇您在上一節中決定的目標指標 (在本例中為 first_result_opened),然後選取要追蹤的任何其他指標,例如購買收益或無當機使用者。

    4. 在「變體」部分中,定義兩個變體:

      • 控制組 (自動建立)
      • 實驗性植物標籤器

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

      如果是「Experimental plant labeler」(實驗性植物標籤器) 變體,請將 plant_labeler_model 參數設為 plant_labeler_v2 (假設您已使用該名稱發布新模型)。指派給這個變體的使用者會使用新模型。

    A/B 測試設定畫面

開始實驗,並讓實驗執行幾天以上,直到 A/B Testing 宣告領先者為止。如果實驗無法判斷出領先者,您可能需要 擴大實驗範圍,納入更多使用者

4. 向所有使用者顯示勝出的變化版本

A/B 測試結果資訊卡

A/B Testing 收集足夠資訊來選出勝出版本 (在本例中,是將頂端搜尋結果點擊次數最大化的變化版本) 後,您就能決定是否要向所有使用者推出勝出的變化版本 (或其他變化版本)。

Firebase 控制台的「A/B Testing」部分,開啟已完成實驗的詳細資料檢視畫面。在這個檢視畫面中,您可以根據目標指標和所選的任何次要指標,查看各個變體的成效。有了這項資訊,您就能決定要推出領先變體還是其他變體。

如要向所有使用者推出變化版本,請在實驗的詳細資料頁面中,按一下 >「導入變化版本」。完成後,所有使用者的 plant_labeler_model 參數值都會是 plant_labeler_v2

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