Notifications
Clear all

Jigsaw Unintended Bias in Toxicity Classification - Update การแข่งขันใหม่ พฤษภา 2020!!

3 ข้อความ
2 Users
4 Likes
27.7 K Views
nameless
(@nameless)
Member Moderator
เข้าร่วมเมื่อ: 5 years ago
ข้อความ: 7
Topic starter  

อัพเดต พค 2020 

ทางทีม Jigsaw ได้จัดการแข่งขันรอบใหม่แบบยากกว่าเดิมมากๆ เป็นโดยต้องทำนายถึง 7 ภาษา รายละเอียดดูได้กระทู้ข้างล่างผครับ

(ข้างล่างนี้เป็นข้อความปี 2019 ครับ) เกริ่นที่มาของปัญหาโดย Neuron Engineer - แชร์ประสบการณ์คว้าเหรียญเงินจาก Kaggle โดยคุณ Nameless

สวัสดีเพื่อนๆ ครับ สัปดาห์นี้ขอแชร์เรื่องเบาๆ เกี่ยวกับบันทึกประสบการณ์ที่ได้รับจากการแข่งขัน Kaggle  บ้างนะครับ

เดือนที่ผ่านมาทีมของเราได้ลงแข่งขัน NLP รายการใหญ่ที่มีชื่อว่า “Unintended Bias in Toxicity Classification” การแข่งขันครั้งนี้มีทีมลงแข่ง 3,165 ทีมจากทั่วโลก และทีมของเราได้อันดับที่ 55 ของโลกได้เหรียญเงินมาเป็นรางวัล

โจทย์ NLP รอบนี้มีจุดประสงค์ที่จะทำ classification comments ที่สร้างความร้าวฉานในสังคม (toxic comment) ซึ่งเป็นโจทย์ใหญ่ที่ NLP communityได้ให้ความสนใจมานาน โดยการแข่งรอบนี้เต็มไปด้วยยอดฝีมือ NLP จากทั่วโลกและมีความพิเศษหลายประการ อาทิเช่น

  • ได้มีการค้นพบว่าโมเดลในอดีตมักจะ bias บาง keywords เช่นถ้ามีคำว่า gay ก็จะคัดกรองว่าเป็น toxic comments ไว้ก่อน ซึ่งอาจเป็นการไม่เคารพเพศที่ 3 ที่อาจเข้ามา comment ด้วยความบริสุทธิ์ใจ การตัด bias ส่วนนี้ออกจึงเป็นจุดประสงค์หลักของการแข่งรอบนี้ครับ
  • การแข่งขันอนุญาตให้ใช้ State of the Arts โมเดลได้เต็มที่ต่างจากการแข่งครั้งก่อน ดังนั้นสุดยอดโมเดลอย่าง BERT, GPT-2 หรือกระทั่ง XLNet ซึ่งตีพิมพ์ตอนการแข่งครั้งใกล้จะจบก็ถูกนำมาต่อสู้กันอย่างสนุกสนาน
  • Metric การวัดผลในรอบนี้มีชื่อว่า “overall AUC+Generalized mean of Bias AUC” ถูกออกแบบมาให้จัดการเรื่อง Bias ดังกล่าว จึงมีความซับซ้อนกว่า Metric ปกติมากๆ และถูกนำมาใช้เป็นครั้งแรกในโลก การทำเข้าใจ Metric อย่างลึกซึ่งเพื่อออกแบบโมเดลให้ตอบโจทย์นั้นจึงส่งผลต่อผลการแข่งขันมากๆ

คุณ nameless ซึ่งเป็นผู้นำทีมในการแข่งครั้งนี้ก็ได้บันทึกแชร์ประสบการจากการแข่งครั้งนี้ไว้ที่เว็บบอร์ดของเราที่นี่ครับ

—————————-

บทความโดยคุณ nameless

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

ในคราวนี้จะขอเขียนแชร์ประสบการณ์การแข่งขัน Jigsaw Unintended Bias in Toxicity Classification [link] ที่เพิ่งจะมีการประกาศผลกันไป โดยทีมของเราเริ่มเข้าแข่งขันในช่วงสิบวันสุดท้าย และไต่อันดับขึ้นมาเรื่อยๆ จนติดท็อป 2% ซึ่งขั้นตอนในการทำงานของทีมเราสามารถเขียนสรุปเป็นข้อๆ ได้ดังนี้ครับ

