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

Быстрый

let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
    "plant_labeler_model": "plant_labeler_v1" as NSObject,
    // ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()

Цель-C

FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
  @"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
  // ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];

Затем измените код настройки модели, чтобы загрузить модель, указанную параметром plant_labeler_model :

Быстрый

let rcValue = remoteConfig.configValue(forKey: "plant_labeler_model")
guard let remoteModelName = rcValue.stringValue else { return }

// ...

let remoteModel = RemoteModel(
    name: remoteModelName,
    allowsModelUpdates: true,
    initialConditions: initialConditions,
    updateConditions: updateConditions
)
ModelManager.modelManager().register(remoteModel)

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/ios/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/ios/use-custom-models#configure_a_local_model

Цель-C

FIRRemoteConfigValue *rcValue = [remoteConfig configValueForKey:@"plant_labeler_model"];
NSString *remoteModelName = [rcValue stringValue];

// ...

FIRRemoteModel *remoteModel = [[FIRRemoteModel alloc] initWithName:remoteModelName
                                                allowsModelUpdates:YES
                                                 initialConditions:initialConditions
                                                  updateConditions:updateConditions];
[[FIRModelManager modelManager] 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-тестированию назначать разные модели разным пользователям с целью их сравнения.

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

Быстрый

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let _ = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? RemoteModel,
        model.name == remoteModelName
        else { return }
    // If the model downloaded was specified by a remote parameter, log an
    // event, which will be our experiment's activation event.
    if rcValue.source == .remote {
        Analytics.logEvent("nondefault_model_downloaded", parameters: nil)
    }
}

Цель-C

__weak typeof(self) weakSelf = self;

[NSNotificationCenter.defaultCenter
    addObserverForName:FIRModelDownloadDidSucceedNotification
                object:nil
                 queue:nil
            usingBlock:^(NSNotification *_Nonnull note) {
              if (weakSelf == nil | note.userInfo == nil) {
                return;
              }

              FIRRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
              if ([model.name isEqualToString:remoteModelName] &&
                  rcValue.source == FIRRemoteConfigSourceRemote) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                [FIRAnalytics logEventWithName:@"nondefault_model_downloaded" parameters:nil];
              }
            }];

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

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

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

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

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

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

Быстрый

Analytics.logEvent("first_result_opened", parameters: nil)

Цель-C

[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];

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

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

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

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

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

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

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

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

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

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

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