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

Nachdem Sie ein neues benutzerdefiniertes Modell trainiert haben, können Sie mit A/B Testing sehen, wie gut das neue Modell im Vergleich zum bereits verwendeten Modell unter realen Bedingungen funktioniert. Wenn Sie bestätigt haben, dass Ihr neues Modell eine Verbesserung darstellt, können Sie es ganz einfach für alle Nutzer bereitstellen, ohne dass ein App-Update erforderlich ist.

Auf dieser Seite wird beschrieben, wie Sie einen A/B-Test durchführen können, um zwei Versionen eines Modells zu bewerten, das eine hypothetische visuelle Pflanzensuchfunktion unterstützt. Diese Funktion verwendet ein benutzerdefiniertes Modell zur Bildkennzeichnung, um Nutzern dabei zu helfen, Pflanzenarten anhand von Bildern zu identifizieren.

Angenommen, Sie haben gerade ein neues Modell für die Pflanzenkennzeichnung plant_labeler_v2 veröffentlicht und möchten einen Test durchführen, in dem es mit Ihrem aktuellen Modell plant_labeler_v1 verglichen wird. In den folgenden Schritten wird beschrieben, wie Sie den Test einrichten, ausführen und auf die Ergebnisse reagieren.

1. Modell aus der Ferne konfigurierbar machen

Der erste Schritt beim A/B-Testen Ihrer Modelle besteht darin, Ihre App so zu ändern, dass sie einen Remote Config-Parameter verwendet, um zu bestimmen, welches Modell verwendet wird. Anfangs legen Sie den Standardwert dieses Parameters auf das Modell fest, das Ihre App bereits verwendet. Da der Modellname jedoch durch einen remote konfigurierbaren Parameter gesteuert wird, können Sie verschiedene Modelle ändern und testen, ohne jedes Mal App-Updates für Ihre Nutzer bereitstellen zu müssen.

Wenn Sie Ihr aktuelles Modell also unter dem Namen plant_labeler_v1 veröffentlicht haben, legen Sie in Ihrem App-Initialisierungscode plant_labeler_v1 als Standardwert des Parameters plant_labeler_model fest, wie im folgenden Beispiel:

Kotlin

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 Einrichtungscode für das Modell, um das durch den Parameter plant_labeler_model angegebene Modell zu laden:

Kotlin

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/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/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 kann A/B Testing verschiedenen Nutzern verschiedene Modelle zuweisen, um sie zu vergleichen.

Bevor Sie fortfahren, fügen Sie Ihrem Code zum Herunterladen des Modells Folgendes hinzu:

Kotlin

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 oben stehenden Code wird ein benutzerdefiniertes Analytics-Ereignis protokolliert, das Sie später als Aktivierungsereignis für Ihren Test verwenden. Ein Aktivierungsereignis ist ein Ereignis, das der Nutzer auslösen muss, bevor er als Teil des Tests gilt. So wird sichergestellt, dass Nutzer erst dann in Ihrem A/B-Test erfasst werden, wenn ihr Gerät das benutzerdefinierte ML-Modell vollständig heruntergeladen hat.

2. Zielmesswert festlegen

Als Nächstes müssen Sie entscheiden, wie Sie den Erfolg Ihres Modells messen möchten. Außerdem müssen Sie dafür sorgen, dass Ihre App die Daten erfasst, die erforderlich sind, um zu testen, wie gut verschiedene Versionen des Modells in Bezug auf diesen Messwert abschneiden.

A/B Testing bietet mehrere integrierte 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. Für die Bewertung Ihres Modells und Anwendungsfalls sind sie jedoch möglicherweise nicht sinnvoll. In diesem Fall können Sie stattdessen versuchen, für ein benutzerdefiniertes Analytics-Ereignis zu optimieren.

Nehmen wir an, Sie präsentieren Ihrem Nutzer Suchergebnisse in der Reihenfolge der Konfidenz des Modells für jedes Ergebnis. Eine Möglichkeit, die Genauigkeit Ihres Modells zu beurteilen, besteht darin, zu sehen, wie oft Nutzer das erste Suchergebnis geöffnet haben.

