มารู้จัก Transformer กันเถอะ (ตอนที่ 1)

ppp mena
mena.ai
Published in
3 min readMay 25, 2018

สวัสดีครับ ในบทความชุดนี้เราจะมาทำความรู้จักกับ architecture ใหม่ล่าสุดในแวดวง deep learning และ natural language processing (NLP) ที่ชื่อว่า Transformer กันครับ เนื่องจากความยาวของเนื้อหา จึงจะขอแบ่งเป็นออกเป็น 4 ตอนย่อยๆ คือ

  • ตอนที่ 1 จะเป็นการเกริ่นนำถึงความสำคัญของเปเปอร์ Attention Is All You Need และความเป็นมาก่อนที่จะมีเปเปอร์นี้
  • ตอนที่ 2 จะกล่าวถึง Attention Module ซึ่งถือเป็นหัวใจหลักของ Transformer ครับ
  • ตอนที่ 3 จะมาดู architecture ของ Transformer กัน
  • ตอนที่ 4 แสดงถึงข้อดีและจุดเด่นของ Self-Attention

ถ้าพร้อมแล้วเรามาเริ่มกันเลยครับ

เกริ่นนำ

เมื่อปีที่แล้วนี่เอง (ค.ศ. 2017) มีเหล่านักวิจัย 8 คน ซึ่งส่วนใหญ่มาจากบริษัท Google ได้ร่วมกันตีพิมพ์เปเปอร์ที่มีชื่อว่า Attention Is All You Need ซึ่งสั่นสะเทือนวงการ deep learning และ NLP อย่างสูง โดยสิ่งที่ทำให้เปเปอร์นี้ทรงอิทธิพลมากเห็นจะเป็นด้วยเหตุผลสามประการดังนี้ครับ

  1. ในโลกของ deep learning ปัจจุบัน โครงสร้าง network ที่เป็นมหาอำนาจในโลกนี้มีอยู่แค่สองเจ้าผู้ยิ่งใหญ่เท่านั้น คือไม่ RNN ก็ CNN นี่แหละครับ สำหรับ RNN ส่วนใหญ่จะใช้ในงานด้าน language และ CNN จะใช้ในงานด้าน vision แต่ทั้งนี้ทั้งนั้น CNN ก็เอามาใช้ในงานด้าน language ส่วน RNN ก็สามารถนำไปใช้ในงานด้าน vision ได้เช่นกัน ซึ่งเปเปอร์นี้เล็งเห็นทั้งจุดอ่อนของทั้ง RNN และ CNN จึงปฏิเสธที่จะใช้ทั้งสองอย่างนี้ในการทำ NLP เสียเลย แล้วหันมาใช้สิ่งที่เรียกว่า Attention เพียงอย่างเดียว โดยไม่ใช่แค่ Attention แบบวานิลลาธรรมดา แต่จะขยายขอบเขตและความสามารถของ Attention ขึ้นไป แล้วเรียก architecture ใหม่นี้ว่า Transformer ซึ่งไม่ได้หมายถึงหม้อแปลงไฟฟ้าหรือยานพาหนะที่แปลงรูปร่างเป็นหุ่นยนต์ได้แต่ประการใดนะครับ
  2. หัวใจหลักของ Transformer คือกระบวนการที่เรียกว่า Self-Attention โดยกระบวนการนี้นอกจากจะเป็นสิ่งที่ทดแทน RNN และ CNN ได้แล้ว ยังแสดงถึงความข้องเกี่ยวกันของคำต่างๆ ในข้อความ ทำให้สามารถแก้ปัญหา coreference resolution ไปได้กลายๆ ซึ่งการแก้ปัญหานี้มีความสำคัญอย่างมากต่องาน NLP หลายประเภท เช่น machine translation ครับ
  3. Transformer ให้ผลการทดลองในชุดข้อมูลมาตรฐานที่เหนือกว่าวิธีการอื่นอย่างชัดเจน ตัวอย่างเช่นในงาน machine translation ซึ่งใช้ชุดข้อมูล newstest2014 ทำการแปลจากภาษาอังกฤษเป็นภาษาเยอรมัน และภาษาอังกฤษเป็นภาษาฝรั่งเศส แล้ววัดผลโดยใช้ค่า BLEU ผลการเปรียบเทียบจะเป็นดังตารางด้านล่างนี้ ซึ่งนำมาจากเปเปอร์โดยตรง จะเห็นว่าการแปลไปภาษาฝรั่งเศสให้ค่าดีกว่าการแปลไปภาษาเยอรมัน นั่นเป็นเพราะว่าข้อมูลของภาษาฝรั่งเศสมีเยอะกว่าหลายเท่า และภาษาเยอรมันจะมี morphology ที่ซับซ้อนกว่านั่นเองครับ ซึ่ง Transformer สามารถอัพสกอร์ของภาษาเยอรมันได้มากกว่าวิธีอื่นถึงขนาดนี้โดยที่ใช้การคำนวณน้อยกว่าก็นับว่าเทพจริงๆ ครับ
