درس تطبيقي حول الترميز في الوقت الفعلي لتحسين عمليات الشراء داخل التطبيق

1. نظرة عامة

1cbf855eda62c306.png

مرحبًا بك في الدرس التطبيقي حول الترميز الخاص بتحسين عمليات الشراء داخل التطبيق في الوقت الفعلي على الجهاز فقط. في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية استخدام TensorFlow Lite وFirebase لتدريب نموذج تخصيص مخصّص ونشره في تطبيقك.

يوضّح هذا الدليل التوجيهي كيفية إنشاء نموذج تعلُّم الآلة للتخصيص، ولا سيما نموذج يتوقّع أفضل حلّ مقترَح لعملية شراء داخل التطبيق (IAP) بالنظر إلى الحالة التي يكون فيها المستخدم الحالي. هذا مثال على مشكلة اللصوص المتعدّدين المسلّحين بالسياق، وهي نوع مهم وقابل للتطبيق على نطاق واسع من مشاكل تعلُّم الآلة التي ستتعرّف على المزيد عنها في هذا الدرس العملي.

أهداف الدورة التعليمية

  • جمع بيانات الإحصاءات من خلال "إحصاءات Firebase"
  • المعالجة المُسبقة لبيانات الإحصاءات باستخدام BigQuery
  • تدريب نموذج بسيط لتعلُّم الآلة من أجل تحسين عمليات الشراء داخل التطبيق على الجهاز فقط
  • نشر نماذج TFLite في Firebase ML والوصول إليها من تطبيقك
  • قياس النماذج المختلفة وتجربتها من خلال ميزة "اختبار A/B من Firebase"
  • تدريب نماذج جديدة ونشرها باستخدام أحدث البيانات بوتيرة متكرّرة

المتطلبات

  • الإصدار 3.4 من "استوديو Android" أو إصدار أحدث
  • جهاز اختبار حقيقي يعمل بالإصدار 2.3 من نظام التشغيل Android أو الإصدارات الأحدث و"خدمات Google Play" 9.8 أو الإصدارات الأحدث، أو محاكي يعمل بالإصدار 9.8 من "خدمات Google Play" أو الإصدارات الأحدث
  • في حال استخدام جهاز اختبار فعلي، يجب توفير كابل توصيل
  • معرفة أساسية بتعلُّم الآلة

كيف ستستخدم هذا البرنامج التعليمي؟

قراءة المحتوى فقط قراءة المحتوى وإكمال التمارين

كيف تقيّم تجربتك في إنشاء تطبيقات Android؟

مبتدئ متوسط متقدّم

2. بيان المشكلة

لنفترض أنّك مطوّر ألعاب وتريد عرض اقتراحات مخصّصة لعمليات الشراء داخل التطبيق في نهاية كل مستوى. يمكنك عرض عدد محدود فقط من خيارات الشراء داخل التطبيق في كل مرة، ولا تعرف الخيارات التي ستحقّق أفضل معدّل إحالات ناجحة. بما أنّ كل مستخدم وكل جلسة يختلفان عن غيرهما، كيف يمكننا العثور على عرض الشراء داخل التطبيق الذي يقدّم أعلى مكافأة متوقّعة؟

3- الحصول على الرمز النموذجي

استنسِخ مستودع GitHub من سطر الأوامر.

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

يحتوي هذا المستودع على ما يلي:

  1. دفتر ملاحظات Jupyter‏ (‎.ipynb) يدرب نموذج التخصيص ويحزمه في نموذج TFLite
  2. تطبيق Kotlin نموذجي يستخدم نموذج TFLite لتقديم توقّعات على الجهاز فقط

4. تشغيل التطبيق باستخدام Firebase

في هذا الدرس التطبيقي حول الترميز، سنعمل على تحسين عمليات الشراء داخل التطبيق في تطبيق اللعبة الوهمية Flappy Sparky. اللعبة عبارة عن لعبة تمرير جانبي يتحكّم فيها اللاعب بشخصية Sparky، ويحاول الطيران بين أعمدة الجدران بدون أن يصطدم بها. في بداية المستوى، يتم عرض عرض شراء داخل التطبيق على المستخدم يمنحه عنصرًا معزّزًا. سننفّذ في هذا الدرس التطبيقي حول الترميز الجزء المتعلّق بتحسين عمليات الشراء داخل التطبيق فقط.

ستتمكّن من تطبيق ما تعلّمته هنا على تطبيقك الخاص المرتبط بمشروع Firebase. يمكنك بدلاً من ذلك إنشاء مشروع جديد على Firebase لهذا الدرس العملي. إذا كنت بحاجة إلى مساعدة في بدء استخدام Firebase، يُرجى الاطّلاع على البرامج التعليمية حول هذا الموضوع ( Android و iOS).

5- جمع أحداث التحليلات في تطبيقك