Um zu testen, welches Modell das Ziel, die Klicks auf das Top-Ergebnis zu maximieren, am besten erreicht hat, protokollieren Sie ein benutzerdefiniertes Ereignis, wenn ein Nutzer auf das erste Element in der Ergebnisliste tippt.

Kotlin

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

Java

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

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

Jetzt können Sie Ihre App im Play Store bereitstellen. Ihre App verwendet weiterhin Ihr ursprüngliches Modell. Mit dem Remote Config- und Analytics-Code, den Sie hinzugefügt haben, können Sie jedoch verschiedene Modelle nur über die Firebase-Konsole testen.

3. A/B Testing-Test durchführen

Nachdem Ihre App nun von Ihren Nutzern verwendet wird und Analysedaten erhoben werden, erstellen Sie ein A/B Testing-Experiment, in dem Sie die Auswirkungen der Verwendung Ihres neuen Modells anstelle des aktuellen Modells testen.

So erstellen Sie den Test:

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

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

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

  3. So erstellen Sie einen neuen Test:

    1. Klicken Sie auf Test erstellen > Remote Config.

    2. Im Abschnitt Targeting:

      • Wählen Sie Ihre App aus der Liste aus.
      • Geben Sie an, wie viele Ihrer Nutzer in den Test einbezogen werden sollen.
      • Wählen Sie das Aktivierungsereignis aus, mit dem Sie die Protokollierung gestartet haben (in diesem Beispiel nondefault_model_downloaded).
    3. Wählen Sie im Bereich Zielvorhaben den Zielvorhabenmesswert aus, den Sie im vorherigen Abschnitt festgelegt haben (in diesem Beispiel first_result_opened), und wählen Sie alle zusätzlichen Messwerte aus, die Sie erfassen möchten, z. B. Umsatz durch Käufe oder Nutzer ohne Abstürze.

    4. Legen Sie im Abschnitt Varianten zwei Varianten fest:

      • Kontrollgruppe (automatisch erstellt)
      • Experimentelles Tool zum Beschriften von 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 Experimental plant labeler den Parameter plant_labeler_model auf plant_labeler_v2 fest (vorausgesetzt, Sie haben Ihr neues Modell unter diesem Namen veröffentlicht). Nutzer, die dieser Variante zugewiesen sind, verwenden das neue Modell.

    Konfigurationsbildschirm für A/B-Tests

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

4. Gewinnervariante für alle Nutzer bereitstellen

Karte mit A/B-Testergebnis

Nachdem A/B Testing genügend Informationen gesammelt hat, um einen Gewinner zu ermitteln – in diesem Fall die Variante, mit der die meisten Klicks auf das Top-Suchergebnis erzielt wurden –, können Sie entscheiden, ob Sie die Gewinner- oder eine andere Variante für alle Nutzer einführen möchten.

Öffnen Sie im Bereich A/B Testing der Firebase-Konsole die Detailansicht des abgeschlossenen Tests. In dieser Ansicht sehen Sie, wie die einzelnen Varianten in Bezug auf den Zielvorhaben-Messwert und alle ausgewählten sekundären Messwerte abgeschnitten haben. Anhand dieser Informationen können Sie entscheiden, ob Sie die führende oder eine andere Variante einführen möchten.

Wenn Sie eine Variante für alle Nutzer bereitstellen möchten, klicken Sie auf der Detailseite des Tests auf  > Variante bereitstellen. Danach ist der Wert des Parameters plant_labeler_model für alle Nutzer plant_labeler_v2.

Bei einem zukünftigen App-Update sollten Sie den Standardwert des Parameters plant_labeler_model in plant_labeler_v2 ändern und das gebündelte Modell aktualisieren, falls Sie eines verwenden. Ihre Nutzer verwenden jedoch bereits das neueste Modell. Sie können dieses Update also im Rahmen der veröffentlichten App bereitstellen, wenn es Ihnen passt, z. B. wenn Sie das nächste Mal ein Feature-Update vornehmen.