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参数的默认值,如以下示例所示:

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

爪哇

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

爪哇

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

现在,您的应用程序使用Remote Config参数来确定要加载的模型,您可以通过发布新模型并将其名称分配给Remote Config参数来更改模型。此功能使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)
        }
    }

爪哇

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(分析)事件进行优化。

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

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

Kotlin + KTX

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

爪哇

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

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

此时,您可以将应用程序部署到Play商店。您的应用将继续使用原始模型,但是您添加的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测试收集了足够的信息以宣布一位领导者之后(在这种情况下,这是最大化顶部搜索结果点击率的变体),您可以决定是否向所有用户推出获胜变体(或另一个变体)。

在的A / B测试火力地堡控制台,打开细节查看已完成的实验。从此视图中,您可以查看每个变体如何根据您的目标指标和您选择的任何辅助指标进行操作。有了这些信息,你可以决定是否推出领先的变体或另一种变体。

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

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