เปรียบเทียบ Frequentist VS Bayesian A/B Testing

การทดลอง (experiment) ถือเป็นสิ่งสำคัญอีกอย่างหนึ่งในองค์กรที่เป็น data-driven culture เริ่มจากการที่เราตั้งเป้าหมายไว้ เช่น ต้องการเพิ่มยอดคลิกในเวปไซต์ ต้องการเพิ่มรายได้ของบริษัท ต้องการเพิ่มยอดการจองหรือการสั่งซื้อ เป็นต้น แล้วเราก็ตั้งสมมุติฐาน (hypothesis) ว่าด้วยวิธีการดังนี้จะช่วยสนับสนุนเป้าหมายที่เราตั้งเอาไว้ได้ เช่น ตัวโมเดลแบบใหม่ในการทำ recommendation สินค้าที่นำเสนอสินค้าในเวปไซต์ตามลักษณะการซื้อสินค้าของแต่ละคน จะทำให้ช่วยเพิ่ม click-through rate หรือเพิ่มจำนวนการซื้อสินค้าในเวปไซต์ให้มากขึ้นได้ หรือ การออกแบบหน้าตาเวปไซต์ใหม่ให้แสดงข้อมูลของสินค้าเพิ่มมากขึ้นน่าจะช่วยให้คนเกิดความสนใจและเพิ่มยอดคลิกเข้าไปซื้อสินค้าในเวปไซต์มากขึ้น เป็นต้น และเพื่อทดสอบสมมุติฐานนั้นว่าจะถูกหรือไม่ แทนที่เราจะใช้ความรู้สึกในการตัดสิน หรือบางครั้งการทดลองแบบออฟไลน์ก็ไม่สามารถให้ผลที่ตรงกับสถานการณ์จริงได้ด้วยปัจจัยหลายๆอย่าง เราก็ต้องอาศัยการทดลองจริงๆกับ product ของเรา แล้วดูว่าผลที่ได้นั้นตรงกับที่เราตั้งสมมุติฐานหรือไม่
การทดลองนั้นสามารถมีได้หลายแบบ ทั้งในแบบ A/B Testing ที่เราแบ่งกลุ่มทดลองออกเป็น 2 กลุ่ม หรือ Multi-Armed Bandit Testing ซึ่งเป็นการทดลองเพื่อที่จะบาลานซ์ exploration กับ exploitation โดยแบ่ง traffic ของแต่ละ variation ไม่เท่ากันขึ้นอยู่กับผลที่ได้ของแต่ละ variation แต่ในบล็อกนี้ของเขียนแค่ในส่วนที่เป็น A/B Testing ก่อนละกัน ส่วน Multi-Armed Bandit Testing หากจะเขียนคงต้องเปิดมาเป็นอีกบล็อกหนึ่งเลยทีเดียว
หลักการของ A/B Testing ค่อนข้างตรงไปตรงมา เริ่มจากเราแบ่งกลุ่ม users ออกมาเป็น 2 กลุ่ม คือ กลุ่ม A และกลุ่ม B โดยกลุ่ม A นั้นเราจะให้ได้ใช้เวอร์ชันปัจจุบัน เช่น เห็นหน้าเวปไซต์ที่ยังไม่ได้แก้ไขอะไร หรือ การใช้โมเดลตัวปัจจุบันที่ใช้อยู่สำหรับการทำ recommendation ในเวปไซต์ เป็นต้น ส่วนในกลุ่ม B นั้นจะได้เห็นเวอร์ชันใหม่ตามที่เราตั้งสมมุติฐาน เช่น หน้าตาเวปไซต์แบบใหม่ที่แสดงข้อมูลของสินค้าเยอะขึ้น หรือ การแนะนำสินค้าจากโมเดลตัวใหม่ที่พัฒนาขึ้นมา และเมื่อรันการทดลองนี้ เราก็จะเก็บผลที่เกิดขึ้นในกลุ่ม A และ B เพื่อมาเปรียบเทียบกันอีกทีว่าเป็นไปตามสมมุติฐานหรือไม่ เพราะอะไร
ถึงแม้ว่าหลักการของ A/B Testing จะค่อนข้างชัดเจน แต่การทดลองและการวัดผลนั้นเราก็สามารถทำได้หลายวิธี ในบล็อกนี้จะขอเปรียบเทียบ Frequentist กับ Bayesian A/B Testing
Frequentist A/B Testing
สำหรับ Frequentist A/B Testing นั้น น่าจะเป็นอะไรที่คุ้นเคยกันดีกับหลายๆคน การทดลองของ Frequentist จะเริ่มจากสร้าง 2 สมมุติฐานขึ้นมา คือ null hypothesis เช่น ผลของการทดลองในกลุ่ม A กับ B นั้นไม่ต่างกัน และ alternative hypothesis เช่น ผลการทดลองของกลุ่ม B นั้นจะต่างจาก (ดีกว่า) กลุ่ม A เมื่อทำการทดลองเราก็จะได้ผลทั้งในฝั่งของ A และ B ก็จะมีการคำนวณค่า p-value ขึ้นมา และตั้ง cut-off ของค่า p-value เพื่อใช้เป็น criteria ในการที่จะ reject null hypothesis
พูดง่ายๆก็คือ สิ่งที่ Frequentist จะทำนั้นคือการทำ hypothesis test ขึ้นมาแล้วดูว่าผลต่างของกลุ่ม A และ B ที่ได้มานั้น (หากเราว่า null hypothesis คือ A และ B ไม่ต่างกัน) เป็นความต่างที่มีนัยยะสำคัญจริงๆ ไม่ใช่เกิดจาก noise
Bayesian A/B Testing
สำหรับ Bayesian แล้ว จะพยายามที่จะสร้าง probability distribution ขึ้นมาโดยที่ random variable ของ distribution นี้ก็คือ ตัวสถิติที่เราต้องการจะวัด เช่น click-through rate (CTR) หรือ จำนวนการจองโรงแรมในเวปไซต์ หรือ conversion rate เป็นต้น วิธีการของ Bayesian นั้นจะประกอบไปด้วย 3 ขั้นตอน คือ
- การสร้าง Prior สำหรับ distribution ของ metric ที่ต้องการวัด
- การคำนวณ Posterior distribution ที่เกิดจากการอัพเดทตัว prior จากข้อมูลที่ได้มาจริงๆ
- การคำนวณหา cut-off สำหรับการตัดสินใจ
1. การสร้าง Prior
การเลือก prior นั้น ถือว่าเป็นเรื่องที่สำคัญใน Bayesian นี้เลย prior เปรียบเสมือนกับความเชื่อตั้งต้นที่เรามีต่อการทดลองนี้ เราสามารถใช้ข้อมูลจากอดีตมาเป็นตัวตั้งต้นหรือสร้างเป็น prior ขึ้นมา ซึ่งถือว่าเป็นอีกส่วนที่แตกต่างจาก Frequentist ที่ไม่ใช้ prior เลย ตัวอย่างเช่น หากเราจะทำการทดลองเพื่อดูความน่าจะเป็นของค่า CTR จากโมเดลใหม่ของเรา เราก็อาจจะสร้าง prior จากการดูที่ค่า CTR ในอดีตแล้วก็สร้าง distribution ของความน่าจะเป็นของ CTR เป็นต้น

