All You Need Is Attention … แค่ใส่ใจกันเท่านั้นก็พอ

ppp
8 min readMay 24, 2018

--

ระดับ : Beginner / Intermediate / Advanced (ณ เวลาที่เขียน)
เชิง : Concept / Mathematics / Implementation / Creativity / Others
แท็ก : Deep Learning, Natural Language Processing

สวัสดีครับ บทความนี้ก็นับว่าเป็นบทความแรกของผู้เขียนเลย หากท่านผู้อ่านพบความบกพร่องผิดพลาดที่อยากให้เพิ่มเติมแก้ไข หรือมีข้อสงสัยไม่กระจ่างในส่วนไหน แล้วอยากจะซักถาม ก็สามารถส่งข้อความเข้ามาที่ตรงด้านล่างได้เลยนะครับ ก่อนอื่นเห็นชื่อแล้ว ก็ใช่ว่าบทความนี้จะมีเนื้อหาเกี่ยวกับด้านประชานศาสตร์หรือจิตวิทยาความสัมพันธ์แต่อย่างใด หากแต่เป็นหัวข้อที่กำลังมาแรงมากในวงการ deep learning และ natural language processing (NLP) เลยทีเดียว โดยในบทความนี้ เบื้องต้นจะเกริ่นนำถึงความสำคัญและประวัติความเป็นมา ก่อนที่จะอธิบายถึงรายละเอียดของสิ่งที่เรียกว่า Transformer กันต่อไปครับ

เกริ่นนำ