تقدّم أحداث "إحصاءات Google" إحصاءات حول سلوك المستخدِمين، ويتم استخدامها لتدريب نموذج تعلُّم الآلة. على سبيل المثال، قد يتعلّم النموذج أنّ المستخدمين الذين يلعبون لفترة أطول من المرجّح أن يجروا عملية شراء داخل التطبيق للحصول على محاولات إضافية. يحتاج نموذج تعلُّم الآلة إلى أحداث الإحصاءات كمدخلات لتعلُّم هذه المعلومات.

تشمل بعض أحداث الإحصاءات التي قد نريد تسجيلها ما يلي:

  • مدة لعب المستخدم للعبة
  • المستوى الذي يصل إليه المستخدم
  • عدد العملات المعدنية التي ينفقها المستخدم
  • السلع التي يشتريها المستخدم

تنزيل نموذج البيانات (اختياري)

في الخطوات التالية، سنستخدم "إحصاءات Firebase" لتسجيل أحداث الإحصاءات التي سيتم استخدامها في نموذجنا. إذا كانت لديك بيانات إحصائية تريد استخدامها، انتقِل إلى قسم "تدريب نموذج التحسين" في هذا الدرس التطبيقي حول الترميز، ويمكنك اتّباع الخطوات باستخدام بياناتنا النموذجية.

جمع البيانات باستخدام حزمة تطوير البرامج (SDK) في "إحصاءات Firebase"

سنستخدم "إحصاءات Firebase" للمساعدة في جمع أحداث الإحصاءات هذه. تسجّل حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase" تلقائيًا عددًا من الأحداث وخصائص المستخدِمين. ويتيح لك أيضًا تحديد أحداثك المخصّصة لقياس الأحداث الفريدة لتطبيقك.

تثبيت حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase"

يمكنك البدء في استخدام "إحصاءات Firebase" في تطبيقك باتّباع مستندات البدء في استخدام "إحصاءات Google". يتضمّن مستودع firebase-iap-optimization الذي تم استنساخه في بداية هذا الدرس التطبيقي حزمة تطوير البرامج (SDK) الخاصة بخدمة "إحصاءات Firebase".

تسجيل الأحداث المخصّصة

بعد إعداد حزمة تطوير البرامج (SDK) في "إحصاءات Firebase"، يمكننا البدء في تسجيل الأحداث التي نحتاج إليها لتدريب نموذجنا.

قبل إجراء ذلك، من المهم ضبط معرّف مستخدم في حدث الإحصاءات، حتى نتمكّن من ربط بيانات الإحصاءات الخاصة بهذا المستخدم ببياناته الحالية في التطبيق.

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".

6. المعالجة المُسبقة للبيانات في BigQuery

في الخطوة الأخيرة، جمعنا أحداثًا حول عرض المنتج داخل التطبيق الذي يتم تقديمه للمستخدم وعرض المنتج داخل التطبيق الذي ينقر عليه المستخدم. في هذه الخطوة، سندمج بيانات الحدث هذه مع بيانات المستخدمين ليتمكّن نموذجنا من التعلّم من صورة كاملة.

لإجراء ذلك، علينا البدء بتصدير أحداث الإحصاءات إلى BigQuery.

لربط مشروع Firebase وتطبيقاته بخدمة BigQuery:

  1. سجّل الدخول إلى Firebase.
  2. انقر على رمز الإعدادات، ثم اختَر "إعدادات المشروع".
  3. في صفحة "إعدادات المشروع"، انقر على علامة التبويب "عمليات الدمج".
  4. في بطاقة BigQuery، انقر على "ربط".

(اختياري) تصدير مجموعات Firestore إلى BigQuery

في هذه الخطوة، يمكنك تصدير بيانات مستخدمين إضافية من Firestore إلى BigQuery لاستخدامها في المساعدة على تدريب النموذج. إذا أردت تخطّي هذه الخطوة في الوقت الحالي، انتقِل إلى قسم "إعداد البيانات في BigQuery" من هذا الدرس التطبيقي حول الترميز، ويمكنك متابعة أحداث "إحصاءات Firebase" التي تم تسجيلها في الخطوة الأخيرة.

قد يكون Firestore هو المكان الذي خزّنت فيه تاريخ اشتراك المستخدمين أو عمليات الشراء داخل التطبيق أو مستويات اللعبة أو العملات المعدنية في الرصيد أو أي سمات أخرى قد تكون مفيدة في تدريب النموذج.

لتصدير مجموعات Firestore إلى BigQuery، يمكنك تثبيت إضافة Firestore BigQuery Export. بعد ذلك، اربط الجداول في BigQuery لدمج هذه البيانات مع البيانات من "إحصاءات Google" لاستخدامها في نموذج التخصيص وفي بقية هذا الدرس العملي.

إعداد البيانات في 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. تدريب نموذج التحسين

عيّنات البيانات

استخدِم بياناتك من الخطوة السابقة "المعالجة المُسبقة للبيانات في BigQuery" أو البيانات النموذجية القابلة للتنزيل المتوفّرة هنا لمتابعة بقية هذا الدرس التطبيقي حول الترميز.

