1. 總覽

歡迎參加應用程式內購最佳化程式碼研究室,瞭解如何即時在裝置上進行最佳化。在本程式碼研究室中,您將瞭解如何使用 TensorFlow Lite 和 Firebase,訓練及部署自訂個人化模型至應用程式。
本教學課程說明如何建構個人化機器學習模型,特別是根據目前使用者狀態預測最佳應用程式內購 (IAP) 方案的模型。這是情境式強盜問題的範例,這類機器學習問題非常重要且適用範圍廣泛,您將在本程式碼研究室中進一步瞭解
課程內容
- 透過 Firebase Analytics 收集數據分析資料
- 使用 BigQuery 預先處理 Analytics 資料
- 訓練簡單的機器學習模型,在裝置端最佳化應用程式內購 (IAP)
- 將 TFLite 模型部署至 Firebase ML,並從應用程式存取模型
- 透過 Firebase A/B 測試評估及實驗不同模型
- 使用最新資料以固定頻率訓練及部署新模型
事前準備
- Android Studio 3.4 以上版本
- 搭載 Android 2.3 以上版本和 Google Play 服務 9.8 以上版本的實體測試裝置,或搭載 Google Play 服務 9.8 以上版本的模擬器
- 如果使用實體測試裝置,請準備連接線
- 機器學習新手
您會如何使用本教學課程?
您對建構 Android 應用程式的體驗滿意嗎?
2. 問題陳述
假設您是遊戲開發人員,想在每個關卡結束時顯示個人化應用程式內商品 (IAP) 建議。每次只能顯示有限數量的應用程式內商品選項,而且您不知道哪些選項的轉換率最高。由於每位使用者和每個工作階段都不盡相同,我們該如何找出可提供最高預期獎勵的應用程式內商品優惠?
3. 取得程式碼範例
從指令列複製 GitHub 存放區。
git clone https://github.com/googlecodelabs/firebase-iap-optimization.git
這個存放區包含:
- Jupyter 筆記本 (.ipynb):用於訓練個人化模型,並將模型封裝成 TFLite 模型
- Kotlin 範例應用程式,使用 TFLite 模型在裝置上進行預測
4. 使用 Firebase 執行應用程式
在本程式碼研究室中,我們將著重於最佳化虛構遊戲應用程式「Flappy Sparky」的應用程式內商品。這款遊戲是橫向捲軸遊戲,玩家要控制 Sparky 在牆壁間飛行,並避免撞到牆壁。在關卡開始時,系統會向使用者顯示應用程式內購優惠,提供強化道具。在本程式碼研究室中,我們只會實作應用程式的應用程式內商品最佳化部分。
您將能把這裡學到的內容,套用至已連結至 Firebase 專案的應用程式。或者,您也可以為這個程式碼研究室建立新的 Firebase 專案。如需 Firebase 入門說明,請參閱相關主題的教學課程 ( Android 和 iOS)。
5. 在應用程式中收集數據分析事件
Analytics 事件可深入瞭解使用者行為,並用於訓練機器學習模型。舉例來說,模型可能會發現,玩得越久的使用者越有可能進行應用程式內購買,以取得額外生命值。機器學習模型需要將 Analytics 事件做為輸入內容,才能瞭解這項資訊。
我們可能會想記錄的 Analytics 事件包括:
- 使用者玩遊戲的時間長度
- 使用者達到的等級
- 使用者花費的金幣數量
- 使用者購買的項目
下載範例資料 (選用)
在下列步驟中,我們會使用 Firebase Analytics 記錄數據分析事件,以便在模型中使用。如果您已有想使用的 Analytics 資料,請跳至本程式碼研究室的「訓練最佳化模型」一節,並使用我們的範例資料。
使用 Firebase Analytics SDK 收集資料
我們會使用 Firebase 數據分析來協助收集這些數據分析事件。Firebase Analytics SDK 會自動擷取多種事件和使用者屬性,您也可以定義自己的自訂事件,評估應用程式特有的事件。
安裝 Firebase Analytics SDK
如要在應用程式中開始使用 Firebase Analytics,請參閱這篇 Google Analytics 入門文件。在本程式碼研究室一開始複製的 firebase-iap-optimization 存放區中,已包含 Firebase Analytics SDK。
記錄自訂事件
設定 Firebase Analytics SDK 後,我們就能開始記錄訓練模型所需的事件。
在此之前,請務必在 Analytics 事件中設定使用者 ID,以便將該使用者的 Analytics 資料與應用程式中的現有資料建立關聯。
MainActivity.kt
firebaseAnalytics.setUserId("player1")
接著,我們可以記錄播放器事件。為進行應用程式內商品最佳化,我們想記錄向使用者顯示的每個應用程式內商品,以及使用者是否點選該商品。這樣我們就會有兩個 Analytics 事件 - offer_iap 和 offer_accepted。我們也會追蹤專屬的 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 Analytics 記錄事件說明文件。
6. 在 BigQuery 中預先處理資料
在上一個步驟中,我們收集了有關向使用者顯示的應用程式內商品優惠,以及使用者點選的應用程式內商品優惠事件。在這個步驟中,我們會將這項事件資料與使用者資料合併,讓模型從完整資料中學習。
為此,我們需要先將 Analytics 事件匯出至 BigQuery。
將您的 Firebase 專案連結至 BigQuery
如要將 Firebase 專案及其應用程式連結至 BigQuery,請按照下列步驟操作:
- 登入 Firebase 帳戶。
- 按一下
,然後選取「專案設定」。 - 在「專案設定」頁面中,按一下「整合」分頁標籤。
- 在 BigQuery 資訊卡中,按一下「連結」。
(選用) 將 Firestore 集合匯出至 BigQuery
在這個步驟中,您可以選擇將其他使用者資料從 Firestore 匯出至 BigQuery,用於訓練模型。如要暫時略過這個步驟,請跳至本程式碼研究室的「在 BigQuery 中準備資料」一節,並按照上一個步驟中記錄的 Firebase Analytics 事件操作。
您可能已在 Firestore 中儲存使用者的註冊日期、應用程式內購項目、遊戲等級、餘額中的金幣,或是任何其他有助於訓練模型的屬性。
如要將 Firestore 集合匯出至 BigQuery,請安裝 Firestore BigQuery Export 擴充功能。然後在 BigQuery 中聯結表格,將這項資料與 Google Analytics 資料合併,以便在個人化模型和本程式碼研究室的其餘部分中使用。
在 BigQuery 中準備資料
在接下來的幾個步驟中,我們將使用 BigQuery 將原始 Analytics 資料轉換為可用於訓練模型的資料。
為了讓模型根據使用者和遊戲狀態瞭解要顯示哪個 IAP 優惠,我們需要整理下列資料:
- 使用者
- 遊戲狀態
- 所提供的優惠
- 使用者是否點選顯示的優惠
所有這些資料都必須整理成資料表中的單一資料列,模型才能處理。幸好,BigQuery 的設定就是為了協助我們達成這個目標。
BigQuery 可建立「檢視區塊」,讓查詢井然有序。視圖是 SQL 查詢定義的虛擬表格。建立檢視表時,其查詢方法與資料表查詢相同。我們可以先使用這項功能清理 Analytics 資料。
如要查看每個應用程式內購優惠是否遭到點選,我們需要加入上一個步驟中記錄的 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. 訓練最佳化模型
範例資料
請使用上一個步驟「在 BigQuery 中預先處理資料」中的資料,或這裡提供的可下載範例資料,繼續完成本程式碼研究室的其餘部分。
問題定義
開始訓練模型前,我們先花點時間定義情境式強盜問題。
說明脈絡強盜演算法
在 Flappy Sparky 的每個關卡開始時,系統會向使用者顯示可提供加成的應用程式內商品。我們每次只能顯示一個應用程式內商品選項,而且不知道哪個選項的轉換率最高。由於每位使用者和每個工作階段都不盡相同,我們該如何找出可提供最高預期獎勵的應用程式內商品優惠?
在這種情況下,如果使用者未接受應用程式內商品優惠,獎勵應為 0;如果接受,獎勵則為應用程式內商品價值。為盡量提高獎勵,我們可以運用歷來資料訓練模型,預測使用者每項動作的預期獎勵,並找出獎勵最高的動作。

