สร้างโมเดลถอดรหัสถ้อยคำสำคัญในทวิตเตอร์ บน Kaggle
ThaiKeras 10 มิย. 2563
สวัสดีครับ เพื่อนๆ นอกจากการแข่งขันตรวจจับภาษาพิษ 7 ภาษาที่เรานำเสนอไปในบทความที่แล้ว ( https://bit.ly/thaikeras-kaggle-xlmr ) ยังมีอีกการแข่งขันหนึ่งบน Kaggle ที่เกี่ยวกับข้อมูลทางภาษาที่น่าสนใจและช่วยให้เราเข้าใจวิธีการสร้างโมเดลที่มี output ซับซ้อนกว่าโมเดล Classification ทั่วไปครับ
การแข่งขันนี้มีชื่อว่า "Tweet Sentiment Extraction" ( https://www.kaggle.com/c/tweet-sentiment-extraction )
ทำความเข้าใจปัญหา
โจทย์นี้เป็นการแข่งขันที่ท้าทายให้เราสร้างโมเดลที่ "เข้าใจถ้อยคำสั้นๆ บนทวิตเตอร์" โดยปัญหา "Sentiment Extraction" นี้ "ไม่ใช่" ปัญหา Sentiment Analysis ที่พบกันบ่อยๆ โดยปัญหา Sentiment Analysis นั้นจะมีเป้าหมายให้โมเดลทำนายว่า sentiment เป็นบวก (ทวิตความสุข) หรือลบ (ทวิตเศร้า)
ในปัญหา Sentiment Extraction โมเดลจะได้รับ input ทั้งข้อความและ sentiment มาทั้งคู่ (มี input 2 ค่า) โดย output ที่โมเดลต้องทำนายออกมาคือ substring หรือ "ประโยคย่อย" ในทวิตนั้นๆ ว่า ประโยคใดที่บ่งบอกว่าทวิตนั้นสุขหรือเศร้า
เพื่อให้เข้าใจมากขึ้นเรามาดูตัวอย่างสักสองตัวอย่างครับ
ตัวอย่าง 1.
Model Input :
- Text: My ridiculous dog is amazing.
- Sentiment : Positive
Model Output: "is amazing"
ตัวอย่าง 2.
Model Input :
- Text: I missed mine, too. Not fun...
- Sentiment : Negative
Model Output: "Not fun..."
…
แน่นอนในยุคนี้ ถ้าเราพูดถึงปัญหาด้านภาษาหรือ NLP แล้วเราต้องนึกถึงโมเดลตระกูล Transformer ที่ดีที่สุดในการทำความเข้าใจภาษา และนึกถึง library HuggingFace ที่มีโมเดล Transformer แทบทุกประเภทให้เราเรียกใช้งานง่ายๆ บน Keras ครับ .. ในการตรวจจับภาษาพิษ 7 ภาษาในบทความก่อนเราก็ใช้ HuggingFace library เช่นเดียวกัน
ไอเดียการสร้าง Text-Extraction Model
เนื่องจากโจทย์ให้โมเดลทำนาย substring จาก input text ที่กำหนด ดังนั้นเราสามารถใช้มุมมองที่ว่า input text ใดๆ นั้นล้วนเป็นลำดับของคำ (sequence of words) (w_1, w_2, …, w_N -- โดยกำหนดให้ทุก input texts มีความยาวไม่เกิน N) และโมเดลของเราก็เพียงทำนายว่าคำใดควรจะเป็น "คำแรก" ของ substring และคำใดควรจะเป็น "คำสุดท้าย" ของ substring นั่นเองครับ
นั่นคือ ในทำนองเดียวกันกับ Classification model ทั่วไปที่เรามี Output 1หัวเพื่อทำนายว่าตัวอย่างควรเป็นคลาสใด (คลาส 1 ถึงคลาส N) ในปัญหา Text Extraction นี้เราจะมี Output 2 หัว เพื่อทำนายว่า "คำเริ่มต้นของ substring" และทำนาย "คำสุดท้ายของ substring" ควรเป็นคำในตำแหน่งใด (ตำแหน่งที่ 1 ถึงตำแหน่งที่ N) นั่นเอง
รู้จัก Question-Answering Extraction
เทคนิกสร้าง Text Extraction Model นี้ไม่เพียงใช้กับปัญหา Sentiment Extraction นี้เท่านั้น จริงๆ แล้วใช้อย่างกว้างขวางในปัญหาที่เรียกว่า "Question Answering Extraction" (Q&A Extraction) ซึ่งเป็น Application ที่มีประโยชน์มากๆ สำหรับงานทางด้าน NLP
ปัญหา Q&A Extraction นี้จะคล้ายๆ กับปัญหาในข้อสอบบ้านเรา นั่นคือโจทย์จะกำหนดประโยค input text ที่ต้องการให้โมเดลอ่าน (อาทิ เช่น ชีวประวัติของไอแซค นิวตันในวิกิพีเดีย) จากนั้นโจทย์ก็จะถามคำถามจาก input นั้น (เช่น นิวตันคิดค้นทฤษฎีอะไร?) และโมเดลก็ต้อง extract substring จาก input text เพื่อตอบคำถามนั้นให้ถูกต้องครับ
ดังนั้นเมื่อพวกเราสร้างโมเดล Sentiment Extraction เป็นแล้ว เราก็จะได้โมเดล Q&A Extraction มาเป็นโบนัสฟรีๆ ด้วยครับ 😀
Text Extraction ด้วย Transformers : words vs. subwords
ถึงแม้ไอเดียในการแก้ปัญหา Sentiment Extraction นี้จะดูไม่ซับซ้อน และเรายังมีโมเดล Transformers ที่เรียกใช้ง่ายๆ ด้วย Huggingface + TF-Keras แล้วก็ตาม ยังมีประเด็นหนึ่งที่เราต้องทำความเข้าใจอย่างละเอียดก่อนที่จะสร้างโมเดลได้ นั่นคือ
เราต้องการทำนายว่าคำเริ่มต้น/สุดท้ายอยู่ตำแหน่งใด ในตำแหน่งที่ 1 ถึง N ทว่าโมเดล Transformers นั้นไม่ได้ตัดประโยคด้วย "คำ" (words) แต่ตัดประโยคด้วย "ส่วนประกอบของคำ" (subwords)
ทั้งนี้เนื่องจากนักวิจัยฝั่ง NLP นั้นได้ข้อสรุปแล้วว่าการสร้าง subword-vector นั้นมีประสิทธิภาพที่สุด (เทียบกับการสร้าง word-vector หรือ character-vector --- ดูเรื่อง word vector ย้อนหลังได้ที่นี่ครับ : http://bit.ly/thaikeras-kaggle-quora19 )
เช่นคำว่า Kaggle นั้นเป็นคำ "1 คำ" แต่ Transformer จะตัดคำนี้ออกเป็น "3 subwords" คือ['K', 'agg', 'le'] เป็นต้น ดังนั้นลำดับของ subwords จะไม่ตรงกับ words โมเดลเราจะทำนายคำเริ่มต้น และคำสุดท้ายของ substring เป็นลำดับของ subwords แทน ดังนั้นเราต้องสร้าง mapping จาก subwords กลับไปเป็น word อีกทีหนึ่งครับ ซึ่งอาจจะจุกจิกหน่อย แต่ไม่เกินฝีมือเราครับ
สำหรับปัญหา Twitter Sentiment Extraction นี้เราจะเลือกใช้ Transformer model ที่ชื่อ "Roberta" ซึ่งเป็นเวอร์ชั่นอัพเกรดจาก Bert อีกทีครับ โดยตัวอย่าง input text, การเข้ารหัส subwords และโมเดล outputs คือ "subword เริ่มต้น" และ "subwords สุดท้าย" ในรูปที่ 1 ครับ (เครดิต Chris Deotte ในโน้ตบุคประจำบทความนี้ครับ) การเข้ารหัสของ Roberta ดูรายละเอียดได้ที่ https://huggingface.co/transformers/model_doc/roberta.html
และ Roberta architecture สำหรับ Text Extraction แสดงได้ดังรูปที่ 2 ครับ
สำหรับเพื่อนๆ ที่ทำความเข้าใจหลักการเรียบร้อยแล้ว และอยากทดลองเขียนโปรแกรม Text Extraction ภาคปฏิบัติด้วย TF-Keras + Huggingface แล้วสามารถศึกษาและทดลองปรับแต่งได้ทันทีบน Kaggle จากผลงานชิ้นนี้ของ Chris Deotte ซึ่งเขียนไว้อย่างสวยงามมากครับ
https://www.kaggle.com/cdeotte/tensorflow-roberta-0-705
สำหรับคนที่ยังไม่รู้จักหรือไม่มี account Kaggle ซึ่งมี Virtual Machine ประสิทธิภาพสูงให้พวกเราใช้งานได้ฟรีสามารถเริ่มได้ที่นี่ครับ : http://bit.ly/thaikeras-kaggle
วันนี้ขอจบปัญหา Text Extraction ไว้เท่านี้ และพบกันในบทความถัดไปครับผม