2. การคำนวณ Posterior distribution
เมื่อเราได้ prior หรือความเชื่อตั้งต้นมาแล้ว เมื่อเราได้รับข้อมูลที่ได้จากการทดลอง เราก็จะนำมาอัพเดทตัว prior ด้วยวิธีการของ Bayesian ทำให้เราได้ postetior ออกมา

โดยที่ x ก็คือ observation หรือ ข้อมูลที่ได้จากการทดลอง และ theta คือ พารามิเตอร์ของ observation เช่น หากเราบอกว่า x~N(Mu, Sigma) แล้ว ตัว theta ก็คือ Mu และ Sigma นั่นเอง
การหา posterior นี้จะมาช่วยอัพเดทความเชื่อของ prior จากการที่เราเห็นข้อมูลมาจริงๆ
3. การหาค่า cut-off สำหรับการตัดสินใจ
ในส่วนนี้จะของกล่าวถึงการตัดสินใจเลือกกลุ่ม A หรือกลุ่ม B รวมถึงการการันตีผล ซึ่งจริงๆแล้วสามารถเลือกใช้ได้หลายวิธี แต่จะขอกล่าวถึงการตัดสินใจจากค่า expected loss
ก่อนอื่นขอเริ่มจากการอธิบายก่อนว่า loss คืออะไร ในกรณีนี้ loss ก็คือ ค่า metric ที่จะลดลงกรณีที่เราตัดสินใจที่จะเลือกกลุ่มใดกลุ่มหนึ่ง (A หรือ B) ไป หรือก็คือ …

