การทดสอบ A/B กับโมเดล 2 เวอร์ชัน

หลังจากฝึกโมเดลที่กำหนดเองใหม่หรือโมเดล AutoML Vision Edge แล้ว คุณสามารถใช้การทดสอบ A/B เพื่อดูว่าโมเดลใหม่ทำงานได้ดีเพียงใดในสภาพจริง โดยเทียบกับโมเดลที่คุณใช้อยู่แล้ว หลังตรวจสอบแล้วว่าโมเดลใหม่เป็นการปรับปรุงแล้ว คุณก็สามารถเปิดตัวโมเดลใหม่กับผู้ใช้ทั้งหมดได้ง่ายๆ โดยไม่ต้องอัปเดตแอป

หน้านี้แสดงวิธีทำการทดสอบ A/B ซึ่งประเมินโมเดล 2 เวอร์ชันซึ่งขับเคลื่อนฟีเจอร์การค้นหาพืชสมมติ ฟีเจอร์นี้ใช้โมเดลการติดป้ายกำกับรูปภาพที่กำหนดเองเพื่อช่วยให้ผู้ใช้ระบุชนิดพืชจากรูปภาพของตนได้

สมมติว่าคุณเพิ่งเผยแพร่โมเดลการติดป้ายกำกับพืชใหม่ 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);
                }
            }
        });

โค้ดด้านบนจะบันทึกเหตุการณ์ Analytics ที่กําหนดเองซึ่งคุณจะต้องใช้ในภายหลังเป็นเหตุการณ์การเปิดใช้งานของการทดสอบ เหตุการณ์การเปิดใช้งานคือเหตุการณ์ที่ผู้ใช้ต้องทริกเกอร์ก่อนจึงจะได้รับการพิจารณาว่าเป็นส่วนหนึ่งของการทดสอบ ซึ่งทำให้มั่นใจได้ว่าระบบจะไม่บันทึกผู้ใช้ในการทดสอบ A/B จนกว่าอุปกรณ์ของผู้ใช้จะดาวน์โหลดโมเดล ML ที่กำหนดเองเสร็จสิ้น

2. กำหนดเมตริกเป้าหมาย

ขั้นตอนถัดไปคือการตัดสินใจว่าจะวัดความสำเร็จของโมเดลอย่างไร และเพื่อให้มั่นใจว่าแอปรวบรวมข้อมูลที่จำเป็นต่อการทดสอบว่าโมเดลเวอร์ชันต่างๆ ทำงานได้ดีเพียงใดตามเมตริกนั้น

การทดสอบ A/B มีเมตริกในตัวมากมาย เช่น รายได้ การมีส่วนร่วมรายวัน และการคงผู้ใช้ไว้ เมตริกเหล่านี้มักมีประโยชน์สำหรับการทดสอบขั้นตอน UX ที่แตกต่างกันหรือพารามิเตอร์การปรับแต่ง แต่อาจไม่เหมาะแก่การประเมินโมเดลและกรณีการใช้งาน ในกรณีนี้ คุณอาจลองเพิ่มประสิทธิภาพสำหรับเหตุการณ์ Analytics ที่กำหนดเองแทน

ตัวอย่างการใช้ฟีเจอร์การค้นหาพืชที่ปรากฏสมมติขึ้นมา สมมติคุณนำเสนอผลการค้นหาแก่ผู้ใช้ตามลำดับความเชื่อมั่นของโมเดลในผลลัพธ์แต่ละรายการ วิธีหนึ่งที่คุณจะรู้ถึงความแม่นยำของโมเดลคือการดูความถี่ที่ผู้ใช้เปิดผลการค้นหาแรก

หากต้องการทดสอบว่าโมเดลใดบรรลุเป้าหมายในการเพิ่มจำนวนคลิกของผลลัพธ์อันดับต้นๆ ได้ดีที่สุด คุณจะต้องบันทึกเหตุการณ์ที่กำหนดเองเมื่อผู้ใช้แตะรายการแรกในผลลัพธ์

Kotlin+KTX

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

Java

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

สุดท้ายแล้ว เมตริกที่คุณทดสอบจะขึ้นอยู่กับวิธีที่แอปใช้โมเดลของคุณ

เมื่อถึงตอนนี้ คุณสามารถทำให้แอปใช้งานได้ใน Play Store แอปจะยังคงใช้โมเดลเดิมต่อไป แต่โค้ดการกำหนดค่าระยะไกลและโค้ด Analytics ที่คุณเพิ่มจะให้คุณทดสอบกับโมเดลต่างๆ ได้โดยใช้เฉพาะคอนโซล Firebase

3. ทำการทดสอบ A/B Testing

เมื่อแอปของคุณอยู่ในมือของผู้ใช้และกำลังรวบรวมข้อมูลการวิเคราะห์แล้ว ให้คุณสร้างการทดสอบ A/B Testing ที่จะทดสอบผลจากการใช้รูปแบบใหม่ของคุณแทนรูปแบบปัจจุบัน

