リアルタイムのオンデバイスのアプリ内購入最適化 Codelab

1. 概要

1cbf855eda62c306.png

リアルタイムのオンデバイスのアプリ内購入最適化 Codelab へようこそ。この Codelab では、TensorFlow Lite と Firebase を使用してカスタム パーソナライズ モデルをトレーニングし、アプリにデプロイする方法を学びます。

このチュートリアルでは、パーソナライズ用の ML モデル、特に現在のユーザーの状態に基づいて最適なアプリ内購入(IAP)を提供するモデルを構築する方法を説明します。これは、コンテキストに基づくバンディット問題の例です。広く適用できる重要な ML 問題です。これについては、この Codelab で詳しく説明します。

学習内容

  • Firebase Analytics を使って分析データを収集する
  • BigQuery を使用して分析データを前処理する
  • アプリ内購入(IAP)をデバイス上で最適化するためのシンプルな ML モデルをトレーニングする
  • TFLite モデルを Firebase ML にデプロイしてアプリからアクセス
  • Firebase A/B Testing を使用してさまざまなモデルを測定し、テストする
  • 最新のデータを使用して定期的に新しいモデルをトレーニングしてデプロイする

必要なもの

  • Android Studio バージョン 3.4 以降
  • Android 2.3 以降と Google Play 開発者サービス 9.8 以降を搭載した物理テストデバイス、または Google Play 開発者サービス 9.8 以降を搭載したエミュレータ
  • 実機のテストデバイスを使用する場合、接続ケーブル
  • ML の初心者の知識

このチュートリアルをどのように使用されますか?

通読のみ 通読して演習を行う

Android アプリの作成経験をどのように評価されますか。

初心者 中級者 上級者

2. 問題の説明

たとえば、ゲーム デベロッパーで、各レベルの終了時にパーソナライズされたアプリ内購入(IAP)の候補を表示するとします。一度に表示できる IAP オプションは限られており、どのオプションがコンバージョンに最も貢献するかを判断できません。各ユーザーと各セッションがそれぞれ異なることを前提に、期待される報酬が最も高い IAP オファーを見つけるにはどうすればよいでしょうか。

3. サンプルコードを取得する

コマンドラインから GitHub リポジトリのクローンを作成します。

git clone https://github.com/googlecodelabs/firebase-iap-optimization.git

このリポジトリには次のものが含まれています。

  1. パーソナライズ モデルをトレーニングして TFLite モデルにパッケージ化する Jupyter ノートブック(.ipynb)
  2. TFLite モデルを使用してデバイス上で予測を行う Kotlin サンプルアプリ

4. Firebase でアプリを実行する

この Codelab では、架空のゲームアプリ Flappy Sparky の IAP を最適化します。このゲームは、プレーヤーがスパーキーをコントロールし、壁にぶつからずに飛んでいく横スクロール スクローラーです。レベルの開始時に、パワーアップを提供する IAP オファーがユーザーに表示されます。この Codelab では、アプリの IAP 最適化の部分のみを実装します。

ここで学んだことを、Firebase プロジェクトに接続されている自分のアプリに適用できます。または、この Codelab 用に新しい Firebase プロジェクトを作成することもできます。Firebase の使用を開始するにあたってサポートが必要な場合は、このトピックのチュートリアル(Android および iOS)をご覧ください。

5. アプリでアナリティクス イベントを収集する

分析イベントはユーザーの行動に関するインサイトを提供し、ML モデルのトレーニングに使用されます。たとえば、長くプレイするユーザーは追加ライフを獲得するために IAP を作成する可能性が高いことを学習できます。ML モデルでは、この情報を学習し、入力として分析イベントを必要とします。

ログに記録する必要のあるアナリティクス イベントには、次のようなものがあります。

  • ユーザーのゲームのプレイ時間
  • ユーザーが達成するレベル
  • ユーザーが購入したコインの数
  • ユーザーが購入する商品

サンプルデータをダウンロードする(省略可)

次のステップでは、Firebase Analytics を使用して、モデルで使用する分析イベントをログに記録します。使用したい分析データがすでにある場合は、この Codelab の「最適化モデルをトレーニングする」セクションに進み、サンプルデータを確認してください。

Firebase Analytics SDK でデータを収集する