โดยที่ lambda_A และ lambda_B คือ ผลที่แท้จริง (true metric) จากกลุ่ม A และกลุ่ม B และ x ก็คือ variant หรือกลุ่มที่เราเลือก (เช่น กลุ่ม B หรือ กลุ่ม A)
ตัวอย่างเช่น หากเราตัดสินใจเลือกกลุ่ม A หรือ x=A ซึ่งถ้า A นั้นดีกว่า B จริงๆ หรือ lambda_A ≥ lambda_B แล้ว ค่า loss ก็จะเป็น 0 คือไม่มีอะไรลดลงเลยจากการที่เราตัดสินใจเลือกกลุ่ม A แต่ถ้า lambda_A < lambda_B ก็จะเกิด loss ขึ้น นอกจากนี้จะเห็นว่า loss function ของ Bayesian จะมีการดูขนาดของค่า loss ด้วย ถ้าผลของของกลุ่ม A ต่างจากกลุ่ม B มาก เราก็จะได้ค่า loss ที่มากขึ้น ถ้าไม่ต่างกันมาก ค่า loss ก็จะน้อยลง พูดง่ายๆก็คือ ทาง Bayesian จะมองว่า loss ที่เกิดขึ้นมาจากกรณีที่เราเลือกกลุ่ม B แล้วจริงๆแล้ว CTR ของกลุ่ม B เป็น 30% และกลุ่ม A เป็น 30.5% ต่างจากกรณีที่ CTR ของกลุ่ม B เป็น 30% และกลุ่ม A เป็น 60% ในขณะที่ทางฝั่ง Frequentist จะนับว่าทั้งสองกรณีก็คือ False positive จากการเลือกฝั่ง B เหมือนๆกัน
และเนื่องจากในความเป็นจริงนั้นเราไม่สามารถรู้ค่าที่แท้จริงของ lambda_A กับ lambda_B ได้ ดังนั้นสิ่งที่เราทำได้คือการประมาณค่าของ expected loss จาก posterior distribution ที่เราได้ขึ้นมา โดยกำหนดให้ f(lambda_A,lambda_B) คือ joint posterior density เราจะสามารถคำนวณค่า expected loss ได้ว่า

