この Codelab について
1. 概要
リアルタイム オンデバイス アプリ内購入の最適化 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
このリポジトリには次のものが含まれています。
- パーソナライズ モデルをトレーニングし、TFLite モデルにパッケージ化する Jupyter ノートブック(.ipynb)
- TFLite モデルを使用してデバイス上で予測を行う Kotlin サンプルアプリ
4. Firebase でアプリを実行する
この Codelab では、架空のゲームアプリ Flappy Sparky の IAP の最適化を行います。このゲームは横スクロール型で、プレイヤーは Sparky を操作して、壁にぶつかることなく壁の間を飛行します。レベルの開始時に、パワーアップを提供する IAP 特典がユーザーに提示されます。この Codelab では、アプリの IAP 最適化部分のみを実装します。
ここで学んだ内容は、Firebase プロジェクトに接続されている独自のアプリに適用できます。または、この Codelab 用に新しい Firebase プロジェクトを作成することもできます。Firebase の利用を開始する際にサポートが必要な場合は、このトピックに関するチュートリアル(Android と iOS)をご覧ください。
5. アプリでアナリティクス イベントを収集する
アナリティクス イベントはユーザー行動に関する分析情報を提供します。この情報は ML モデルのトレーニングに使用されます。たとえば、長時間プレイしたユーザーは追加のライフを取得するために IAP を行う可能性が高いことをモデルが学習する場合があります。ML モデルがこの情報を学習するには、アナリティクス イベントを入力として必要とします。
ロギングするアナリティクス イベントには、次のようなものがあります。
- ユーザーがゲームをプレイした時間
- ユーザーが到達したレベル
- ユーザーが使用するコインの数
- ユーザーが購入した商品
サンプルデータをダウンロードする(省略可)
次の手順では、Firebase アナリティクスを使用して、モデルで使用するアナリティクス イベントをログに記録します。使用するアナリティクス データがすでにある場合は、この Codelab の「最適化モデルをトレーニングする」セクションに進み、サンプルデータを使用して学習を進めてください。
Firebase Analytics SDK を使用してデータを収集する
これらのアナリティクス イベントの収集には Firebase アナリティクスを使用します。Firebase Analytics SDK は、いくつかのイベントとユーザー プロパティを自動的に収集します。また、独自のカスタム イベントを定義して、アプリに固有のイベントを測定することもできます。
Firebase アナリティクス SDK のインストール
アプリで Firebase アナリティクスを使い始めるには、Google アナリティクスのスタートガイドをご覧ください。この Codelab の冒頭でクローンを作成した firebase-iap-optimization
リポジトリには、Firebase Analytics SDK がすでに含まれています。
カスタム イベントを記録する
Firebase Analytics SDK を設定したら、モデルのトレーニングに必要なイベントのロギングを開始できます。
これを実現するには、アナリティクス イベントでユーザー ID を設定して、そのユーザーのアナリティクス データをアプリ内の既存のデータに関連付けることが重要です。
MainActivity.kt
firebaseAnalytics.setUserId("player1")
次に、プレーヤー イベントをロギングします。IAP の最適化では、ユーザーに表示された IAP オファーと、そのオファーがユーザーによってクリックされたかどうかを記録する必要があります。これにより、offer_iap
と offer_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 アナリティクスのイベントのロギングに関するドキュメントをご覧ください。
6. BigQuery でデータを前処理する
最後のステップでは、どの IAP 特典がユーザーに提示され、どの IAP 特典がユーザーによってクリックされたかに関するイベントを収集しました。このステップでは、このイベントデータをユーザーデータと組み合わせて、モデルが全体像から学習できるようにします。
そのためには、まずアナリティクス イベントを BigQuery にエクスポートする必要があります。
Firebase プロジェクトを BigQuery にリンクする
Firebase プロジェクトとそのアプリを BigQuery にリンクするには:
- Firebase にログインします。
をクリックし、[プロジェクトの設定] を選択します。
- [プロジェクトの設定] ページで、[統合] タブをクリックします。
- 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 にエクスポートして、モデル トレーニングで使用できるようにします。
7. 最適化モデルをトレーニングする
サンプルデータ
この Codelab の残りの部分では、前のステップ「BigQuery でデータを前処理する」で使用したデータ、またはこちらからダウンロードできるサンプルデータを使用します。
問題の定義
モデルのトレーニングを開始する前に、コンテキスト バンディットの問題を定義しましょう。
コンテキスト バンディットの説明
Flappy Sparky の各レベルの開始時に、パワーアップを提供する IAP オファーがユーザーに表示されます。一度に表示できる IAP オプションは 1 つだけです。どの IAP オプションがコンバージョンに最も効果的かはわかりません。ユーザーとセッションはそれぞれ異なるため、期待される報酬が最も高い IAP オファーを見つけるにはどうすればよいですか?
この場合、ユーザーが IAP オファーを承認しなかった場合は報酬を 0 に、承認した場合は IAP の値にします。報酬を最大化するために、過去のデータを使用して、ユーザーに応じた各アクションの予想報酬を予測するモデルをトレーニングし、報酬が最も高いアクションを見つけることができます。
予測に使用するものは次のとおりです。
- 状態: ユーザーと現在のセッションに関する情報
- アクション: 表示する IAP オファー
- 報酬: IAP 特典の価値
悪用と探索
すべてのマルチアームのバンディット問題において、アルゴリズムは探索(より多くのデータを取得して最適な結果をもたらすアクションを学習する)と搾取(最適な結果を使用して最高の報酬を得る)のバランスを取る必要があります。
ここでは、この問題を簡素化して、クラウドでモデルを定期的にトレーニングし、ユーザーのデバイスでモデルを使用する場合にのみ予測を行うようにします(ユーザーのデバイスでトレーニングを行うのではなく)。モデルの使用後に十分なトレーニング データが確保されるように、アプリのユーザーにランダムな結果を表示することがあります(30% など)。探索と活用のバランスを取るこの戦略は、ε-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 つの理由で役立ちます。
- アプリのインストール サイズを小さく抑え、必要な場合にのみモデルをダウンロードできる
- モデルは定期的に更新でき、アプリ全体とは異なるリリース サイクルで更新できます
モデルを 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 パワーアップであると推奨しています。
モデルの精度を測定する
モデルの精度を測定するには、Firebase アナリティクスを使用して、モデルによって予測された IAP オファーと、それらがクリックされたかどうかを記録するだけです。Firebase A/B Testing と組み合わせて使用することで、モデルの実際のパフォーマンスを測定できます。さらに一歩進んで、モデルのさまざまな反復処理に対して A/B テストを実施することもできます。Firebase での A/B テストの詳細については、A/B Testing で Firebase Remote Config テストを作成するをご覧ください。
9. (省略可)新しいデータでモデルを定期的に更新する
新しいデータの受信に合わせてモデルを更新する必要がある場合は、パイプラインを設定してモデルを定期的に再トレーニングできます。これを行うには、まず、前述のエプシロン貪欲戦略を使用して、トレーニングに使用する新しいデータがあることを確認する必要があります。(例: モデルの予測結果を 70%、ランダムな結果を 30% 使用)。
新しいデータを使用してトレーニングとデプロイを行うためのパイプラインの構成は、この Codelab の範囲外です。Google Cloud AI Platform と TFX を確認して、始めてください。
10. お疲れさまでした
この Codelab では、Firebase を使用してアプリ内購入を最適化するためのオンデバイス TFLite モデルをトレーニングしてデプロイする方法を学びました。TFLite と Firebase の詳細については、他の TFLite サンプルと Firebase スタートガイドをご覧ください。
ご不明な点がございましたら、Stack Overflow #firebase-machine-learning でお問い合わせください。
学習した内容
- TensorFlow Lite
- Firebase ML
- Firebase アナリティクス
- BigQuery
次のステップ
- アプリ用のオプティマイザー モデルをトレーニングしてデプロイする。