Codelab לאופטימיזציה של רכישות מתוך האפליקציה בזמן אמת

1. סקירה כללית

1cbf855eda62c306.png

ברוכים הבאים לשיעור בנושא אופטימיזציה בזמן אמת של רכישות מתוך האפליקציה במכשיר. ב-codelab הזה נסביר איך להשתמש ב-TensorFlow Lite וב-Firebase כדי לאמן ולפרוס מודל מותאם אישית של התאמה אישית באפליקציה.

במדריך הזה נסביר איך ליצור מודל למידת מכונה להתאמה אישית, ובפרט מודל שמנבא את ההצעה האופטימלית לרכישה מתוך האפליקציה (IAP) בהתאם למצב הנוכחי של המשתמש. זוהי דוגמה לבעיית שודד הקשרים, סוג חשוב של בעיה בלמידת מכונה שיש לה יישומים רבים. תוכלו לקרוא עליה עוד ב-codelab הזה.

מה תלמדו

  • איסוף נתוני ניתוח באמצעות Firebase Analytics
  • עיבוד מוקדם של נתוני ניתוח באמצעות BigQuery
  • אימון מודל פשוט של ML לאופטימיזציה של רכישות מתוך האפליקציה (IAP) במכשיר
  • פריסת מודלים של TFLite ב-Firebase ML וגישה אליהם מהאפליקציה
  • מדידה והתנסות במודלים שונים באמצעות Firebase A/B Testing
  • אימון ופריסה של מודלים חדשים באמצעות הנתונים העדכניים ביותר במחזוריות קבועה

מה צריך להכין

  • גרסה 3.4 ואילך של Android Studio
  • מכשיר בדיקה פיזי עם Android בגרסה 2.3 ומעלה ו-Google Play Services בגרסה 9.8 ומעלה, או אמולטור עם Google Play Services בגרסה 9.8 ומעלה
  • אם משתמשים במכשיר בדיקה פיזי, כבל חיבור
  • ידע בסיסי בלמידת מכונה

איך תשתמשו במדריך הזה?

קריאה בלבד קריאה והשלמת התרגילים

איזה דירוג מגיע לדעתך לחוויית הפיתוח של אפליקציות ל-Android?

מתחילים ביניים מומחים

2. תיאור הבעיה

נניח שאתם מפתחי משחקים שרוצים להציג הצעות לרכישות מתוך האפליקציה (IAP) בהתאמה אישית בסוף כל שלב. אפשר להציג רק מספר מוגבל של אפשרויות לרכישות מתוך האפליקציה בכל פעם, ואין לכם דרך לדעת אילו מהן יניבו את שיעור ההמרה הכי גבוה. בהתחשב בכך שכל משתמש וכל סשן הם שונים, איך אפשר למצוא את מבצע הרכישה מתוך האפליקציה שמניב את התגמול הכי גבוה?

3. קבלת קוד לדוגמה

משכפלים את המאגר ב-GitHub משורת הפקודה.

git clone https://github.com/googlecodelabs/firebase-iap-optimization.git

המאגר הזה מכיל:

  1. קובץ Jupyter notebook ‏(‎.ipynb) שמאמן את מודל ההתאמה האישית ואורז אותו למודל TFLite
  2. אפליקציית Kotlin לדוגמה שמשתמשת במודל TFLite כדי ליצור תחזיות במכשיר

4. הפעלת האפליקציה עם Firebase

ב-codelab הזה נבצע אופטימיזציה של הרכישות מתוך האפליקציה במשחק הדמיוני שלנו – Flappy Sparky. המשחק הוא משחק גלילה צדדית שבו השחקן שולט בדמות של ספארקי ומנסה לעוף בין עמודות של קירות בלי לפגוע בהן. בתחילת השלב, מוצג למשתמש מבצע לרכישה מתוך האפליקציה שיעניק לו בונוס. ב-codelab הזה נטמיע רק את החלק של אופטימיזציית הרכישות מתוך האפליקציה.

