デバイス上のリアルタイムのアプリ内購入最適化に関する Codelab

1. 概要

1cbf855eda62c306.png

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

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

学習内容

  • Firebase 向け Google アナリティクスを使用してアナリティクス データを収集する
  • 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 の最適化について説明します。このゲームは横スクロール ゲームで、プレイヤーは Sparky を操作して、壁にぶつかることなく壁の間を飛び回ります。レベルの開始時に、パワーアップ アイテムを提供する IAP オファーがユーザーに表示されます。この Codelab では、アプリの IAP 最適化部分のみを実装します。

ここで学んだ内容は、Firebase プロジェクトに接続されている独自のアプリに適用できます。別の方法として、この Codelab 用に新しい Firebase プロジェクトを作成することもできます。Firebase の利用を開始する際にサポートが必要な場合は、このトピックに関するチュートリアル(AndroidiOS)をご覧ください。

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

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

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

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

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

次の手順では、Firebase 向け Google アナリティクスを使用して、モデルで使用するアナリティクス イベントをログに記録します。使用する分析データがすでにある場合は、「最適化モデルのトレーニング」に進んでください。セクションがあります。サンプルデータも参照できます。

Firebase 向け Google アナリティクス SDK を使用してデータを収集する

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

Firebase アナリティクス SDK のインストール

アプリで Firebase Analytics の利用を始めるには、Google アナリティクスの利用を開始する方法に関するドキュメントをご覧ください。この Codelab の冒頭でクローンを作成した firebase-iap-optimization リポジトリには、すでに Firebase Analytics SDK が含まれています。

カスタム イベントをログに記録する

Firebase 向け Google アナリティクス SDK を設定したら、モデルのトレーニングに必要なイベントのロギングを開始できます。

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

MainActivity.kt

firebaseAnalytics.setUserId("player1")

次に、プレーヤー イベントをロギングします。IAP を最適化するために、ユーザーに提示された各 IAP オファーと、そのオファーがユーザーがクリックしたかどうかを記録します。これにより、offer_iapoffer_accepted の 2 つのアナリティクス イベントが生成されます。また、一意の offer_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 向け Google アナリティクスのログイベントに関するドキュメントをご覧ください。

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

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

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

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

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

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

このステップでは、モデルのトレーニングに使用する追加のユーザーデータを Firestore から BigQuery にエクスポートすることもできます。この手順をスキップする場合は、この Codelab の「BigQuery でのデータの準備」セクションに進み、前回ログに記録した Firebase アナリティクス イベントについて説明します。

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% など)。探索と活用のバランスを取るこの戦略は、ε-greedy と呼ばれます。

モデルのトレーニング

始めるにあたっては、Codelab に付属のトレーニング スクリプト(training.ipynb)を使用できます。目標は、状態が与えられたときの各アクションの期待報酬を予測するモデルをトレーニングし、期待報酬が最も高いアクションを見つけることです。

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

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

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

用意されたトレーニング スクリプトの中で、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. デバイス上での予測

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

モデルのトレーニング中になんらかの前処理を適用したため、デバイス上で実行するときには、同じ前処理をモデル入力に適用する必要があります。これを簡単に行うには、プラットフォームと言語に依存しない形式(前処理方法に関するメタデータへのすべての特徴のマップを含む 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

モデルの精度を測定する

モデルの精度を測定するには、Firebase アナリティクスを使用して、モデルによって予測された IAP オファーと、それらがクリックされたかどうかを記録します。Firebase A/B Testing と組み合わせて使用することで、モデルの実際のパフォーマンスを測定できます。さらに一歩進んで、モデルの異なる反復処理に対して A/B テストを実施することもできます。Firebase を使用した A/B Testing について詳しくは、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

次のステップ

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

詳細