Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。
このページは Cloud Translation API によって翻訳されました。
Switch to English

モデルの2つのバージョンのA / Bテスト

新しいカスタムモデルまたはAutoMLVision Edgeモデルをトレーニングした後、A / Bテストを使用して、既存のモデルと比較して、新しいモデルが実際の条件でどの程度機能するかを確認できます。新しいモデルが改善されていることを確認したら、アプリを更新しなくても、すべてのユーザーに新しいモデルを簡単に展開できます。

このページでは、架空の視覚的な植物検索機能を強化するモデルの2つのバージョンを評価するA / Bテストを実行する方法を示します。この機能は、カスタム画像ラベリングモデルを使用して、ユーザーがそれらの画像から植物種を識別できるようにします。

新しい植物ラベリングモデルplant_labeler_v2を公​​開したばかりで、それを現在のモデルplant_labeler_v1と比較する実験を実行するとします。以下の手順は、実験を設定して実行し、結果に対してアクションを実行する方法を示しています。

1.モデルをリモートで構成可能にする

モデルをA / Bテストするための最初のステップは、Remote Configパラメーターを使用するようにアプリを変更して、使用するモデルを決定することです。最初に、このパラメーターのデフォルト値をアプリが既に使用しているモデルに設定しますが、モデル名はリモートで構成可能なパラメーターによって制御されるため、アプリの更新をプッシュすることなく、さまざまなモデルを変更して実験できます。毎回ユーザー。

したがって、現在のモデルをplant_labeler_v1という名前でplant_labeler_v1した場合、次の例のように、アプリの初期化コードで、 plant_labeler_modelパラメーターのデフォルト値として設定します。

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

次に、モデル設定コードを変更して、 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

アプリがRemoteConfigパラメーターを使用してロードするモデルを決定するようになったので、新しいモデルを公開してその名前をRemote Configパラメーターに割り当てるだけで、モデルを変更できます。この機能により、A / Bテストでは、モデルを比較する目的で、さまざまなモデルをさまざまなユーザーに割り当てることができます。

続行する前に、モデルのダウンロードコードに次の追加も行ってください。

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

上記のコードは、後で実験として使用するカスタムアナリティクスイベントをログに記録しますアクティベーションイベント。アクティベーションイベントは、ユーザーが実験の一部であると見なされる前にトリガーする必要があるイベントです。これにより、デバイスがカスタムMLモデルのダウンロードを完了するまで、ユーザーがA / Bテストに記録されないことが保証されます。

2.目標メトリックを決定します

次のステップは、モデルの成功を測定する方法を決定し、アプリがそのメトリックに従ってモデルのさまざまなバージョンのパフォーマンスをテストするために必要なデータを収集していることを確認することです。

A / Bテストには、収益、毎日のエンゲージメント、ユーザー維持など、いくつかの組み込みの指標があります。これらの指標は、さまざまなUXフローのテストやパラメーターの微調整に役立つことがよくありますが、モデルやユースケースの評価には意味がない場合があります。この状況では、代わりにカスタムアナリティクスイベントの最適化を試みることができます。

例として架空の視覚的な植物検索機能を使用して、各結果に対するモデルの信頼度の順に検索結果をユーザーに提示したとします。モデルの精度を知る1つの方法は、ユーザーが最初の検索結果を開いた頻度を調べることです。

上位の結果クリック数を最大化するという目標を最もよく達成したモデルをテストするには、ユーザーが結果リストの最初の項目をタップするたびにカスタムイベントをログに記録します。

Kotlin + KTX

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

Java

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

テストする指標は、最終的にはアプリがモデルをどのように使用するかによって異なります。

この時点で、アプリをPlayストアにデプロイできます。アプリは引き続き元のモデルを使用しますが、追加したRemote ConfigおよびAnalyticsコードを使用すると、Firebaseコンソールのみを使用してさまざまなモデルを試すことができます。

3. A / Bテスト実験を実行します

アプリがユーザーの手元にあり、分析データを収集しているので、現在のモデルの代わりに新しいモデルを使用した場合の効果をテストするA / Bテスト実験を作成します。

実験を作成するには:

  1. Firebaseコンソールの[イベント]ページで、関連するアナリティクスイベント(アクティベーションイベントと目標指標)をログに記録していることを確認します。

    アプリは、Firebaseコンソールに表示される前に、各イベントを少なくとも1回ログに記録する必要があります。

  2. Firebaseコンソールで、[ A / Bテスト]セクションを開きます。

  3. 新しい実験を作成します。

    1. [実験の作成]> [リモート構成]をクリックします

    2. ターゲティングセクション:

      • リストからアプリを選択してください
      • 実験に含めるユーザーの数を指定します
      • ロギングを開始したアクティベーションイベントを選択します(この例では、 nondefault_model_downloaded
    3. [目標]セクションで、前のセクションで決定した目標メトリック(この例ではfirst_result_opened )を目標メトリックのリストから選択し、購入収益やクラッシュのないユーザーなど、追跡する追加のメトリックを選択します。

    4. バリアント」セクションで、次の2つのバリアントを定義します。

      • コントロールグループ(自動的に作成)
      • 実験植物ラベラー

      コントロールグループの場合、 plant_labeler_modelパラメーターを作成し、それをplant_labeler_v1設定しplant_labeler_v1 。コントロールグループに割り当てられたユーザーは、古いモデルを使用します。 (アプリでは、リモート値を使用していることをテストしているため、パラメーターを(no change)に設定しないでください。)

      実験的な植物ラベラーバリアントの場合、 plant_labeler_modelパラメーターをplant_labeler_v2設定します(新しいモデルをその名前で公開したと仮定します)。このバリアントに割り当てられたユーザーは、新しいモデルを使用します。

    A / Bテスト設定画面

実験を開始し、A / Bテストでリーダーが宣言されるまで数日以上実行します。実験でリーダーを特定できない場合は、実験をより多くのユーザー拡張する必要があります

4.受賞したバリアントをすべてのユーザーにロールアウトします

A / Bテスト結果カード

A / Bテストがリーダーを宣言するのに十分な情報を収集した後(この場合、上位の検索結果のクリックを最大化したバリアント)、すべてのユーザーに勝者のバリアント(または別のバリアント)を展開するかどうかを決定できます。

Firebaseコンソールの[ A / Bテスト]セクションで、完了した実験の詳細ビューを開きます。このビューから、目標メトリックと選択したセカンダリメトリックに従って各バリアントがどのように実行されたかを確認できます。この情報を使用して、主要なバリアントを展開するか、別のバリアントを展開するかを決定できます。

バリアントをすべてのユーザーにロールアウトするには、実験の詳細ページで >バリアントのロールアウトをクリックします。これを行うと、 plant_labeler_modelパラメーターの値はすべてのユーザーのplant_labeler_v2になります。

今後のアプリの更新では、 plant_labeler_modelパラメーターのデフォルト値をplant_labeler_v2に変更し、バンドルされているモデルを使用する場合は更新する必要があります。ただし、ユーザーはすでに最新のモデルを使用しているため、次に機能を更新するときなど、都合のよいときにいつでも、公開されたアプリの一部としてこの更新をプッシュできます。