มาลองเล่นแต่งเป็นกลอน ตอนที่ 2 : เมื่อทรานสฟอร์เมอร์เจอพระอภัย

Source: Deep Learning on Medium

มาลองเล่นแต่งเป็นกลอน ตอนที่ 2 : เมื่อทรานสฟอร์เมอร์เจอพระอภัย

(ภาพจากปกหนังสือ พระอภัยมณี ของ สนพ. เพชรกะรัต)

เกริ่นนำ

เมื่อไม่นานมานี้ ผู้เขียนได้เจอบทความ TRANSFORMERS FROM SCRATCH ของ Peter Bloem ซึ่งย่อยเนื้อหา Transformer แล้วนำมาอธิบายตั้งแต่พื้นฐาน มีทั้งแนวคิด ภาพประกอบ และโค้ด PyTorch อย่างครบครัน เมื่ออ่านแล้วจะทำให้รู้สึกได้เลยว่า Transformer ไม่ใช่เรื่องยากอีกต่อไป สำหรับผู้ที่อยากศึกษา สามารถเริ่มต้นจากบทความนี้ก็ได้ครับ

Peter Bloem ยังได้แชร์โค้ด Transformer สำหรับเรียนรู้แบบจำลองภาษาระดับอักขระเอาไว้ด้วย ในบทความก่อน ผู้เขียนได้ทำการทดลองเรียนรู้แบบจำลองภาษาระดับอักขระโดยใช้ LSTM มาคราวนี้เราจะลองใช้ Transformer กันดูบ้าง โดยจะทดลองกับชุดข้อมูลเดิม คือวรรณคดีเรื่องพระอภัยมณี นอกจากนี้ ไหนๆ ก็จะทำการทดลองแล้ว เลยโหลดวรรณคดีเรื่อง รามเกียรติ์ และ สามก๊ก มาร่วมด้วย ในส่วนของโค้ดที่ใช้ ผู้เขียนได้แก้ไขเพิ่มเติมจากต้นฉบับเพื่อให้รองรับภาษาไทย ผู้ที่สนใจสามารถเข้าไปดูได้ที่นี่ครับ

การทดลอง

ชุดข้อมูล

ชุดข้อมูลทั้งหมดในที่นี้ใช้ encoding เป็น cp874 ในแต่ละชุดข้อมูลก็จะมีจำนวน training data และ validation data รวมทั้ง test data ดังนี้ครับ

จำนวนข้อมูลในชุดข้อมูลต่างๆ

จะเห็นว่าทั้งสามชุดข้อมูลนี้มีจำนวนอักขระพอๆ กัน ราวๆ 2–3 ล้านตัว แต่มีลักษณะคำประพันธ์ที่ต่างกัน โดยชุดข้อมูลพระอภัยมณีเป็นกลอนสุภาพ ชุดข้อมูลรามเกียรติ์เป็นกลอนบทละคร และชุดข้อมูลสามก๊กเป็นร้อยแก้วที่มีสำนวนเฉพาะ ตัวอย่างของชุดข้อมูลทั้งสามเรียงตามลำดับเป็นดังนี้ครับ

ตัวอย่างชุดข้อมูลพระอภัยมณี
ตัวอย่างชุดข้อมูลรามเกียรติ์
ตัวอย่างชุดข้อมูลสามก๊ก

เซ็ตอัพ

ค่า hyperparameter ต่างๆ สำหรับการทดลองมีดังนี้

context length = 256
embedding size = 128
num head = 8
layer depth = 12

optimizer = Adam (+ warmup)
learning rate = 0.0003
batch size = 64
gradient clipping = 1.0

ผลการทดลอง

ในการทดลองจะเหมือนบทความที่แล้ว คือวัดค่า bit per character (bpc) ของแบบจำลองภาษากับ validation set และ test set แล้วมาลองดูตัวอย่างข้อความที่แบบจำลองภาษาผลิตออกมากันครับ

เชิงตัววัด

ค่า bpc และ learning curve ของข้อมูลชุดต่างๆ เป็นดังตารางและรูปด้านล่างนี้

ผลการทดลอง (ค่า bpc)
ผลการทดลอง (learning curve)

จะเห็นได้ว่าค่า bpc ของข้อมูลชุดพระอภัยมณีสูงกว่าการทดลองเดิมที่ใช้ LSTM อาจจะเป็นเพราะผู้เขียนยังปรับ hyperparameter ได้ไม่ดี หรืออาจจะมีเหตุผลอย่างอื่น ที่ทำให้ Transformer ใช้กับชุดข้อมูลนี้แล้วผลไม่ดีเท่า LSTM แต่โดยทั่วไปแล้ว Transformer จะได้เปรียบกว่า LSTM ตรงที่ Transformer เห็นข้อมูลทั้งหมดในช่วง context length และสามารถเลือกทำ attention กับส่วนที่สำคัญ ขณะที่ LSTM นั้นมีการส่ง information ต่อกันมาเป็นทอดๆ และอาจจะเกิดอาการลืมเลือนข้อมูลตัวที่อยู่ห่างไปได้

เชิงคุณภาพ

ตัวอย่างข้อความที่โมเดลผลิตขึ้นมาในชุดข้อมูลต่างๆ เป็นดังนี้

ตัวอย่างข้อความจากแบบจำลองภาษาพระอภัยมณี
ตัวอย่างข้อความจากแบบจำลองภาษารามเกียรติ์
ตัวอย่างข้อความจากแบบจำลองภาษาสามก๊ก

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

ปิดท้าย

บทความนี้ก็เป็นการทดลองเล็กๆ ที่ทำสนุกๆ นะครับ ถือเป็นภาคต่อจากบทความที่แล้ว ในที่นี้ยังมีอีกหลายส่วนที่ปรับปรุงเพิ่มเติมได้ เช่น ถ้าให้ input เป็นหน่วย subword แทน character หรือใช้ Transformer-XL แทน Transformer แบบดั้งเดิม ก็อาจจะทำให้ผลที่ได้นั้นดีขึ้น ที่สำคัญคือดีกรีในการอ่านรู้เรื่องของการทดลองนี้ยังห่างไกลจากความสามารถในการประพันธ์ของมนุษย์มากนัก แต่ขณะนี้ก็มีโมเดลที่สามารถแต่งข่าวปลอม และความคิดเห็นปลอม ได้คล้ายกับของจริงแล้ว ซึ่งถือเป็นเทคโนโลยีที่สามารถนำมาใช้ทั้งในทางที่เป็นประโยชน์หรือเป็นโทษก็ได้ กลายเป็นปัญหาทางจริยธรรมที่เกิดขึ้นตามมาอย่างไม่อาจหลีกพ้นเมื่อระบบ AI มีการพัฒนาก้าวหน้าขึ้นไปอย่างไม่หยุดยั้งเช่นในปัจจุบันครับ