新しいカスタムモデルまたはAutoMLVisionEdgeモデルをトレーニングした後、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];
}
}];
上記のコードは、後で実験として使用するカスタムAnalyticsイベントをログに記録します
2.目標メトリックを決定します
次のステップは、モデルの成功を測定する方法を決定し、アプリがそのメトリックに従ってモデルのさまざまなバージョンのパフォーマンスをテストするために必要なデータを収集していることを確認することです。
A / Bテストには、収益、毎日のエンゲージメント、ユーザー維持など、いくつかの組み込みの指標があります。これらの指標は、さまざまなUXフローのテストやパラメーターの微調整に役立つことがよくありますが、モデルやユースケースの評価には意味がない場合があります。この状況では、代わりにカスタムAnalyticsイベントの最適化を試みることができます。
例として架空の視覚的な植物検索機能を使用して、各結果に対するモデルの信頼度の順に検索結果をユーザーに提示したとします。モデルの精度を知る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テスト実験を作成します。
実験を作成するには:
Firebaseコンソールの[イベント]ページで、関連するアナリティクスイベント(アクティベーションイベントと目標指標)をログに記録していることを確認します。
アプリは、Firebaseコンソールに表示される前に、各イベントを少なくとも1回ログに記録する必要があります。
Firebaseコンソールで、[ A/Bテスト]セクションを開きます。
新しい実験を作成します。
[実験の作成]>[リモート構成]をクリックします。
ターゲティングセクション:
- リストからアプリを選択してください
- 実験に含めるユーザーの数を指定します
- ロギングを開始したアクティベーションイベントを選択します(この例では、 nondefault_model_downloaded )
[目標]セクションで、前のセクションで決定した目標メトリック(この例ではfirst_result_opened )を目標メトリックのリストから選択し、購入収益やクラッシュのないユーザーなど、追跡する追加のメトリックを選択します。
「バリアント」セクションで、次の2つのバリアントを定義します。
- コントロールグループ(自動的に作成)
- 実験植物ラベラー
コントロールグループの場合、
plant_labeler_model
パラメーターを作成し、それをplant_labeler_v1
に設定します。コントロールグループに割り当てられたユーザーは、古いモデルを使用します。 (アプリでは、リモート値を使用していることをテストしているため、パラメーターを(no change)
に設定しないでください。)実験的な植物ラベラーバリアントの場合、
plant_labeler_model
パラメーターをplant_labeler_v2
に設定します(新しいモデルをその名前で公開したと仮定します)。このバリアントに割り当てられたユーザーは、新しいモデルを使用します。
実験を開始し、A/Bテストでリーダーが宣言されるまで数日以上実行します。実験でリーダーを特定できない場合は、実験をより多くのユーザーに拡張する必要があります。
4.受賞したバリアントをすべてのユーザーに展開します

A / Bテストがリーダーを宣言するのに十分な情報を収集した後(この場合、上位の検索結果のクリックを最大化したバリアント)、すべてのユーザーに勝者のバリアント(または別のバリアント)を展開するかどうかを決定できます。
Firebaseコンソールの[ A/Bテスト]セクションで、完了した実験の詳細ビューを開きます。このビューから、目標メトリックと選択したセカンダリメトリックに従って各バリアントがどのように実行されたかを確認できます。この情報を使用して、主要なバリアントを展開するか、別のバリアントを展開するかを決定できます。
バリアントをすべてのユーザーにロールアウトするには、実験の詳細ページでmore_vert >バリアントのロールアウトをクリックします。これを行うと、 plant_labeler_model
パラメーターの値はすべてのユーザーのplant_labeler_v2
になります。
今後のアプリの更新では、 plant_labeler_model
パラメーターのデフォルト値をplant_labeler_v2
に変更し、バンドルされているモデルを使用する場合は更新する必要があります。ただし、ユーザーはすでに最新モデルを使用しているため、次に機能を更新するときなど、都合のよいときにいつでも、公開されたアプリの一部としてこの更新をプッシュできます。