تعريف المشكلة

قبل البدء في تدريب النموذج، لنخصّص بعض الوقت لتحديد مشكلة اللصوص السياقية.

شرح عن اللصوص السياقيين

في بداية كل مستوى في لعبة Flappy Sparky، يتم عرض عرض شراء داخل التطبيق على المستخدم يمنحه ميزة إضافية. يمكننا عرض خيار واحد فقط من خيارات الشراء داخل التطبيق في كل مرة، ولا نعرف الخيارات التي ستحقّق أفضل معدّل إحالات ناجحة. بما أنّ كل مستخدم وكل جلسة يختلفان عن غيرهما، كيف يمكننا العثور على عرض الشراء داخل التطبيق الذي يقدّم أعلى مكافأة متوقّعة؟

في هذه الحالة، لنفترض أنّ المكافأة هي 0 إذا لم يقبل المستخدم عرض الشراء داخل التطبيق، وقيمة الشراء داخل التطبيق إذا قبله. لمحاولة زيادة المكافأة إلى أقصى حدّ، يمكننا استخدام بياناتنا السابقة لتدريب نموذج يتوقّع المكافأة المتوقّعة لكل إجراء يحدّده المستخدم، والعثور على الإجراء الذي يحقّق أعلى مكافأة.

e7d3264141498bff.jpeg

في ما يلي ما سنستخدمه في التوقّع:

  • الحالة: معلومات عن المستخدم وجلسة التصفّح الحالية
  • الإجراء: عروض IAP التي يمكننا اختيار عرضها
  • المكافأة: قيمة العرض الترويجي للشراء داخل التطبيق

الاستغلال مقابل الاستكشاف

في جميع مسائل قطاع الطرق المتعدّدين، تحتاج الخوارزمية إلى تحقيق التوازن بين الاستكشاف (الحصول على المزيد من البيانات لمعرفة الإجراء الذي يحقّق النتيجة المثلى) والاستغلال (استخدام النتيجة المثلى للحصول على أعلى مكافأة).

في نسختنا من هذه المشكلة، سنبسّطها لتدريب النموذج بشكل دوري فقط على السحابة الإلكترونية وإجراء التوقعات فقط عند استخدام النموذج على جهاز المستخدم (بدلاً من التدريب على جهاز المستخدم أيضًا). للتأكّد من توفّر بيانات تدريب كافية بعد استخدام النموذج، سنحتاج أحيانًا إلى عرض نتائج عشوائية لمستخدمي التطبيق (مثل %30). تُعرف استراتيجية تحقيق التوازن بين الاستكشاف والاستغلال باسم Epsilon-greedy.

تدريب النموذج

يمكنك استخدام النص البرمجي التدريبي (training.ipynb) المتوفّر مع الدرس التطبيقي حول الترميز للبدء. هدفنا هو تدريب نموذج يتوقّع المكافآت المتوقّعة لكل إجراء في حالة معيّنة، ثم العثور على الإجراء الذي يمنحنا أعلى المكافآت المتوقّعة.

التدريب محليًا

أسهل طريقة للبدء في تدريب النموذج الخاص بك هي إنشاء نسخة من دفتر الملاحظات في عينة تعليمات برمجية لهذا الدرس العملي.

لا تحتاج إلى وحدة معالجة رسومات (GPU) لإكمال هذا الدرس التطبيقي حول الترميز، ولكن إذا كنت بحاجة إلى جهاز أكثر قوة لاستكشاف بياناتك وتدريب نموذجك، يمكنك الحصول على مثيل من AI Platform Notebook لتسريع عملية التدريب.

في نص التدريب البرمجي المقدَّم، أنشأنا مكرّرًا ينشئ بيانات التدريب من ملفات 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، يمكنك اتّباع الخطوات الواردة في درس إضافة Firebase إلى تطبيق Android المستنِد إلى تعلُّم الآلة. يمكنك اختيار النشر باستخدام وحدة تحكّم 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 هو أفضل عنصر تحسين أداء يمكن شراؤه داخل التطبيق لهذا المستخدم تحديدًا.

a3381dbcdbdf811e.png

قياس دقة النموذج

لقياس دقة النموذج، يمكننا ببساطة تتبُّع عروض الشراء داخل التطبيق التي يتوقّعها النموذج وما إذا كان يتم النقر عليها باستخدام "إحصاءات Firebase". يمكنك استخدام هذا الإعداد مع اختبار A/B من Firebase لقياس الأداء الفعلي للنموذج. يمكنك أيضًا إجراء اختبارات A/B على تكرارات مختلفة من النموذج. يمكنك الاطّلاع على مزيد من المعلومات حول اختبار A/B باستخدام Firebase في مستند إنشاء تجارب الإعداد عن بُعد عبر Firebase باستخدام اختبار A/B.

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"
  • BigQuery

الخطوات التالية

  • تدريب نموذج تحسين ونشره لتطبيقك

مزيد من المعلومات