Prova A/B due versioni di un modello

Dopo aver addestrato un nuovo modello personalizzato o un modello AutoML Vision Edge, puoi utilizzare i test A/B per verificare le prestazioni del nuovo modello in condizioni reali rispetto al modello che già utilizzi. Dopo aver confermato che il tuo nuovo modello rappresenta un miglioramento, puoi facilmente distribuirlo a tutti i tuoi utenti, senza richiedere un aggiornamento dell'app.

Questa pagina mostra come condurre un test A/B che valuti due versioni di un modello che alimenta un'ipotetica funzionalità di ricerca visiva delle piante. Questa funzionalità utilizza un modello di etichettatura delle immagini personalizzato per aiutare gli utenti a identificare le specie di piante dalle loro immagini.

Supponiamo che tu abbia appena pubblicato un nuovo modello di etichettatura delle piante, plant_labeler_v2 e desideri eseguire un esperimento che lo confronti con il tuo modello attuale, denominato plant_labeler_v1 . I passaggi seguenti mostrano come impostare l'esperimento, eseguirlo e agire sui risultati.

1. Rendi il tuo modello configurabile da remoto

Il primo passaggio per eseguire il test A/B sui tuoi modelli è modificare la tua app per utilizzare un parametro Remote Config per determinare quale modello utilizza. Inizialmente, imposterai il valore predefinito di questo parametro in modo che sia il modello già utilizzato dalla tua app, ma poiché il nome del modello è controllato da un parametro configurabile in remoto, puoi modificare e sperimentare modelli diversi senza dover inviare aggiornamenti dell'app al tuo utenti ogni volta.

Pertanto, se pubblicassi il tuo modello corrente con il nome plant_labeler_v1 , nel codice di inizializzazione dell'app imposteresti plant_labeler_v1 come valore predefinito del parametro plant_labeler_model , come nell'esempio seguente:

Veloce

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

Obiettivo-C

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

Quindi, modifica il codice di configurazione del modello per caricare il modello specificato dal parametro plant_labeler_model :

Veloce

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

Obiettivo-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 utilizza un parametro Remote Config per determinare quale modello caricare, puoi modificare il modello semplicemente pubblicando un nuovo modello e assegnando il suo nome al parametro Remote Config. Questa funzionalità consente ai test A/B di assegnare modelli diversi a utenti diversi allo scopo di confrontarli.

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

Veloce

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

Obiettivo-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 precedente registra un evento Analytics personalizzato che utilizzerai in seguito come esperimento evento di attivazione . Un evento di attivazione è un evento che l'utente deve attivare prima di essere considerato parte dell'esperimento. Ciò garantisce che gli utenti non verranno registrati nel test A/B finché il loro dispositivo non avrà terminato di scaricare il modello ML personalizzato.

2. Determinare una metrica dell'obiettivo

Il passaggio successivo consiste nel decidere come misurare il successo del modello e assicurarsi che l'app raccolga i dati necessari per testare il rendimento delle diverse versioni del modello in base a tale metrica.

Il test A/B prevede diverse metriche integrate, tra cui entrate, coinvolgimento quotidiano e fidelizzazione degli utenti. Queste metriche sono spesso utili per testare diversi flussi UX o parametri di messa a punto, ma potrebbero non avere senso per valutare il modello e il caso d'uso. In questa situazione, puoi invece provare a ottimizzare per un evento Analytics personalizzato.

Utilizzando l'ipotetica funzionalità di ricerca visiva delle piante come esempio, supponi di aver presentato i risultati della ricerca all'utente nell'ordine di confidenza del modello in ciascun risultato. Un modo per farti un'idea della precisione del tuo modello è osservare la frequenza con cui gli utenti aprono il primo risultato di ricerca.

Per testare quale modello ha raggiunto meglio l'obiettivo di massimizzare i clic sui risultati migliori, dovresti registrare un evento personalizzato ogni volta che un utente tocca il primo elemento nell'elenco dei risultati.

Veloce

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

Obiettivo-C

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

La metrica per cui esegui il test dipende in definitiva da come la tua app utilizza il tuo modello.

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

3. Esegui un esperimento di test A/B

Ora che la tua app è nelle mani dei tuoi utenti e sta raccogliendo dati analitici, crea un esperimento di test A/B che verifichi l'effetto dell'utilizzo del nuovo modello anziché del modello attuale.

Per creare l'esperimento:

  1. Nella pagina Eventi della console Firebase, verifica di registrare gli eventi Analytics pertinenti: l'evento di attivazione e la metrica dell'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 Test A/B .

  3. Crea un nuovo esperimento:

    1. Fai clic su Crea esperimento > Configurazione remota .

    2. Nella sezione Targeting :

      • Scegli la tua app dall'elenco
      • Specifica quanti utenti desideri includere nell'esperimento
      • Seleziona l'evento di attivazione che hai iniziato a registrare (in questo esempio, nondefault_model_downloaded )
    3. Nella sezione Obiettivi , scegli la metrica dell'obiettivo che hai determinato nella sezione precedente (in questo esempio, first_result_opened ) dall'elenco delle metriche dell'obiettivo e seleziona eventuali metriche aggiuntive che desideri monitorare, come le entrate degli acquisti o gli utenti senza arresti anomali.

    4. Nella sezione Varianti , definire due varianti:

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

      Per il gruppo Controllo , creare un parametro plant_labeler_model e impostarlo su plant_labeler_v1 . Gli utenti assegnati al gruppo di controllo utilizzeranno il vecchio modello. (Non impostare il parametro su (no change) , poiché nella tua app stai verificando che stai utilizzando un valore remoto.)

      Per la variante dell'etichettatore di piante sperimentale , imposta il parametro plant_labeler_model su plant_labeler_v2 (supponendo che tu abbia pubblicato il tuo nuovo modello con quel nome). Gli utenti assegnati a questa variante utilizzeranno il nuovo modello.

    Schermata di configurazione del test A/B

Avvia l'esperimento e lascialo funzionare per diversi giorni o più, finché il test A/B non dichiara un leader. Se l'esperimento non riesce a determinare un leader, potrebbe essere necessario estendere l'esperimento a più utenti .

4. Distribuisci la variante vincente a tutti gli utenti

Scheda dei risultati del test A/B

Dopo che il test A/B ha raccolto informazioni sufficienti per dichiarare un leader, in questo caso la variante che ha massimizzato i clic più importanti nei risultati di ricerca, puoi decidere se distribuire la variante vincente (o un'altra variante) a tutti i tuoi utenti.

Nella sezione Test A/B della console Firebase , apri la visualizzazione dei dettagli dell'esperimento completato. Da questa visualizzazione puoi vedere il rendimento di ciascuna variante in base alla metrica dell'obiettivo e alle 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. Una volta fatto ciò, il valore del parametro plant_labeler_model sarà plant_labeler_v2 per tutti gli utenti.

In un futuro aggiornamento dell'app, dovresti modificare il valore predefinito del parametro plant_labeler_model in plant_labeler_v2 e aggiornare il modello in bundle se ne usi uno. I tuoi utenti, tuttavia, utilizzano già il modello più recente, quindi puoi inviare questo aggiornamento come parte dell'app pubblicata ogni volta che lo ritieni opportuno, ad esempio la prossima volta che effettui un aggiornamento delle funzionalità.