1. ทำความเข้าใจโจทย์

โจทย์ที่เราต้องทำในการแข่งขันครั้งนี้คือ binary classification ของ NLP โดยจะมีข้อความมาให้ แล้วเราต้องแยกแยะว่าข้อความนี้มีความเป็นพิษเป็นภัย (toxicity) หรือเปล่า โดยตอบออกมาเป็นความน่าจะเป็น (ตัวเลขระหว่าง 0-1) ว่าข้อความนี้น่าจะมี toxicity มากน้อยแค่ไหน ตัวอย่างเช่นใน training data จะเป็นอย่างนี้ครับ

  • id 59856: "haha you guys are a bunch of losers." มีค่า toxicity เท่ากับ 0.893617
  • id 59859: "ur a sh*tty comment." มีค่า toxicity เท่ากับ 0.666667
  • id 59861: "hahahahahahahahhha suck it." มีค่า toxicity เท่ากับ 0.457627
  • id 239578: "Wow, that sounds great." มีค่า toxicity เท่ากับ 0

ดูแล้วปัญหาจะคล้ายๆ กับการแข่งขัน Quora Insincere Questions Classification [link] ที่ผ่านมาเลย ซึ่งทางทีม ThAIKeras ก็ได้ลงแข่ง และเขียนสรุปเล่าเรื่องราววิธีการอย่างละเอียดไว้ที่นี่ครับ [link]

ในเบื้องต้นจะเห็นว่าปัญหาของ Jigsaw นี้ ต่างจาก Quora ตรงที่เราใช้ output ที่เป็น probability มาตอบได้เลย ไม่ต้องปัดเป็น 0 หรือ 1 แล้วใช้ค่า AUC ในการวัดผล แต่ไม่เพียงแค่นั้น กุญแจสำคัญของการแข่งขันครั้งนี้คือการที่ต้องทำให้โมเดลของเราไม่มี bias ด้วย สำหรับคนที่เคยทำงานด้าน classification ของ NLP อาจจะคุ้นเคยกับเรื่องนี้ดีอยู่แล้ว ว่าบางทีโมเดลที่เรียนรู้ออกมาได้ จะไปจำและผูกติดกับคำบางคำไว้ เช่น ถ้ามีคำว่า "gay" ก็ตอบออกมาเลยว่าเป็น toxicity คือเหยียดเพศที่สามแน่ๆ ทั้งๆ ที่ประโยคนั้นอาจจะบอกว่า "I am a gay woman." ก็ได้

เพื่อที่จะเน้นเรื่องนี้ในการวัดผล จึงได้แบ่งข้อความออกเป็นกลุ่ม (subgroup) ต่างๆ เพิ่มขึ้นด้วย เช่นกลุ่ม homosexual_gay_or_lesbian กลุ่ม muslim และกลุ่ม black เป็นต้น จากนั้น นอกจากจะคำนวณค่า AUC โดยรวมแล้ว ก็จะคำนวณค่า AUC อื่นๆ อีกสามค่า ดังนี้ครับ

  • Subgroup AUC: จะคำนวณค่า AUC เฉพาะข้อความที่อยู่ใน subgroup นั้นๆ ทำให้รู้ว่าโมเดลของเราสามารถจำแนกข้อความใน subgroup ต่างๆ ได้ดีเพียงใด
  • BPSN AUC (Background Positive, Subgroup Negative): จะเลือกข้อความที่เป็น toxicity นอก subgroup นั้นมา รวมกับข้อความที่ไม่เป็น toxicity ใน subgroup นั้น โมเดลที่ให้ BPSN AUC ไม่ดีมีแนวโน้มว่าจะให้ค่า toxicity กับข้อความใน subgroup นั้นที่ไม่มีพิษมีภัยสูงกว่าความเป็นจริง
  • BNSP AUC (Background Negative, Subgroup Positive): จะเลือกข้อความที่ไม่เป็น toxicity นอก subgroup นั้นมา รวมกับข้อความที่เป็น toxicity ใน subgroup นั้น โมเดลที่ให้ BNSP AUC ไม่ดีมีแนวโน้มว่าจะให้ค่า toxicity กับข้อความใน subgroup นั้นที่มีพิษมีภัยต่ำกว่าความเป็นจริง

