После обучения новой специальной модели вы можете использовать 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, как показано в следующем примере:
Swift
let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
"plant_labeler_model": "plant_labeler_v1" as NSObject,
// ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()
Objective-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:
Swift
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/use-custom-models#configure_a_local_model
Objective-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/use-custom-models#configure_a_local_model
Теперь, когда ваше приложение использует параметр Remote Config, чтобы определить, какую модель загрузить, вы можете изменить модель, просто опубликовав новую и присвоив ее название параметру Remote Config. Эта функция позволяет A/B Testing назначать разные модели разным пользователям для сравнения.
Прежде чем продолжить, добавьте в код для скачивания модели следующее:
Swift
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)
}
}
Objective-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];
}
}];
Приведенный выше код регистрирует специальное событие Аналитики, которое вы будете использовать в качестве
2. Определите показатель цели
Затем вам нужно решить, как вы будете оценивать эффективность модели, и убедиться, что ваше приложение собирает данные, необходимые для тестирования разных версий модели по выбранному показателю.
A/B Testing содержит несколько встроенных показателей, в том числе доход, ежедневную вовлеченность и удержание пользователей. Эти показатели часто полезны для тестирования различных сценариев взаимодействия или точной настройки параметров, но могут не подходить для оценки вашей модели и варианта использования. В этом случае можно попробовать оптимизировать кампанию на основе специального события Аналитики.
Предположим, что в гипотетической функции визуального поиска растений результаты поиска показываются пользователю в порядке уверенности модели в каждом результате. Один из способов оценить точность модели – посмотреть, как часто пользователи открывали первый результат поиска.
Чтобы проверить, какая модель лучше всего подходит для достижения цели (максимальное количество кликов по первому результату), вы будете регистрировать специальное событие каждый раз, когда пользователь нажимает на первый элемент в списке результатов.
Swift
Analytics.logEvent("first_result_opened", parameters: nil)
Objective-C
[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];
Показатель, который вы будете тестировать, зависит от того, как ваше приложение использует модель.
Теперь вы можете опубликовать приложение в App Store. В вашем приложении будет использоваться исходная модель, но добавленный вами код Remote Config и Аналитики позволит экспериментировать с разными моделями, используя только консоль Firebase.
3. Как провести эксперимент A/B Testing
Теперь, когда ваше приложение доступно пользователям и собирает данные аналитики, создайте A/B Testingэксперимент, чтобы проверить, как использование новой модели влияет на результаты по сравнению с текущей моделью.
Чтобы создать эксперимент:
-
На странице События консоли Firebase убедитесь, что вы регистрируете нужные события Аналитики: событие активации и показатель цели.
Чтобы событие появилось в консоли Firebase, оно должно быть зарегистрировано в приложении хотя бы один раз.
-
В консоли Firebase откройте раздел A/B Testing.
-
Чтобы создать эксперимент:
Нажмите Создать эксперимент > Remote Config.
-
В разделе Таргетинг:
- Выберите приложение из списка.
- Укажите, сколько пользователей будет участвовать в эксперименте.
- Выберите событие активации, для которого вы начали вести журнал (в этом примере – nondefault_model_downloaded).
-
В разделе Цели выберите показатель цели, который вы определили в предыдущем разделе (в этом примере first_result_opened), из списка показателей целей и выберите любые дополнительные показатели, которые вы хотите отслеживать, например доход от покупок или количество пользователей без сбоев.
-
В разделе Варианты задайте два варианта:
- Контрольная группа (создается автоматически)
- Экспериментальная функция распознавания растений
Для контрольной группы создайте параметр
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 откройте подробную информацию о завершенном эксперименте. В этом представлении можно посмотреть, как каждый вариант соответствует целевому показателю и дополнительным показателям, которые вы выбрали. На основе этих данных вы можете решить, какой вариант использовать.
Чтобы применить вариант для всех пользователей, нажмите more_vert > Применить вариант на странице сведений об эксперименте. После этого значение параметра plant_labeler_model будет равно plant_labeler_v2 для всех пользователей.
В следующем обновлении приложения вам нужно будет изменить значение параметра plant_labeler_model по умолчанию на plant_labeler_v2 и обновить встроенную модель, если вы ее используете. Поскольку пользователи уже используют последнюю модель, вы можете опубликовать обновление в любое удобное время, например когда будете добавлять в приложение новые функции.