A/B tester deux versions d'un modèle

Après avoir entraîné un nouveau modèle personnalisé ou un modèle AutoML Vision Edge, vous pouvez utiliser les tests A/B pour voir les performances du nouveau modèle dans des conditions réelles, par rapport au modèle que vous utilisez déjà. Après avoir confirmé que votre nouveau modèle constitue une amélioration, vous pouvez facilement déployer le nouveau modèle auprès de tous vos utilisateurs, sans nécessiter de mise à jour de l'application.

Cette page montre comment vous pouvez effectuer un test A/B qui évalue deux versions d'un modèle qui alimente une fonction de recherche visuelle d'usine hypothétique. Cette fonctionnalité utilise un modèle d'étiquetage d'image personnalisé pour aider les utilisateurs à identifier les espèces végétales à partir d'images d'elles.

Supposons que vous veniez de publier un nouveau modèle d'étiquetage des plantes, plant_labeler_v2 et que vous souhaitiez exécuter une expérience qui le compare à votre modèle actuel, nommé plant_labeler_v1 . Les étapes ci-dessous montrent comment configurer l'expérience, l'exécuter et agir sur les résultats.

1. Rendez votre modèle configurable à distance

La première étape du test A/B de vos modèles consiste à modifier votre application pour utiliser un paramètre Remote Config afin de déterminer le modèle qu'elle utilise. Initialement, vous définirez la valeur par défaut de ce paramètre sur le modèle que votre application utilise déjà, mais comme le nom du modèle est contrôlé par un paramètre configurable à distance, vous pouvez modifier et expérimenter différents modèles sans avoir à envoyer les mises à jour de l'application sur votre utilisateurs à chaque fois.

Ainsi, si vous publiez votre modèle actuel sous le nom plant_labeler_v1 , vous définissez, dans le code d'initialisation de votre application, plant_labeler_v1 comme valeur par défaut du paramètre plant_labeler_model , comme dans l'exemple suivant :

Rapide

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

Objectif c

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

Ensuite, modifiez le code de configuration de votre modèle pour charger le modèle spécifié par le paramètre plant_labeler_model :

Rapide

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

Objectif 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

Maintenant que votre application utilise un paramètre Remote Config pour déterminer le modèle à charger, vous pouvez modifier le modèle simplement en publiant un nouveau modèle et en attribuant son nom au paramètre Remote Config. Cette fonctionnalité permet à A/B Testing d'attribuer différents modèles à différents utilisateurs dans le but de les comparer.

Avant de continuer, effectuez également l'ajout suivant au code de téléchargement de votre modèle :

Rapide

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

Objectif 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];
              }
            }];

Le code ci-dessus enregistre un événement Analytics personnalisé que vous utiliserez plus tard comme événement de votre expérience. événement d'activation . Un événement d'activation est un événement que l'utilisateur doit déclencher avant d'être considéré comme faisant partie de l'expérience. Cela garantit que les utilisateurs ne seront pas enregistrés dans votre test A/B tant que leur appareil n'aura pas fini de télécharger leur modèle ML personnalisé.

2. Déterminer une mesure d'objectif

L'étape suivante consiste à décider comment vous allez mesurer le succès de votre modèle et à vous assurer que votre application collecte les données nécessaires pour tester les performances des différentes versions du modèle en fonction de cette métrique.

Les tests A/B disposent de plusieurs mesures intégrées, notamment les revenus, l'engagement quotidien et la fidélisation des utilisateurs. Ces métriques sont souvent utiles pour tester différents flux UX ou affiner les paramètres, mais peuvent ne pas avoir de sens pour évaluer votre modèle et votre cas d'utilisation. Dans cette situation, vous pouvez plutôt essayer d'optimiser pour un événement Analytics personnalisé.

En utilisant la fonction de recherche visuelle de plantes hypothétique comme exemple, supposons que vous présentiez les résultats de la recherche à votre utilisateur dans l'ordre de confiance du modèle dans chaque résultat. Une façon d'avoir une idée de la précision de votre modèle serait d'examiner la fréquence à laquelle les utilisateurs ouvrent le premier résultat de recherche.

Pour tester quel modèle a le mieux atteint l'objectif de maximiser les clics sur les meilleurs résultats, vous devez enregistrer un événement personnalisé chaque fois qu'un utilisateur appuie sur le premier élément de la liste de résultats.