これらのアナリティクス イベントの収集には、Firebase 向け Google アナリティクスを使用します。Firebase Analytics SDK は、多くのイベントとユーザー プロパティを自動的に取得します。また、独自のカスタム イベントを定義して、アプリ固有のイベントを測定することもできます。

Firebase Analytics SDK のインストール

Google アナリティクス スタートガイドのドキュメントに沿って、アプリで Firebase 向け Google アナリティクスの利用を開始できます。この Codelab の冒頭でクローンを作成した firebase-iap-optimization リポジトリには、すでに Firebase Analytics SDK が含まれています。

カスタム イベントをロギングする

Firebase Analytics SDK を設定したら、モデルのトレーニングに必要なイベントのロギングを開始できます。

その前に、アナリティクス イベントでユーザー ID を設定して、そのユーザーのアナリティクス データをアプリ内の既存のデータに関連付けることが重要です。

MainActivity.kt

firebaseAnalytics.setUserId("player1")

次に、プレーヤーのイベントをログに記録します。IAP を最適化するために、ユーザーに提示された各 IAP オファーと、そのオファーがユーザーがクリックされたかどうかをログに記録します。これにより、offer_iapoffer_accepted という 2 つのアナリティクス イベントが生成されます。また、一意の Offer_id も記録して、後でこれらのデータを組み合わせて、オファーが受け入れられるかどうかを確認するためにこの ID を使用します。

MainActivity.kt

