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

Prueba A/B de dos versiones de un modelo

Después de entrenar un nuevo modelo personalizado o un modelo de AutoML Vision Edge, puede usar las pruebas A/B para ver qué tan bien se desempeña el nuevo modelo en condiciones reales, en comparación con el modelo que ya usa. Después de confirmar que su nuevo modelo es una mejora, puede implementar fácilmente el nuevo modelo para todos sus usuarios, sin necesidad de actualizar la aplicación.

Esta página muestra cómo puede realizar una prueba A/B que evalúe dos versiones de un modelo que impulsa una función hipotética de búsqueda visual de plantas. Esta función utiliza un modelo de etiquetado de imágenes personalizado para ayudar a los usuarios a identificar especies de plantas a partir de imágenes de ellas.

Suponga que acaba de publicar un nuevo modelo de etiquetado de plantas, plant_labeler_v2 y desea ejecutar un experimento que lo compare con su modelo actual, llamado plant_labeler_v1 . Los pasos a continuación muestran cómo configurar el experimento, ejecutarlo y tomar medidas sobre los resultados.

1. Haz que tu modelo sea configurable de forma remota

El primer paso para la prueba A/B de sus modelos es modificar su aplicación para usar un parámetro de configuración remota para determinar qué modelo usa. Inicialmente, configurará el valor predeterminado de este parámetro para que sea el modelo que su aplicación ya usa, pero debido a que el nombre del modelo está controlado por un parámetro configurable de forma remota, puede cambiar y experimentar con diferentes modelos sin tener que enviar actualizaciones de la aplicación a su usuarios cada vez.

Entonces, si publicó su modelo actual con el nombre plant_labeler_v1 , en el código de inicialización de su aplicación, establecería plant_labeler_v1 como el valor predeterminado del parámetro plant_labeler_model , como en el siguiente ejemplo:

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

Luego, cambie el código de configuración de su modelo para cargar el modelo especificado por el parámetro 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

Ahora que su aplicación usa un parámetro de configuración remota para determinar qué modelo cargar, puede cambiar el modelo simplemente publicando un nuevo modelo y asignando su nombre al parámetro de configuración remota. Esta capacidad permite que las pruebas A/B asignen diferentes modelos a diferentes usuarios con el fin de compararlos.

Antes de continuar, también agregue lo siguiente al código de descarga de su modelo:

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

El código anterior registra un evento de Analytics personalizado que usará más adelante como evento de su experimento. evento de activación . Un evento de activación es un evento que el usuario debe desencadenar antes de que se le considere parte del experimento. Esto garantiza que los usuarios no se registren en su prueba A/B hasta que su dispositivo haya terminado de descargar su modelo ML personalizado.

2. Determinar una métrica objetivo

El siguiente paso es decidir cómo medirá el éxito de su modelo y asegurarse de que su aplicación recopile los datos necesarios para probar qué tan bien funcionan las diferentes versiones del modelo de acuerdo con esa métrica.

Las pruebas A/B tienen varias métricas integradas, que incluyen ingresos, participación diaria y retención de usuarios. Estas métricas a menudo son útiles para probar diferentes flujos de UX o ajustar parámetros, pero pueden no tener sentido para evaluar su modelo y caso de uso. En esta situación, puede intentar optimizar para un evento de Analytics personalizado.

Usando la función hipotética de búsqueda visual de plantas como ejemplo, suponga que presenta los resultados de la búsqueda a su usuario en el orden de confianza del modelo en cada resultado. Una forma de hacerse una idea de la precisión de su modelo sería observar la frecuencia con la que los usuarios abrieron el primer resultado de búsqueda.

Para probar qué modelo logró mejor el objetivo de maximizar los clics de resultados principales, registraría un evento personalizado cada vez que un usuario tocara el primer elemento en la lista de resultados.

Kotlin+KTX

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

Java

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

La métrica que prueba depende en última instancia de cómo su aplicación utiliza su modelo.

En este punto, puede implementar su aplicación en Play Store. Su aplicación seguirá usando su modelo original, pero el código de Remote Config and Analytics que agregó le permitirá experimentar con diferentes modelos usando solo la consola de Firebase.

3. Ejecute un experimento de prueba A/B

Ahora que su aplicación está en manos de sus usuarios y está recopilando datos analíticos, cree un experimento de prueba A/B que pruebe el efecto de usar su nuevo modelo en lugar del modelo actual.

Para crear el experimento:

  1. En la página Eventos de Firebase console, verifique que esté registrando los eventos relevantes de Analytics: el evento de activación y la métrica del objetivo.

    Su aplicación debe registrar cada evento al menos una vez antes de que aparezca en la consola de Firebase.

  2. En Firebase console, abra la sección Pruebas A/B .

  3. Crear un nuevo experimento:

    1. Haga clic en Crear experimento > Configuración remota .

    2. En la sección Orientación :

      • Elija su aplicación de la lista
      • Especifique cuántos de sus usuarios desea incluir en el experimento
      • Seleccione el evento de activación que comenzó a registrar (en este ejemplo, nondefault_model_downloaded )
    3. En la sección Objetivos , elija la métrica de objetivo que determinó en la sección anterior (en este ejemplo, first_result_opened ) de la lista de métricas de objetivo y seleccione cualquier métrica adicional que desee rastrear, como ingresos por compras o usuarios sin fallas.

    4. En la sección Variantes , defina dos variantes:

      • Grupo de control (creado automáticamente)
      • Etiquetadora de plantas experimentales

      Para el grupo Control , cree un parámetro plant_labeler_model y configúrelo en plant_labeler_v1 . Los usuarios asignados al grupo de control utilizarán el modelo anterior. (No establezca el parámetro en (no change) , ya que en su aplicación, está probando que está usando un valor remoto).

      Para la variante de etiquetadora de plantas Experimental , establezca el parámetro plant_labeler_model en plant_labeler_v2 (suponiendo que haya publicado su nuevo modelo con ese nombre). Los usuarios asignados a esta variante utilizarán el nuevo modelo.

    Pantalla de configuración de prueba A/B

Inicie el experimento y déjelo funcionar durante varios días o más, hasta que A/B Testing declare un líder. Si el experimento no puede determinar un líder, es posible que deba expandir el experimento a más usuarios .

4. Implemente la variante ganadora para todos los usuarios

Tarjeta de resultado de prueba A/B

Una vez que las pruebas A/B hayan recopilado suficiente información para declarar un líder, en este caso, la variante que maximizó los clics en los resultados de búsqueda principales, puede decidir si implementar la variante ganadora (u otra variante) para todos sus usuarios.

En la sección Pruebas A/B de Firebase console , abra la vista de detalles del experimento completado. Desde esta vista, puede ver el rendimiento de cada variante según la métrica de su objetivo y cualquier métrica secundaria que haya seleccionado. Con esta información, puede decidir si implementar la variante principal u otra variante.

Para implementar una variante para todos los usuarios, haga clic en > Implementar variante en la página de detalles del experimento. Una vez que lo haga, el valor del parámetro plant_labeler_model será plant_labeler_v2 para todos los usuarios.

En una futura actualización de la aplicación, debe cambiar el valor predeterminado del parámetro plant_labeler_model a plant_labeler_v2 y actualizar el modelo incluido si usa uno. Sin embargo, sus usuarios ya están utilizando el último modelo, por lo que puede enviar esta actualización como parte de la aplicación publicada siempre que sea conveniente, como la próxima vez que realice una actualización de funciones.