以下是我們在預測時會使用的內容:
- 狀態:使用者及其目前工作階段的相關資訊
- 動作:我們可以選擇顯示的應用程式內商品優惠
- 獎勵:應用程式內購優惠價值
利用與探索
對於所有多臂賭博機問題,演算法都需要在探索 (取得更多資料,瞭解哪項動作可帶來最佳結果) 和利用 (使用最佳結果來獲得最高報酬) 之間取得平衡。
在我們的問題版本中,我們會簡化這項程序,只在雲端定期訓練模型,並只在使用者裝置上使用模型時進行預測 (而不是在使用者裝置上訓練模型)。為確保模型使用後有足夠的訓練資料,我們有時需要向應用程式使用者顯示隨機結果 (例如 30%)。這種平衡探索和利用的策略稱為 Epsilon-greedy。
訓練模型
您可以使用程式碼研究室提供的訓練指令碼 (training.ipynb) 開始作業。我們的目標是訓練模型,根據狀態預測每個動作的預期獎勵,然後找出預期獎勵最高的動作。
在本機訓練
如要開始訓練自己的模型,最簡單的方法就是複製本程式碼研究室程式碼範例中的筆記本。
本程式碼研究室不需要 GPU,但如要使用更強大的機器探索自有資料及訓練自有模型,可以取得 AI Platform Notebook 執行個體,加快訓練速度。
在提供的訓練指令碼中,我們建立了一個疊代器,可從 BigQuery 匯出的 CSV 檔案產生訓練資料。接著,我們使用這些資料,透過 Keras 開始訓練模型。如要瞭解如何訓練模型,請參閱 Python 筆記本中的註解。
評估模型效能
訓練模型時,我們會與隨機選取應用程式內商品方案的隨機代理程式進行比較,確認模型是否確實在學習。這項邏輯位於 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 代管模型。這項指標十分實用,主要有兩個原因:
- 我們可以縮減應用程式安裝大小,並只在需要時下載模型
- 模型可以定期更新,且發布週期與整個應用程式不同
如要瞭解如何將模型部署至 Firebase ML,請參閱「將 Firebase 新增至以 TFLite 為基礎的 Android 應用程式」程式碼研究室。您可以選擇使用 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 是最適合這位使用者的應用程式內購加成。

