1. 總覽
歡迎使用「即時裝置端應用程式內購最佳化」程式碼研究室。在本程式碼研究室中,您將瞭解如何使用 TensorFlow Lite 和 Firebase 訓練自訂個人化模型,並將模型部署至應用程式。
本教學課程將說明如何建構個人化機器學習模型,特別是根據目前使用者的狀態,預測最佳的應用程式內購 (IAP) 商品。這是情境淘金問題的範例,這是一種重要且廣泛適用的機器學習問題,您將在本程式碼研究室中進一步瞭解
課程內容
- 透過 Firebase Analytics 收集數據分析資料
- 使用 BigQuery 預先處理資料分析資料
- 訓練簡單的機器學習模型,在裝置端最佳化應用程式內購 (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
這個存放區包含:
- 訓練個人化模型並將其封裝成 TFLite 模型的 Jupyter 筆記本 (.ipynb)
- 使用 TFLite 模型在裝置上執行預測的 Kotlin 應用程式範例
4. 使用 Firebase 執行應用程式
在本程式碼研究室中,我們將著手改善虛構遊戲應用程式 Flappy Sparky 的應用程式內購功能。這是一款橫向捲軸遊戲,玩家需要操控 Sparky,試圖在兩道牆壁之間飛行,但不得碰撞牆壁。在關卡開始時,系統會向使用者提供可獲得強化效果的應用程式內購優惠。在本程式碼研究室中,我們只會實作應用程式的應用程式內購最佳化部分。
您可以將這裡學到的知識,應用至已連結至 Firebase 專案的應用程式。或者,您也可以為本程式碼實驗室建立新的 Firebase 專案。如果您需要 Firebase 的入門說明,請參閱相關教學課程 ( Android 和 iOS)。
5. 收集應用程式中的數據分析事件
Analytics 事件可提供使用者行為洞察資料,並用於訓練機器學習模型。舉例來說,模型可能會學習到,玩遊戲時間較長的使用者較有可能購買應用程式內商品來獲得額外生命數。機器學習模型需要分析事件做為輸入內容,才能學習這項資訊。
我們可能會記錄的部分數據分析事件包括:
- 使用者遊玩遊戲的時間長度
- 使用者達到的等級
- 使用者花費多少枚寶石
- 使用者購買的商品
下載範例資料 (選用)
在後續步驟中,我們會使用 Firebase Analytics 記錄數據分析事件,以便在模型中使用。如果您已有要使用的分析資料,請直接前往本程式碼研究室的「訓練最佳化模型」部分,並按照我們的範例資料操作。
使用 Firebase Analytics SDK 收集資料
我們會使用 Firebase 數據分析收集這些數據分析事件。Firebase Analytics SDK 會自動擷取多種事件和使用者屬性。您也可以定義自訂事件,評估應用程式專屬的事件。
安裝 Firebase Analytics SDK
您可以按照Google Analytics 新手上路說明文件的說明,在應用程式中開始使用 Firebase Analytics。在本程式碼研究室一開始複製的 firebase-iap-optimization
存放區已包含 Firebase Analytics SDK。
記錄自訂事件
設定 Firebase Analytics SDK 後,我們就可以開始記錄訓練模型所需的事件。
在進行這項操作前,請務必在數據分析事件中設定使用者 ID,這樣我們才能將該使用者的數據分析資料與他們在應用程式中現有的資料建立關聯。
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 將原始數據分析資料轉換為可用於訓練模型的資料。
為了讓模型學習如何根據使用者和遊戲狀態,顯示適合的應用程式內購商品,我們需要整理以下資料:
- 使用者
- 遊戲狀態
- 顯示的優惠
- 使用者是否點選顯示的優惠
所有資料都必須整理成資料表中的單一資料列,才能供模型處理。幸好,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. 訓練最佳化模型
範例資料
請使用上一個步驟「在 BigQuery 中預先處理資料」中所用的資料,或是下載此處提供的範例資料,並按照本程式碼研究室的其餘部分進行操作。
問題定義
開始訓練模型前,我們先來定義情境式強盜問題。
內容相關強盜行為說明
在 Flappy Sparky 的每個關卡開始時,使用者都會看到可提供加強效果的 IAP 商品。我們每次只能顯示一個 IAP 選項,且不清楚哪些選項轉換率最高。每位使用者和每個工作階段都不同,我們該如何找出最有可能帶來高報酬的應用程式內購商品?
在這種情況下,如果使用者不接受應用程式內購商品,獎勵點數就設為 0,如果接受則設為應用程式內購商品的價值。為了盡可能提高獎勵點數,我們可以使用歷來資料訓練模型,預測使用者執行每個動作的預期獎勵點數,並找出獎勵點數最高的動作。
以下是我們在預測中使用的資訊:
- 狀態:使用者和目前工作階段的相關資訊
- 動作:我們可以選擇顯示的應用程式內購商品
- Reward:應用程式內購優惠的價值
惡意利用與探索
對於所有多臂老虎問題,演算法需要在探索 (取得更多資料,以便瞭解哪些動作可帶來最佳結果) 和利用 (使用最佳結果取得最高獎勵) 之間取得平衡。
在我們的問題版本中,我們會簡化這項作業,只在雲端定期訓練模型,並只在使用者裝置上使用模型時進行預測 (而非在使用者裝置上訓練模型)。為確保使用模型後有足夠的訓練資料,我們有時會向應用程式使用者顯示隨機結果 (例如 30%)。這種平衡探索和利用的策略稱為ε-貪婪。
訓練模型
您可以使用程式碼研究室提供的訓練指令碼 (training.ipynb
) 開始學習。我們的目標是訓練模型,預測每個動作在特定狀態下的預期報酬,然後找出能帶來最高預期報酬的動作。
本機訓練
如要開始訓練自己的模型,最簡單的方法就是複製本程式碼研究室的程式碼範例中的 Notebook。
您不需要使用 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 代管模型。這有兩個主要原因:
- 我們可以讓應用程式安裝大小保持小巧,並只在必要時下載模型
- 模型可定期更新,且發布週期與整個應用程式不同
如要瞭解如何將模型部署至 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. (選用) 定期使用新資料更新模型
如果您需要隨著新資料的到來更新模型,可以設定管道,定期重新訓練模型。為此,您必須先確保有新資料可用於使用上述的ε-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
後續步驟
- 為應用程式訓練及部署最佳化器模型。