Rapide

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

Objectif c

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

La métrique que vous testez dépend en fin de compte de la manière dont votre application utilise votre modèle.

À ce stade, vous pouvez déployer votre application sur l'App Store. Votre application continuera à utiliser votre modèle d'origine, mais le code Remote Config and Analytics que vous avez ajouté vous permettra d'expérimenter différents modèles en utilisant uniquement la console Firebase.

3. Exécutez une expérience de test A/B

Maintenant que votre application est entre les mains de vos utilisateurs et collecte des données analytiques, créez une expérience de test A/B qui teste l'effet de l'utilisation de votre nouveau modèle au lieu du modèle actuel.

Pour créer l'expérience :

  1. Sur la page Événements de la console Firebase, vérifiez que vous enregistrez les événements Analytics pertinents : l'événement d'activation et la métrique d'objectif.

    Votre application doit enregistrer chaque événement au moins une fois avant qu'il n'apparaisse dans la console Firebase.

  2. Dans la console Firebase, ouvrez la section Tests A/B .

  3. Créez une nouvelle expérience :

    1. Cliquez sur Créer une expérience > Configuration à distance .

    2. Dans la section Ciblage :

      • Choisissez votre application dans la liste
      • Spécifiez le nombre de vos utilisateurs que vous souhaitez inclure dans le test
      • Sélectionnez l'événement d'activation que vous avez commencé à enregistrer (dans cet exemple, nondefault_model_downloaded )
    3. Dans la section Objectifs , choisissez la métrique d'objectif que vous avez déterminée dans la section précédente (dans cet exemple, first_result_opened ) dans la liste des métriques d'objectif, et sélectionnez toutes les métriques supplémentaires que vous souhaitez suivre, telles que les revenus d'achat ou les utilisateurs sans crash.

    4. Dans la section Variantes , définissez deux variantes :

      • Groupe de contrôle (créé automatiquement)
      • Étiqueteuse de plantes expérimentales

      Pour le groupe Contrôle , créez un paramètre plant_labeler_model et définissez-le sur plant_labeler_v1 . Les utilisateurs affectés au groupe témoin utiliseront l'ancien modèle. (Ne définissez pas le paramètre sur (no change) , car dans votre application, vous testez que vous utilisez une valeur distante.)

      Pour la variante Experimental plant labeler , définissez le paramètre plant_labeler_model sur plant_labeler_v2 (en supposant que vous ayez publié votre nouveau modèle sous ce nom). Les utilisateurs affectés à cette variante utiliseront le nouveau modèle.

    Écran de configuration des tests A/B

Démarrez l'expérience et laissez-la se dérouler pendant plusieurs jours ou plus, jusqu'à ce que l'A/B Testing déclare un leader. Si le test ne parvient pas à déterminer un leader, vous devrez peut-être étendre le test à davantage d'utilisateurs .

4. Déployez la variante gagnante auprès de tous les utilisateurs

Fiche de résultat du test A/B

Une fois que les tests A/B ont collecté suffisamment d'informations pour désigner un leader (dans ce cas, la variante qui a maximisé les clics dans les meilleurs résultats de recherche), vous pouvez décider de déployer la variante gagnante (ou une autre variante) à tous vos utilisateurs.

Dans la section Tests A/B de la console Firebase , ouvrez la vue détaillée du test terminé. À partir de cette vue, vous pouvez voir les performances de chaque variante en fonction de la mesure de votre objectif et des mesures secondaires que vous avez sélectionnées. Grâce à ces informations, vous pouvez décider de déployer la variante principale ou une autre variante.

Pour déployer une variante auprès de tous les utilisateurs, cliquez sur > Déployer une variante sur la page de détails du test. Une fois cela fait, la valeur du paramètre plant_labeler_model sera plant_labeler_v2 pour tous les utilisateurs.

Dans une future mise à jour de l'application, vous devez modifier la valeur par défaut du paramètre plant_labeler_model en plant_labeler_v2 et mettre à jour le modèle fourni si vous en utilisez un. Cependant, vos utilisateurs utilisent déjà le dernier modèle, vous pouvez donc diffuser cette mise à jour dans le cadre de l'application publiée chaque fois que cela vous convient, par exemple lors de votre prochaine mise à jour de fonctionnalités.