ค่าเฉลี่ยของทุกๆ กลุ่มใน AUC เดียวกันจะใช้ power mean และค่า AUC ทั้งสี่ตัวนี้ก็นำมาเฉลี่ยกันธรรมดา สำหรับรายละเอียดเพิ่มเติมสามารถดูใน Kaggle ได้เลยครับ [link]

2. ไล่อ่าน kernel และ discussion

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

สำหรับ kernel และ discussion ที่สำคัญสำหรับทีมเราในการแข่งขันครั้งนี้ ได้แก่

- Toxic BERT plain vanila ของ @yuval6967 ในการแข่งขันครั้งนี้ โมเดล BERT [link] จะให้ผลดีกว่าโมเดลอื่นๆ และ kernel ของคุณ @yuval6967 เป็นโค้ดตั้งต้นสำหรับการใช้ BERT ที่ดีมาก เจ้าของ kernel ก็นับว่ามี contribution กับการแข่งขันครั้งนี้เป็นอย่างสูง เพราะนอกจากจะสร้าง kernel แล้ว ยังตอบทุกคำถาม ซึ่งก็มีคนถามกันมาเยอะ ทำให้คนอื่นๆ ได้รับความรู้เพิ่มขึ้นไปด้วย

- Dynamic Minibatch Trimming ของ @hooong เป็นโค้ดที่ใช้เพิ่มความเร็วในการเทรน ทำให้สามารถเทรนกับข้อมูลที่มีจำนวนมากขึ้นได้ ในเวลาที่จำกัด

- Simple LSTM ของ @thousandvoices เป็นโค้ด Keras ตั้งต้นที่สั้น กระชับ ซึ่งทีมเราได้ใช้ไอเดียของ sample_weights มาเพื่อปรับ loss ให้ดีขึ้น

นอกจากนี้ก็ยังมี kernel และ discussion อื่นๆ ที่ผู้ทำได้คะแนนดีมาบอกใบ้วิธีการไว้ ซึ่งเป็นสิ่งที่ช่วยทีมเราได้เยอะเลยครับ

3. ใช้ BERT

เราตั้งต้นโดยใช้โค้ดจาก kernel ของ @yuval6967 ที่กล่าวถึงไปแล้ว โดย kernel นี้ ได้ใช้ BERT เวอร์ชันของ Hugging Face [link] ที่เป็น PyTorch ซึ่งทำให้เราสามารถนำ BERT มาใช้งานได้โดยง่าย โดยจะมี BertTokenizer สำหรับแปลงข้อความมาเป็น input ของโมเดล และ BertForSequenceClassification ที่เป็นโมเดล BERT สำหรับจำแนกข้อมูล นอกจากนี้ ยังมีการใช้ apex ของ NVIDIA เพื่อเพิ่มความเร็วในการทำงานให้กับ PyTorch ด้วยครับ

4. เร่งความเร็ว

เนื่องจากทาง ThAIKeras ของเรา ไม่มี GPU ส่วนตัว หรือการเช่า GPU จากคลาวด์แล้ว จึงต้องใช้ kernel ของ Kaggle ในการรัน ซึ่งก็มีข้อจำกัดอยู่ตรงที่ว่าในแต่ละครั้งจะรันได้ไม่เกิน 9 ชั่วโมง เนื่องจาก training data มีปริมาณเยอะ (ประมาณ 1.8 ล้านข้อความ) ทำให้ไม่สามารถเทรนได้หมดภายใน 9 ชั่วโมง จึงต้องพยายามเร่งให้เทรนได้เร็วขึ้น

ทีมเราได้ใช้โค้ดของ @hooong ที่ทำการสร้าง minibatch โดยสุ่มข้อความขึ้นมา ข้อความที่มีความยาวขนาดนึงจะตกลงไปใน bucket สำหรับรองรับข้อความที่มีความยาวช่วงนั้น และถ้า bucket ไหนเต็ม คือมีจำนวนข้อความเท่ากับขนาดของ minibatch ที่กำหนดไว้แล้ว ก็จะถูกนำมาใช้เป็น minibatch ถัดไปเรื่อยๆ วิธีการนี้จะได้ minibatch ที่มี input ขนาดสั้นมาด้วย ซึ่งทำให้การประมวลผลทำได้รวดเร็วขึ้น ไม่เหมือนวิธีปกติที่เรากำหนดให้ทุก minibatch มีความยาวของ input เท่ากันหมดนะครับ

