จับคู่สินค้าบน Shopee ด้วย ArcFace และ Super-fast kNN  

  RSS
The Neural Engineer
(@neural-engineer)
EfficientNet

จับคู่สินค้าบน Shopee ด้วย ArcFace และ Super-fast kNN

ThaiKeras and Kaggle - 6 พฤษภาคม 2021

 

วันนี้มีโปรเจกต์ของ Shopee บน Kaggle ที่น่าสนใจมากมาแชร์ครับ

ปัญหามีอยู่ว่า เพื่อประสบการณ์ที่ดีที่สุดสำหรับการช้อปปิ้ง  เวลาเราซื้อของบน Shopee นั้น Shopee ต้องทราบว่า "สินค้า" ที่ลงขายแต่ละชิ้นนั้น "เป็นสินค้าเดียวกันกับพ่อค้า แม่ค้า คนอื่นๆ หรือไม่"

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

นอกจากนี้ Shopee ยังอาจ match สินค้าตัวนี้เข้ากับสินค้าตัวเดียวกันบนเว็บคู่แข่ง เช่น Lazada หรือ JD อีกด้วย ในกรณีที่จะทำ Best Price Guarantee (ช้อปที่เราได้ของถูกสุด) ได้

ปัญหา "จับคู่สินค้า" นี้เหมือนจะง่าย แต่ "ไม่ง่าย" เนื่องจากสินค้าประเภทเดียวกัน แม่ค้าแต่ละคนอาจจะลงรูปต่างกันโดยสิ้นเชิง เช่น สินค้าแฟชั่น บางคนเน้นรูปสินค้าที่พับเรียบร้อย แต่บางคนลงรูปสินค้าตอนใช้จริงคู่กับนางแบบ เป็นต้น (รูปที่ 1 และ 2)  และ นอกจากนี้ยังเขียนคำบรรยายสินค้าต่างกันอีกด้วย

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

ทำให้การจำแนกประเภทจำเป็นต้องใช้ทั้ง "รูปภาพ" และ "ข้อความ" ไปพร้อมๆ กัน

.

 

หลากหลายความท้าทายของปัญหานี้

  1. โมเดลต้องรับ Input ได้ทั้ง "รูปภาพ" และ "ข้อความบรรยายสินค้า"
  2. นอกจากนี้ในบางครั้งมีตัวหนังสืออยู่ในรูปซึ่งมีความสำคัญ อาจจะต้องใช้ OCR เสริม
  3. ชนิดของสินค้ามีได้มหาศาล อาจจะมีหลายล้านประเภทสินค้าในความเป็นจริง แต่ในปัญหาบน Kaggle นี้จำกัดจำนวนชนิดอยู่ที่หลักหมื่น ซึ่งก็ยังเยอะอยู่
  4. ตัวอย่างที่ใช้สอนของสินค้าแต่ละประเภทมีไม่มาก เช่นใน training data อาจมีสินค้าประเภทเสื้อซึ่งมีหลากหลายลาย และแต่ละลายมีแม่ค้า 2-5 คนที่ขาย ปัญหาที่มี training data ในแต่ละ class น้อยๆ นี้เรียกว่าปัญหาประเภท Few-shots

 

จากข้อ 3) และ 4) จะเห็นได้ว่าจำนวนประเภทเยอะ (large classes) และในแต่ละประเภทก็มีตัวอย่างสอนน้อย (few shots)

 

       5. อย่างที่เกริ่นตอนต้น บางสินค้าที่ใช้รูปโฆษณาเดียวกัน กลับเป็นสินค้าคนละประเภทกัน

       6. ใน test set สินค้าอาจเป็นคนละกลุ่มกับ train set โดยสิ้นเชิง!! นั่นคือ โมเดล classification แบบกำหนดจำนวนคลาสตายตัวจะใช้ไม่ได้ในปัญหานี้  โมเดลต้องมีความสามารถในการจับคู่ สินค้าประเภทที่ไม่เคยเห็นมาก่อนได้ ว่าคล้ายกันหรือไม่

 

ขยายความข้อ 6) เราเรียกปัญหา classification ที่สามารถแบ่งกลุ่ม สำหรับ "กลุ่มที่ไม่เคยเห็นมาก่อน" ว่า Open-domain ในขณะที่ปัญหาที่เรารู้กลุ่มชัดเจนตั้งแต่แรกนั้นจะเรียกว่า Closed-domain

โดยทั่วไปปํญหาที่เราเจอในแบบเรียนมักเป็น closed-domain เช่น จำแนกตัวเลข 0-9 จำแนกรูปภาพสัตว์  จำแนกรูปภาพใน ImageNet เป็นต้น

ในขณะที่ปัญหา Open-domain ที่เราเจอในที่นี้นั้น มักมาพร้อมกับตัวอย่าง few-shots  ทำให้ยากกว่าปัญหา closed-domain ทั่วไปมาก

.

 

ปัญหาจดจำใบหน้า (Face Recognition)

ความท้าทาย 3) 4) และ 6) ในปัญหาจับคู่สินค้าใน Shopee นั้นมึความคล้ายปัญหา "จดจำใบหน้า" (face recognition) อยู่มาก

เนื่องจากการฝึกให้โมเดลจดจำใบหน้าคน ได้นั้นในทางปฏิบัติต้องอัพเดตหน้าบุคคลใหม่ๆ ได้ตลอดจึงเป็น open-domain และจำนวนคนที่ต้องจดจำก็เป็นหลักหมื่นถึงหลักล้านคล้ายกับจำนวนสินค้า

