Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

A/B test due versioni di un modello

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

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

Supponiamo che appena pubblicato un nuovo modello di etichettatura impianto, plant_labeler_v2 e si desidera eseguire un esperimento che lo confronta con il modello attuale, di nome 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 dei modelli consiste nel modificare l'app in modo che utilizzi 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.

Quindi, se hai pubblicato il tuo modello attuale con il nome plant_labeler_v1 , si farebbe, nel codice di inizializzazione app, insieme plant_labeler_v1 come il valore di default del plant_labeler_model parametri, come nell'esempio che segue:

Kotlin+KTX

val remoteConfig = FirebaseRemoteConfig.getInstance()

val remoteConfigDefaults = HashMap<String, Any>()
remoteConfigDefaults["plant_labeler_model"] = "plant_labeler_v1"
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults))

remoteConfig.fetchAndActivate().addOnSuccessListener { success ->
    if (success) {
      // Okay to get remote values.
      // ...
    }
}

Giava

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();

Map<String, Object> remoteConfigDefaults = new HashMap<>();
remoteConfigDefaults.put("plant_labeler_model", "plant_labeler_v1");
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults));

remoteConfig.fetchAndActivate().addOnSuccessListener(
        new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean success) {
                if (success) {
                  // Okay to get remote values.
                  // ...
                }
            }
        });

Quindi, modificare il codice di installazione del modello per caricare il modello specificato dal plant_labeler_model parametri:

Kotlin+KTX

val rcValue = remoteConfig.getValue("plant_labeler_model")
val remoteModelName = rcValue.asString()

// ...

val remoteModel = FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build()
FirebaseModelManager.getInstance().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

Giava

FirebaseRemoteConfigValue rcValue = remoteConfig.getValue("plant_labeler_model");
String remoteModelName = rcValue.asString();

// ...

FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build();
FirebaseModelManager.getInstance().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 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, aggiungi anche la seguente aggiunta al codice download del tuo modello:

Kotlin+KTX

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
    .addOnSuccessListener {
        // If the model downloaded was specified by a remote parameter, log an
        // event, which will be our experiment's activation event.
        if (rcValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
            FirebaseAnalytics.getInstance(this).logEvent("nondefault_model_downloaded", null)
        }
    }

Giava

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                if (rcValue.getSource() == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
                    FirebaseAnalytics.getInstance(YourActivity.this)
                            .logEvent("nondefault_model_downloaded", null);
                }
            }
        });

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 vengano registrati nel tuo test A/B fino a quando il loro dispositivo non ha terminato il download del 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 ha diverse metriche integrate, tra cui entrate, coinvolgimento giornaliero 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, supponiamo di aver presentato i risultati della ricerca all'utente nell'ordine della fiducia del modello in ciascun risultato. Un modo per avere un'idea dell'accuratezza del tuo modello sarebbe osservando la frequenza con cui gli utenti hanno aperto il primo risultato di ricerca.

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

Kotlin+KTX

FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)

Giava

FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);

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 sul Play 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 tuo nuovo modello invece del modello corrente.

Per creare l'esperimento:

  1. Sulla eventi pagina della console Firebase, verificare che si stanno registrando i relativi eventi Analytics: l'evento di attivazione e l'obiettivo metriche.

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

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

  3. Crea un nuovo esperimento:

    1. Fare clic su Crea esperimento> Remote Config.

    2. Nella sezione Targeting:

      • Scegli la tua app dall'elenco
      • Specifica quanti dei tuoi utenti vuoi includere nell'esperimento
      • Selezionare l'evento di attivazione iniziare la registrazione (in questo esempio, nondefault_model_downloaded)
    3. Nella sezione Reti, scegli l'obiettivo metrica è determinato nella sezione precedente (in questo esempio, first_result_opened) dall'elenco di metriche obiettivo, e selezionare qualsiasi metriche aggiuntive che si desidera monitorare, come ad esempio le entrate di acquisto o di utenti privi di incidente.

    4. Nella sezione di varianti, definire due varianti:

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

      Per il gruppo di controllo, creare un plant_labeler_model parametro e impostarlo plant_labeler_v1 . Gli utenti assegnati al gruppo di controllo utilizzeranno il vecchio modello. (Non impostare il parametro (no change) , dal momento che nella vostra app, sei prove che si sta utilizzando un valore di distanza.)

      Per la variante impianto etichettatrice Sperimentale, impostare il plant_labeler_model parametro plant_labeler_v2 (supponendo che hai pubblicato il tuo nuovo modello sotto questo nome). Gli utenti assegnati a questa variante utilizzeranno il nuovo modello.

    Schermata di configurazione del test A/B

Avvia l'esperimento e fallo funzionare per diversi giorni o più, fino a quando l'A/B Testing non dichiara un leader. Se l'esperimento non può 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 sui risultati di ricerca principali, puoi decidere se distribuire la variante vincente (o un'altra variante) a tutti i tuoi utenti.

Nella sezione Test A / B della console Firebase , aprire vista dei dettagli dell'esperimento completata. Da questa visualizzazione, puoi vedere il rendimento di ciascuna variante in base alla metrica dell'obiettivo e alle metriche secondarie selezionate. Con queste informazioni, puoi decidere se implementare la variante principale o un'altra variante.

Per stendere una variante a tutti gli utenti, fare clic su > Stendete variante nella pagina dei dettagli dell'esperimento. Una volta fatto ciò, il valore del plant_labeler_model parametro sarà plant_labeler_v2 per tutti gli utenti.

In un aggiornamento futuro app, è necessario modificare il valore predefinito del plant_labeler_model parametro da plant_labeler_v2 e aggiornare il modello in dotazione se si utilizza uno. Tuttavia, i tuoi utenti stanno già utilizzando il modello più recente, quindi puoi inviare questo aggiornamento come parte dell'app pubblicata ogni volta che è conveniente, ad esempio quando effettui un successivo aggiornamento delle funzionalità.