5. ปรับ loss

การปรับ loss ให้สัมพันธ์กับ metric ที่ใช้วัดผล ก็เป็นส่วนสำคัญที่ทำให้คะแนนเพิ่มขึ้นได้มาก ในที่นี้เราได้ให้ weight เพิ่มขึ้น สำหรับข้อความที่เกี่ยวข้องกับค่า AUC ต่างๆ ได้แก่

  • ข้อความที่อยู่ใน subgroup ที่กำหนดไว้
  • ข้อความที่เป็นพิษเป็นภัย และไม่ได้อยู่ใน subgroup ที่กำหนดไว้
  • ข้อความที่ไม่เป็นพิษเป็นภัย และอยู่ใน subgroup ที่กำหนดไว้

โดยการคำนวณ weight จะเป็นไปตาม sample_weights ใน kernel ของ @thousandvoices ครับ

6. ปรับจูน

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

  • ข้อมูลของการแข่งขันครั้งนี้ จะมีประเภทของ toxicity ไว้ด้วย เช่นเป็น severe_toxicity หรือ identity_attack เป็นต้น และสามารถนำค่าเหล่านี้มาเป็น target ช่วยสอนได้
  • ใช้ soft target คือใช้ค่า target ตรงๆ ไม่ได้ปัดไปเป็น 0 หรือ 1
  • การคำนวณ weight ของ loss ก็เป็นแบบซอฟต์ๆ เช่นเดียวกัน
  • เพิ่มการเทรนจากรอบเดียว (epoch เดียว) เป็น 1.5 รอบ และปรับ learning rate ให้ลดลงหลังจากเทรนครบรอบนึงแล้ว
  • เน้น subgroup ที่ยังมีคะแนนไม่ดีอยู่ โดยเพิ่ม weight ของ loss ให้ หลังจากที่เทรนครบรอบ

 

7. Ensemble

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

  • โมเดล BERT จำนวน 6 โฟลด์
  • โมเดล BERT ที่เทรนด้วยข้อมูลทั้งหมด
  • โมเดล GPT2
  • โมเดล LSTM

ทั้งนี้ทีมเรายังไม่สามารถเทรนให้โมเดล GPT2 และ LSTM มีคะแนนดีเท่า BERT ได้ โดยคะแนน validation data ของ GPT2 และ LSTM อยู่ที่ราวๆ 0.93 เท่านั้น ไม่เหมือนกับ BERT ที่ทำให้ขึ้นไปได้ถึงระดับ 0.94 เลยครับ แต่พอนำโมเดล GPT2 และ LSTM มาช่วยทำนายผลด้วย ก็ทำให้คะแนนสูงขึ้นได้อีกนิดนึง โดย weight ในการทำนายของโมเดล BERT กับ GPT2 และ LSTM เป็น 0.8 0.1 0.1 ตามลำดับ

 

โดยขั้นตอนต่างๆ มีผลต่อสกอร์ของ public leaderboard ดังนี้ครับ

  • 0.933 เป็น kernel ของ BERT ต้นฉบับ
  • 0.938 ทำให้รันได้เร็วขึ้น และรันกับข้อมูล 1.5 ล้านตัว
  • 0.942 ทำการปรับ loss และปรับจูนเบื้องต้น
  • 0.943 รัน 1.5 รอบ และทำการปรับจูนเพิ่มเติม
  • 0.945 ทำ ensemble

 

สำหรับผู้ที่เคยลงแข่ง Kaggle คงมีประสบการณ์ว่าการไต่อันดับทำได้ค่อนข้างยาก เนื่องจากไอเดียที่ทดลองไปส่วนใหญ่จะไม่เวิร์ค และผู้ร่วมแข่งขันล้วนแล้วแต่เป็นยอดฝีมือจากทั่วทุกมุมโลก แต่ในบางรายการ เราก็อาจทำถูกทางและทำคะแนนดีขึ้นมาได้ อย่างไรก็ตาม สุดท้ายแล้วอันดับหรือคะแนนก็เป็นเพียงตัวเลขเท่านั้น หากแต่สิ่งสำคัญก็คือการได้เรียนรู้ เพื่อจะนำไปสู่พัฒนาการทางด้าน data science และ machine learning ที่ดียิ่งขึ้นต่อไปครับ (คมไหม)


   
อ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 5 years ago
ข้อความ: 396
 

