Teste A/B de duas versões de um modelo

Depois de treinar um novo modelo personalizado ou modelo do AutoML Vision Edge, você pode usar o teste A/B para ver o desempenho do novo modelo em condições reais, em comparação com o modelo que você já usa. Depois de confirmar que seu novo modelo é uma melhoria, você poderá implementá-lo facilmente para todos os seus usuários, sem precisar atualizar o aplicativo.

Esta página mostra como você pode realizar um teste A/B que avalia duas versões de um modelo que alimenta um hipotético recurso de pesquisa visual de planta. Este recurso usa um modelo de rotulagem de imagens personalizado para ajudar os usuários a identificar espécies de plantas a partir de imagens delas.

Suponha que você acabou de publicar um novo modelo de rotulagem de plantas, plant_labeler_v2 , e deseja executar um experimento que o compare com seu modelo atual, denominado plant_labeler_v1 . As etapas abaixo mostram como configurar o experimento, executá-lo e tomar medidas com base nos resultados.

1. Torne seu modelo configurável remotamente

A primeira etapa para testar seus modelos A/B é modificar seu aplicativo para usar um parâmetro do Configuração remota para determinar qual modelo ele usa. Inicialmente, você definirá o valor padrão desse parâmetro como o modelo que seu aplicativo já usa, mas como o nome do modelo é controlado por um parâmetro configurável remotamente, você pode alterar e experimentar diferentes modelos sem precisar enviar atualizações de aplicativo para seu usuários sempre.

Portanto, se você publicou seu modelo atual com o nome plant_labeler_v1 , você definiria, no código de inicialização do seu aplicativo, plant_labeler_v1 como o valor padrão do parâmetro plant_labeler_model , como no exemplo a seguir:

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

Em seguida, altere o código de configuração do seu modelo para carregar o modelo especificado pelo 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

Agora que seu aplicativo usa um parâmetro do Configuração remota para determinar qual modelo carregar, você pode alterar o modelo apenas publicando um novo modelo e atribuindo seu nome ao parâmetro do Configuração remota. Esse recurso permite que o teste A/B atribua modelos diferentes a usuários diferentes com a finalidade de compará-los.

Antes de continuar, faça também a seguinte adição ao código de download do seu 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);
                }
            }
        });

O código acima registra um evento personalizado do Analytics que você usará posteriormente como evento do seu experimento evento de ativação . Um evento de ativação é um evento que o usuário deve acionar antes de ser considerado parte do experimento. Isso garante que os usuários não serão registrados em seu teste A/B até que o dispositivo termine de baixar o modelo de ML personalizado.

2. Determine uma métrica de meta

A próxima etapa é decidir como você medirá o sucesso do seu modelo e garantir que seu aplicativo esteja coletando os dados necessários para testar o desempenho de diferentes versões do modelo de acordo com essa métrica.

O teste A/B tem várias métricas integradas, incluindo receita, envolvimento diário e retenção de usuários. Essas métricas costumam ser úteis para testar diferentes fluxos de UX ou ajustar parâmetros, mas podem não fazer sentido para avaliar seu modelo e caso de uso. Nessa situação, você pode tentar otimizar para um evento personalizado do Analytics.

Usando o hipotético recurso de pesquisa visual de plantas como exemplo, suponha que você apresentou os resultados da pesquisa ao usuário na ordem de confiança do modelo em cada resultado. Uma maneira de ter uma ideia da precisão do seu modelo seria observar com que frequência os usuários abriram o primeiro resultado da pesquisa.

Para testar qual modelo atingiu melhor o objetivo de maximizar os cliques nos resultados principais, você registraria um evento personalizado sempre que um usuário tocasse no primeiro item da lista de resultados.

Kotlin+KTX

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

Java

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

A métrica que você testa depende, em última análise, de como seu aplicativo usa seu modelo.

Neste ponto, você pode implantar seu aplicativo na Play Store. Seu aplicativo continuará usando o modelo original, mas o código da Configuração remota e do Analytics que você adicionou permitirá que você experimente diferentes modelos usando apenas o Firebase console.

3. Execute um experimento de teste A/B

Agora que seu aplicativo está nas mãos dos usuários e coletando dados analíticos, crie um experimento de teste A/B que testa o efeito do uso de seu novo modelo em vez do modelo atual.

Para criar o experimento:

  1. Na página Eventos do console do Firebase, verifique se você está registrando os eventos relevantes do Analytics: o evento de ativação e a métrica da meta.

    Seu aplicativo precisa registrar cada evento pelo menos uma vez antes que ele apareça no Console do Firebase.

  2. No console do Firebase, abra a seção Teste A/B .

  3. Crie um novo experimento:

    1. Clique em Criar experimento > Configuração remota .

    2. Na seção Segmentação :

      • Escolha seu aplicativo na lista
      • Especifique quantos usuários você deseja incluir na experiência
      • Selecione o evento de ativação que você começou a registrar (neste exemplo, nondefault_model_downloaded )
    3. Na seção Metas , escolha a métrica da meta determinada na seção anterior (neste exemplo, first_result_opened ) na lista de métricas da meta e selecione quaisquer métricas adicionais que você deseja acompanhar, como receita de compras ou usuários sem falhas.

    4. Na seção Variantes , defina duas variantes:

      • Grupo de controle (criado automaticamente)
      • Rotulador de plantas experimentais

      Para o grupo Controle , crie um parâmetro plant_labeler_model e defina-o como plant_labeler_v1 . Os usuários atribuídos ao grupo de controle usarão o modelo antigo. (Não defina o parâmetro como (no change) , pois em seu aplicativo você está testando se está usando um valor remoto.)

      Para a variante Experimental Plant Labeler , defina o parâmetro plant_labeler_model como plant_labeler_v2 (supondo que você publicou seu novo modelo com esse nome). Os usuários atribuídos a esta variante usarão o novo modelo.

    Tela de configuração do teste A/B

Inicie o experimento e deixe-o rodar por vários dias ou mais, até que o Teste A/B declare um líder. Se a experiência não conseguir determinar um líder, poderá ser necessário expandi-la para mais usuários .

4. Distribua a variante vencedora para todos os usuários

Cartão de resultado do teste A/B

Depois que o teste A/B coletar informações suficientes para declarar um líder – neste caso, a variante que maximizou os cliques nos principais resultados de pesquisa – você pode decidir se deseja lançar a variante vencedora (ou outra variante) para todos os seus usuários.

Na seção Teste A/B do Firebase Console , abra a visualização de detalhes do experimento concluído. Nessa visualização, você pode ver o desempenho de cada variante de acordo com a métrica de sua meta e quaisquer métricas secundárias selecionadas. Com essas informações, você pode decidir se deseja implementar a variante principal ou outra variante.

Para implementar uma variante para todos os usuários, clique em > Implementar variante na página de detalhes do experimento. Depois de fazer isso, o valor do parâmetro plant_labeler_model será plant_labeler_v2 para todos os usuários.

Em uma atualização futura do aplicativo, você deverá alterar o valor padrão do parâmetro plant_labeler_model para plant_labeler_v2 e atualizar o modelo empacotado, se usar um. Porém, seus usuários já estão usando o modelo mais recente, então você pode enviar essa atualização como parte do aplicativo publicado sempre que for conveniente, como na próxima vez que fizer uma atualização de recurso.