Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

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

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

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

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

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

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

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

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

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

Kotlin+KTX

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

Java

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

Метрика, которую вы тестируете, в конечном итоге зависит от того, как ваше приложение использует вашу модель.

На этом этапе вы можете развернуть свое приложение в Play Store. Ваше приложение продолжит использовать исходную модель, но добавленный вами код Remote Config and Analytics позволит вам экспериментировать с другими моделями, используя только консоль Firebase.

3. Проведите эксперимент по A/B-тестированию

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

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

  1. На странице « События » консоли Firebase убедитесь, что вы регистрируете соответствующие события Google Analytics: событие активации и показатель цели.

    Ваше приложение должно зарегистрировать каждое событие хотя бы один раз, прежде чем оно появится в консоли Firebase.

  2. В консоли Firebase откройте раздел A/B Testing .

  3. Создайте новый эксперимент:

    1. Щелкните Создать эксперимент > Удаленная настройка .

    2. В разделе « Таргетинг »:

      • Выберите свое приложение из списка
      • Укажите, сколько ваших пользователей вы хотите включить в эксперимент
      • Выберите событие активации, которое вы начали регистрировать (в этом примере, nondefault_model_downloaded )
    3. В разделе « Цели » выберите целевую метрику, которую вы определили в предыдущем разделе (в данном примере, first_result_opened ) из списка целевых метрик, а также любые дополнительные метрики, которые вы хотите отслеживать, например доход от покупок или пользователей без сбоев.

    4. В разделе Варианты определите два варианта:

      • Группа управления (создается автоматически)
      • Этикетировщик экспериментальных растений

      Для группы Control создайте параметр 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 Testing консоли Firebase откройте представление сведений о завершенном эксперименте. В этом представлении вы можете увидеть, как каждый вариант работал в соответствии с вашей целевой метрикой и любыми дополнительными метриками, которые вы выбрали. С помощью этой информации вы можете решить, развертывать ли ведущий вариант или другой вариант.

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

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