1. 總覽
歡迎參加「即時裝置端應用程式內購最佳化」程式碼研究室。在這個程式碼研究室中,您將瞭解如何使用 TensorFlow Lite 和 Firebase 訓練自訂個人化模型,並部署至應用程式。
本教學課程說明如何建構個人化機器學習模型,特別是根據目前使用者所在狀態預測出最佳的應用程式內購 (IAP) 模型。這是情境式吃角子老虎機器問題示例,您將在本程式碼研究室中進一步瞭解這項重要且廣泛適用的機器學習問題。
課程內容
- 透過 Firebase 數據分析收集數據分析資料
- 使用 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,試圖在兩支牆壁之間飛行,完全沒碰到。在關卡開始時,使用者會看到可賺取強化道具的應用程式內購優惠。在本程式碼研究室中,我們只會實作應用程式的 IAP 最佳化部分。
您可以將此處所學內容,應用到連結至 Firebase 專案的應用程式中。或者,您也可以為這個程式碼研究室建立新的 Firebase 專案。如果在開始使用 Firebase 時需要協助,請參閱這個主題的相關教學課程 ( Android 和 iOS)。
5. 收集應用程式的數據分析事件
數據分析事件可讓您深入瞭解使用者行為,並用於訓練機器學習模型。舉例來說,這個模型可能會得知長時間遊戲的使用者較有可能完成應用程式內購,以獲得額外生命。機器學習模型需要數據分析事件做為輸入內容,才能學習這項資訊。
建議記錄的數據分析事件包括:
- 使用者玩遊戲的時間長度
- 使用者到達的等級
- 使用者花費多少金幣
- 使用者購買的商品
下載範例資料 (選用)
我們會在下列步驟中使用 Firebase Analytics 記錄要在模型中使用的 Analytics 事件。如果已有想使用的數據分析資料,請跳至「訓練最佳化模型」部分,您可以按照範例資料操作。
使用 Firebase Analytics SDK 收集資料
我們會使用 Firebase Analytics 來收集這些數據分析事件。Firebase Analytics SDK 會自動擷取多種事件和使用者屬性,此外,您也可以定義自己的自訂事件,評估應用程式特有的事件。
安裝 Firebase Analytics SDK
如要開始在應用程式中使用 Firebase Analytics,請按照 Google Analytics 說明文件中的說明操作。在本程式碼研究室一開始所複製的 firebase-iap-optimization
存放區已包含 Firebase Analytics SDK。
記錄自訂事件
設定 Firebase Analytics SDK 後,系統就能開始記錄訓練模型所需的事件。
在這之前,請務必先在 Analytics 事件中設定 User-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 中預先處理資料
在最後一個步驟中,我們收集的事件是關於向使用者顯示的應用程式內購商品,以及使用者點擊了哪些 IAP 商品。在這個步驟中,我們將這項事件資料與使用者資料結合,以利模型完整學習。
如要完成這項操作,首先請將數據分析事件匯出至 BigQuery。
將您的 Firebase 專案連結至 BigQuery
如要將 Firebase 專案及其應用程式連結至 BigQuery,請按照下列步驟操作:
- 登入 Firebase 帳戶。
- 按一下 ,然後選取「Project Settings」。
- 在「專案設定」頁面中,按一下「整合」分頁標籤。
- 在 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》的每個關卡開始時,使用者都會看到可賺取強化道具的應用程式內購優惠。我們每次只能顯示一個應用程式內購選項,而無從得知哪個選項能帶來最多轉換。考量到每位使用者和每個工作階段的情況各不相同,我們該如何找出預期能提供最高獎勵的應用程式內購商品?
在這個例子中,如果使用者不接受應用程式內購商品,我們要獎勵 0;如果可以,則獎勵應用程式內購價值。為了盡可能獲得最高的獎勵,我們可以使用歷來資料來訓練模型,藉此預測每位使用者各項操作的預期獎勵,並找出獎勵最高的動作。
下列是預測中會使用的值:
- 狀態:使用者相關資訊及其目前工作階段的資訊
- 動作:我們可以選擇顯示的應用程式內購優惠
- 獎勵:應用程式內購優惠的價值
入侵與探索
針對所有多選項吃角子老虎機器問題,演算法必須在探索 (取得更多資料來瞭解哪些動作能帶來最佳結果) 和漏洞攻擊 (採用最佳結果來取得最高獎勵) 之間取得平衡。
在我們的問題版本中,我們會簡化這項工作,以便只在雲端定期訓練模型,且只在在使用者裝置上使用模型時才進行預測,這與在使用者裝置上進行訓練的情形相反。為確保在使用模型後擁有足夠的訓練資料,我們有時會向應用程式使用者顯示隨機結果 (例如 30%)。這種在探索與剝削之間取得平衡的策略稱為 Epsilon-greedy,
訓練模型
使用程式碼研究室提供的訓練指令碼 (training.ipynb
) 即可開始使用。我們的目標是訓練一個模型,預測特定州別應提供每個動作的預期獎勵,然後找出能帶來最高預期獎勵的動作。
在本機訓練
如要開始自行訓練模型,最簡單的方法就是在本程式碼研究室的程式碼範例中複製筆記本。
本程式碼研究室不需要 GPU,但如果您需要更強大的機器來探索自己的資料及訓練模型,可以透過 AI 平台筆記本執行個體加快訓練速度。
在提供的訓練指令碼中,我們建立了一個疊代器,這個疊代器會根據從 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
是這個特定使用者的最佳 IAP 強化道具。
評估模型準確率
如要評估模型準確度,我們只需透過 Firebase 數據分析追蹤模型預測的應用程式內購商品,以及是否點選這些商品。但也可以搭配 Firebase A/B 測試使用,以評估模型的實際成效。更進一步,您也可以針對模型的不同疊代執行 A/B 版本測試。如要進一步瞭解透過 Firebase 進行 A/B 測試的方式,請參閱「透過 A/B 測試建立 Firebase 遠端設定實驗」說明文件。
9. (選用):定期使用新資料更新模型
如果您在收到新資料時需要更新模型,可以設定管道來定期重新訓練模型。在這之前,您必須先確認自己有新的資料,可以運用上述的 Epsilon-greedy 策略進行訓練。(例如,在 70% 的時間使用模型預測結果,且 30% 的時間會使用隨機結果)。
這個程式碼研究室的涵蓋範圍還包括透過 Google Cloud AI 平台和 TFX 設定管道,以使用新資料進行訓練及部署。
10. 恭喜!
在本程式碼研究室中,您已瞭解如何使用 Firebase 訓練及部署裝置端 TFLite 模型,針對應用程式內購進行最佳化。如要進一步瞭解 TFLite 和 Firebase,請參閱其他 TFLite 範例和 Firebase 入門指南。
如有任何疑問,可以在 Stack Overflow #firebase-machine-learning 提問。
涵蓋內容
- TensorFlow Lite
- Firebase ML
- Firebase Analytics
- BigQuery
後續步驟
- 為您的應用程式訓練及部署最佳化工具模型。