ขออนุญาตลงรูปประกอบสักเล็กน้อยนะครับ ให้เห็นบรรยากาศการแข่งขัน รวมทั้งการแชร์ความรู้ต่างๆ จากผู้เข้าแข่งขันบน Kernels เพื่อผลประโยชน์โดยรวมของวงการ AI ครับ ? 


   
endofday and nameless reacted
ตอบกลับอ้างอิง
The Neural Engineer
(@neural-engineer)
Honorable Member Admin
เข้าร่วมเมื่อ: 5 years ago
ข้อความ: 396
 

อัพเดตการแข่งขันปี 2020 ครับ!!

มาสร้างโมเดลพหุภาษา (Multi-lingual) และทำความรู้จัก Subwords Embedding ด้วยพลังของ XLM-Roberta และ HuggingFace บน Kaggle TPU !!

ThaiKeras 15 พค. 2563

 

สวัสดีครับเพื่อนๆ ช่วงนี้ Kaggle มีการแข่งขัน NLP ครั้งใหม่สองรายการที่น่าสนใจมากๆ ทีมงาน ThaiKeras เลยจะมาเล่าให้เพื่อนๆ ฟังครับ โดยบทความนี้จะเริ่มต้นที่รายการแรก

รายการแรกคือการตรวจจับประโยคที่เป็นพิษ (toxic detection) เพื่อโจมตี กล่าวร้าย หรือเหยียดหยามบุคคลอื่น ไม่ว่าจะเป็น เพศ เชื้อชาติ ศาสนา ฯลฯ โดยการแข่งขันทำนองนี้จัดมาแล้วหลายครั้ง แต่ครั้งนี้พิเศษสุดๆ เนื่องจากว่าเป็นการแข่งขันแบบ ”พหุภาษา” หรือ Multi-lingual ที่ยากมากๆ ครับ โดยข้อมูลสอน training data นั้นเป็นภาษาอังกฤษทั้งหมด แต่เวลาเราต้องไปทดสอบจริงเพื่อตรวจจับประโยคพิษบน test data นั้นไม่มี ประโยคภาษาอังกฤษเลยแม้แต่ประโยคเดียว!! ประโยคที่เราต้องไปทำนายประกอบไปด้วย 6 ภาษาคือ ภาษาสเปน ฝรังเศส โปรตุเกส รัสเซีย ตุรกี และอิตาลีครับ

เพื่อนๆ อาจสงสัยว่าปัญหาที่ยากระดับนี้เราจะสร้างโมเดลมาจัดการได้ด้วยหรือ? วิธีหนึ่งที่หลายๆ งานวิจัยได้ทำการทดลองกันกันมาตลอดก็คือ การใช้โมเดล “translation” เป็นตัวกลาง นั่นคือเราแปลประโยคที่เราต้องการทดสอบทั้ง 6 ภาษานั้นกลับเป็นภาษาอังกฤษ เราก็จะสามารถใช้โมเดลที่ฝึกสอนบนภาษาอังกฤษนั้นมาทำนายได้

อย่างไรก็ดีวิธีนี้กลับใช้ไม่ได้ดีมากในปัญหาจับประโยค “พิษ” เนื่องจากโมเดล translation ต่างๆ นั้นมักถูกฝึกสอนมาในสภาพแวดล้อมแบบ “ผู้ดี” นั่นคือจะไม่พยายามแปลภาษาที่ไม่สุภาพ ซึ่งทำให้เมื่อเราแปลภาษาอื่นมาเป็นภาษาอังกฤษแล้ว ความเป็นพิษภัยนั้นจะถูกลดทอนลงไปมาก (เรียกว่า Detoxify) ทำให้ประโยคพิษหลายๆ ประโยคในภาษาอื่นๆ ถูกลดทอนความรุนแรงลงระดับหนึ่ง บางประโยคก็กลายเป็นประโยคธรรมดาในภาษาอังกฤษ

