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

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

1cbf855eda62c306.png

ברוכים הבאים ל-Codelab בנושא אופטימיזציה בזמן אמת של רכישות באפליקציה במכשיר. בשיעור 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")

בשלב הבא אפשר לתעד ביומן אירועים שקשורים לשחקנים. לצורך אופטימיזציה של רכישות מתוך האפליקציה, אנחנו רוצים לרשום ביומן את כל המבצעים לרכישות מתוך האפליקציה שמוצגים למשתמש, ואם המשתמש לחץ על המבצע. כך נקבל שני אירועים לניתוח נתונים – 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' ב-codelab הזה ולעקוב אחרי האירועים של Firebase Analytics שנרשמו בשלב האחרון.

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

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

הכנת נתונים ב-BigQuery

בשלבים הבאים נשתמש ב-BigQuery כדי להפוך את נתוני הניתוח הגולמיים לנתונים שניתן להשתמש בהם לאימון המודל.

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

  • המשתמש
  • מצב המשחק
  • המבצע שמוצג
  • האם המשתמש לחץ על המוצר המוצג או לא

כדי שהמודל שלנו יוכל לעבד את כל הנתונים האלה, צריך לארגן אותם בשורה אחת בטבלה. למזלנו, 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 כדי להשתמש בו באימון המודל.

888daa7ba4db8e44.png14d22bf474fae455.png

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

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

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

הגדרת הבעיה

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

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

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

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

e7d3264141498bff.jpeg

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

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

ניצול לעומת ניתוח

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

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

המודל מציע שפריט ה-IAP sparky_armor הוא הבונוס הכי טוב למשתמש הספציפי הזה.

a3381dbcdbdf811e.png

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

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

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

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

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

השלבים הבאים

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

מידע נוסף