A/B-Test zweier Versionen eines Modells

Nachdem Sie ein neues benutzerdefiniertes Modell oder AutoML Vision Edge-Modell trainiert haben, können Sie A/B-Tests verwenden, um zu sehen, wie gut das neue Modell unter realen Bedingungen im Vergleich zu dem bereits verwendeten Modell abschneidet. Nachdem Sie bestätigt haben, dass Ihr neues Modell eine Verbesserung darstellt, können Sie das neue Modell ganz einfach für alle Ihre Benutzer bereitstellen, ohne dass ein App-Update erforderlich ist.

Auf dieser Seite wird gezeigt, wie Sie einen A/B-Test durchführen können, der zwei Versionen eines Modells bewertet, das eine hypothetische visuelle Pflanzensuchfunktion unterstützt. Diese Funktion verwendet ein benutzerdefiniertes Bildkennzeichnungsmodell, um Benutzern dabei zu helfen, Pflanzenarten aus Bildern von ihnen zu identifizieren.

Angenommen , Sie gerade ein neues Werk Kennzeichnung Modell veröffentlicht, plant_labeler_v2 und Sie wollen ein Experiment auszuführen , die es mit Ihrem aktuellen Modell vergleicht, mit dem Namen plant_labeler_v1 . Die folgenden Schritte zeigen, wie Sie das Experiment einrichten, ausführen und Maßnahmen zu den Ergebnissen ergreifen.

1. Machen Sie Ihr Modell aus der Ferne konfigurierbar

Der erste Schritt zum A/B-Testen Ihrer Modelle besteht darin, Ihre App so zu ändern, dass ein Remote Config-Parameter verwendet wird, um zu bestimmen, welches Modell sie verwendet. Anfangs legen Sie den Standardwert dieses Parameters auf das Modell fest, das Ihre App bereits verwendet. Da der Modellname jedoch von einem fernkonfigurierbaren Parameter gesteuert wird, können Sie verschiedene Modelle ändern und mit ihnen experimentieren, ohne App-Updates auf Ihre App übertragen zu müssen Benutzer jedes Mal.

Also, wenn Sie veröffentlichte Ihr aktuelles Modell unter dem Namen plant_labeler_v1 , würden Sie in Ihrer App Initialisierungscode, Satz plant_labeler_v1 als Standardwert des plant_labeler_model Parameter, wie im folgenden Beispiel:

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.
      // ...
    }
}

Java

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.
                  // ...
                }
            }
        });

Ändern Sie dann Code Ihr Modell Setup das Modell von der angegebenen zu laden plant_labeler_model Parameter:

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

Java

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

Da Ihre App jetzt einen Remote Config-Parameter verwendet, um zu bestimmen, welches Modell geladen werden soll, können Sie das Modell ändern, indem Sie einfach ein neues Modell veröffentlichen und seinen Namen dem Remote Config-Parameter zuweisen. Mit dieser Funktion können A/B-Tests verschiedenen Benutzern verschiedene Modelle zuordnen, um sie zu vergleichen.

Bevor Sie fortfahren, fügen Sie Ihrem Modell-Downloadcode außerdem Folgendes hinzu:

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

Java

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

Der obige Code protokolliert ein benutzerdefiniertes Analytics-Ereignis, das Sie später als Testereignis verwenden werden Aktivierungsereignis . Ein Aktivierungsereignis ist ein Ereignis, das der Benutzer auslösen muss, bevor er als Teil des Experiments betrachtet wird. Dadurch wird sichergestellt, dass Nutzer nicht in Ihrem A/B-Test erfasst werden, bis ihr Gerät das benutzerdefinierte ML-Modell heruntergeladen hat.

2. Bestimmen Sie eine Zielkennzahl

Der nächste Schritt besteht darin, zu entscheiden, wie Sie den Erfolg Ihres Modells messen und sicherstellen, dass Ihre App die Daten sammelt, die erforderlich sind, um zu testen, wie gut verschiedene Versionen des Modells gemäß dieser Metrik funktionieren.

A/B-Tests verfügen über mehrere integrierte Metriken, darunter Umsatz, tägliches Engagement und Nutzerbindung. Diese Metriken sind oft nützlich zum Testen verschiedener UX-Flows oder zur Feinabstimmung von Parametern, sind jedoch möglicherweise nicht sinnvoll, um Ihr Modell und Ihren Anwendungsfall zu bewerten. In dieser Situation können Sie stattdessen versuchen, für ein benutzerdefiniertes Analytics-Ereignis zu optimieren.

Nehmen wir als Beispiel die hypothetische visuelle Pflanzensuchfunktion an, Sie haben Ihrem Benutzer Suchergebnisse in der Reihenfolge der Vertrauenswürdigkeit des Modells in den einzelnen Ergebnissen präsentiert. Eine Möglichkeit, sich ein Bild von der Genauigkeit Ihres Modells zu machen, besteht darin, sich anzusehen, wie oft Benutzer das erste Suchergebnis geöffnet haben.