เปรียบเทียบผลของ Transfomer กับวิธีอื่นๆ [Attention Is All You Need, Table 2]

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

ความมีส่วนร่วมของผู้ทำเปเปอร์ [Attention Is All You Need, authors]

ความเป็นมา

ประเภทของงาน machine learning อาจจะแบ่งตามลักษณะของ input ที่เข้ามาและ output ที่ได้ ซึ่งท่านผู้อ่านอาจจะคุ้นเคยกับงานประเภท classification หรือ regression กันดี แต่ในที่นี้เราจะสนใจงานที่มีข้อมูลเข้ามาเป็น sequence นึง แล้วให้ตอบกลับไปเป็นอีก sequence นึงได้ โดยจะขอเรียกว่า sequence-to-sequence learning นะครับ ซึ่งการทำ machine translation ก็ถือว่าเป็น sequence-to-sequence learning แบบนึง และนับว่าเป็นสิ่งที่ผู้คนให้ความสำคัญมากตั้งแต่ยุคสมัยแรกๆ ของ AI มาจนถึงปัจจุบันเลย

ตัวอย่างการทำ machine translation ที่แปลจากภาษาจีนเป็นภาษาไทย

ปัจจุบันวิธีที่เป็นมาตรฐานสำหรับทำงาน sequence-to-sequence learning คือ Sequence-to-Sequence Model (seq2seq) หรือเรียกอีกชื่อว่า RNN Encoder–Decoder ซึ่งโมเดลนี้จะแบ่งเป็นสองส่วน เรียกว่า encoder กับ decoder โดยส่วน encoder จะรับ input เข้ามาทีละหน่วยผ่านทาง RNN และเก็บสะสม information ที่จำเป็นไว้ จากนั้นจะผ่าน information นี้ไปยังส่วน decoder ซึ่งก็จะเป็น RNN อีกตัวนึงที่ให้ output ออกมาทีละหน่วย โดยดูจาก information ที่ได้รับมา และ output ตัวก่อนหน้า ซึ่งแผนภาพคร่าวๆ ของ seq2seq จะแสดงได้ดังนี้ครับ

ในที่นี้ seq2seq รับ input คือ “A B C” และให้ output เป็น “W X Y Z” ออกมา [Sutskever et al., Figure 1]

อย่างไรก็ดี โมเดล seq2seq จะมีปัญหาคอขวดเกิดขึ้น นั่นคือการส่ง information เป็นทอดๆ ตามสายยาวแบบนี้ อาจจะมี information ที่จำเป็นบางอย่างสูญหายไประหว่างทางได้ ยกตัวอย่างเช่น จากรูปข้างบน สมมติว่าเป็นงาน machine translation ที่แปลจากภาษาไทยไปเป็นภาษาอังกฤษ โดย “A B C” คือคำว่า “ฉัน เลี้ยง แมว” และ “W X Y Z” เป็นคำว่า “I have a cat” จะเห็นว่า output คำว่า “cat” จะขึ้นอยู่กับ input คำว่า “แมว” โดยตรง แต่ข้อมูลจาก C กว่าจะส่งมาถึง Z ต้องผ่านตัวกลางหลายทอด และอาจจะสูญหายได้ โดยเฉพาะอย่างยิ่งถ้าเป็นประโยคยาวๆ จึงมีความคิดว่า จะดีกว่าไหมถ้าเราให้กระบวนการสร้าง output สามารถโฟกัสไปที่ input ส่วนใดส่วนหนึ่งได้โดยตรง และนี่คือที่มาของ Attention นั่นเองครับ

