Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

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

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

1. اجعل نموذجك قابلاً للتكوين عن بُعد

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

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

سويفت

let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
    "plant_labeler_model": "plant_labeler_v1" as NSObject,
    // ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()

ج موضوعية

FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
  @"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
  // ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];

بعد ذلك ، قم بتغيير كود إعداد النموذج الخاص بك لتحميل النموذج المحدد بواسطة معلمة plant_labeler_model :

سويفت

let rcValue = remoteConfig.configValue(forKey: "plant_labeler_model")
guard let remoteModelName = rcValue.stringValue else { return }

// ...

let remoteModel = RemoteModel(
    name: remoteModelName,
    allowsModelUpdates: true,
    initialConditions: initialConditions,
    updateConditions: updateConditions
)
ModelManager.modelManager().register(remoteModel)

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

ج موضوعية

FIRRemoteConfigValue *rcValue = [remoteConfig configValueForKey:@"plant_labeler_model"];
NSString *remoteModelName = [rcValue stringValue];

// ...

FIRRemoteModel *remoteModel = [[FIRRemoteModel alloc] initWithName:remoteModelName
                                                allowsModelUpdates:YES
                                                 initialConditions:initialConditions
                                                  updateConditions:updateConditions];
[[FIRModelManager modelManager] 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

الآن بعد أن استخدم تطبيقك معلمة Remote Config لتحديد النموذج المراد تحميله ، يمكنك تغيير النموذج بمجرد نشر نموذج جديد وتعيين اسمه إلى معلمة Remote Config. تتيح هذه الإمكانية لاختبار أ / ب تعيين نماذج مختلفة لمستخدمين مختلفين بغرض مقارنتها.

قبل المتابعة ، قم أيضًا بإجراء الإضافة التالية إلى رمز تنزيل الطراز الخاص بك:

سويفت

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let _ = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? RemoteModel,
        model.name == remoteModelName
        else { return }
    // If the model downloaded was specified by a remote parameter, log an
    // event, which will be our experiment's activation event.
    if rcValue.source == .remote {
        Analytics.logEvent("nondefault_model_downloaded", parameters: nil)
    }
}

ج موضوعية

__weak typeof(self) weakSelf = self;

[NSNotificationCenter.defaultCenter
    addObserverForName:FIRModelDownloadDidSucceedNotification
                object:nil
                 queue:nil
            usingBlock:^(NSNotification *_Nonnull note) {
              if (weakSelf == nil | note.userInfo == nil) {
                return;
              }

              FIRRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
              if ([model.name isEqualToString:remoteModelName] &&
                  rcValue.source == FIRRemoteConfigSourceRemote) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                [FIRAnalytics logEventWithName:@"nondefault_model_downloaded" parameters:nil];
              }
            }];

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

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

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

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

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

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

سويفت

Analytics.logEvent("first_result_opened", parameters: nil)

ج موضوعية

[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];

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

في هذه المرحلة ، يمكنك نشر تطبيقك على App Store. سيستمر تطبيقك في استخدام نموذجك الأصلي ، لكن رمز Remote Config و Analytics الذي أضفته سيتيح لك تجربة نماذج مختلفة باستخدام وحدة تحكم Firebase فقط.

3. قم بإجراء تجربة اختبار A / B

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

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

  1. في صفحة الأحداث بوحدة تحكم Firebase ، تحقق من تسجيل أحداث Analytics ذات الصلة: حدث التنشيط ومقياس الهدف.

    يحتاج تطبيقك إلى تسجيل كل حدث مرة واحدة على الأقل قبل ظهوره في وحدة تحكم 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 معلومات كافية للإعلان عن قائد - في هذه الحالة ، المتغير الذي زاد من نقرات نتائج البحث الأعلى - يمكنك أن تقرر ما إذا كنت تريد طرح الصيغة الفائزة (أو متغير آخر) لجميع المستخدمين.

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

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

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