A/B-тестирование двух версий модели,A/B-тестирование двух версий модели

После обучения новой пользовательской модели или модели AutoML Vision Edge вы можете использовать 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+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-kit/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml-kit/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-kit/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml-kit/android/use-custom-models#configure_a_local_model

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

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

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

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

2. Определите целевую метрику

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

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

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

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

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

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

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

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

    1. Нажмите Создать эксперимент > Remote Config .

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

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

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

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

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

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