การทำ Attention สำหรับ seq2seq [CS224n, Lecture 11]

การทำ Attention สำหรับ seq2seq สามารถแสดงได้ดังรูปด้านบนนี้ โดยเมื่อต้องการจะคำนวณ output ที่ตำแหน่งนึง ก็จะนำ vector ของ decoder (q) ณ ตำแหน่งนั้น มาใช้หา attention score กับ vector ของ encoder (p) ในทุกตำแหน่ง ซึ่งถ้า score ที่ encoder ตำแหน่งไหนสูง หมายความว่าเราจะให้ความสำคัญ หรือใส่ใจกับตำแหน่งนั้นมาก การคำนวณค่านี้ก็ทำได้หลายวิธี โดยวิธีที่ง่ายที่สุดก็คือการทำ dot product กันตรงๆ ระหว่าง p กับ q เลย ซึ่งหมายความว่าเราจะใส่ใจกับตำแหน่งที่มีค่า p ใกล้เคียงกับค่า q และเมื่อได้ค่า score ออกมาแล้ว ก็จะเอาเข้าฟังก์ชัน softmax เพื่อแปลงเป็นค่าความน่าจะเป็น ซึ่งค่านี้จะเปรียบเสมือน weight สำหรับ p ต่างๆ จากนั้นก็จะทำการหา weight average ของ p ออกมาเป็น vector เดียว (r) เพื่อนำไปใช้ในการคำนวณ output ต่อไป ซึ่งที่เขียนมาทั้งหมดสามารถสรุปได้เป็นสมการดังนี้ครับ

อันว่า Attention นี้ นอกจากจะแก้ปัญหาคอขวดดังที่กล่าวมาแล้ว ยังถือว่าสามารถแก้ปัญหา vanishing gradient ไปด้วยพร้อมกัน นอกจากนั้นถ้าเรามาลองดูว่า output ตำแหน่งต่างๆ ให้ความใส่ใจกับ input ที่ตำแหน่งใด ก็เท่ากับว่าเราได้ alignment มาฟรีๆ ซึ่งการทำ alignment นี้ ในกรรมวิธี machine translation แบบดั้งเดิม ที่ไม่ใช่ neural machine translation ถือว่าเป็นปัญหาสำคัญทีเดียวครับ

ตัวอย่าง alignment ที่ได้จาก Attention [CS224n, Lecture 11]

ในทางปฏิบัติก็พบว่าเมื่อใช้ Attention เข้ามาช่วยแล้ว ได้ผลลัพธ์ที่ดีกว่าเมื่อไม่ใช้แทบจะแน่นอน ปัจจุบัน Attention จึงเป็นเหมือนท่าบังคับพื้นฐานของการทำ sequence-to-sequence learning ไปแล้ว ถ้าหากเราใช้ซอฟต์แวร์สำหรับทำงานด้านนี้อย่างเช่น OpenNMT จะพบว่ามี Attention เป็น default ให้เลย และใน OpenNMT-py ตอนนี้ยังไม่มี option ให้เอา Attention ออกได้ด้วยครับ

อาจนับได้ว่า Attention เป็นกระบวนการ memory addressing รูปแบบนึง คล้ายๆ กับที่มีอยู่ใน Neural Turing Machines และผู้เขียนยังประทับใจตรงที่เรื่องนี้สามารถเปรียบเทียบกับจิตวิทยาการรับรู้ของคนเราได้อีกด้วย

--

--