Check out what’s new from Firebase at Google I/O 2022. Learn more

Test A/B dwóch wersji modelu

Po wytrenowaniu nowego modelu niestandardowego lub modelu AutoML Vision Edge możesz użyć testów A/B, aby sprawdzić, jak dobrze nowy model działa w warunkach rzeczywistych w porównaniu z modelem, którego już używasz. Po potwierdzeniu, że nowy model jest ulepszeniem, możesz łatwo wdrożyć nowy model dla wszystkich użytkowników bez konieczności aktualizacji aplikacji.

Na tej stronie pokazano, jak można przeprowadzić test A/B, który ocenia dwie wersje modelu obsługującego hipotetyczną funkcję wizualnego wyszukiwania roślin. Ta funkcja wykorzystuje niestandardowy model etykietowania obrazów, aby pomóc użytkownikom zidentyfikować gatunki roślin na podstawie ich obrazów.

Załóżmy, że właśnie opublikowałeś nowy model etykietowania roślin, plant_labeler_v2 i chcesz przeprowadzić eksperyment, który porównuje go z bieżącym modelem o nazwie plant_labeler_v1 . Poniższe kroki pokazują, jak skonfigurować eksperyment, przeprowadzić go i podjąć działania na wynikach.

1. Spraw, aby Twój model był zdalnie konfigurowalny

Pierwszym krokiem do testowania A/B modeli jest zmodyfikowanie aplikacji tak, aby używała parametru Remote Config w celu określenia, którego modelu używa. Początkowo ustawisz domyślną wartość tego parametru na model, którego już używa Twoja aplikacja, ale ponieważ nazwa modelu jest kontrolowana przez zdalnie konfigurowany parametr, możesz zmieniać i eksperymentować z różnymi modelami bez konieczności wypychania aktualizacji aplikacji do użytkowników za każdym razem.

Jeśli więc opublikowałeś swój bieżący model pod nazwą plant_labeler_v1 , w kodzie inicjalizacji aplikacji ustaw plant_labeler_v1 jako domyślną wartość parametru plant_labeler_model , jak w poniższym przykładzie:

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

Następnie zmień kod konfiguracji modelu, aby załadować model określony przez parametr plant_labeler_model :

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

Teraz, gdy Twoja aplikacja używa parametru Zdalnej konfiguracji, aby określić, który model ma zostać załadowany, możesz zmienić model, publikując nowy model i przypisując jego nazwę do parametru Zdalna konfiguracja. Ta funkcja umożliwia testom A/B przypisywanie różnych modeli różnym użytkownikom w celu ich porównania.

Zanim przejdziesz dalej, dodaj także następujący dodatek do kodu pobierania modelu:

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

Powyższy kod rejestruje niestandardowe zdarzenie Analytics, którego będziesz później używać jako zdarzenia w eksperymencie wydarzenie aktywacyjne . Zdarzenie aktywacji to zdarzenie, które użytkownik musi wywołać, zanim zostanie uznany za część eksperymentu. Dzięki temu użytkownicy nie będą rejestrowani w teście A/B, dopóki ich urządzenie nie zakończy pobierania niestandardowego modelu ML.

2. Określ wskaźnik celu

Następnym krokiem jest podjęcie decyzji, w jaki sposób będziesz mierzyć sukces swojego modelu, i upewnienie się, że Twoja aplikacja zbiera dane niezbędne do przetestowania skuteczności różnych wersji modelu w zależności od tego wskaźnika.

Testy A/B mają kilka wbudowanych wskaźników, w tym przychody, codzienne zaangażowanie i utrzymanie użytkowników. Te metryki są często przydatne do testowania różnych przepływów UX lub dostrajania parametrów, ale mogą nie mieć sensu przy ocenie modelu i przypadku użycia. W takiej sytuacji możesz zamiast tego spróbować zoptymalizować niestandardowe zdarzenie Analytics.

Na przykładzie hipotetycznej wizualnej funkcji wyszukiwania roślin, załóżmy, że zaprezentowałeś użytkownikowi wyniki wyszukiwania w kolejności zaufania modelu do każdego wyniku. Jednym ze sposobów na zorientowanie się w dokładności modelu jest sprawdzenie, jak często użytkownicy otwierali pierwszy wynik wyszukiwania.

Aby przetestować, który model najlepiej osiągnął cel, jakim jest zmaksymalizowanie kliknięć z najlepszymi wynikami, należy rejestrować zdarzenie niestandardowe za każdym razem, gdy użytkownik kliknie pierwszy element na liście wyników.