นอกจากนี้เวลาถ่ายรูปหน้าแต่ละคน เราก็จะถ่ายเพียงไม่กี่มุมกล้อง จึงเป็นปัญหา few-shots เช่นเดียวกัน

ดังนั้นเราจึงสามารถประยุกต์นำเทคนิก face recoginition model มาใช้ในปัญหา shopee นี้ได้

อย่างไรก็ดี ในปัญหาจับคู่ของ Shopee นี้มีประเด็นที่ยากกว่าปัญหา Face Recoginition ในประเด็นที่ 1) 2) และ 5) ซึ่งเราจำเป็นต้องไปพัฒนาโมเดล face recognition เพิ่มเติมกันต่อไป

.

 

ว่าด้วย ArcFace

ปัจจุบัน 1 ใน face recognition model ที่ได้รับการยอมรับว่าดีมากๆ คือ โมเดลชื่อ ArcFace ซึ่งตีพิมพ์ในปี 2018 https://arxiv.org/pdf/1801.07698.pdf

โดยไอเดียของ ArcFace มีคร่าวๆ ดังนี้

  1. ตอน train, train เหมือน classification โมเดลบน closed-domain ปกติ แต่เปลี่ยน objective function จาก cross-entropy เป็น ArcFace Loss

 

2. ในตอนใช้งานจริง ให้เราถอด classification layer (ที่ระบุจำนวน classes แบบ closed domain) ออก  ทำให้ output ของโมเดลจะเป็น feature vectors (บางครั้งเรียก Embedding vectors)

3. ในการจับคู่ faces หรือจับคู่สินค้า ให้ใช้เทคนิค k-Nearest Neighbors (kNN) บน feature vectors นี้แทน

จากรูปแนบสังเกตว่า การ miminize ArcFace loss จะทำให้ data ชนิดเดียวกันอยู่รวมกลุ่มกันมาก ในขณะเดียวกันก็จะอยู่ไกลจากกลุ่มอื่นให้มากที่สุด ในขณะที่การ minimize ด้วย CrossEntropy loss นั้น data ของแต่ละ class จะยังอยู่ใกล้กัน  ดังนั้นจะมีประสิทธิภาพต่ำเวลาเจอ data ประเภทใหม่ที่ไม่เคยเจอมาก่อน

 

เราสามารถดู Keras implementation ของ ArcFace model ในโน้ตบุคบน Kaggle นี้ :

โดยดูที่ class ArcMarginProduct ที่ inherit มาจาก keras layer (ดูรูปแนบ)

การถอด classification layer ออกตอนใช้งานจริง ก็ดูได้ในโน้ตบุคนี้เช่นกันครับ

 

ไอเดียของ ArcFace loss คือการ minimize "ระยะทางเชิงมุม" แทนระยะทางแบบยูคลิเดียน ซึ่งก่อนหน้า ArcFace มีไอเดียที่คล้ายๆ กันคือ CosFace และ SphereFace (ไอเดียคล้ายกัน สมการต่างกันเล็กน้อย) ซึ่งหลายๆ การทดลองพบว่า ArcFace มักให้ผลลัพธ์ที่ดีที่สุด ดูรายละเอียดในเปเปอร์ ArcFace ด้านบนเพิ่มเติมได้ครับ

 

.

 

SuperFast kNN ด้วย Rapids.ai

ในโน้ตบุคนี้ยังได้อัพเกรดการทำ kNN ให้ไปทำบน GPU โดยสมบูรณ์ แทนที่จะทำบน CPU ทำให้เร็วกว่าเดิมถึง 10x-50x โดยเลือกใช้ library ของ Rapids.ai ครับ https://github.com/rapidsai/cuml

 

โดยรายละเอียดการใช้งานจะคล้ายๆ SciKitLearn ซึ่งเป็น CPU version มากครับ เพื่อนๆ สามารถดูรายละเอียดการ implement rapid kNN ได้ในฟังก์ชันที่ชื่อ get_neighbors ครับ (ดูรูปแนบ)

.

 

ขยายความสามารถของโมเดลให้ทำความเข้าใจ texts data

 

โดยต้นกำเนิด ArcFace ถูกพัฒนามาจาก Face recognition ซึ่งเป็น image problem แต่อย่างไรก็ดีเราสามารถนำ ArcFace loss ไปใส่กับโมเดลที่รับ input เป็น Text เช่น Transformers ต่างๆ ได้เช่นกัน ในโน้ตบุคข้างต้น ก็ประยุกต์นำ ArcFace Loss ไปติดไว้ที่ Bert Model ครับ เพื่อที่จะทำ kNN บนข้อมูล texts ต่อไป

หลังจากที่เราได้ feature vectors ของทั้ง images และ texts แล้ว เราสามารถ concatenate vectors ทั้งสองประเภทเพื่อทำ kNN ครั้งเดียวได้ หรือเราจะทำ kNN 2 ครั้งแล้วนำผลลัพธ์มารวมกันก็ได้ เช่นเดียวกันครับ แต่วิธีไหนจะดีกว่ากัน ก็ต้องลองไปทำจริงและสร้างการวัดผล local validation test ที่รัดกุมกันต่อไป

การขยายความสามารถของโมเดลให้อ่าน text ที่ซ่อนอยู่ในรูปโดยวิธี OCR ก็สามารถทำได้ โดยเพื่อนๆ สามารถศึกษาไอเดียนี้และไอเดียอื่นๆ เพิ่มเติมได้ที่นี่ครับ

https://www.kaggle.com/c/shopee-product-matching/code

 

This topic was modified 5 months ago by The Neural Engineer
อ้างอิง
Posted : 06/05/2021 10:06 am
Share:

Please Login or Register