โดยที่เราสามารถคำนวณ joint posterior density ได้จาก posterior ของ A และ B และสามารถคำนวณหาค่า loss ได้จากสมการ L(lambda_A, lambda_B, x)
สำหรับการตัดสินใจว่าจะหยุดหรือจะเลือกกลุ่มใดนั้น เราจะตั้งค่า threshold สำหรับ expected loss นี้ และใช้ค่า threshold ในการตัดสินใจว่าจะหยุดและจะเลือกกลุ่มใด เช่น ถ้าหากว่าค่าของ expected loss ในกลุ่ม B มีค่าน้อยกว่าค่า threshold ที่เราตั้ง เราก็สามารถหยุดการทดลองแล้วตัดสินใจที่จะเลือกใช้กลุ่ม B และโดยวิธีการนี้จะเป็นการการันตีว่าในอนาคตข้างหน้าที่เราอาจจะรันไปอีกหลายๆการทดลอง บางครั้งกลุ่มที่เราเลือกไว้อาจจะเกิด loss ได้บ้าง แต่โดยรวมแล้ว ค่า expected loss จะไม่เกินกับ threshold ที่เราตั้งไว้
จะใช้ Frequentist หรือ Bayesian A/B Testing ดี ?
สุดท้ายแล้วสิ่งที่เราต้องการจากการทดลองคือ การตัดสินใจว่าเราจะเลือกใช้เวอร์ชันไหนต่อไป ทั้งสองวิธีการก็ให้คำตอบออกมาคนละแบบแต่ทั้งหมดก็เพื่อเป็นการประกอบการตัดสินใจ หากเป็น Frequentist เราจะตัดสินใจจากการทำ hypethesis test แล้วใช้การตั้งค่า cut-off ของค่า p-value เพื่อคุมค่า false positiveในการพิจารณาว่าจะใช้เวอร์ชันในกลุ่ม A หรือ B ดี ในบางครั้งผลในกลุ่มของ B อาจจะดีกว่าผลในกลุ่มของ A แต่ถ้าค่า p-value นี้มากกว่า cut-off ที่เราตั้งไว้ เราก็อาจจะที่ตัดสินใจที่จะใช้กลุ่ม A ด้วยเหตุผลที่ว่าเราไม่มีหลักฐานที่เพียงพอในการที่จะ reject กลุ่ม A
สำหรับวิธีการของ Bayesian นั้น จะเริ่มจากการกำหนด prior แล้วเอาผลที่ได้จากการทดลองมาคำนวณหาเป็น posterior จาก prior การใช้ Bayesian A/B testing นั้น เราสามารถเลือกใช้วิธีการตัดสินใจเลือกกลุ่มได้หลายวิธีขึ้นอยู่กับเป้าหมายและเงื่อนไขต่างๆของเรา เช่น การที่เราคุมที่ค่า expected loss โดยยอมให้มี loss ได้บ้างแต่โดยรวมแล้วค่า expected loss นั้นจะมีค่าน้อยกว่าค่า threshold ที่เราตั้งไว้ เป็นต้น
ข้อดีอีกอย่างของ Bayesian คือ การทดลองนั้นจะมี dynamic length ได้ ในกรณีของ Frequentist นั้น เราต้องรันการทดลองจนกว่าจะได้จำนวน sample size ที่ต้องการจึงจะหยุดได้ แต่สำหรับ Bayesian นั้น เราอาจจะไม่ต้องรอจนกว่าจะได้ sample size ที่ต้องการ แต่สามารถหยุดการทดลองเมื่อเราได้หลักฐานที่มากพอ หรือเมื่อ expected loss ของกลุ่มใดกลุ่มหนึ่งมีค่าน้อยกว่า threshold ที่เราตั้งไว้ ทำให้ถ้าเรามีหลักฐานที่เพียงพอเมื่อไหร่ เราก็สามารถหยุดการทดลองได้เลย
การจะเลือกใช้ Frequentist หรือ Bayesian จึงขึ้นอยู่กับวัตถุประสงค์หลักของของการทดลอง ตัวอย่างเช่น หากเราต้องการที่จะใช้การทดลองเพื่อเปรียบเทียบผลต่างของ 2 เวอร์ชัน และต้องการที่จะการันตีว่าสองเวอร์ชันนี้ต่างกันจริงๆ Frequentist ก็อาจจะเป็นตัวเลือกที่ดี แต่หากเรามีแผนที่จะทำการทดลองต่อไปอีกหลายๆครั้ง โดยยอมที่จะเลือกเวอร์ชันที่ได้ผลที่ดีขึ้นบ้างเพียงแค่เล็กน้อยตั้งแต่แรก แล้วก็ iterate สร้างเวอร์ชันอื่นต่อไปจากเวอร์ชันนี้เพื่อพัฒนาผลไปเรื่อยๆ ก็อาจจะใช้เป็น Bayesian เอา (อาจจะเหมาะกับองค์กรที่อยากได้แบบ learn fast, fail fast) แล้วก็อาศัยการคุมตัวค่า error ที่อาจจะเกิดขึ้นได้ด้วยวิธีการต่างๆ ดังนั้นก่อนที่เราจะเลือกว่าจะใช้วิธีการทดลองแบบใด เราต้องเข้าใจวัตถุประสงค์ของการทดลองนี้ว่าเราต้องการอะไร ต้องการที่จะรู้อะไร และเป้าหมายของเราให้ชัดเจน
Special Thanks
ขอขอบคุณ Sorawit Saengkyongam (James) และ Anthony Khong ที่ช่วยคอมเมนท์อะไรให้หลายๆอย่างในระหว่างการเขียนบล็อกนี้
เอกสารอ้างอิง
https://medium.com/convoy-tech/the-power-of-bayesian-a-b-testing-f859d2219d5