評估模型準確率
如要評估模型準確度,只要使用 Firebase Analytics 追蹤模型預測的應用程式內購項目,以及這些項目是否遭到點選即可。您可以搭配使用這項功能和 Firebase A/B 測試,評估模型的實際成效。此外,您也可以對不同模型疊代執行 A/B 測試。如要進一步瞭解如何使用 Firebase 進行 A/B 測試,請參閱「建立 Firebase 遠端設定實驗並進行 A/B 測試」說明文件。
9. (選用):定期使用新資料更新模型
如有新資料,需要更新模型時,可以設定管道,定期重新訓練模型。如要這麼做,請先確認您有新資料,可使用上述 epsilon-greedy 策略進行訓練。(例如:70% 的時間使用模型預測結果,30% 的時間使用隨機結果)。
本程式碼研究室不會說明如何設定管道,以使用新資料訓練及部署模型。如要開始使用,請參閱 Google Cloud AI Platform 和 TFX。
10. 恭喜!
在本程式碼研究室中,您學會如何訓練及部署裝置端 TFLite 模型,以便使用 Firebase 最佳化應用程式內購。如要進一步瞭解 TFLite 和 Firebase,請參閱其他 TFLite 範例和 Firebase 入門指南。
如有任何問題,請前往 Stack Overflow #firebase-machine-learning 提問。
涵蓋內容
- TensorFlow Lite
- Firebase ML
- Firebase Analytics
- BigQuery
後續步驟
- 訓練及部署應用程式的廣告空間最佳化模型。