תוכלו ליישם את מה שתלמדו כאן באפליקציה שלכם שמקושרת לפרויקט Firebase. לחלופין, אפשר ליצור פרויקט חדש ב-Firebase בשביל ה-codelab הזה. אם אתם צריכים עזרה בתחילת העבודה עם Firebase, תוכלו לעיין במדריכים שלנו בנושא ( Android ו- iOS).

5. איסוף אירועים לצורך ניתוח באפליקציה

אירועים ב-Analytics מספקים תובנות לגבי התנהגות המשתמשים, והמערכת משתמשת בהם כדי לאמן את מודל ה-ML. לדוגמה, המודל יכול ללמוד שמשתמשים שמשחקים יותר זמן נוטים יותר לבצע רכישה מתוך האפליקציה כדי לקבל תוספת חיים. מודל ה-ML צריך אירועים של Analytics כקלט כדי ללמוד את המידע הזה.

דוגמאות לאירועים אנליטיים שכדאי לרשום ביומן:

  • כמה זמן המשתמש משחק במשחק
  • הרמה שאליה המשתמש מגיע
  • כמה מטבעות המשתמש מוציא
  • אילו פריטים המשתמש קונה

הורדת נתונים לדוגמה (אופציונלי)

בשלבים הבאים נשתמש ב-Firebase Analytics כדי לרשום ביומן אירועים של Analytics לשימוש במודל שלנו. אם כבר יש לכם נתונים אנליטיים שאתם רוצים להשתמש בהם, אתם יכולים לדלג לקטע 'אימון מודל האופטימיזציה' ב-codelab הזה ולפעול לפי נתוני הדוגמה שלנו.

איסוף נתונים באמצעות Firebase Analytics SDK

נשתמש ב-Firebase Analytics כדי לאסוף את אירועי הניתוח האלה. ה-SDK של Firebase Analytics מתעד באופן אוטומטי מספר אירועים ומאפייני משתמש. בנוסף, אפשר להגדיר אירועים מותאמים אישית כדי למדוד אירועים שייחודיים לאפליקציה שלכם.

התקנה של Firebase Analytics SDK

כדי להתחיל להשתמש ב-Firebase Analytics באפליקציה, אפשר לעקוב אחרי ההוראות במאמר תחילת השימוש ב-Google Analytics. מאגר firebase-iap-optimization ששוכפל בתחילת ה-codelab הזה כבר כולל את Firebase Analytics SDK.

תיעוד של אירועים מותאמים אישית

אחרי שמגדירים את Firebase Analytics SDK, אפשר להתחיל לתעד את האירועים שדרושים לאימון המודל.

לפני שנעשה את זה, חשוב להגדיר מזהה משתמש באירוע Analytics, כדי שנוכל לשייך את נתוני 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

בשלב האחרון, אספנו אירועים לגבי מבצעים לרכישות מתוך האפליקציה שמוצגים למשתמשים ומבצעים לרכישות מתוך האפליקציה שהמשתמשים לוחצים עליהם. בשלב הזה נשלב את נתוני האירועים האלה עם נתוני משתמשים, כדי שהמודל יוכל ללמוד מתמונה מלאה.

כדי לעשות זאת, נתחיל בייצוא אירועי הניתוח ל-BigQuery.

כדי לקשר ל-BigQuery פרויקט מ-Firebase, כולל את האפליקציות שלו:

  1. נכנסים ל-Firebase.
  2. לוחצים על סמל ההגדרות ואז בוחרים באפשרות 'הגדרות הפרויקט'.
  3. בדף Project Settings (הגדרות הפרויקט), לוחצים על הכרטיסייה Integrations (שילובים).
  4. בכרטיס BigQuery, לוחצים על Link (קישור).

(אופציונלי) ייצוא של אוספי Firestore ל-BigQuery

