A/B-Tests für zwei Versionen eines Modells durchführen

Nachdem Sie ein neues benutzerdefiniertes Modell oder AutoML Vision Edge-Modell trainiert haben, können Sie A/B Testing, um zu sehen, wie gut das neue Modell unter realen Bedingungen funktioniert, im Vergleich zu dem Modell, das Sie bereits verwenden. Nachdem Sie bestätigt haben, dass Ihr neues Modell eine Verbesserung darstellt, können Sie es ganz einfach für alle Nutzer einführen, ohne ein App-Update ausführen zu müssen.

Auf dieser Seite wird gezeigt, wie Sie einen A/B-Test durchführen können, bei dem zwei Versionen eines Modells bewertet werden, das eine hypothetische visuelle Pflanzensuche ermöglicht. Diese Funktion nutzt ein benutzerdefiniertes Modell zur Bildbeschriftung, um Nutzenden dabei zu helfen, Pflanzenarten in Bilder von ihnen.

Angenommen, Sie haben gerade ein neues Modell zur Beschriftung von Pflanzen plant_labeler_v2 und Sie möchten einen Test durchführen, um die Ergebnisse zu vergleichen durch Ihr aktuelles Modell plant_labeler_v1. Im Folgenden erfahren Sie, wie Sie den Test einrichten, ausführen und die Ergebnisse umsetzen.

1. Modell aus der Ferne konfigurierbar machen

Der erste Schritt für A/B-Tests Ihrer Modelle besteht darin, Ihre App für die Verwendung eines Parameter Remote Config, um zu bestimmen, welches Modell verwendet wird. Zuerst legen Sie den Standardwert dieses Parameters auf das Modell fest, das bereits in Ihrer App verwendet wird. Da der Modellname jedoch über einen per Fernzugriff konfigurierbaren Parameter gesteuert wird, können Sie verschiedene Modelle ändern und ausprobieren, ohne dass Sie Ihre Nutzer jedes Mal mit App-Updates belästigen müssen.

Wenn Sie Ihr aktuelles Modell also unter dem Namen plant_labeler_v1 würden Sie im Initialisierungscode der App festlegen, plant_labeler_v1 als Standardwert des plant_labeler_model, 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 den Code für die Modelleinrichtung so, dass das mit dem Parameter plant_labeler_model angegebene Modell geladen wird:

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 nun einen Remote Config-Parameter verwendet, um zu bestimmen, welches Modell laden können, können Sie das Modell ändern, indem Sie ein neues Modell veröffentlichen und seine in den Parameter Remote Config ein. Mit dieser Funktion kann A/B Testing den verschiedenen Nutzenden zum Zweck des Vergleichs verschiedene Modelle zuweisen.

Bevor Sie fortfahren, nehmen Sie außerdem folgende Ergänzung zum Download des Modells vor Code:

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

Mit dem Code oben wird ein benutzerdefiniertes Analytics-Ereignis protokolliert, das Sie später als Aktivierungsereignis für den Test verwenden. Ein Aktivierungsereignis ist ein Ereignis, Nutzer müssen auslösen, bevor sie als Testteil betrachtet werden. So werden Nutzer erst in Ihrem A/B-Test erfasst, wenn das Herunterladen des benutzerdefinierten ML-Modells auf ihrem Gerät abgeschlossen ist.

2. Zielmesswert festlegen

Im nächsten Schritt müssen Sie entscheiden, wie Sie den Erfolg Ihres Modells messen möchten, und dafür sorgen, dass Ihre App die Daten erhebt, die erforderlich sind, um zu testen, wie gut verschiedene Versionen des Modells gemäß diesem Messwert abschneiden.

A/B Testing bietet mehrere vordefinierte Messwerte, darunter Umsatz, tägliche Interaktionen und Nutzerbindung. Diese Messwerte sind oft nützlich, um verschiedene UX-Abläufe zu testen oder Parameter zu optimieren, aber sie sind möglicherweise nicht sinnvoll, um Ihr Modell und Ihren Anwendungsfall zu bewerten. In diesem Fall können Sie stattdessen versuchen, für ein benutzerdefiniertes Analytics-Ereignis optimieren.

Nehmen wir als Beispiel die hypothetische visuelle Pflanzensuchfunktion, Suchergebnisse in der Reihenfolge angezeigt, wie das Modell für jedes Ergebnis. Eine Möglichkeit, sich ein Bild von der Genauigkeit Ihres Modells zu machen, besteht darin, zu sehen, wie oft Nutzer das erste Suchergebnis geöffnet haben.

Wenn Sie testen möchten, welches Modell das Ziel der Maximierung der Klicks auf das Top-Ergebnis am besten erreicht, protokollieren Sie ein benutzerdefiniertes Ereignis, wenn ein Nutzer 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);

