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

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

現在應用程式可以使用遠端設定參數,判斷要 只需要發布新模型並指派模型即可 叫做「遠端設定」參數這項功能可讓 A/B 測試指派 以便向不同使用者比較不同模型

繼續操作之前,請一併在下載模型時新增下列項目 程式碼:

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 事件, 實驗的啟用事件。啟用事件是指 使用者必須先觸發實驗,系統才會將他們納入實驗。這個 確保在 A/B 版本測試中,系統不會在使用者的裝置 並完整下載自訂機器學習模型

2. 決定目標指標

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

A/B 測試功能有幾種內建指標,包括收益 參與度和使用者留存率這些指標在測試時 不同的使用者體驗流程或微調參數, 並評估模型和用途在這種情況下,您可以改為嘗試 以自訂 Analytics 事件做為最佳化目標

以假想視覺植物搜尋功能為例 系統會根據模型的可信度 每項結果。想要瞭解模型準確度的方法之一 有利於使用者開啟第一個搜尋結果的頻率

如要測試哪種模式最能達成「盡量提高熱門搜尋結果點擊次數」的目標, 每當使用者輕觸搜尋結果中的第一個項目時,就會記錄自訂事件 請參考閱讀清單,進一步瞭解 如何選擇 Kubeflow Pipelines SDK 或 TFX

Swift

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

Objective-C

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

最終測試的指標取決於應用程式使用 model.

此時,您可以將應用程式部署至 App Store。您的應用程式會繼續使用原始模型。 但您加入的「遠端設定」和「分析」程式碼 而且完全不必使用 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」區段中定義兩個變化版本:

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

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

      針對「實驗版植物標籤工具」變數,將 將 plant_labeler_model 參數傳送至 plant_labeler_v2 (假設您發布了新模型) 。指派給這個變化版本的使用者會使用新的 model.

    A/B 版本測試設定畫面

開始實驗,並讓實驗持續幾天以上,直到 A/B 測試會宣告主要版本。如果實驗無法決定勝出版本, 您可能需要 向更多使用者開放實驗。

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

A/B 測試結果資訊卡

A/B 測試收集到充足資訊以宣告 勝出者—在本例中是成效最佳的變化版本。 進而決定是否要採用成效最佳的版本 (或其他版本) 版本) 發布給所有使用者。

Firebase 主控台的「A/B 測試」部分,開啟詳細資料 即可查看已完成實驗的檢視畫面這個檢視畫面會顯示每個變化版本的 是根據您選取的目標指標和任何次要指標執行的成效 掌握這項資訊後,您就能決定要推出成效最佳的版本, 其他變化版本。

如要向所有使用者推出變化版本,請按一下 >針對以下項目導入變化版本: 實驗的詳細資料頁面。完成後, plant_labeler_model 參數會是 plant_labeler_v2 提供給所有使用者

日後的應用程式更新時,建議您 將 plant_labeler_model 參數更新為 plant_labeler_v2,並將隨附的 模型不過,您的使用者已經採用最新的模型, 您隨時可以在已發布的應用程式中推送這項更新 例如您下次更新功能時