Kotlin+KTX

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

Java

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

Metryka, którą testujesz, ostatecznie zależy od tego, w jaki sposób Twoja aplikacja korzysta z Twojego modelu.

W tym momencie możesz wdrożyć swoją aplikację w Sklepie Play. Twoja aplikacja będzie nadal korzystać z oryginalnego modelu, ale dodany kod Remote Config i Analytics umożliwi Ci eksperymentowanie z różnymi modelami tylko przy użyciu konsoli Firebase.

3. Przeprowadź eksperyment testowania A/B

Teraz, gdy Twoja aplikacja jest w rękach użytkowników i zbiera dane analityczne, utwórz eksperyment testowania A/B, który testuje efekt użycia nowego modelu zamiast obecnego.

Aby stworzyć eksperyment:

  1. Na stronie Zdarzenia w konsoli Firebase sprawdź, czy rejestrujesz odpowiednie zdarzenia Analytics: zdarzenie aktywacji i wskaźnik celu.

    Twoja aplikacja musi co najmniej raz rejestrować każde zdarzenie, zanim pojawi się w konsoli Firebase.

  2. W konsoli Firebase otwórz sekcję Testy A/B .

  3. Utwórz nowy eksperyment:

    1. Kliknij Utwórz eksperyment > Zdalna konfiguracja .

    2. W sekcji Kierowanie :

      • Wybierz swoją aplikację z listy
      • Określ, ilu użytkowników chcesz uwzględnić w eksperymencie
      • Wybierz zdarzenie aktywacji, które rozpoczęło się rejestrowanie (w tym przykładzie nondefault_model_downloaded )
    3. W sekcji Cele wybierz z listy dane celu określone w poprzedniej sekcji (w tym przykładzie first_result_opened ) i wybierz dodatkowe dane, które chcesz śledzić, takie jak przychody z zakupów lub użytkownicy bez awarii.

    4. W sekcji Warianty zdefiniuj dwa warianty:

      • Grupa kontrolna (utworzona automatycznie)
      • Eksperymentalna maszyna do znakowania roślin

      Dla grupy Control utwórz parametr plant_labeler_model i ustaw go na plant_labeler_v1 . Użytkownicy przypisani do grupy kontrolnej będą używać starego modelu. (Nie ustawiaj parametru na (no change) , ponieważ w Twojej aplikacji testujesz, że używasz wartości zdalnej).

      W przypadku wariantu etykietującego rośliny eksperymentalne ustaw parametr plant_labeler_model na plant_labeler_v2 (zakładając, że opublikowałeś nowy model pod tą nazwą). Użytkownicy przypisani do tego wariantu będą korzystać z nowego modelu.

    Ekran konfiguracji testu A/B

Rozpocznij eksperyment i pozwól mu działać przez kilka dni lub dłużej, aż testy A/B ogłoszą lidera. Jeśli w eksperymencie nie można określić lidera, konieczne może być rozszerzenie eksperymentu na większą liczbę użytkowników .

4. Rozwiń zwycięski wariant dla wszystkich użytkowników

Karta wyników testu A/B

Po zebraniu przez testy A/B informacji wystarczających do wyznaczenia lidera — w tym przypadku wariantu, który zmaksymalizował liczbę kliknięć w najlepszych wynikach wyszukiwania — możesz zdecydować, czy udostępnić zwycięski wariant (lub inny wariant) wszystkim użytkownikom.

W sekcji Testy A/B konsoli Firebase otwórz widok szczegółów zakończonego eksperymentu. W tym widoku możesz sprawdzić skuteczność poszczególnych wariantów zgodnie z danymi celu i dowolnymi wybranymi danymi drugorzędnymi. Dzięki tym informacjom możesz zdecydować, czy wprowadzić wariant wiodący, czy inny.

Aby wdrożyć wariant u wszystkich użytkowników, kliknij > Wdróż wariant na stronie szczegółów eksperymentu. Gdy to zrobisz, wartością parametru plant_labeler_model dla wszystkich użytkowników będzie plant_labeler_v2 .

W przyszłej aktualizacji aplikacji należy zmienić domyślną wartość parametru plant_labeler_model na plant_labeler_v2 i zaktualizować model w pakiecie, jeśli go używasz. Twoi użytkownicy już korzystają z najnowszego modelu, więc możesz przesłać tę aktualizację jako część opublikowanej aplikacji, kiedy tylko jest to wygodne, na przykład przy następnej aktualizacji funkcji.