เมื่อปีที่แล้วนี่เอง (ค.ศ. 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 และผู้เขียนยังประทับใจตรงที่เรื่องนี้สามารถเปรียบเทียบกับจิตวิทยาการรับรู้ของคนเราได้อีกด้วย

Transformer Architecture

ในส่วนนี้จะได้มีโอกาสพูดถึง Transformer กันแล้ว โดยจะขอแบ่งออกเป็นสองหัวข้อใหญ่ เริ่มจาก Attention Module ซึ่งก็คือส่วนประมวลผลหลักและถือเป็นหัวใจของ Transformer เลย จากนั้นจะรวมร่าง module ต่างๆ ขึ้นเป็น Transformer Model ที่พร้อมจะใช้สำหรับงานด้าน sequence-to-sequence learning ต่อไปครับ

Attention Module

Attention ใน Transformer จะต่างจาก Attention ใน seq2seq ที่กล่าวมาข้างต้นหลายประการ ประการแรกคือไม่ใช่เป็นการหา attention vector ของส่วน decoder จากส่วน encoder เพียงทางเดียวเท่านั้น แต่ทุกๆ หน่วยของข้อมูลจะทำ attention กันเองด้วย สิ่งนี้เรียกว่า Self-Attention และการทำ Attention จะเป็นแบบ Scaled Dot-Product Attention ที่เสริมด้วย Multi-Head Attention ซึ่งมีรายละเอียดดังนี้ครับ

Scaled Dot-Product Attention

ในที่นี้จะมาขยายความ Attention จากที่กล่าวมาแล้วให้เป็น Attention ที่ใช้ใน Transformer กันครับ โดยเริ่มจากการแบ่งประเภท vector เป็น query กับ key และ value ซึ่ง query ในที่นี้ จะเหมือนกับ q ในหัวข้อที่แล้ว ส่วน p ในหัวข้อที่แล้ว จะเหมือนเป็นทั้ง key (k) และ value (v) ไปพร้อมกัน โดย k คือ vector ที่นำไปทำ dot product กับ q เพื่อดูว่าควรจะใส่ใจกับตำแหน่งไหน และ v จะเป็นค่าที่นำมาใช้นั่นเอง เปรียบเสมือนกับเรามีหีบ (k, v) อยู่หลายใบ โดย k เป็นกุญแจล็อคหีบ และ v เป็นของที่อยู่ข้างใน ส่วน q ก็คือลูกกุญแจที่นำมาไขหีบ ถ้า q เข้ากับ k ได้ดี ก็จะสามารถนำ v ไปใช้ได้มาก ซึ่งการทำ Attention ในที่นี้ ก็คือฟังก์ชัน A ที่รับ q กับ K และ V เข้ามา แล้วให้ผลลัพธ์ออกไปเป็น vector ตัวนึงที่เป็นส่วนผสมของ v ต่างๆ โดยที่ให้ความสำคัญกับ v ตามค่าของ k·q หรือจะเขียนเป็นสมการได้ว่า

และอาจเขียนเป็นแผนภาพได้ดังนี้ครับ

แผนภาพแสดงการคำนวณ Attention

ถ้าหากว่าต้องการคำนวณ q หลายๆ ตัว เราก็สามารถทำให้เป็นการคูณ matrix ได้เลย จากสมการข้างบน ก็จะกลายเป็น

โดยที่แต่ละเวคเตอร์ q, k, v คือ row vector ใน Q, K, V ตามลำดับ และการทำ softmax ในที่นี้ก็จะทำตาม row และผล attention vector ของแต่ละ q ก็คือแต่ละ row ใน A(Q, K, V) นั่นเองครับ

ทั้งนี้หาก dimension ของ k ซึ่งเท่ากับ dimension ของ q มีค่าสูง ค่าของ k·q ก็จะสูงตามไปด้วย ซึ่งพอเข้า softmax แล้ว จะไปอยู่ในบริเวณที่มี gradient น้อย ทำให้ยากต่อการ optimization ผู้ทำวิจัยจึงได้ลดขนาดของ k·q ตามจำนวน dimension ของ k ด้วย ดังนี้ครับ

จากการเลือกใช้ Attention แบบ dot product ที่ประหยัดทั้งเวลาและเนื้อที่ในการคำนวณมากกว่า Attention แบบอื่นๆ โดยเพิ่ม scaling factor เข้าไป จึงได้ออกมาเป็น Scaled Dot-Product Attention ซึ่งสมการข้างต้นก็สามารถเขียนเป็นแผนภาพได้ดังนี้ครับ

Scaled Dot-Product Attention [Attention Is All You Need, Figure 2 (left)]

Multi-Head Attention

จะเห็นว่า Scaled Dot-Product Attention จากหัวข้อที่แล้ว ถ้านำมาใช้เลยทันทีจะมีข้อจำกัดอยู่สองอย่างด้วยกัน อย่างแรกก็คือข้างต้นนี้เป็นการนำค่า Q, K, V มาคำนวณตรงๆ ซึ่งอาจไม่ใช่ representation ที่เหมาะสมสำหรับการทำ Attention เราจึงควรจะให้ระบบมีการเรียนรู้ representation ที่เหมาะสมด้วย โดยการใส่ weight เข้าไป ทำให้ Attention Module กลายเป็นดังนี้ครับ

แต่ถึงกระนั้นก็ยังมีข้อจำกัดอยู่ตรงที่ทุกหน่วยของข้อมูลมีปฏิสัมพันธ์กันได้เพียงแบบเดียว ซึ่งไม่เพียงพอสำหรับงานทั่วไปที่หน่วยต่างๆ ของข้อมูลจะมีความสัมพันธ์กันได้หลายแบบ เช่นประโยคที่ว่า “ฉันเลี้ยงแมว” คำว่า “แมว” กับ “ฉัน” อาจจะมีความสัมพันธ์โดยที่ “แมว” เป็นกรรมตรงของประโยคที่มีประธานคือ “ฉัน” หรือ “ฉัน” คือสิ่งที่แสดงความเป็นเจ้าของของ “แมว” ก็ได้ เพราะฉะนั้น จึงควรจะมี Q, K, V ไว้หลายๆ ชุด ซึ่งจะถูกคูณด้วยค่า weight ที่ต่างกันออกไป เพื่อให้สามารถเรียนรู้ความสัมพันธ์ต่างๆ ได้ จากนั้นจึงทำ Attention ในแต่ละชุด ก่อนที่จะรวมทุกชุดเข้าด้วยกันเป็นข้อมูลเพื่อส่งไปประมวลผลต่อไป โดย Attention ชุดนึง จะเรียกว่าหัวหัวนึง และ Multi-Head Attention คือการนำทุกหัวมารวมกัน ซึ่งเขียนเป็นสมการได้ดังนี้ครับ

การที่มีหลายหัวเช่นนี้ อาจเทียบได้กับ CNN ที่มีหลาย channel ซึ่งแต่ละ channel ก็จะเรียน feature ที่แตกต่างกันไป และดูจะตรงกับภาษิตไทยที่ว่า “หลายหัวดีกว่าหัวเดียว” อยู่เหมือนกัน สุดท้ายแล้ว Multi-Head Attention สามารถสรุปออกมาเป็นภาพได้ดังนี้ครับ

Multi-Head Attention [Attention Is All You Need, Figure 2 (right)]

Attention แบบต่างๆ

ใน Transformer จะใช้ Attention ที่ต่างกันสามแบบ ดังนี้ครับ

Self-Attention [Łukasz Kaiser]

แบบแรกคือ Self-Attention ปกติ ที่ทุกหน่วยจะทำ Attention กับทุกหน่วย

Masked Self-Attention [Łukasz Kaiser]

แบบที่สองคือ Masked Self-Attention ที่แต่ละหน่วยทำ Attention กับเฉพาะข้อมูลที่อยู่ด้านหน้าเท่านั้น โดย Attention ชนิดนี้จะใช้กับส่วน decoder เนื่องจากกระบวนการผลิต output ในตอนใช้งานจริงเป็นการผลิตทีละตัว จึงไม่สามารถนำข้อมูลจากอนาคตมาใช้ได้

Encoder-Decoder Attention [Łukasz Kaiser]

ส่วนแบบที่สามคือ Attention ที่เหมือนกับที่ใช้ใน seq2seq ทั่วไป โดยฝั่ง decoder จะเป็นตัว query ข้อมูลจากฝั่ง encoder

Transformer Model

ในหัวข้อนี้เราจะมาดู Transformer แบบเต็มๆ กันครับ

The Transformer [Attention Is All You Need, Figure 1]

Transformer Model นี้ จะยังคงแบ่งเป็นสองฝั่งอยู่ โดยฝั่งซ้ายจะเป็น encoder ที่รับ input sequence เข้ามา ส่วนฝั่งขวาคือ decoder ที่รับ output sequence โดยในขั้นตอนการเทรนนี้ output sequence จะถูกเลื่อนไปทางขวาหนึ่งตำแหน่ง ซึ่งเป็นการเทรนแบบ teacher forcing นั่นเองครับ

Embedding & Positional Encoding

จากนั้นจะเข้าสู่การทำ embedding (กล่องสีชมพู) ที่เป็นขั้นตอนพื้นฐานสำหรับงาน NLP แทบทุกประเภท โดยสามารถทำ embedding ได้หลายรูปแบบ ในเปเปอร์นี้ได้ใช้วิธี Byte-Pair Encoding ซึ่งปัจจุบันใช้กันแพร่หลายในงาน neural machine translation ครับ

เนื่องจากในที่นี้เป็นการทำ Attention เพียงอย่างเดียว โดยไม่ได้ใช้ RNN หรือ CNN แล้ว ทำให้ข้อมูลเกี่ยวกับตำแหน่งสูญหายไป จึงมีการใส่ Positional Encoding เข้ามาด้วย โดยใช้ periodic function ซึ่งก็คือ sin และ cos ที่ความถี่ต่างๆ กัน มาหาค่าในแต่ละตำแหน่งดังนี้ครับ

โดยที่ pos ก็คือตำแหน่ง และ 2i กับ 2i+1 คือแต่ละ dimension ของ position vector หรืออาจแสดงเป็นรูปคร่าวๆ เพื่อให้เข้าใจได้ง่ายขึ้นดังนี้ครับ

ตัวอย่าง Positional Encoding [ricardokleinklein.github.io]

ในที่นี้ position vector ของตำแหน่ง p ตัวที่ j จะได้จากค่าของ periodic function ตัวที่ j ในตำแหน่ง p โดยช่วงความถี่สูงจะแยกแยะตำแหน่งที่อยู่ใกล้กัน และช่วงความถี่ต่ำจะแยกแยะตำแหน่งที่อยู่ไกล ซึ่งการทำ Positional Encoding แบบนี้ เป็นการใช้ข้อมูลเชิงความถี่มาประกอบกันครับ

Encoder

ส่วนของ Encoder [Attention Is All You Need, Figure 1]

ในแต่ละ block ของ encoder จะประกอบไปด้วยสอง layer ใหญ่ๆ โดย layer แรกจะมี Multi-Head Attention (กล่องสีส้ม) ที่ได้อธิบายไปแล้ว เป็น sub-layer หลัก จะเห็นว่า input ที่เข้ามาสู่ sub-layer นี้ เป็นลูกศรสามหัว ซึ่งแต่ละหัวก็คือ V, K, Q นั่นเอง ส่วน layer ถัดไป (กล่องสีฟ้า) จะเป็น position-wise fully connected feed-forward network สองชั้น ซึ่ง position-wise network ในที่นี้คือสิ่งเดียวกับ 1x1 convolutional network ครับ

ข้อมูลขาเข้าของ layer เหล่านี้ (x) จะถูกส่งผ่านทางลัดเป็น residual connection เข้ามาสมทบกับผลลัพธ์ที่ออกมาจาก sub-layer หลัก จากนั้นจะทำ layer normalization กับผลลัพธ์นี้อีกทีนึง ในที่สุดแล้วผลลัพธ์ของแต่ละ layer ก็คือ

โดยที่ทั้ง block นี้จะซ้อนกันไปเรื่อยๆ หลายชั้น ตามสไตล์ของ deep learning ซึ่งใน Transformer ได้เลือกใช้จำนวนชั้นเท่ากับ 6 และเพื่อความง่ายในการคำนวณ ทั้ง embedding กับผลลัพธ์จากทุก sub-layer จะมีจำนวน dimension เป็น 512 ครับ

Decoder

ส่วนของ Decoder [Attention Is All You Need, Figure 1]

แต่ละ block ของ decoder มีสาม layer ใหญ่ๆ โดย layer ล่างและ layer บน จะเหมือนกับทางฝั่ง encoder เลยครับ เว้นเสียแต่ว่าที่ layer ล่าง จะเป็น Masked Self-Attention ส่วน layer ตรงกลาง จะเป็น Encoder-Decoder Attention ซึ่งรับ V และ K มาจาก encoder และใช้ข้อมูลจาก decoder เป็น Q

ในส่วนของ decoder จะประกอบด้วย block เรียงกันไป 6 ชั้น เท่ากับของ encoder โดยผลลัพธ์จาก block สุดท้ายของ encoder จะถูกส่งเข้ามาที่ layer ตรงกลางของแต่ละ block และผลลัพธ์ที่ออกจาก block สุดท้ายของ decoder จะถูกนำเข้า softmax เพื่อผลิตเป็น output ออกไป

Animation

สุดท้ายนี้เป็น animation ที่แสดงให้เห็นการทำงานของ Transformer ครับ

animation การทำงานของ Transformer [Google AI Blog]

Why Self-Attention

การใช้ Self-Attention เพียวๆ นี้ดีอย่างไร ในที่นี้เราจะมาลองเปรียบเทียบกับวิธีอื่น แล้วลองมาดู visualization ของ Self-Attention กันครับ

Comparison

เปรียบเทียบ Self-Attention กับวิธีอื่นๆ [Attention Is All You Need, Table 1]

จากตารางข้างบน คอลัมน์ Complexity per Layer คือการคำนวณที่ใช้ในแต่ละ layer คอลัมน์ต่อมาคือ sequential operation ที่จำเป็นต้องใช้ และคอลัมน์สุดท้ายคือระยะทางมากที่สุดที่ต้องส่งข้อมูลถึงกัน โดยที่ n คือความยาวของ sequence และ d คือ representation dimension ครับ

RNN

การที่ต้องส่งข้อมูลต่อกันเป็นทอดๆ นับเป็นข้อจำกัดสำคัญทั้งในด้านการคำนวณและความถูกต้องของข้อมูล ในด้านการคำนวณนั้น sequential operation ได้กีดกั้นความสามารถของ parallel computation ซึ่งเป็นหนึ่งในจุดแข็งของ deep learning ออกไป นอกจากนั้นการส่งข้อมูลต่อกันเป็นทอดๆ ก็จะเกิดปัญหา bottleneck และ vanishing gradient ดังที่กล่าวมาแล้ว เพราะฉะนั้น O(n) ในสองคอลัมน์หลังจึงถือเป็นจุดอ่อนที่สำคัญของ RNN ทีเดียวครับ

CNN

ถึงแม้ CNN จะทำ parallelization ได้ แต่การประมวลผลข้อมูลเป็นแบบ locality และกว่าที่ข้อมูลส่วนที่อยู่ไกลกันจะได้รับการประมวลผลร่วมกัน ก็ต้องผ่านไปหลายชั้นแล้ว เมื่อ k เป็นความกว้างของ receptive field ใน CNN จะได้ว่าข้อมูลทั้งหมดของ sequence จะถูกประมวลผลรวมกันในชั้นที่ O(log(n)/log(k)) ซึ่งต่างจาก Self-Attention ที่ข้อมูลถูกส่งถึงกันหมด จึงได้ maximum path length เป็น O(1) เท่านั้น

นอกจากนี้ Self-Attention ยังให้ความสำคัญกับข้อมูลแต่ละตัวได้ผ่านทางกลไก Attention ซึ่งต่างจาก CNN ที่มองเห็นข้อมูลแต่ละตัวแตกต่างกัน และมีความสำคัญพอๆ กันหมด ดังรูปด้านล่างนี้ครับ

Convolution และ Self-Attention [Łukasz Kaiser]

Self-Attention

เนื่องจาก ณ จุดๆ นึงใน Self-Attention ต้องคำนวณจากข้อมูลของทุกจุด ทำให้ใช้เวลาคำนวณเป็น O(n²d) แต่ในงาน sequence-to-sequence learning ทั่วไป ค่า n ซึ่งเป็นความยาวของ sequence จะไม่สูงมาก ทว่าค่า d อาจจะสูงมากๆ ได้ โดยทั่วไป O(n²d) จึงมีความได้เปรียบกว่า O(nd²) แต่ถ้า n มีค่ามากจริงๆ อาจจะใช้เป็น Restricted Self-Attention ที่ทำ Self-Attention กันเฉพาะในบริเวณที่ความยาว r ก็ได้ครับ

Visualization

เมื่อผ่านการเรียนรู้แล้ว Self Multi-Head Attention สามารถนำมาแสดงเป็นรูปได้ ดังเช่นตัวอย่างต่อไปนี้ครับ

Visualization of Self Multi-Head Attention [Attention Is All You Need, Figure 3]

โดยแต่ละสีแสดงถึงแต่ละหัวของ Multi-Head Attention ในที่นี้ได้เลือกคำว่า making ออกมาเพื่อดูว่าคำนี้ให้ความใส่ใจกับคำไหนในประโยคบ้าง ซึ่งก็พบว่าดูจะให้ความใส่ใจกับส่วนที่เป็น “more difficult” ซึ่งเป็นคำขยายที่ทำให้เกิดวลี “making … more difficult” ขึ้นมา

Coreference Resolution

มีคำกล่าวในวงการ NLP ที่เรียกว่า Winograd Schema ว่า ถ้าเจ้าสามารถแก้ปัญหา coreference resolution ได้อย่างไม่มีผิดพลาด นั่นเท่ากับว่าเจ้าได้เข้าใจภาษาธรรมชาติแล้ว เพราะว่าการแก้ปัญหานี้จำเป็นต้องอาศัยความเข้าใจทางภาษาเป็นอย่างมากทีเดียว และเป็นเรื่องน่าตื่นเต้นว่าการทำ Self-Attention นั้น เหมือนจะแก้ปัญหานี้ไปได้ในตัว ดังรูปด้านล่างนี้ครับ

Self-Attention ช่วยแก้ปัญหา coreference resolution [Google AI Blog]

มนุษย์เราเมื่ออ่านสองประโยคข้างบน จะรู้ได้ทันทีว่าคำว่า “it” หมายถึงอะไร แต่การจะสอนให้คอมพิวเตอร์เข้าใจนั้นยากมาก การทำ coreference resolution จึงเป็นหัวข้อวิจัยในทาง NLP มาช้านาน และงานด้าน machine translation ต้องแก้ปัญหานี้ให้ได้ด้วยเช่นกัน เช่นในการแปลจากภาษาอังกฤษเป็นภาษาฝรั่งเศส คำว่า “it” จะแปลเป็น “il” หรือ “elle” ก็ได้ ขึ้นอยู่กับว่า “it” ตัวนี้ใช้แทนคำนามเพศไหน การที่ Self-Attention ทำ coreference resolution ได้ดี จึงส่งผลให้ทำ machine translation ได้ดีตามไปด้วยครับ

ปิดท้าย

เปเปอร์ Attention Is All You Need เปิดตัวในปี 2017 ผู้เขียนได้เขียนบทความนี้ในปี 2018 มาถึงปี 2019 นี้ ก็เป็นที่ประจักษ์แล้วว่า Transformer คือบรรทัดฐานของวงการ NLP อย่างแท้จริง เนื่องจากโมเดลที่สร้างปรากฏการณ์ในช่วงที่ผ่านมานี้ ล้วนต่อยอดมาจาก Transformer ทั้งสิ้น โดยเฉพาะอย่างยิ่ง BERT และ GPT-2 นอกจากนี้ ยังมีงานวิจัยที่อ้างอิงถึงเปเปอร์ Attention Is All You Need และ BERT มากมาย เป็นจำนวนหลายพันฉบับ (นับถึงช่วงปลายปี 2019) รวมทั้งได้มีการนำ Transformer หรือ BERT ไปใช้กับงานด้านต่างๆ กันอย่างกว้างขวาง จึงถือว่า Transformer และ BERT ได้เปิดโลกใบใหม่ กำลังเป็นหัวข้อวิจัยที่มาแรง ทั้งยังเป็นโมเดลระดับ state of the art ที่นิยมนำมาใช้กันอย่างแพร่หลายในปัจจุบันครับ

แหล่งเรียนรู้เพิ่มเติม

  • เปเปอร์หลัก
  • Google AI Blog
  • ในคอร์ส CS224n มีสไลด์ที่สรุป Transformer ได้ดีมากครับ
  • วีดีโอการบรรยายของ Łukasz Kaiser หนึ่งในผู้ทำเปเปอร์ ทำให้ได้รับรู้แง่มุมเพิ่มเติมในด้านต่างๆ เสริมจากการอ่านเปเปอร์เยอะเลย
  • ในฟากภาษาไทยจะมี lecture ของอาจารย์เอกพล ซึ่งบรรยายเรื่อง Transformer ไว้โดยละเอียด ทำให้ผู้เขียนมีความเข้าใจในเรื่องนี้มากขึ้นครับ
  • ในตอนต้นผู้เขียนได้ละรายละเอียดเกี่ยวกับ RNN ไว้ ซึ่งในทางปฏิบัติ RNN ส่วนใหญ่จะใช้ unit ที่เรียกว่า LSTM หรือไม่ก็ GRU ซึ่ง vector ของ seq2seq ในบทความนี้ ก็คือ hidden state ของ LSTM หรือ GRU สำหรับผู้ที่สนใจเรื่อง RNN อาจเริ่มต้นศึกษาจากคอร์ส Sequence Models ของอาจารย์ Andrew Ng ก็ได้ครับ

เพิ่มเติมแหล่งเรียนรู้เพิ่มเติม

ภายหลังจากที่เผยแพร่บทความนี้แล้ว ผู้เขียนก็ได้พบบทความอื่นๆ ที่เขียนอธิบายได้ดีมากๆ ดังนี้ครับ

--

--