Welchen Messwert Sie testen, hängt letztendlich davon ab, wie Ihre App modellieren.

Jetzt können Sie Ihre App im Play Store veröffentlichen. Ihre App verwendet weiterhin Ihr ursprüngliches Modell, Sie können aber mit dem hinzugefügten Remote Config- und Analytics-Code experimentieren mit verschiedenen Modellen unter Verwendung der Firebase-Konsole.

3. A/B Testing-Test ausführen

Ihre App befindet sich nun im und sammelt Analysedaten. Erstellen Sie einen A/B Testing-Test, um die Auswirkungen der Verwendung Ihres neuen anstelle des aktuellen Modells.

So erstellen Sie den Test:

  1. Prüfen Sie auf der Seite Ereignisse der Firebase Console, ob Sie die relevanten Analytics-Ereignisse erfassen: das Aktivierungsereignis und den Zielmesswert.

    Jedes Ereignis muss mindestens einmal in Ihrer App protokolliert werden, bevor es in der Firebase-Konsole angezeigt wird.

  2. Öffnen Sie in der Firebase Console den Bereich A/B Testing.

  3. Neuen Test erstellen:

    1. Klicken Sie auf Test erstellen > Remote Config.

    2. Gehen Sie im Abschnitt Ausrichtung so vor:

      • App aus der Liste auswählen
      • Geben Sie an, wie viele Nutzer Sie in den Test einbeziehen möchten.
      • Wählen Sie das Aktivierungsereignis aus, das Sie protokolliert haben (in diesem Beispiel nondefault_model_downloaded).
    3. Wählen Sie im Bereich Zielvorhaben den Zielvorhabenmesswert aus der Liste der Zielvorhabenmesswerte aus, den Sie im vorherigen Abschnitt festgelegt haben (in diesem Beispiel first_result_opened). Wählen Sie außerdem alle zusätzlichen Messwerte aus, die Sie erfassen möchten, z. B. den Umsatz aus Käufen oder die Anzahl der Nutzer ohne Abstürze.

    4. Definieren Sie im Bereich Varianten zwei Varianten:

      • Kontrollgruppe (automatisch erstellt)
      • Experimenteller Labelersteller für Pflanzen

      Erstellen Sie für die Kontrollgruppe einen plant_labeler_model-Parameter und legen Sie ihn auf plant_labeler_v1 fest. Nutzer, die der Kontrollgruppe zugewiesen sind, verwenden das alte Modell. Legen Sie den Parameter nicht auf (no change) fest, da Sie in Ihrer App testen, ob Sie einen Remote-Wert verwenden.

      Legen Sie für die Variante Experimentelles Labelersteller für Pflanzen Folgendes fest: plant_labeler_model-Parameter für plant_labeler_v2 (vorausgesetzt, Sie haben Ihr neues Modell veröffentlicht unter diesem Namen). Nutzer, die dieser Variante zugewiesen sind, verwenden das neue Modell.

    A/B-Test – Konfigurationsbildschirm

Starten Sie den Test und lassen Sie ihn mehrere Tage lang laufen, bis A/B Testing eine Gewinnervariante ermittelt. Wenn im Test keine Variante als Gewinner ermittelt werden kann, müssen Sie den Test möglicherweise auf mehr Nutzer ausweiten.

4. Erfolgreiche Variante für alle Nutzer einführen

Karte mit A/B-Testergebnis

Nachdem A/B Testing genügend Informationen erfasst hat, um Folgendes zu deklarieren: beste Variante, in diesem Fall die Variante, die das beste Suchergebnis maximiert hat können Sie entscheiden, ob Sie die beste Variante (oder eine andere Variante) für alle Nutzer.

Öffnen Sie in der Firebase Console im Bereich A/B Testing die Detailansicht des abgeschlossenen Tests. Hier sehen Sie, wie sich die die entsprechend Ihrem Zielmesswert und etwaigen sekundären Messwerten, die Sie ausgewählt haben, ausgeführt wurde. Anhand dieser Informationen können Sie entscheiden, ob Sie die führende Variante oder eine andere Variante.

Wenn Sie eine Variante für alle Nutzer einführen möchten, klicken Sie auf > Variante für die auf der Detailseite des Tests. Danach erhöht sich der Wert des plant_labeler_model-Parameter wird plant_labeler_v2 für alle Nutzenden.

Bei einem zukünftigen App-Update sollten Sie den Standardwert des Parameters plant_labeler_model in plant_labeler_v2 ändern und das gebundelte Modell aktualisieren, falls Sie eines verwenden. Ihre Nutzer verwenden jedoch bereits das neueste Modell. können Sie dieses Update jederzeit als Teil der veröffentlichten App z. B. wenn Sie das nächste Mal ein Funktionsupdate durchführen.