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

1. 概要

1cbf855eda62c306.png

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

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

学習内容

  • Firebase アナリティクスでアナリティクス データを収集する
  • 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 のアプリ内購入の最適化に取り組みます。このゲームは、プレーヤーが Sparky を操作して、壁の柱の間をぶつからずに飛び抜けようとする横スクロール ゲームです。レベルの開始時に、ユーザーにパワーアップを提供する IAP オファーが表示されます。この Codelab では、アプリの IAP 最適化部分のみを実装します。

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

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

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

ロギングするアナリティクス イベントの例を次に示します。

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

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

次の手順では、Firebase アナリティクスを使用して、モデルで使用する分析イベントをログに記録します。使用する分析データがすでにある場合は、この Codelab の「最適化モデルをトレーニングする」セクションに移動して、サンプルデータに沿って操作してください。

Firebase アナリティクス SDK でデータを収集する

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

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

アプリで Firebase アナリティクスを使い始めるには、Google アナリティクスのスタートガイドをご覧ください。この Codelab の冒頭でクローンした firebase-iap-optimization リポジトリには、Firebase アナリティクス SDK がすでに含まれています。

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

Firebase アナリティクス 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. 最適化モデルをトレーニングする

サンプルデータ

この Codelab の残りの部分を完了するには、前のステップ「BigQuery でデータを前処理する」で作成したデータを使用するか、こちらで提供されているダウンロード可能なサンプルデータを使用します。

問題の定義

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

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

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

この場合、ユーザーがアプリ内購入の提案を受け入れなかった場合は報酬を 0 に、受け入れた場合はアプリ内購入の価値に設定します。報酬を最大化するために、過去のデータを使用して、ユーザーが特定のアクションを行った場合の期待される報酬を予測するモデルをトレーニングし、最も高い報酬が得られるアクションを見つけます。

e7d3264141498bff.jpeg

予測で使用する内容は次のとおりです。

  • 状態: ユーザーとその現在のセッションに関する情報
  • アクション: 表示する IAP オファーを選択できる
  • 報酬: IAP オファーの価値

Exploitation と Exploration の違い

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

この問題のバージョンでは、クラウドでモデルを定期的にトレーニングし、ユーザーのデバイスでモデルを使用するときにのみ予測を行うように簡略化します(ユーザーのデバイスでもトレーニングを行うのではなく)。モデルの使用後に十分なトレーニング データが確保されるように、アプリユーザーにランダムな結果を提示する必要がある場合があります(30% など)。探索と活用のバランスを取るこの戦略は、ε-greedy と呼ばれます。

モデルのトレーニング

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

ローカルでトレーニングする

独自のモデルのトレーニングを始める最も簡単な方法は、この 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. デバイス上で予測を行う

次のステップは、デバイス上のモデルを使用して予測を行うことです。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 アナリティクスを使用してクリックされたかどうかを追跡します。この機能は、Firebase A/B テストと組み合わせて使用して、モデルの実際のパフォーマンスを測定できます。さらに、モデルのさまざまなイテレーションで 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

次のステップ

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

詳細