Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

การทดสอบ 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 พารามิเตอร์เช่นในตัวอย่างต่อไปนี้:

Swift

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

วัตถุประสงค์-C

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

จากนั้นเปลี่ยนรหัสการตั้งค่ารูปแบบของคุณเพื่อโหลดรูปแบบที่ระบุโดย plant_labeler_model พารามิเตอร์:

Swift

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

วัตถุประสงค์-C

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

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

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

Swift

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)
    }
}

วัตถุประสงค์-C

__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 ที่กำหนดเองแทนได้

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

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

Swift

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

วัตถุประสงค์-C

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

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

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

3. เรียกใช้การทดสอบ A/B Testing

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

ในการสร้างการทดสอบ:

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

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

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

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

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

    2. ในส่วนของการกำหนดเป้าหมาย:

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

    4. ในส่วนที่แตกต่างกำหนดสองสายพันธุ์:

      • กลุ่มควบคุม (สร้างโดยอัตโนมัติ)
      • เครื่องติดฉลากพืชทดลอง

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

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