בשלב הזה, יש לכם אפשרות לייצא נתוני משתמשים נוספים מ-Firestore ל-BigQuery כדי להשתמש בהם לאימון המודל. אם אתם רוצים לדלג על השלב הזה כרגע, אתם יכולים לעבור לקטע 'הכנת נתונים ב-BigQuery' במעבדת הקוד הזו ולעקוב אחרי האירועים של Firebase Analytics שנרשמו בשלב האחרון.

יכול להיות ששמרתם ב-Firestore את תאריך ההרשמה של המשתמשים, רכישות שבוצעו מתוך האפליקציה, רמות במשחק, מטבעות ביתרה או כל מאפיין אחר שיכול להיות שימושי לאימון המודל.

כדי לייצא את האוספים שלכם ב-Firestore ל-BigQuery, אתם יכולים להתקין את התוסף Firestore BigQuery Export. לאחר מכן, מאחדים טבלאות ב-BigQuery כדי לשלב את הנתונים האלה עם הנתונים מ-Google Analytics, ולהשתמש בהם במודל ההתאמה האישית ובשאר חלקי ה-codelab הזה.

הכנת נתונים ב-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 כדי להשתמש בו באימון המודל.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. אימון מודל האופטימיזציה

נתונים שנדגמו

כדי להמשיך בשאר השלבים של ה-codelab הזה, תוכלו להשתמש בנתונים מהשלב הקודם, 'עיבוד מוקדם של נתונים ב-BigQuery', או בנתונים לדוגמה שאפשר להוריד מכאן.

הגדרת הבעיה

לפני שנתחיל לאמן את המודל, נגדיר את הבעיה של שודדים הקשריים.

הסבר על אלגוריתמים של שודדים בהקשר

בתחילת כל שלב במשחק Flappy Sparky, מוצגת למשתמש הצעה לרכישה מתוך האפליקציה שתעניק לו שדרוג. אנחנו יכולים להציג רק אפשרות אחת לרכישה מתוך האפליקציה בכל פעם, ואין לנו דרך לדעת אילו מהן יניבו את שיעור ההמרה הכי גבוה. בהתחשב בכך שכל משתמש וכל סשן הם שונים, איך אפשר למצוא את מבצע הרכישה מתוך האפליקציה שמניב את התגמול הכי גבוה?

במקרה הזה, נגדיר את התגמול כ-0 אם המשתמש לא יקבל את ההצעה לרכישה מתוך האפליקציה, ואת ערך הרכישה מתוך האפליקציה אם הוא יקבל אותה. כדי לנסות למקסם את התגמול, אפשר להשתמש בנתונים היסטוריים כדי לאמן מודל שינבא את התגמול הצפוי לכל פעולה בהתחשב במשתמש, ולמצוא את הפעולה עם התגמול הכי גבוה.

e7d3264141498bff.jpeg

אלה הנתונים שבהם נשתמש בתחזית:

  • מצב: מידע על המשתמש והסשן הנוכחי שלו
  • פעולה: מוצרים לרכישה מתוך האפליקציה שאפשר לבחור להציג
  • פרס: ערך המבצע של הרכישה מתוך האפליקציה

ניצול לעומת חקירה

בכל הבעיות שקשורות לשיטת Multi-armed bandits, האלגוריתם צריך לאזן בין שלב החיפוש (קבלת נתונים נוספים כדי ללמוד איזו פעולה מניבה את התוצאה האופטימלית) לבין שלב הניצול (שימוש בתוצאה האופטימלית כדי להשיג את התגמול הגבוה ביותר).

בגרסה שלנו של הבעיה, נבצע פשוט אימון של המודל מעת לעת בענן, ונשתמש במודל לחיזויים רק במכשיר של המשתמש (בניגוד לאימון במכשיר של המשתמש). כדי לוודא שיש לנו מספיק נתוני אימון אחרי השימוש במודל, נצטרך להציג למשתמשי האפליקציה תוצאות אקראיות מדי פעם (למשל, ב-30% מהמקרים). השיטה הזו של איזון בין חיפוש ניצול נקראת Epsilon-greedy.

אימון המודל

