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

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

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

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

1. ทำให้โมเดลกำหนดค่าจากระยะไกลได้

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

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

Kotlin

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

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/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/use-custom-models#configure_a_local_model

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

ก่อนดำเนินการต่อ ให้เพิ่มโค้ดต่อไปนี้ลงในการดาวน์โหลดโมเดลด้วย

Kotlin

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 Testing มีเมตริกในตัวหลายรายการ รวมถึงรายได้ การมีส่วนร่วมรายวัน และการคงผู้ใช้ไว้ เมตริกเหล่านี้มักมีประโยชน์สำหรับการทดสอบ โฟลว์ UX ที่แตกต่างกันหรือการปรับแต่งพารามิเตอร์ แต่ก็อาจไม่สมเหตุสมผล สำหรับการประเมินโมเดลและกรณีการใช้งาน ในกรณีนี้ คุณอาจลอง เพิ่มประสิทธิภาพสําหรับเหตุการณ์ Analytics ที่กําหนดเองแทน

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

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

Kotlin

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

Java

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

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

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

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

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

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

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

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

  2. ในFirebaseคอนโซล ให้เปิดส่วน A/B Testing

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

    1. คลิกสร้างการทดสอบ > Remote Config

    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 Testing จะประกาศผู้ชนะ หากการทดสอบไม่สามารถระบุตัวแปรที่มีประสิทธิภาพสูงสุดได้ คุณอาจต้อง ขยายการทดสอบไปยังผู้ใช้จำนวนมากขึ้น

4. เปิดตัวตัวแปรที่ชนะต่อผู้ใช้ทั้งหมด

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

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

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

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

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