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

Котлин + 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 параметра:

Котлин + 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 Testing назначать разные модели разным пользователям для их сравнения.

Прежде чем продолжить, внесите следующее дополнение в код загрузки вашей модели:

Котлин + 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, которое вы будете использовать позже в качестве эксперимента. событие активации . Событие активации - это событие, которое пользователь должен запустить, прежде чем он будет считаться участником эксперимента. Это гарантирует, что пользователи не будут записаны в ваш A / B-тест, пока их устройство не завершит загрузку своей пользовательской модели машинного обучения.

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

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

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

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

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

Котлин + KTX

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

Ява

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

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

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

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

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

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

  1. На Events странице Firebase консоли, убедитесь , вы регистрируете соответствующие Analytics события: события активации и цель метрики.

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

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

  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-тестирование не определит лидера. Если эксперимент не может определить лидера, возможно , потребуется расширить эксперимент для большего числа пользователей .

4. Раскройте выигрышный вариант для всех пользователей.

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

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

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

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

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