Um zu testen, welches Modell das Ziel der Maximierung der Klicks mit den besten Ergebnissen am besten erreicht, würden Sie jedes Mal ein benutzerdefiniertes Ereignis protokollieren, wenn ein Benutzer auf das erste Element in der Ergebnisliste tippt.

Kotlin+KTX

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

Java

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

Welche Metrik Sie testen, hängt letztendlich davon ab, wie Ihre App Ihr ​​Modell verwendet.

An diesem Punkt können Sie Ihre App im Play Store bereitstellen. Ihre App verwendet weiterhin Ihr ursprüngliches Modell, aber mit dem hinzugefügten Remote Config- und Analytics-Code können Sie nur mit der Firebase-Konsole mit verschiedenen Modellen experimentieren.

3. Führen Sie ein A/B-Testing-Experiment durch

Da sich Ihre App nun in den Händen Ihrer Benutzer befindet und Analysedaten sammelt, erstellen Sie ein A/B-Testing-Experiment, das die Auswirkungen der Verwendung Ihres neuen Modells anstelle des aktuellen Modells testet.

So erstellen Sie das Experiment:

  1. Auf den Veranstaltungen Seite der Konsole Firebase, überprüfen Sie die entsprechenden Analytics Ereignisse protokollieren: das Aktivierungsereignis und Ziel Metrik.

    Ihre App muss jedes Ereignis mindestens einmal protokollieren, bevor es in der Firebase-Konsole angezeigt wird.

  2. In der Konsole Firebase öffnet Abschnitt des A / B - Tests.

  3. Erstellen Sie ein neues Experiment:

    1. Erstellen Experiment Klicken> Remote - Konfiguration.

    2. Im Bereich Targeting:

      • Wählen Sie Ihre App aus der Liste
      • Geben Sie an, wie viele Ihrer Nutzer Sie in das Experiment einbeziehen möchten
      • Wählen Sie das Aktivierungsereignis Sie begonnen Protokollierung (in diesem Beispiel nondefault_model_downloaded)
    3. Im Abschnitt Ziele, wählen Sie das Ziel Metrik , die Sie im vorherigen Abschnitt bestimmt (in diesem Beispiel first_result_opened) aus der Liste der Ziel - Metriken, und wählen Sie alle zusätzlichen Metriken Sie, wie Kauf Einnahmen oder absturzfrei Benutzer verfolgen möchten.

    4. Im Variante Abschnitt definiert zwei Varianten:

      • Kontrollgruppe (automatisch erstellt)
      • Experimentelle Pflanzenkennzeichnung

      Für die Kontrollgruppe, ein erstellen plant_labeler_model Parameter und setzen plant_labeler_v1 . Benutzer, die der Kontrollgruppe zugewiesen sind, verwenden das alte Modell. (Stellen Sie den Parameter auf (no change) , da in Ihrer Anwendung, Sie testen , dass Sie einen Remote - Wert verwenden.)

      Für die Versuchsanlage Etikettierer Variante, stellen Sie den plant_labeler_model Parameter plant_labeler_v2 (vorausgesetzt , Sie Ihr neues Modell unter diesem Namen veröffentlicht). Benutzer, die dieser Variante zugewiesen sind, verwenden das neue Modell.

    Konfigurationsbildschirm für A/B-Tests

Starten Sie das Experiment und lassen Sie es mehrere Tage oder länger laufen, bis A/B Testing zum Leader erklärt. Wenn das Experiment nicht einen Führer bestimmen kann, müssen Sie das Experiment , um mehr Nutzer zu erweitern .

4. Die Gewinnervariante an alle Nutzer ausrollen

A/B-Testergebniskarte

Nachdem A/B-Testing genügend Informationen gesammelt hat, um einen führenden Anbieter zu benennen – in diesem Fall die Variante, die die Klicks in den Top-Suchergebnissen maximiert hat – können Sie entscheiden, ob Sie die Gewinnervariante (oder eine andere Variante) allen Ihren Nutzern zur Verfügung stellen.

In der A / B - Tests Abschnitt der Firebase Konsole öffnen sich die Details des fertigen Experiment betrachten. In dieser Ansicht können Sie sehen, wie jede Variante gemäß Ihrem Zielmesswert und allen von Ihnen ausgewählten sekundären Messwerten abgeschnitten hat. Anhand dieser Informationen können Sie entscheiden, ob Sie die führende Variante oder eine andere Variante ausrollen möchten.

Um eine Variante für alle Benutzer ausrollen, klicken > Roll - out - Variante auf der Detailseite des Experiments. Sobald Sie dies tun, wird der Wert des plant_labeler_model wird Parameter sein plant_labeler_v2 für alle Benutzer.

In einem zukünftigen App - Update sollten Sie den Standardwert der ändern plant_labeler_model Parameter plant_labeler_v2 und das gebündelte Modell aktualisieren , wenn Sie eine solche verwenden. Ihre Benutzer verwenden jedoch bereits das neueste Modell, sodass Sie dieses Update jederzeit als Teil der veröffentlichten App übertragen können, z. B. wenn Sie das nächste Feature-Update durchführen.