Eseguire test A/B di due versioni di un modello

Dopo aver addestrato un nuovo modello personalizzato o un modello AutoML Vision Edge, puoi utilizzare A/B Testing per vedere le prestazioni del nuovo modello in condizioni reali, rispetto al modello che già utilizzi. Dopo aver confermato che il nuovo modello è un miglioramento, puoi implementare facilmente il nuovo modello per tutti gli utenti, senza richiedere un aggiornamento dell'app.

Questa pagina mostra come eseguire un test A/B che valuta due versioni alla base di un'ipotetica funzionalità visiva di ricerca delle piante. Questa funzionalità utilizza un modello di etichettatura delle immagini personalizzato per aiutare gli utenti a identificare le specie di piante di queste immagini.

Supponiamo che tu abbia appena pubblicato un nuovo modello di etichettatura delle piante, plant_labeler_v2 e vuoi eseguire un esperimento per confrontarlo con il modello attuale, denominato plant_labeler_v1. I passaggi che seguono che mostrano come configurare l'esperimento, eseguirlo e intervenire sui risultati.

1. Rendere il modello configurabile da remoto

Il primo passaggio per il test A/B dei modelli consiste nel modificare l'app in modo che utilizzi una Parametro Remote Config per determinare quale modello utilizza. All'inizio imposterà il valore predefinito di questo parametro in modo che sia il modello utilizzato dalla tua app utilizza già, ma poiché il nome del modello è controllato da un parametro configurabile, puoi modificare e sperimentare modelli diversi senza dover inviare ogni volta aggiornamenti dell'app agli utenti.

Pertanto, se hai pubblicato il tuo modello attuale con il nome plant_labeler_v1, nel codice di inizializzazione dell'app imposterai plant_labeler_v1 come valore predefinito del plant_labeler_model parametro, come nell'esempio seguente:

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

Poi, modifica il codice di configurazione del modello per caricare il modello specificato dal parametro 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/label-images-with-automl#configure-a-local-model-source
// 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/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

Ora che la tua app usa un parametro Remote Config per determinare quale modello caricare, puoi modificare il modello semplicemente pubblicando un nuovo modello e assegnando al parametro Remote Config. Questa funzionalità consente a A/B Testing di assegnare modelli diversi a utenti diversi al fine di confrontarli.

Prima di continuare, aggiungi anche la seguente aggiunta al download del modello codice:

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

Il codice riportato sopra registra un evento Analytics personalizzato che utilizzerai in seguito come evento di attivazione dell'esperimento. Un evento di attivazione è un evento che l'utente deve attivarsi prima di essere considerato parte dell'esperimento. Questo assicura che gli utenti non vengano registrati nel test A/B finché il dispositivo non ha ha terminato il download del modello ML personalizzato.

2. Stabilire una metrica dell'obiettivo

Il passo successivo è decidere come misurare il successo del modello, e assicurarti che la tua app stia raccogliendo i dati necessari per verificare l'efficacia versioni diverse del modello funzionano in base a quella metrica.

A/B Testing ha diverse metriche integrate, tra cui Entrate, Giornaliere coinvolgimento e fidelizzazione degli utenti. Queste metriche sono spesso utili per testare flussi UX o parametri di ottimizzazione diversi, ma potrebbero non avere senso per per valutare il modello e il caso d'uso. In questo caso, puoi provare a ottimizzare per un evento Analytics personalizzato.

Utilizzando l'ipotetica funzionalità di ricerca visiva delle piante come esempio, supponi di ha presentato i risultati di ricerca all'utente in base all'ordine di confidenza del modello per ciascun risultato. Un modo per farsi un'idea della precisione del modello è che osserva la frequenza con cui gli utenti hanno aperto il primo risultato di ricerca.

Per verificare quale modello ha raggiunto l'obiettivo di massimizzare i clic sui risultati migliori, registrerai un evento personalizzato ogni volta che un utente tocca il primo elemento nel risultato dall'elenco di lettura.

Swift

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

Objective-C

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

