Google 致力于为黑人社区推动种族平等。查看具体举措
此页面由 Cloud Translation API 翻译。
Switch to English

A / B测试模型的两个版本

训练新的自定义模型或AutoML Vision Edge模型后,可以使用A / B测试来查看新模型在实际条件下与已使用的模型相比的性能如何。确认新模型已得到改进之后,您可以轻松地向所有用户推出新模型,而无需更新应用程序。

此页面显示了如何进行A / B测试,以评估模型的两个版本,这些版本可以支持虚拟的可视工厂搜索功能。此功能使用自定义图像标签模型来帮助用户从图像中识别植物物种。

假设您刚刚发布了一个新的植物标签模型plant_labeler_v2并且想要运行一个将其与当前模型进行比较的实验,该模型名为plant_labeler_v1 。以下步骤显示了如何设置实验,运行实验以及对结果采取行动。

1.使模型可远程配置

A / B测试模型的第一步是修改您的应用程序,以使用Remote Config参数确定它使用的模型。最初,您会将此参数的默认值设置为您的应用已使用的模型,但是由于模型名称是由可远程配置的参数控制的,因此您可以更改和试验不同的模型而不必将应用更新推送到您的用户每次。

因此,如果以名称plant_labeler_v1发布当前模型,则可以在应用程序初始化代码中将plant_labeler_v1设置为plant_labeler_model参数的默认值,如以下示例所示:

迅速

let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
    "plant_labeler_model": "plant_labeler_v1" as NSObject,
    // ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()

物镜

FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
  @"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
  // ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];

然后,更改模型设置代码以加载plant_labeler_model参数指定的模型:

迅速

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

物镜

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

现在,您的应用程序使用Remote Config参数来确定要加载的模型,您可以通过发布新模型并将其名称分配给Remote Config参数来更改模型。此功能使A / B测试可以将不同的模型分配给不同的用户,以进行比较。

在继续之前,还要在模型下载代码中添加以下内容:

迅速

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

物镜

__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测试具有多个内置指标,包括收入,每日参与度和用户保留率。这些指标通常对于测试不同的UX流或微调参数很有用,但对于评估模型和用例可能没有意义。在这种情况下,您可以尝试针对自定义Analytics(分析)事件进行优化。

以假设的可视植物搜索功能为例,假设您按照模型对每个结果的置信度顺序向用户展示了搜索结果。您可以通过查看用户打开第一个搜索结果的频率来了解模型的准确性。

要测试哪种模型最能实现最大化顶部结果点击次数的目标,您将在用户点击结果列表中的第一项时记录一个自定义事件。

迅速

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

目标C

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

您测试的指标最终取决于应用程序如何使用模型。

此时,您可以将应用程序部署到App Store。您的应用将继续使用原始模型,但是您添加的Remote Config和Analytics代码将使您仅使用Firebase控制台即可尝试使用不同的模型。

3.运行A / B测试实验

既然您的应用已经掌握在用户手中,并且正在收集分析数据,那么创建一个A / B测试实验,以测试使用新模型而不是当前模型的效果。

创建实验:

  1. 在Firebase控制台的“事件”页面上,确认您正在记录相关的Google Analytics(分析)事件:激活事件和目标指标。

    您的应用程序需要至少记录一次每个事件,然后该事件才会出现在Firebase控制台中。

  2. 在Firebase控制台中,打开“ 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测试收集了足够的信息以宣布一位领导者之后(在这种情况下,这是最大化顶部搜索结果点击率的变体),您可以决定是否向所有用户推出获胜变体(或另一个变体)。

Firebase控制台的“ A / B测试”部分中,打开完成的实验的详细信息视图。从此视图中,您可以查看每个变体如何根据您的目标指标和您选择的任何辅助指标执行。有了这些信息,您就可以决定是否推出领先版本或其他版本。

要将变体推广给所有用户,请在实验的详细信息页面上单击 >推广变体。完成后,所有用户的plant_labeler_model参数的值将为plant_labeler_v2

在以后的应用程序更新中,您应该将plant_labeler_model参数的默认值更改为plant_labeler_v2并更新捆绑的模型(如果使用的话)。不过,您的用户已经在使用最新模型,因此您可以在方便时(例如,下次进行功能更新时)将其作为已发布应用程序的一部分推送。