1. סקירה כללית
ברוכים הבאים למעבדת הקוד לאופטימיזציה של רכישות במכשיר בזמן אמת במכשיר. במעבדת קוד זה תלמד כיצד להשתמש ב-TensorFlow Lite וב-Firebase כדי להכשיר ולפרוס מודל התאמה אישית מותאם אישית לאפליקציה שלך.
מדריך זה מראה כיצד לבנות מודל למידת מכונה להתאמה אישית, בפרט כזה שמנבא את הצעת הרכישה האופטימלית בתוך האפליקציה (IAP) בהינתן מצב בו נמצא המשתמש הנוכחי. זוהי דוגמה לבעיית שודדים קונטקסטואלית. סוג של בעיית למידת מכונה ישימה נרחבת, שעליה תלמד יותר במעבדת קוד זה
מה תלמד
- איסוף נתוני ניתוח באמצעות ניתוח נתונים של Firebase
- עיבוד מוקדם של נתוני ניתוח באמצעות BigQuery
- אימון מודל ML פשוט לאופטימיזציה במכשיר של רכישות בתוך האפליקציה (IAPs)
- פרוס דגמי TFLite ל-Firebase ML וגשת אליהם מהאפליקציה שלך
- למדוד ולהתנסות במודלים שונים באמצעות Firebase A/B Testing
- אמן ופריסה דגמים חדשים תוך שימוש בנתונים העדכניים ביותר על קצב חוזר
מה אתה צריך
- Android Studio גרסה 3.4+
- מכשיר בדיקה פיזי עם Android 2.3+ ושירותי Google Play 9.8 ואילך, או אמולטור עם שירותי Google Play 9.8 ואילך
- אם משתמשים במכשיר בדיקה פיזי, כבל חיבור
- ידע ב-ML מתחילים
כיצד תשתמש במדריך זה?
איך היית מדרג את החוויה שלך בבניית אפליקציות אנדרואיד?
2. הצהרת בעיה
נניח שאתה מפתח משחקים שרוצה להציג הצעות מותאמות אישית לרכישה בתוך האפליקציה (IAP) בסוף כל רמה. אתה יכול להציג רק מספר מצומצם של אפשרויות IAP בכל פעם, ואינך יודע לאילו מהן תהיה ההמרה הטובה ביותר. בהתחשב בכל משתמש וכל סשן הוא שונה, איך נמשיך למצוא את הצעת IAP שנותנת את התגמול הצפוי הגבוה ביותר?
3. קבל את הקוד לדוגמה
שכבו את מאגר GitHub משורת הפקודה.
git clone https://github.com/googlecodelabs/firebase-iap-optimization.git
מאגר זה מכיל:
- מחברת Jupyter (.ipynb) המאמנת את מודל ההתאמה האישית ואורזת אותו לדגם TFLite
- אפליקציית Kotlin לדוגמה המשתמשת במודל TFLite כדי לבצע תחזיות במכשיר
4. הפעל את האפליקציה עם Firebase
ב-codelab זה, נעבוד על אופטימיזציה של ה-IAPs של אפליקציית המשחקים הבדיונית שלנו - Flappy Sparky . המשחק הוא גלילה צדדית שבה השחקן שולט בספארקי, מנסה לעוף בין עמודי קירות מבלי לפגוע בהם. בתחילת הרמה מוצגת למשתמש הצעת IAP שתעניק לו עוצמה. אנו ניישם רק את חלק האופטימיזציה של IAP של האפליקציה במעבדת הקוד הזה.
תוכל ליישם את מה שאתה לומד כאן באפליקציה משלך שמחוברת לפרויקט Firebase. לחלופין, תוכל ליצור פרויקט Firebase חדש עבור מעבדת קוד זה. אם אתה זקוק לעזרה בתחילת העבודה עם Firebase, עיין במדריכי הלימוד שלנו בנושא זה ( אנדרואיד ו- iOS ).
5. אסוף אירועי ניתוח באפליקציה שלך
אירועי Analytics מספקים תובנות לגבי התנהגות המשתמש, ומשמשים לאימון מודל ה-ML. לדוגמה, המודל עשוי ללמוד שמשתמשים שמשחקים זמן רב יותר נוטים יותר לבצע IAP כדי לקבל חיים נוספים. מודל ה-ML זקוק לאירועי ניתוח כקלט כדי ללמוד מידע זה.
כמה אירועי ניתוח שאולי נרצה לרשום כוללים:
- כמה זמן המשתמש משחק במשחק
- לאיזו רמה המשתמש מגיע
- כמה מטבעות המשתמש מוציא
- אילו פריטים המשתמש קונה
הורד נתונים לדוגמה (אופציונלי)
בשלבים הבאים, נשתמש ב-Firebase Analytics כדי לתעד אירועי ניתוח לשימוש במודל שלנו. אם כבר יש לך נתוני ניתוח שאתה רוצה להשתמש בהם, קפוץ לקטע "אימון מודל האופטימיזציה" של מעבדת קוד זה ותוכל לעקוב אחר הנתונים לדוגמה שלנו.
איסוף נתונים עם Firebase Analytics SDK
אנו נשתמש ב-Firebase Analytics כדי לעזור באיסוף אירועי ניתוח אלה. ה-SDK של Firebase Analytics לוכד אוטומטית מספר אירועים ומאפייני משתמש. זה גם מאפשר לך להגדיר אירועים מותאמים אישית משלך כדי למדוד את האירועים הייחודיים לאפליקציה שלך.
התקנת Firebase Analytics SDK
אתה יכול להתחיל עם Firebase Analytics באפליקציה שלך על ידי ביצוע התיעוד 'התחלה עם Google Analytics'. מאגר ה- firebase-iap-optimization
ששובט בתחילת מעבדת הקוד הזה כבר כולל את Firebase Analytics SDK.
רישום אירועים מותאמים אישית
לאחר הגדרת ה-SDK של Firebase Analytics, נוכל להתחיל לרשום את האירועים הדרושים לנו כדי להכשיר את המודל שלנו.
לפני שנעשה זאת, חשוב להגדיר מזהה משתמש באירוע הניתוח, כדי שנוכל לשייך נתוני ניתוח של אותו משתמש לנתונים הקיימים שלו באפליקציה.
MainActivity.kt
firebaseAnalytics.setUserId("player1")
בשלב הבא נוכל לרשום אירועי שחקן. עבור אופטימיזציה של IAP, אנו רוצים לרשום כל הצעת IAP שמוצגת למשתמש והאם ההצעה נלחצת על ידי המשתמש. זה ייתן לנו שני אירועי ניתוח - offer_iap
ו- offer_accepted
. אנו גם נעקוב אחר זיהוי הצעה ייחודי כדי שנוכל להשתמש בו מאוחר יותר כדי לשלב נתונים אלה כדי לראות אם הצעה מתקבלת.
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 מוצגת למשתמש ועל איזו הצעה IAP לוחץ על ידי המשתמש. בשלב זה, נשלב את נתוני האירועים הללו עם נתוני המשתמש כדי שהמודל שלנו יוכל ללמוד מתמונה מלאה.
לשם כך, נצטרך להתחיל בייצוא אירועי הניתוח ל-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 כדי להפוך את נתוני הניתוח הגולמיים שלנו לנתונים שמישים להדרכה של המודל שלנו.
על מנת שהמודל שלנו ילמד איזו הצעה IAP להציג בהתבסס על המשתמש ומצב המשחק, עלינו לארגן נתונים על הדברים הבאים:
- המשתמש
- מצב המשחק
- ההצעה שהוצגה
- אם לוחצים על ההצעה המוצגת או לא
כל הנתונים האלה יצטרכו להיות מאורגנים בשורה אחת בטבלה כדי שהמודל שלנו יעבד אותם. למרבה המזל, 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 אחת בכל פעם, ואנחנו לא יודעים לאילו מהן תהיה ההמרה הטובה ביותר. בהתחשב בכל משתמש וכל סשן הוא שונה, איך נמשיך למצוא את הצעת IAP שנותנת את התגמול הצפוי הגבוה ביותר?
במקרה זה, הבה נהפוך את הפרס ל-0 אם המשתמש לא יקבל את הצעת ה-IAP, ואת ערך ה-IAP אם כן. כדי לנסות למקסם את התגמול שלך, נוכל להשתמש בנתונים ההיסטוריים שלנו כדי לאמן מודל שמנבא את התגמול הצפוי עבור כל פעולה שניתנה למשתמש, ולמצוא את הפעולה עם התגמול הגבוה ביותר.
להלן נשתמש בתחזית:
- מצב: מידע על המשתמש וההפעלה הנוכחית שלו
- פעולה: הצעות IAP שאנו יכולים לבחור להציג
- תגמול: ערך הצעת ה-IAP
ניצול מול חקר
עבור כל בעיות השודדים הרב-זרועיים, האלגוריתם צריך לאזן בין חקירה (קבלת נתונים נוספים כדי ללמוד איזו פעולה נותנת את התוצאה האופטימלית) לבין ניצול (שימוש בתוצאה האופטימלית כדי להשיג את התגמול הגבוה ביותר).
בגרסה שלנו לבעיה, נפשט זאת כדי לאמן את הדגם מעת לעת בלבד בענן ולעשות תחזיות רק בשימוש בדגם במכשיר של המשתמש (בניגוד לאימון גם במכשיר של המשתמש). כדי לוודא שיש לנו מספיק נתוני הדרכה לאחר השימוש במודל, נצטרך להציג תוצאות אקראיות למשתמשי האפליקציה שלנו לפעמים (למשל 30%). אסטרטגיה זו של איזון חקר וניצול נקראת אפסילון חמדנית .
הכשרת הדגם
אתה יכול להשתמש בסקריפט ההדרכה ( training.ipynb
) שסופק עם codelab כדי להתחיל. המטרה שלנו היא להכשיר מודל שמנבא את התגמולים הצפויים עבור כל פעולה שניתנת למצב, ואז נמצא את הפעולה שנותנת לנו את התגמולים הצפויים הגבוהים ביותר.
אימון מקומי
הדרך הקלה ביותר להתחיל בהכשרת מודל משלך היא ליצור עותק של המחברת בדוגמת הקוד עבור מעבדת קוד זה.
אתה לא צריך GPU עבור מעבד הקוד הזה, אבל אם אתה צריך מכונה חזקה יותר כדי לחקור את הנתונים שלך ולאמן מודל משלך, אתה יכול לקבל מופע AI Platform Notebook כדי להאיץ את האימון שלך.
בסקריפט ההדרכה שסופק, יצרנו איטרטור שיוצר נתוני אימון מקובצי ה-CSV שייצאנו מ-BigQuery. לאחר מכן השתמשנו בנתונים כדי להתחיל לאמן את המודל שלנו עם 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, תוכל לעקוב אחר ה- Add Firebase למעבד הקוד של אפליקציית Android המופעלת על ידי TFLite . יש לך אפשרות לפרוס באמצעות מסוף Firebase או ה-API של Python.
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 עבור המשתמש המסוים הזה.
מדידת דיוק המודל
כדי למדוד את דיוק המודל שלנו, אנחנו יכולים פשוט לעקוב אחר הצעות ה-IAP שצפויות על ידי המודל שלנו והאם לוחצים עליהם באמצעות Firebase Analytics. אתה יכול להשתמש בזה יחד עם בדיקות A/B של Firebase כדי למדוד את הביצועים בפועל של המודל. אם לוקחים את זה צעד אחד קדימה, אתה יכול גם לבצע בדיקות A/B על איטרציות שונות של המודל. תוכל ללמוד עוד על בדיקות A/B עם Firebase בתיעוד צור Firebase Remote Config Experiments with A/B Testing .
9. (אופציונלי): עדכון מודל באופן קבוע עם נתונים חדשים
אם אתה צריך לעדכן את המודל שלך עם כניסת נתונים חדשים, אתה יכול להגדיר צינור לאימון מחדש של המודל שלך על בסיס חוזר. כדי לעשות זאת, תחילה עליך לוודא שיש לך נתונים חדשים לשימוש לאימון באמצעות האסטרטגיה החמדנית של אפסילון שהזכרנו לעיל. (למשל שימוש בתוצאת חיזוי המודל 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
הצעדים הבאים
- אימון ופרוס מודל אופטימיזציה עבור האפליקציה שלך.