כדי להתחיל, אפשר להשתמש בסקריפט ההדרכה (training.ipynb) שמצורף ל-Codelab. המטרה שלנו היא לאמן מודל שינבא את התגמולים הצפויים לכל פעולה בהינתן מצב מסוים, ואז למצוא את הפעולה שתניב את התגמולים הצפויים הכי גבוהים.

הדרכה מקומית

הדרך הקלה ביותר להתחיל לאמן מודל משלכם היא ליצור עותק של המחברת בדוגמת הקוד של ה-codelab הזה.

לא צריך GPU בשביל ה-codelab הזה, אבל אם אתם צריכים מכונה חזקה יותר כדי לבדוק את הנתונים שלכם ולאמן מודל משלכם, אתם יכולים לקבל מופע של מחברת AI Platform כדי להאיץ את האימון.

בתסריט ההדרכה שסיפקנו, יצרנו איטרטור שמפיק נתוני הדרכה מקובצי ה-CSV שייצאנו מ-BigQuery. לאחר מכן השתמשנו בנתונים כדי להתחיל לאמן את המודל שלנו באמצעות 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. האפשרות הזו מועילה משתי סיבות עיקריות:

  1. אנחנו יכולים לשמור על גודל קטן של התקנת האפליקציה ולהוריד את המודל רק אם יש צורך
  2. אפשר לעדכן את המודל באופן קבוע ובמחזור פרסום שונה מזה של האפליקציה כולה

כדי ללמוד איך פורסים את המודל ל-Firebase ML, אפשר לעיין ב-codelab בנושא הוספת Firebase לאפליקציית Android שמבוססת על TFLite. יש לכם אפשרות לפרוס באמצעות מסוף 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 הכי טוב לשיפור היכולות של המשתמש הספציפי הזה.

a3381dbcdbdf811e.png

מדידת הדיוק של המודל

כדי למדוד את רמת הדיוק של המודל, אפשר פשוט לעקוב אחרי המבצעים על רכישות מתוך האפליקציה שהמודל חוזה, ולבדוק אם המשתמשים לחצו עליהם באמצעות Firebase Analytics. אפשר להשתמש בזה יחד עם Firebase A/B Testing כדי למדוד את הביצועים בפועל של המודל. בנוסף, אפשר לבצע בדיקות A/B על איטרציות שונות של המודל. מידע נוסף על בדיקות A/B עם Firebase זמין במאמר יצירת ניסויים של הגדרת תצורה מרחוק ב-Firebase עם בדיקות A/B.

9. (אופציונלי): עדכון המודל באופן קבוע עם נתונים חדשים

אם אתם צריכים לעדכן את המודל כשהנתונים החדשים מגיעים, אתם יכולים להגדיר צינור נתונים לאימון מחדש של המודל על בסיס חוזר. כדי לעשות את זה, קודם צריך לוודא שיש לכם נתונים חדשים שאפשר להשתמש בהם לאימון באמצעות אסטרטגיית אפסילון-חמדנית שציינו למעלה. (למשל, שימוש בתוצאת החיזוי של המודל ב-70% מהמקרים ושימוש בתוצאות אקראיות ב-30% מהמקרים).

הגדרת צינור לעיבוד נתונים לאימון ולפריסה עם נתונים חדשים היא מעבר להיקף של הדרכה זו. כדי להתחיל, אפשר לעיין ב-Google Cloud AI Platform וב-TFX.

10. כל הכבוד!

ב-codelab הזה למדתם איך לאמן ולפרוס מודל TFLite במכשיר כדי לבצע אופטימיזציה של רכישות מתוך האפליקציה באמצעות Firebase. כדי לקבל מידע נוסף על TFLite ו-Firebase, אפשר לעיין בדוגמאות אחרות של TFLite ובמדריכים לתחילת העבודה עם Firebase.

אם יש לכם שאלות, אתם יכולים להשאיר אותן ב-Stack Overflow #firebase-machine-learning.

מה נכלל

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • BigQuery

השלבים הבאים

  • אימון ופריסה של מודל אופטימיזציה לאפליקציה.

מידע נוסף