Catch up on everthing we announced at this year's Firebase Summit. Learn more

モデルの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次の例のようにパラメータ:

迅速

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];

その後、によって指定されたモデルをロードするために、モデルのセットアップコードを変更plant_labeler_modelパラメータを:

迅速

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/label-images-with-automl#configure-a-local-model-source
// 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/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テストでは、モデルを比較する目的で、さまざまなモデルをさまざまなユーザーに割り当てることができます。

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

迅速

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

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

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

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

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

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

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

迅速

Analytics.logEvent("first_result_opened", parameters: nil)

Objective-C

[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];

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

この時点で、アプリをAppStoreにデプロイできます。アプリは引き続き元のモデルを使用しますが、追加した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. バリアントのセクションでは、二つの変種を定義します。

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

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

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

    A / Bテスト設定画面

実験を開始し、A / Bテストでリーダーが宣言されるまで数日以上実行します。実験は指導者を決定できない場合は、する必要があるかもしれませんより多くのユーザーに実験を展開します

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

A / Bテスト結果カード

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

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

すべてのユーザーにバリエーションを展開するには、クリックし実験の詳細ページにバリアントから>ロールを。あなたがそうしたら、の値plant_labeler_modelパラメータは次のようになりますplant_labeler_v2すべてのユーザーのために。

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