แต่โมเดล Deep Learning ใหม่ๆ พัฒนาไปไกลมากๆ ล่าสุดในปี 2019 ทีม Facebook AI ได้พัฒนาโมเดลที่เข้าใจถึง 100 ภาษาพร้อมๆ กัน!! โมเดลระดับมหัศจรรย์นี้มีชื่อว่า XLM-Roberta (อ้างอิง 1) ที่เรียนรู้ข้อมูลจากอินเตอร์เน็ตทั้งหมดถึง 2.5 Terabytes!! (2500GB) และทำผลงาน State-of-the-arts หลายสิบ Leaderboards พร้อมๆ กัน (ดูความหมายที่ อ้างอิง 2 ) ในจำนวนนี้มีข้อมูลในภาษาไทยอยู่ถึงเกือบๆ 100GB ซึ่งน่าจะเป็นโมเดลที่เก่งภาษาไทยมากๆ เลยอีกด้วย ภาพข้างล่างแสดงข้อมูลที่ใช้สอน XLM-Roberta (สีน้ำเงิน) ซึ่งมากกว่าวิกิพีเดียทุกภาษารวมกันอย่างมากครับ (สังเกตข้อมูลภาษาไทยอยู่ที่อันดับ 10 ของโลกเลยทีเดียว!)

ดังนั้นงานสุดหินในการจับประโยค “พิษ” ใน 7 ภาษานี้จึงสามารถทำได้ด้วยการ Finetuning XLM-Roberta นั่นเองครับ พูดง่ายๆ คือเอาโมเดล XLM-Roberta ที่ถูกฝึกจนเก่งสุดๆ อยู่แล้วมาเรียนรู้ต่อบนข้อมูล toxic detection ของเรานั่นเอง

ในตอนท้ายของบทความเพื่อนๆ สามารถดูโค้ดของ XLM-Roberta ภาคปฏิบัติบน Kaggle ที่ให้ผลดีกว่าการแผลภาษาตรงๆ ไปหลายขั้น

อนึ่ง ที่มาของชื่อ Ro”bert”a นั้นมาจากคำว่า “Bert” ซึ่งเป็นชื่อ Transformers ของทีม Google AI โมเดลที่โด่งดังที่สุดที่ปฏิวัติวงการ NLP เมื่อปี 2017-2018 นั่นเอง โดยงานเกี่ยวกับ NLP ที่ดีที่สุดในรอบ 1-2 ปีที่ผ่านมาก็ล้วนเป็นลูกหลานของ Bert ทั้งสิ้น (ดู อ้างอิง 3. ) ส่วนคำว่า XLM นั้นย่อมาจากคำว่า "Cross-lingual Language Model"

 

Subword Embedding บางคนอาจสงสัยว่า “คำศัพท์” ที่โมเดลต้องจำใน 100 ภาษามันต้องจำเป็นสิบล้านคำศัพท์หรือเปล่า (model word embedding ชือดังเช่น Gloves ยังต้องจำศัพท์หลายแสนคำในภาษาอังกฤษภาษาเดียว — ดูตัวอย่าง Word Embedding ที่อ้างอิง 4. )

ปัจจุบันมีเทคนิกเข้ารหัสคำศัพท์ต่างๆ ที่เรียกว่า “Sub-words Embedding” ที่เราไม่จำเป็นต้องจำศัพท์เต็มคำเสมอไป โดยเทคนิกนี้จะแตกศัพท์ที่เจอไม่บ่อยออกเป็น sub-words ที่เจอบ่อยแทน ยกตัวอย่างเช่น going —> “go” + “ing” และ goes —> “go” + “es” และ “eating” —> “eat” + “ing”

ซึ่งจะเห็นได้ว่าแทนที่เราจะต้องจำว่าคำศัพท์แต่ละคำเป็น “คนละคำ” เช่น go, goes, going การแตกเป็น subwords นี้จะทำให้โมเดลทราบว่าทุกคำล้วนมีรากศัพท์มาจาก go นอกจากนี้คำศัพท์ทุกคำที่มี “ing” ปรากฏอยู่ข้างในเช่น going, eating ก็จะแชร์ vector เดียวกัน ทำให้โมเดลเรียนรู้ความหมายที่แท้จริงของ “ing” ได้อีกด้วย และประหยัดคลังคำศัพท์ไปมาก เนื่องจากศัพท์ส่วนใหญ่สามารถสร้างได้จาก subwords กลุ่มที่พบบ่อยเหล่านี้

