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. Nachdem 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 plant_labeler_v1 im Initialisierungscode Ihrer App als Standardwert des Parameters plant_labeler_model fest, wie im folgenden Beispiel:
Swift
let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
"plant_labeler_model": "plant_labeler_v1" as NSObject,
// ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()
Objective-C
FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
@"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
// ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];
Ändern Sie dann den Einrichtungscode für das Modell, um das durch den Parameter plant_labeler_model angegebene Modell zu laden:
Swift
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/use-custom-models#configure_a_local_model
Objective-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/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 unterschiedliche Modelle zuweisen, um sie zu vergleichen.
Nehmen Sie außerdem die folgende Ergänzung an Ihrem Code zum Herunterladen des Modells vor, bevor Sie fortfahren:
Swift
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)
}
}
Objective-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];
}
}];
Mit dem oben stehenden Code wird ein benutzerdefiniertes Analytics-Ereignis protokolliert, das Sie später als
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, aber möglicherweise nicht sinnvoll, um Ihr Modell und Ihren Anwendungsfall zu bewerten. In diesem Fall können Sie stattdessen versuchen, die Kampagne für ein benutzerdefiniertes Analytics-Ereignis zu optimieren.
Angenommen, 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 ermitteln, besteht darin, zu sehen, wie oft Nutzer das erste Suchergebnis geöffnet haben.
Um zu testen, welches Modell das Ziel, die Klicks auf das oberste Ergebnis zu maximieren, am besten erreicht hat, würden Sie ein benutzerdefiniertes Ereignis protokollieren, wenn ein Nutzer auf das erste Element in der Ergebnisliste tippt.
Swift
Analytics.logEvent("first_result_opened", parameters: nil)
Objective-C
[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];
Welche Messwerte Sie testen, hängt letztendlich davon ab, wie Ihre App Ihr Modell verwendet.
An diesem Punkt können Sie Ihre App im App 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 einen A/B Testing-Test, um die Auswirkungen der Verwendung Ihres neuen Modells im Vergleich zum aktuellen Modell zu testen.
So erstellen Sie den Test:
-
Prüfen Sie auf der Seite Events der Firebase-Konsole, ob die relevanten Analytics-Ereignisse protokolliert werden: das Aktivierungsereignis und der Zielmesswert.
Ihre App muss jedes Ereignis mindestens einmal protokollieren, bevor es in der Firebase-Konsole angezeigt wird.
-
Öffnen Sie in der Firebase Console den Bereich A/B Testing.
-
Neuen Test erstellen:
Klicken Sie auf Test erstellen > Remote Config.
-
Im Abschnitt Targeting:
- Wählen Sie Ihre App aus der Liste aus.
- Geben Sie an, wie viele Ihrer Nutzer Sie in den Test einbeziehen möchten.
- Wählen Sie das Aktivierungsereignis aus, mit dem Sie die Protokollierung gestartet haben (in diesem Beispiel nondefault_model_downloaded).
-
Wählen Sie im Bereich Zielvorhaben den Zielvorhabenmesswert aus, den Sie im vorherigen Abschnitt ermittelt 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.
-
Definieren Sie im Abschnitt Varianten zwei Varianten:
- Kontrollgruppe (automatisch erstellt)
- Experimentelles Tool zum Beschriften von Pflanzen
Erstellen Sie für die Kontrollgruppe einen
plant_labeler_model-Parameter und legen Sie ihn aufplant_labeler_v1fest. 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_modelaufplant_labeler_v2fest (vorausgesetzt, Sie haben Ihr neues Modell unter diesem Namen veröffentlicht). Nutzer, die dieser Variante zugewiesen sind, verwenden das neue Modell.
Starten Sie den Test und lassen Sie ihn mehrere Tage oder länger laufen, bis A/B Testing einen Leader deklariert. Wenn im Test kein Gewinner ermittelt werden kann, müssen Sie ihn möglicherweise auf mehr Nutzer ausweiten.
4. Gewinnervariante für alle Nutzer bereitstellen
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 Console 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 more_vert > 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.