predictButton?.setOnClickListener {
  predictionResult = iapOptimizer.predict()

  firebaseAnalytics.logEvent("offer_iap"){
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

acceptButton?.setOnClickListener {
  firebaseAnalytics.logEvent("offer_accepted") {
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

カスタム イベントのロギングについて詳しくは、Firebase アナリティクスのログイベントに関するドキュメントをご覧ください。

6. BigQuery でデータを前処理する

最後のステップでは、どの IAP オファーがユーザーに表示され、どの IAP オファーがクリックされたかに関するイベントを収集しました。このステップでは、このイベントデータとユーザーデータを組み合わせて、モデルが全体像から学習できるようにします。

そのためには、まず分析イベントを BigQuery にエクスポートする必要があります。

Firebase プロジェクトとそのアプリを BigQuery にリンクするには:

  1. Firebase にログインします。
  2. [設定アイコン] をクリックし、[プロジェクトの設定] を選択します。
  3. [プロジェクトの設定] ページで [統合] タブをクリックします。
  4. BigQuery カードで [リンク] をクリックします。

(省略可)Firestore コレクションを BigQuery にエクスポートする

このステップでは、追加のユーザーデータを Firestore から BigQuery にエクスポートして、モデルのトレーニングに使用できます。このステップを省略する場合は、この Codelab の「BigQuery でのデータの準備」セクションに進み、最後のステップで記録された Firebase Analytics イベントを確認してください。

Firestore には、ユーザーの登録日、アプリ内購入、ゲーム内のレベル、残高のコインなど、モデルのトレーニングに役立つ属性を保存できます。

Firestore コレクションを BigQuery にエクスポートするには、Firestore BigQuery Export 拡張機能をインストールします。次に、BigQuery でテーブルを結合して、このデータを Google アナリティクスのデータと結合し、パーソナライズ モデルやこの Codelab の残りの部分で使用します。

BigQuery でのデータの準備

次の数ステップでは、BigQuery を使用して、未加工の分析データをモデルのトレーニングに使用できるデータに変換します。

モデルで、ユーザーとゲームの状態に基づいてどの IAP オファーを提示するかを学習できるように、以下のデータを整理する必要があります。

  • ユーザー
  • ゲーム ステータス
  • 提示された特典
  • 提示されたオファーがクリックされたかどうか

モデルで処理するには、これらのデータをすべてテーブル内の 1 行に整理する必要があります。幸いなことに、BigQuery はそれを可能にするよう設定されています。

BigQuery では、「ビュー」を作成してクエリを整理できます。ビューは SQL クエリによって定義される仮想テーブルです。ビューを作成する場合、テーブルに対してクエリする場合と同じ方法でビューに対してクエリを実行します。これを使用して、まず分析データをクリーニングできます。

各アプリ内購入オファーがクリックされたかどうかを確認するには、前のステップで記録した offer_iap イベントと offer_accepted イベントを結合する必要があります。

all_offers_joined - BigQuery ビュー

SELECT
  iap_offers.*,
  CASE
    WHEN accepted_offers.accepted IS NULL THEN FALSE ELSE TRUE
  END
  is_clicked,
FROM
  `iap-optimization.ml_sample.accepted_offers` AS accepted_offers
RIGHT JOIN
  `iap-optimization.ml_sample.iap_offers` AS iap_offers
ON
 accepted_offers.offer_id =iap_offers.offer_id;

all_offers_with_user_data - BigQuery ビュー

SELECT
  offers.is_clicked,
  offers.presented_powerup,
  offers.last_run_end_reason,
  offers.event_timestamp,
  users.*
FROM
  `iap-optimization.ml_sample.all_offers_joined` AS offers
LEFT JOIN
  `iap-optimization.ml_sample.all_users` AS users
ON
  users.user_id = offers.user_id;

BigQuery データセットを Google Cloud Storage にエクスポートする

最後に、BigQuery データセットを GCS にエクスポートして、モデルのトレーニングに使用できます。

888daa7ba4db8e44.png

14d22bf474fae455.png

7. 最適化モデルをトレーニングする

サンプルデータ

前のステップの「BigQuery でデータを前処理する」のデータ、またはダウンロード可能なサンプルデータを使用して、この Codelab の残りの部分を進めていきます。

問題の定義

モデルのトレーニングを開始する前に、少し時間をかけてコンテキスト バンディットの問題を定義しましょう。

コンテキスト バンディットの説明

Flappy Sparky の各レベルの開始時に、パワーアップを提供する IAP オファーがユーザーに表示されます。IAP オプションは毎回 1 つしか表示できず、どのオプションがコンバージョンに最も貢献するかもわかりません。各ユーザーと各セッションがそれぞれ異なることを前提に、期待される報酬が最も高い IAP オファーを見つけるにはどうすればよいでしょうか。

ここでは、ユーザーが IAP のオファーを承諾しなかった場合は報酬を 0、承諾しなかった場合は IAP の価値とします。報酬を最大化するには、過去のデータを使用して、ユーザーが与えられた各アクションに対して期待される報酬を予測するモデルをトレーニングし、報酬が最も高いアクションを見つけます。

e7d3264141498bff.jpeg

予測に使用するものは次のとおりです。

  • 状態: ユーザーと現在のセッションに関する情報
  • アクション: 表示可能な IAP 特典
  • 報酬: IAP オファーの価値

探索と探索

多腕バンディット問題では、アルゴリズムで探索(より多くのデータを取得して最適な結果が得られるアクションを学習する)と悪用(最適な結果を使用して最大の報酬を得る)のバランスを取る必要があります。

今回の問題では、これを単純化してクラウド内で定期的にのみモデルをトレーニングし、ユーザーのデバイス上でモデルを使用するときにのみ予測を行います(ユーザーのデバイス上でトレーニングするのではなく)。モデルの使用後に十分なトレーニング データを確保するには、ランダムな結果をアプリユーザーにときどき(30% など)表示する必要があります。探索と悪用のバランスを取るこの戦略は、Epsilon-greedy と呼ばれます。

モデルのトレーニング

この Codelab で提供されているトレーニング スクリプト(training.ipynb)を使用して開始できます。ここでの目標は、特定の状態の各アクションに対して期待される報酬を予測するモデルをトレーニングし、期待される報酬が最も高いアクションを特定することです。

ローカルでのトレーニング

独自のモデルのトレーニングを開始する最も簡単な方法は、この Codelab のコードサンプルにあるノートブックのコピーを作成することです。

この Codelab では GPU は必要ありませんが、独自のデータを探索して独自のモデルをトレーニングするためにより強力なマシンが必要な場合は、AI Platform Notebook インスタンスを使用するとトレーニングを高速化できます。

用意されているトレーニング スクリプトで、BigQuery からエクスポートした CSV ファイルからトレーニング データを生成するイテレータを作成しました。次に、このデータを使用して Keras によるモデルのトレーニングを開始しました。モデルをトレーニングする方法の詳細は、Python ノートブックのコメントに記載されています。

モデルのパフォーマンスを測定する

モデルをトレーニングしている間、IAP オファーをランダムに選択するランダム エージェントと比較して、モデルが実際に学習しているかどうかを確認します。このロジックは ValidationCallback. にあります

トレーニングの最後に、test.csv のデータを使用してモデルを再度テストします。このモデルはこのようなデータをこれまでに見たことがないので、結果が過学習によるものではないと確信できます。この場合、モデルのパフォーマンスはランダム エージェントよりも 28% 優れています。

TFLite モデルをエクスポートする

これで、トレーニング済みモデルが準備完了になりました。ただし、今のところは TensorFlow 形式です。モバイル デバイスで実行できるように、モデルを TFLite 形式としてエクスポートする必要があります。

train.ipynb

converter = tflite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

with tf.io.gfile.GFile('iap-optimizer.tflite', 'wb') as f:
  f.write(tflite_model)

ここからモデルをダウンロードして、アプリにバンドルできます。

必要に応じて、本番環境のアプリの場合、モデルを Firebase ML にデプロイし、Firebase でモデルをホストすることをおすすめします。これは主に次の 2 つの理由で有用です。

  1. アプリのインストール サイズを小さく保ち、必要な場合にのみモデルをダウンロードできます。
  2. モデルは定期的に更新でき、アプリ全体とは異なるリリース サイクルで更新できる

モデルを Firebase ML にデプロイする方法については、TFLite を利用した Android アプリに Firebase を追加するの Codelab をご覧ください。デプロイには、Firebase コンソールまたは Python API を使用できます。

8. デバイスでの予測

次のステップでは、デバイス上でモデルを使用して予測を行います。ダウンロードしたサンプルコードの app フォルダ内に Firebase ML からモデルをダウンロードするサンプルアプリがあり、これを使用してクライアントサイドのデータを使用して推論を行えます。

モデルのトレーニング中に前処理を適用したため、デバイス上で実行するときも、同じ前処理をモデル入力に適用する必要があります。これを簡単に行うには、プラットフォームと言語に依存しない形式を使用します。たとえば、前処理の実行方法に関するメタデータへの各特徴のマップを含む JSON ファイルを使用します。これを行う方法について詳しくは、サンプルアプリをご覧ください。

次に、モデルに次のようなテスト入力を与えます。

IapOptimzer.kt

  val testInput = mapOf(
    "coins_spent" to                       2048f,
    "distance_avg" to                      1234f,
    "device_os" to                         "ANDROID",
    "game_day" to                          10f,
    "geo_country" to                       "Canada",
    "last_run_end_reason" to               "laser"
  )

モデルは、この特定のユーザーに対して sparky_armor が最適な IAP パワーアップであることを示唆しています。

a3381dbcdbdf811e.png

モデルの精度を測定する

モデルの精度を測定するには、モデルによって予測された IAP オファーと、それらがクリックされたかどうかを Firebase Analytics で追跡するだけです。これを Firebase A/B Testing と併用すると、モデルの実際のパフォーマンスを測定できます。さらに一歩進めて、モデルのさまざまな反復処理で A/B テストを実施することもできます。Firebase を使用した A/B テストについて詳しくは、A/B Testing を使用して Firebase Remote Config テストを作成するをご覧ください。

9. (省略可): 新しいデータでモデルを定期的に更新する

新しいデータの受信時にモデルを更新する必要がある場合は、モデルを定期的に再トレーニングするパイプラインを設定できます。そのためには、まず、前述のイプシロン欲張り戦略を使用して、トレーニングに使用する新しいデータを用意する必要があります。(例: 70% の確率でモデルの予測結果を使用し、30% の確率でランダム結果を使用する)。

新しいデータでトレーニングしてデプロイするためのパイプラインの構成は、この Codelab の範囲外です。使用を開始するには、Google Cloud AI PlatformTFX をご確認ください。

10. お疲れさまでした

この Codelab では、Firebase を使用してアプリ内購入を最適化するために、オンデバイス TFLite モデルをトレーニングしてデプロイする方法を学習しました。TFLite と Firebase の詳細については、他の TFLite サンプルと Firebase スタートガイドをご覧ください。

ご不明な点がございましたら、Stack Overflow #firebase-machine-learning までお寄せください。

学習した内容

  • TensorFlow Lite
  • Firebase ML
  • Firebase アナリティクス
  • BigQuery

次のステップ

  • アプリのオプティマイザー モデルをトレーニングしてデプロイします。

詳細