La metrica che testare dipende in ultima analisi da come la tua app utilizza il modello.

A questo punto, puoi eseguire il deployment della tua app nell'App Store. La tua app continuerà a utilizzare il modello originale, ma il codice Remote Config e Analytics che hai aggiunto ti consentirà di eseguire esperimenti con modelli diversi utilizzando solo la console Firebase.

3. Esegui un esperimento A/B Testing

Ora che la tua app è disponibile e sta raccogliendo dati analitici, crea un esperimento A/B Testing per verificare l'effetto dell'utilizzo del nuovo anziché quello attuale.

Per creare l'esperimento:

  1. Nella scheda Eventi della console Firebase, verifica di aver eseguito l'accesso Eventi di Analytics: la metrica relativa all'evento di attivazione e all'obiettivo.

    La tua app deve registrare ogni evento almeno una volta prima che venga visualizzato nella Console Firebase.

  2. Nella console Firebase, apri la sezione A/B Testing.

  3. Crea un nuovo esperimento:

    1. Fai clic su Crea esperimento > Remote Config.

    2. Nella sezione Targeting:

      • Scegli l'app dall'elenco
      • Specifica quanti utenti vuoi includere nel esperimento
      • Seleziona l'evento di attivazione di cui hai iniziato la registrazione (in questo esempio, nondefault_model_downloaded)
    3. Nella sezione Obiettivi, scegli la metrica dell'obiettivo determinata in la sezione precedente (in questo esempio, first_result_opened) dall'elenco di metriche obiettivo e seleziona eventuali metriche aggiuntive vuoi monitorare, come le entrate generate dagli acquisti o gli utenti senza arresti anomali.

    4. Nella sezione Varianti, definisci due varianti:

      • Gruppo di controllo (creato automaticamente)
      • Etichettatore sperimentale per piante

      Per il gruppo di controllo, crea un parametro plant_labeler_model e impostalo su plant_labeler_v1. Utenti assegnati al gruppo di controllo utilizzerà il vecchio modello. Non impostare il parametro su (no change), poiché nella tua app stai testando l'utilizzo di un valore remoto.

      Per la variante Etichettatura vegetale sperimentale, imposta il valore plant_labeler_model per plant_labeler_v2 (supponendo che tu abbia pubblicato il nuovo modello) con lo stesso nome). Gli utenti assegnati a questa variante utilizzeranno il nuovo un modello di machine learning.

    Schermata di configurazione del test A/B

Avvia l'esperimento e attendi che venga eseguito per alcuni giorni o più, fino a quando A/B Testing dichiara una variante leader. Se l'esperimento non riesce a determinare una variante principale, potresti dover per estendere l'esperimento a un maggior numero di utenti.

4. Implementa la variante vincente per tutti gli utenti

Scheda dei risultati del test A/B

Dopo che A/B Testing ha raccolto informazioni sufficienti per dichiarare leader: in questo caso, la variante che ha massimizzato i risultati di ricerca più pertinenti clic, puoi decidere se implementare la variante vincente (o un'altra variante) per tutti gli utenti.

Nella sezione A/B Testing della console Firebase, apri i dettagli vista dell'esperimento completato. In questa visualizzazione puoi vedere come ogni variante rendimento in base alla metrica dell'obiettivo e a eventuali metriche secondarie selezionate. Con queste informazioni, puoi decidere se implementare la variante principale o un'altra variante.

Per implementare una variante per tutti gli utenti, fai clic su > Implementa variante nella pagina dei dettagli dell'esperimento. Dopodiché, il valore del parametro Il parametro plant_labeler_model verrà plant_labeler_v2 per tutti gli utenti.

In un futuro aggiornamento dell'app, dovresti modificare il valore predefinito Parametro plant_labeler_model in plant_labeler_v2 e aggiorna il bundle modello, se ne utilizzi uno. I tuoi utenti stanno già utilizzando il modello più recente, quindi puoi inviare questo aggiornamento come parte dell'app pubblicata in qualsiasi momento come il prossimo aggiornamento di una funzionalità.