اختبار A/B نسختان من نموذج

بعد تدريب نموذج مخصّص جديد أو نموذج AutoML Vision Edge، يمكنك استخدام اختبار A/B للاطّلاع على مستوى أداء النموذج الجديد في الظروف الفعلية، مقارنةً بالنموذج الذي تستخدمه حاليًا. بعد التأكّد من أنّ النموذج الجديد يُعدّ تحسينًا، يمكنك بسهولة طرح النموذج الجديد لجميع المستخدمين بدون الحاجة إلى تحديث التطبيق.

توضح هذه الصفحة كيف يمكنك إجراء اختبار A/B لتقييم نسختين من نموذج يشغّل ميزة افتراضية للبحث عن النباتات مرئيًا. تستخدم هذه الميزة نموذجًا مخصصًا لتسمية الصور لمساعدة المستخدمين في تحديد أنواع النباتات من صورها.

لنفترض أنك نشرت للتو نموذجًا جديدًا لتصنيف النباتات plant_labeler_v2 وتريد إجراء تجربة تقارنه بنموذجك الحالي المسمّى plant_labeler_v1. توضِّح الخطوات التالية كيفية إعداد التجربة وتنفيذها واتّخاذ إجراءات بشأن النتائج.

1- جعل النموذج قابلاً للضبط عن بُعد

الخطوة الأولى لإجراء اختبار A/B للنماذج هي تعديل تطبيقك ليستخدم مَعلمة "الإعداد عن بُعد" لتحديد النموذج المستخدَم. في البداية، ستضبط القيمة التلقائية لهذه المَعلمة على أنّها النموذج الذي يستخدمه تطبيقك، ولكن بما أنّ اسم النموذج يتم التحكّم فيه من خلال مَعلمة قابلة للضبط عن بُعد، يمكنك تغيير نماذج مختلفة وتجربتها بدون الحاجة إلى إرسال تحديثات التطبيق إلى المستخدمين في كلّ مرة.

وبالتالي، إذا نشرت نموذجك الحالي بالاسم plant_labeler_v1، يمكنك ضبط plant_labeler_v1 كقيمة تلقائية للمعلَمة plant_labeler_model في رمز إعداد تطبيقك، كما في المثال التالي:

Kotlin+KTX

val remoteConfig = FirebaseRemoteConfig.getInstance()

val remoteConfigDefaults = HashMap<String, Any>()
remoteConfigDefaults["plant_labeler_model"] = "plant_labeler_v1"
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults))

remoteConfig.fetchAndActivate().addOnSuccessListener { success ->
    if (success) {
      // Okay to get remote values.
      // ...
    }
}

Java

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();

Map<String, Object> remoteConfigDefaults = new HashMap<>();
remoteConfigDefaults.put("plant_labeler_model", "plant_labeler_v1");
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults));

remoteConfig.fetchAndActivate().addOnSuccessListener(
        new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean success) {
                if (success) {
                  // Okay to get remote values.
                  // ...
                }
            }
        });

بعد ذلك، يمكنك تغيير رمز إعداد النموذج لتحميل النموذج الذي تحدّده المَعلمة plant_labeler_model:

Kotlin+KTX

val rcValue = remoteConfig.getValue("plant_labeler_model")
val remoteModelName = rcValue.asString()

// ...

val remoteModel = FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build()
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel)

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

Java

FirebaseRemoteConfigValue rcValue = remoteConfig.getValue("plant_labeler_model");
String remoteModelName = rcValue.asString();

// ...

FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build();
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel);

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

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

قبل المتابعة، أضِف أيضًا ما يلي إلى رمز تنزيل النموذج:

Kotlin+KTX

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
    .addOnSuccessListener {
        // If the model downloaded was specified by a remote parameter, log an
        // event, which will be our experiment's activation event.
        if (rcValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
            FirebaseAnalytics.getInstance(this).logEvent("nondefault_model_downloaded", null)
        }
    }

Java

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                if (rcValue.getSource() == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
                    FirebaseAnalytics.getInstance(YourActivity.this)
                            .logEvent("nondefault_model_downloaded", null);
                }
            }
        });

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

2- تحديد مقياس الهدف

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

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

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

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

Kotlin+KTX

FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)

Java

FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);

يعتمد المقياس الذي تختبره في النهاية على كيفية استخدام تطبيقك لنموذجك.

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

3- إجراء تجربة في اختبار A/B

والآن بعد أن أصبح تطبيقك في متناول المستخدمين ويجمع بيانات الإحصاءات، يمكنك إنشاء تجربة "اختبار A/B" تختبِر تأثير استخدام النموذج الجديد بدلاً من النموذج الحالي.

لإنشاء التجربة:

  1. في صفحة الأحداث ضمن "وحدة تحكُّم Firebase"، تأكّد من تسجيلك لأحداث "إحصاءات Google" ذات الصلة: حدث التفعيل ومقياس الهدف.

    يحتاج تطبيقك إلى تسجيل كل حدث مرة واحدة على الأقل قبل ظهوره في وحدة تحكُّم Firebase.

  2. في "وحدة تحكُّم Firebase"، افتح قسم اختبار A/B.

  3. إنشاء تجربة جديدة:

    1. انقر على إنشاء تجربة > الإعداد عن بُعد.

    2. في قسم الاستهداف:

      • اختَر تطبيقك من القائمة.
      • تحديد عدد المستخدمين الذين تريد تضمينهم في التجربة
      • اختَر حدث التفعيل الذي بدأت في تسجيله (في هذا المثال، nondefault_model_downloaded).
    3. في قسم الأهداف، اختَر مقياس الهدف الذي حدّدته في القسم السابق (في هذا المثال، first_result_opened) من قائمة مقاييس الأهداف، واختَر أيّ مقاييس إضافية تريد تتبُّعها، مثل الأرباح من عمليات الشراء أو المستخدِمين الذين لم يكُنوا يواجهون أي أعطال.

    4. في قسم خيارات المنتج، حدِّد خيارَين:

      • مجموعة التحكّم (يتم إنشاؤها تلقائيًا)
      • مُصنِّف النباتات التجريبي

      بالنسبة إلى مجموعة التحكّم، أنشِئ مَعلمة plant_labeler_model واضبطها على plant_labeler_v1. وسيستخدم المستخدمون المخصّصون لمجموعة التحكّم النموذج القديم. (لا تضبط المَعلمة على (no change)، بما أنّ تطبيقك تختبر استخدام قيمة عن بُعد).

      بالنسبة إلى مصنِّف النباتات التجريبي، اضبط المعلَمة plant_labeler_model على plant_labeler_v2 (بافتراض أنّك نشرت نموذجك الجديد بهذا الاسم). سيستخدم المستخدمون الذين تم تحديد لهم خيار المنتج هذا النموذج الجديد.

    شاشة إعداد اختبار أ/ب

ابدأ التجربة واتركها قيد التنفيذ لعدة أيام أو أكثر، إلى أن يتم تحديد قائد التجربة من خلال اختبار A/B. إذا لم تتمكن التجربة من تحديد القائد، قد تحتاج إلى توسيع التجربة لتشمل المزيد من المستخدمين.

4- طرح الصيغة الفائزة لجميع المستخدمين

بطاقة نتائج اختبار أ/ب

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

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

لطرح صيغة لجميع المستخدمين، انقر على > طرح السعر المتغير في صفحة تفاصيل التجربة. بعد إجراء ذلك، ستكون قيمة المعلَمة plant_labeler_model plant_labeler_v2 لجميع المستخدمين.

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