วิธีการ Subwords Embedding นั้นปัจจุบันมีที่นิยมอยู่ 2-3 วิธีหลักๆ คล้ายๆ กัน โดย XLM-Roberta นั้นใช้การเข้ารหัสที่มีชื่อว่า SentencePiece Embedding ครับ

ด้วยวิธีนี้ทำให้คำศัพท์ของ subwords ทั้งหมดที่ XLM-Roberta ต้องจำใน 100 ภาษานั้นมีเพียง 250,000 คำเท่านั้น!! (เทียบเท่ากับคำศัพท์ปกติของ Word embedding เช่น Glove ในภาษาอังกฤษภาษาเดียว) มันน่ามหัศจรรย์มากๆ ครับที่โมเดลของเราจำศัพท์เพียงเท่านี้ก็สามารถทำความเข้าใจได้ทั้ง 100 ภาษาทั่วโลก

 

การเขียนโปรแกรม XLM-Roberta ภาคปฏิบัติด้วย HuggingFace และ Kaggle TPU

โมเดล XLM-Roberta อันทรงพลังนี้แบ่งเป็นสองขนาดเรียกว่า base และ large คือขนาดปานกลางและขนาดใหญ่ โดยโมเดลขนาดใหญ่นั้นทรงพลังที่สุด แต่ก็กิน resources มากๆ โดยมีจำนวน parameters ของโมเดลมากกว่า 500ล้าน parameters!!

เรียกว่าปกติแล้ว คนธรรมดาอย่างเราๆ ไม่สามารถมี hardware ที่ทรงพลังพอที่จะฝึกสอนโมเดลระดับนี้ได้ แต่ล่าสุดทาง Kaggle ได้อนุญาตให้ทุกคนสามารถใช้ TPU Virtual machine ที่ทรงพลังกว่า GPU (ที่ก็เร็วมากๆ อยู่แล้ว) ถึง 10 เท่า (ดูความหมายที่ อ้างอิง 5. ) ด้วยพลังของ TPU นั้นทำให้เราสามารถสร้างโมเดลขนาดใหญ่นี้ได้ภายในเวลาเพียง 1 ชม. เศษๆ เท่านั้น

และการสร้างโมเดล Transformers ที่ดีที่สุดเหล่านี้ก็ไม่เป็นเรื่องยากอีกต่อไปโดยการใช้ library ใหม่ล่าสุดอย่าง Huggingfaces ที่ใน workshops ก่อนหน้าเราได้สร้างโมเดล GPT-2 ที่สามารถแต่งเรื่องราวได้ราวกับมนุษย์ คราวนี้เราก็จะสร้าง XLM-Roberta ด้วยวิธีเดียวกัน

อย่างไรก็ดีโดยปกติการเขียนโปรแกรมบน TPU นั้นจะต้องมีการเปลี่ยนแปลงโค้ดพอสมควร แต่ที่พิเศษสุดก็คือการเขียนโค้ด TPU บน Keras นั้นเราแทบจะไม่ต้องเปลี่ยนแปลงโค้ดอะไรเลยครับ เพื่อนๆ สามารถดูวิธีการเขียนโค้ดอันเรียบง่ายของ XLM-Roberta บน Keras-TPU และสามารถ copy ไปลองเขียนได้ภายในคลิ้กเดียวได้ที่นี่ครับ https://www.kaggle.com/xhlulu/jigsaw-tpu-xlm-roberta

การแข่งรายการนี้เป็นขุมทองในการพัฒนาทักษะด้าน NLP มากๆ และจะจบลงในกลางเดือนมิถุนายนนี้ครับ

อ้างอิง — 1. XLM-Roberta : https://arxiv.org/abs/1911.02116 2. รู้จัก State-of-the-arts : http://bit.ly/thaikeras-sota 3. BERT : http://bit.ly/thaikeras-nlp-transfer 4. อธิบาย word embedding ผ่านการปัญหา Quora NLP : http://bit.ly/thaikeras-kaggle-quora19 5. รู้จัก Virtual Machine, GPU และ TPU : https://bit.ly/thaikeras-deeplearning-faq


   
ตอบกลับอ้างอิง
Share: