Classification Transformer Model?
สำหรับ Transformer Model มันคือรากฐานของ Large Language Model (LLM) ในปัจจุบัน โดยตัวโมเดลนี้หลัก ๆ แล้วถูกสร้างขึ้นมาเพื่อให้สามารถทำความเข้าใจบริบทและความหมายของภาษาได้ มากกว่าการดูเพียงแค่ความน่าจะเป็นหรือรูปแบบโครงสร้างทางภาษาแบบเดิม ๆ เพียงอย่างเดียว ซึ่งในปัญหาแรก ๆ ที่โมเดล Transformers ถูกหยิบมาใช้มักจะเป็นโจทย์ Classification ที่เกี่ยวข้องกับงานด้านภาษา (NLP) เช่น ต้องการจำแนกว่าข้อความนี้เป็น Spam หรือไม่, คอมเม้นท์นี้มีความหมายเชิง Toxic หรือไม่, รีวิวนี้ดีหรือไม่ดี และอื่น ๆ อีกมากมาย เป็นต้น โดยในบทความนี้จะขอพูดถึงในเชิงเทคนิคว่าถ้าเรามี Transformers Model อยู่ 2 ตัวเราจะเพิ่มประสิทธิภาพการทำ Classification ได้อย่างไร ด้วยวิธีการที่ง่ายและไม่ซับซ้อน
เกริ่นเล็กน้อยเกี่ยวกับโมเดลและข้อมูลที่ทดสอบ
ในการทดสอบนี้จะใช้ข้อมูลใน Kaggle (Getting Started Competition) ซึ่งเกี่ยวกับข้อความในทวิตเตอร์ที่ทวีตถึงเรื่องภัยพิบัติ (ข้อมูลตั้งแต่สมัยยังเป็น Twitter อยู่) โดยเราจะต้องทำการจำแนกว่าข้อความใหม่ ๆ ที่ถูกทวีตเข้ามาในระบบนั้นเป็นเรื่องเกี่ยวกับภัยพิบัติจริงหรือไม่ และโมเดลที่นำมาทดสอบนี้ได้แก่
- FacebookAI/roberta-large โดยจะใช้วิธี Fine-Tuning แบบ rsLoRA (อ่านเพิ่มเติมได้ที่นี่)
- google-bert/bert-base-uncased จะใช้การ Fine-Tuning แบบปกติ
คะแนนที่ได้ของแต่ละโมเดล
หากทำ Classification โดยใช้เฉพาะโมเดลที่หนึ่ง (rsLoRA Roberta Large) จะได้คะแนนบนชุดทดสอบที่ 83.941%
และถ้าใช้เฉพาะโมเดลที่สองเพียงอย่างเดียวจะได้คะแนนบนชุดทดสอบที่ 83.481%
จะเห็นว่าทั้งสองโมเดลมีคะแนนที่ไม่ได้แตกต่างกันมากนัก แต่ถ้าใช้วิธีการ Weighted Average ระหว่างคำตอบของทั้งสองโมเดลนี้จะช่วยให้คะแนนเพิ่มขึ้นได้เป็น 84.216%
การทำ Weighted Average?
สำหรับงาน Classification นั้นสุดท้ายแล้วคำตอบที่ได้จากโมเดลไม่ว่าจะ Machine Learning หรือ Deep Learning ก็ตามในขั้นตอนสุดท้ายมันจะดูจากความน่าจะเป็นว่าสิ่งที่โมเดลได้คิดมาทั้งหมดนั้นควรจะเป็นคลาสใด (ในที่นี้ก็คือโอกาสที่จะเป็นทวีตภัยพิบัติ หรือ ทวีตที่ไม่เกี่ยวกับภัยพิบัติ) ฉะนั้นแล้วเราสามารถนำคะแนนของแต่ละคลาสตรงนี้มาถ่วงน้ำหนักกันได้ระหว่างโมเดลหลาย ๆ ตัว กล่าวแบบสั้น ๆ คือแทนที่จะเชื่อโมเดลตัวเดียว เราเชื่อในการให้โมเดลหลาย ๆ ตัวช่วยกันเลือกมากกว่าโดยที่กำหนดว่าให้น้ำหนักกับโมเดลไหนมากน้อยได้ ด้วยวิธีนี้จะช่วยให้โมเดลลดปัญหา Overfitting บนคลาสใดคลาสหนึ่งได้เพราะนำโมเดลตัวอื่นมาร่วมคิดด้วย และรองรับกับการเจอข้อมูลใหม่ ๆ มากขึ้น (แต่ข้อเสียคือเราต้องรันทั้ง 2 โมเดล ซึ่งหากเป็นงานประเภท Application หรือ Platform ที่คนใช้เยอะ ๆ อาจไม่คุ้มค่าเปลืองเวลาและทรัพยากรอาจจะต้องหาวิธีในการรันส่วนนี้เพิ่มเติม) โดยวิธีการทำง่าย ๆ ดังนี้
1. โหลดโมเดลตัวที่หนึ่งที่เราได้ทำการ Fine-Tuning เรียบร้อยแล้ว
2. โหลดโมเดลตัวที่สองที่ Fine-Tuning แล้วเช่นกัน
3. นำโมเดลแต่ละตัวมาทำ Classification บนชุดข้อมูลทดสอบ (ที่ต้องแยกข้อมูลทดสอบเป็น 2 ชุดเพราะ โมเดลสองตัวนี้ใช้ Tokenizer แตกต่างกัน) โดยขั้นตอนนี้เราจะเอา Logits ที่ได้จากการคิดคำตอบของโมเดลมาเข้าฟังก์ชัน Softmax เพื่อแปลงค่าให้อยู่ในช่วง 0-1 หรือก็คือการแปลงค่าให้อยู่ในรูปแบบ Probability Distribution จากนั้นเก็บค่าความน่าจะเป็นของคำตอบของแต่ละโมเดลไว้
4. ความน่าจะเป็นของคำตอบที่เราเก็บไว้นั้นจะอยู่ใน List และแต่ละตัวจะเป็น Array อยู่ เพื่อความสะดวกในการคิดทีเดียวทั้งก้อน เราจึงนำมา Concatenate กันก่อนเพื่อให้ทั้งหมดรวมอยู่ในก้อนเดียวกัน จากนั้นทำ Weighted Average โดยการรวมความน่าจะเป็นของคำตอบระหว่างโมเดลที่หนึ่งและสองเข้าด้วยกัน (ก็คือจับมาบวกกันตรง ๆ) โดยที่บอกว่านำคะแนนจากโมเดลที่หนึ่งมาใช้ที่ 55% (0.55) และจากโมเดลที่สอง 45% (0.45) รวมเป็น 100% พอดี และทำการเลือกคำตอบจากคลาสที่มีคะแนนเยอะที่สุดเหมือนเดิม
Conclusion
การทำ Weighted Average สั้น ๆ คือการนำความน่าจะเป็นของคำตอบในแต่ละคลาสของโมเดลตั้งแต่ 2 ตัวขึ้นไปมาบวกรวมกัน โดยกำหนดว่าจะเอาจากโมเดลตัวไหนมาคิดมากน้อยอย่างไร ข้อดีคือส่วนใหญ่ช่วยให้โมเดลได้คำตอบที่ถูกต้องมากขึ้น ลด Overfitting ได้จากการที่ไม่ได้เชื่อแค่โมเดลตัวเดียว ข้อเสียคือจะต้องมีโมเดลหลายตัวและถ้าโมเดลแต่ละตัวไม่ได้มีข้อดีอะไรที่จะช่วยกันได้ก็อาจไม่ได้ทำให้ประสิทธิภาพดีขึ้นขนาดนั้น และข้อควรระวังที่ไม่ควรทำคือการพยายามหา Weighted ที่ดีที่สุดระหว่างโมเดลที่นำมารวมกัน เพราะเราไม่รู้ว่าสุดท้ายแล้วชุด Test หรือ Unseen Data เป็นอย่างไรการที่พยายามหา Weighted ที่ดีสุดบนชุดทดสอบเล็ก ๆ ของเราเพียงอย่างเดียวอาจทำให้ทำงานได้ไม่ดีเวลาเจอกับข้อมูลใหม่ ๆ ได้