วิธีสร้างการทดสอบ

  1. ในหน้าเหตุการณ์ของคอนโซล Firebase ให้ยืนยันว่าคุณกําลังบันทึกเหตุการณ์ Analytics ที่เกี่ยวข้อง ซึ่งได้แก่ เหตุการณ์การเปิดใช้งานและเมตริกเป้าหมาย

    แอปของคุณต้องบันทึกเหตุการณ์แต่ละรายการอย่างน้อย 1 ครั้งก่อนที่จะปรากฏในคอนโซล Firebase

  2. ในคอนโซล Firebase ให้เปิดส่วนการทดสอบ A/B

  3. สร้างการทดสอบใหม่

    1. คลิกสร้างการทดสอบ > การกำหนดค่าระยะไกล

    2. ในส่วนการกำหนดเป้าหมาย ให้ทำดังนี้

      • เลือกแอปจากรายการ
      • ระบุจำนวนผู้ใช้ที่คุณต้องการรวมไว้ในการทดสอบ
      • เลือกเหตุการณ์การเปิดใช้งานที่คุณเริ่มบันทึก (ในตัวอย่างนี้คือ nondefault_model_downloaded)
    3. ในส่วนเป้าหมาย ให้เลือกเมตริกเป้าหมายที่ระบุไว้ในส่วนก่อนหน้า (ในตัวอย่างนี้คือ first_result_opened) จากรายการเมตริกเป้าหมาย แล้วเลือกเมตริกเพิ่มเติมที่ต้องการติดตาม เช่น รายได้จากการซื้อหรือผู้ใช้ที่ไม่พบข้อขัดข้อง

    4. ในส่วนตัวแปร ให้กำหนดตัวแปร 2 รายการดังนี้

      • กลุ่มควบคุม (สร้างโดยอัตโนมัติ)
      • ผู้ติดป้ายกำกับโรงงานทดลอง

      สำหรับกลุ่มควบคุม ให้สร้างพารามิเตอร์ plant_labeler_model และตั้งค่าเป็น plant_labeler_v1 ผู้ใช้ที่กำหนดให้กับกลุ่มควบคุมจะใช้โมเดลเก่า (อย่าตั้งพารามิเตอร์เป็น (no change) เนื่องจากในแอปคุณกำลังทดสอบว่าใช้ค่าระยะไกลอยู่)

      สำหรับตัวแปรผู้ติดป้ายกำกับพืชทดลอง ให้ตั้งค่าพารามิเตอร์ plant_labeler_model เป็น plant_labeler_v2 (สมมติว่าคุณเผยแพร่โมเดลใหม่ภายใต้ชื่อนั้น) ผู้ใช้ที่กําหนดให้กับตัวแปรนี้จะใช้โมเดลใหม่

    หน้าจอการกำหนดค่าการทดสอบ A/B

เริ่มการทดสอบและปล่อยให้ทำงานเป็นเวลาหลายวันหรือนานกว่านั้นจนกว่า การทดสอบ A/B จะประกาศตัวแปรที่ดีที่สุด หากการทดสอบไม่สามารถระบุตัวแปรสูงสุดได้ คุณอาจต้อง ขยายการทดสอบให้ครอบคลุมผู้ใช้จำนวนมากขึ้น

4. เริ่มใช้ตัวแปรที่ชนะกับผู้ใช้ทุกคน

การ์ดผลการทดสอบ A/B

หลังจากการทดสอบ A/B ได้รวบรวมข้อมูลเพียงพอที่จะประกาศผู้นำแล้ว ในกรณีนี้ ตัวแปรที่เพิ่มจำนวนคลิกผลการค้นหาสูงสุดให้ได้สูงสุด คุณจะตัดสินใจได้ว่าจะเปิดตัวตัวแปรที่ชนะ (หรือตัวแปรอื่น) กับผู้ใช้ทั้งหมดหรือไม่

ในส่วนการทดสอบ A/B ของคอนโซล Firebase ให้เปิดมุมมองรายละเอียดของการทดสอบที่เสร็จสมบูรณ์แล้ว จากมุมมองนี้ คุณสามารถดูประสิทธิภาพของแต่ละตัวแปรตามเมตริกเป้าหมายและเมตริกรองที่คุณเลือก ข้อมูลนี้จะช่วยให้คุณตัดสินใจได้ว่าจะเปิดตัวตัวแปรที่ดีที่สุดหรือตัวแปรอื่น

หากต้องการเปิดตัวตัวแปรกับผู้ใช้ทุกคน ให้คลิก > เปิดตัวตัวแปรในหน้ารายละเอียดของการทดสอบ หลังจากดำเนินการแล้ว ค่าพารามิเตอร์ plant_labeler_model ของผู้ใช้ทุกรายจะเป็น plant_labeler_v2

ในการอัปเดตแอปในอนาคต คุณควรเปลี่ยนค่าเริ่มต้นของพารามิเตอร์ plant_labeler_model เป็น plant_labeler_v2 และอัปเดตโมเดลแบบกลุ่มหากใช้ แต่ผู้ใช้ก็ใช้เวอร์ชันล่าสุดอยู่แล้ว คุณจึงส่งการอัปเดตนี้ให้เป็นส่วนหนึ่งของแอปที่เผยแพร่ได้ทุกเมื่อที่สะดวก เช่น เวลาที่คุณอัปเดตฟีเจอร์ครั้งถัดไป