Проводить 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, как показано в следующем примере:

Kotlin

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

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/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/use-custom-models#configure_a_local_model

Теперь, когда ваше приложение использует параметр Remote Config, чтобы определить, какую модель загрузить, вы можете изменить модель, просто опубликовав новую и присвоив ее название параметру Remote Config. Эта функция позволяет A/B Testing назначать разные модели разным пользователям для сравнения.

Прежде чем продолжить, добавьте в код для скачивания модели следующее:

Kotlin

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

Приведенный выше код регистрирует специальное событие Аналитики, которое вы будете использовать в качестве события активации эксперимента. Событие активации – это событие, которое должен инициировать пользователь, чтобы считаться участником эксперимента. Это гарантирует, что пользователи не будут зарегистрированы в A/B-тестировании, пока их устройство не завершит скачивание собственной модели машинного обучения.

2. Определите показатель цели

Затем вам нужно решить, как вы будете оценивать эффективность модели, и убедиться, что ваше приложение собирает данные, необходимые для тестирования разных версий модели по выбранному показателю.

A/B Testing содержит несколько встроенных показателей, в том числе доход, ежедневную вовлеченность и удержание пользователей. Эти показатели часто полезны для тестирования различных сценариев взаимодействия или точной настройки параметров, но могут не подходить для оценки вашей модели и варианта использования. В этом случае можно попробовать оптимизировать кампанию на основе специального события Аналитики.

Предположим, что в гипотетической функции визуального поиска растений результаты поиска показываются пользователю в порядке уверенности модели в каждом результате. Один из способов оценить точность модели – посмотреть, как часто пользователи открывали первый результат поиска.

Чтобы проверить, какая модель лучше всего подходит для достижения цели (максимальное количество кликов по первому результату), вы будете регистрировать специальное событие каждый раз, когда пользователь нажимает на первый элемент в списке результатов.

Kotlin

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

Java

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

Показатель, который вы будете тестировать, зависит от того, как ваше приложение использует модель.

Теперь вы можете опубликовать приложение в Google Play. В вашем приложении будет использоваться исходная модель, но добавленный вами код Remote Config и Аналитики позволит экспериментировать с разными моделями, используя только консоль Firebase.

3. Как провести эксперимент A/B Testing

Теперь, когда ваше приложение доступно пользователям и собирает данные аналитики, создайте A/B Testingэксперимент, чтобы проверить, как использование новой модели влияет на результаты по сравнению с текущей моделью.

Чтобы создать эксперимент:

  1. На странице События консоли Firebase убедитесь, что вы регистрируете нужные события Аналитики: событие активации и показатель цели.

    Чтобы событие появилось в консоли 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), поскольку в приложении вы тестируете использование удаленного значения.)

      Для варианта Экспериментальный определитель растений задайте для параметра plant_labeler_model значение plant_labeler_v2 (если вы опубликовали новую модель под этим названием). Пользователи, которым назначен этот вариант, будут использовать новую модель.

    Экран настройки A/B-тестирования

Запустите эксперимент и подождите несколько дней или больше, пока A/B Testing не объявит лидера. Если в эксперименте не удается определить лидера, возможно, вам потребуется расширить эксперимент на большее количество пользователей.

4. Как применить лучший вариант ко всем пользователям

Карточка результатов A/B-тестирования

Когда A/B Testing соберет достаточно данных, чтобы определить лидера (в данном случае вариант, который принес больше всего кликов по результатам поиска), вы сможете решить, следует ли распространять этот вариант (или другой) на всех пользователей.

В разделе A/B Testing консоли Firebase откройте подробную информацию о завершенном эксперименте. В этом представлении можно посмотреть, как каждый вариант соответствует целевому показателю и дополнительным показателям, которые вы выбрали. На основе этих данных вы можете решить, какой вариант использовать.

Чтобы применить вариант для всех пользователей, нажмите > Применить вариант на странице сведений об эксперименте. После этого значение параметра plant_labeler_model будет равно plant_labeler_v2 для всех пользователей.

В следующем обновлении приложения вам нужно будет изменить значение параметра plant_labeler_model по умолчанию на plant_labeler_v2 и обновить встроенную модель, если вы ее используете. Поскольку пользователи уже используют последнюю модель, вы можете опубликовать обновление в любое удобное время, например когда будете добавлять в приложение новые функции.