ทำความเข้าใจ Transformer [Part I]

Pakawat Nakwijit
4 min readJun 16, 2020

--

คำเตือน เนื้อหาในบทความนี้เต็มไปด้วยศัพท์แสงทางวิชาการ โปรดใช้วิจารณญาณก่อนเสพ

credit: https://deepfrench.gitlab.io/deep-learning-project/

บทความนี้ ตั้งใจเขียนขึ้นเพื่อทำความรู้จักเปเปอร์ Attention Is All You Need ซึ่งนำเสนอมาตั้งแต่ในปี 2017 โดยเนื้อหาทั้งหมดในเปเปอร์ คือ โมเดลรูปแบบใหม่ ภายใต้ชื่อ Transformer โดยมีหัวใจสำคัญอยู่ที่กระบวนการที่เรียกว่า Self-Attention

จากเทรนด์ที่ผ่านมา สามารถพูดได้เต็มปากเลยว่า งานชิ้นนี้ได้สร้างแรงสั่นสะเทือนให้กับวงการ Deep Learning และ NLP อย่างมหาศาล ภายในเวลาแค่ 3 ปี มีจำนวน citation มากถึง 8000 ชิ้น นอกจากนี้ หลายๆโมเดลสมัยใหม่ ไม่ว่าจะเป็น BERT, GPT หรือ Transformer XL ต่างก็ต่อยอดมาจากงานชิ้นนี้ ถือได้ว่าเป็นงานชิ้นสำคัญที่ควรค่าแก่การอ่าน และทำความเข้าใจ

Getting to know Neural Machine Translation

ก่อนอื่นเลย ขออธิบายก่อนว่า Transformer ออกแบบมาเพื่อแก้ปัญหาอันนึง ที่ชื่อว่า Machine Translation

Machine translation หรือ กระบวนการแปลภาษาโดยใช้คอมพิวเตอร์ เป็นปัญหาระดับ classic ทางด้าน NLP ซึ่งสามารถสืบย้อนได้ไปถึงช่วงสงครามเย็น โดยใจความสำคัญของ Machine translation คือ การเปลี่ยนจากประโยคอะไรสักอย่างในภาษาหนึ่งไปเป็นอีกประโยคที่อยู่คนละภาษา แต่ยังคงความหมายเดิม

ปัญหาสำคัญของการแปลภาษา คือ มันเป็นทั้งศาสตร์และศิลป์ การแปลที่ดีต้องมีองค์ประกอบทั้งความถูกต้อง (correctness)และ ความครบถ้วน (comprehensiveness) ทั้งในด้านอารมณ์และข้อมูล ซึ่งถือเป็นงานที่ยาก แม้ว่าจะใช้มนุษย์เป็นคนแปลก็ตาม นอกจากนี้ การแปลหลายๆอย่าง ยังจำเป็นจะต้องอาศัย common sense หรือความเข้าใจธรรมชาติของโลกอีกด้วย

Machine Translation model ชิ้นแรกๆ เริ่มต้นจากการใช้ความน่าจะเป็น (probabilistic model) เมื่อนำมาใช้จริงๆ แต่มักพบว่า มันไม่สามารถจับใจความสัมพันธ์ที่ซับซ้อนๆได้อย่างถูกต้อง เนื่องด้วยว่าโมเดลรูปแบบนี้ มักออกแบบให้จัดการคำในประโยค (word) แยกออกจากกัน หรือ อยู่ในรูปแบบ Bag of Words ทำให้ข้อมูลความสัมพันธ์ระหว่างคำหายไป หรือ อาจจะออกแบบโมเดลภายใต้เงื่อนไขบางอย่างซึ่งไม่สามารถใช้ได้จริงในเชิงปฏิบัติ

ต่อมา ความสนใจจึงโดนเบนมาที่ Neural Network ซึ่งสามารถจัดการความสัมพันธ์ที่ซับซ้อนได้ดีมากกว่า โดยหนึ่งในเทคนิคที่ใช้กันอย่างแพร่หลายในปัจจุบัน (2020) ไม่ว่าจะในเชิงวิชาการ หรือ เชิงธุรกิจ ในปัญหา Machine Translation คือ sequence-to-sequence model หรือ encoder-decoder model โดยมองว่า การแปลภาษาคือ การแปลง sequence หนึ่ง ไปเป็นอีกหนึ่ง sequence (sequence-to-sequence tasks) โดยโมเดลประเภทนี้ประกอบด้วย 2 โมเดล คือ

  1. Encoder ทำหน้าที่ แปลงประโยคเริ่มต้น ไปเป็น สิ่งที่เรียกว่า intermediate representation ซึ่งเข้ารหัส(encode) ข้อมูลทั้งหมดในประโยค ทั้งในเชิงโครงสร้าง(grammer) และเชิงความหมาย(semantic) ลงในกลุ่มตัวเลขยึบยับๆอันนึง
  2. Decoder ทำหน้าที่ แปลง intermediate representation ที่ได้รับมาจาก encoder แล้วแปลงกลับไปเป็นประโยค
Encoder-decoder model architecture

โครงสร้าง แบบ Encoder-Decoder นี้มีข้อดีที่สำคัญคือ เราสามารถเทรนปรับเปลี่ยน Encoder/Decoder ได้อย่างอิสระ ถ้าอยากได้ ตัวแปลภาษา EN-TH ก็แค่ใช้ Encoder ภาษาอังกฤษ ต่อกับ Decoder ภาษาไทย แต่ถ้าเปลี่ยนเป็น EN-CH ก็แค่เปลี่ยนเป็น Decoder ภาษาจีน

วิธีเดียวกันนี้ สามารถประยุกต์ได้อีกหลากหลายงาน เช่น ในปัญหาเปลี่ยนคำพูดเป็นตัวอักษร (Speech Recognition) ก็แค่เปลี่ยน Encoder เป็นตัวรับเสียงต่อเข้ากับ Decoder ภาษาไทย หรือ ปัญหาสร้างรูปจากคำอธิบายภาพ (Image Captioning) สิ่งที่ต้องทำก็แค่เปลี่ยน Encoder เป็นตัวรับภาพ เป็นต้น

แต่โจทย์สำคัญสำหรับโมเดลนี้ คือ จะสร้าง encoder และ decoder ได้ยังไง ?? ที่จะสามารถทำงานได้มีประสิทธิภาพมากที่สุด ?? โดยเฉพาะอย่างยิ่งกับข้อมูลที่เป็นภาษา

ในยุคสมัยนี้ ซึ่งถือได้ว่าเป็นยุคสมัยของ Deep Learning ที่แท้ทรู เป็นยุคที่ซึ่งยึดครองโดย 2 มหาอำนาจสำคัญ คือ RNNs และ CNNs เพราะทั้งสองเป็นแค่ไม่กี่ตัวเลือกที่ทรงพลัง และสามารถแก้ปัญหายากๆได้อย่างมีประสิทธิภาพ ทั้งคู่จึงเป็นตัวเลือกแรกๆสำหรับ encoder และ decoder

ปัญหา คือ ทั้งคู่ต่างมีข้อจำกัดในตัวเอง และข้อจำกัดเหล่านี้แหละทำให้โมเดลที่ได้ไม่สามารถแก้ปัญหา Machine translation ได้ดีเท่าที่ควร Why?

RNNs หรือ Recurrent Neural Networks เป็นรูปแบบของ neural network ได้รับความนิยมอย่างมาก โดยมีหลักการสำคัญ คือ นอกจากประมวลผลผลลัพธ์จากข้อมูลที่มี ณ เวลาปัจจุบัน มันยังมีการเอาผลลัพธ์ที่ได้จากการคำนวณครั้งก่อนๆ ย้อนกลับมาใช้เป็นข้อมูลขาเข้าอีกครั้ง ซึ่งมีประโยชน์อย่างมากในข้อมูลที่มีลักษณะเป็น squential อย่าง เสียง และ ราคาหุ้น

โดยข้อมูลที่เป็น squential คือ ข้อมูลที่ลำดับของข้อมูล (data sequence matters) มีความสำคัญ ในข้อมูลประเภทนี้ แต่ละจุดของข้อมูลขึ้นอยู่กับข้อมูลจุดอื่นๆ (depends on other data points) เช่น ข้อมูลราคาตลาดหุ้น ราคาของเมื่อวานมักมีอิทธิผลกับราคาในวันนี้

ภาษาก็ถือเป็นหนึ่งใน sequential data ประโยคอย่าง “ฉันรักแมว” และ “แมวรักฉัน” ไม่เหมือนกัน เพราะ คำที่อยู่ก่อนกริยาคือ ผู้กระทำ แต่ คำที่อยู่หลังกริยา คือ กรรม ตำแหน่งของคำมีผลต่อการทำความเข้าใจประโยค

ตัวอย่าง การประมวลผลของ RNN ซึ่งนำเข้าคำและข้อมูลจากคำก่อนหน้า ไปประมวลผล

ด้วยเหตุนี้ RNNs จึงเป็นโมเดลสำคัญที่ใช้กันอย่างกว้างขวางในการศึกษาภาษาธรรมชาติ ทั้งนี้ ปัญหาสำคัญที่พบในการสร้าง RNNs คือ มันไม่สามารถจดจำความสัมพันธ์ระหว่างคำที่อยู่ไกลๆได้ ( Long-range dependencies) เช่น ประโยค

“คุณย่ารักแมวที่แสนน่ารักสีขาวปุกปุยของฉันมากและนางเป็นแค่คนเดียวที่สามารถกอดมันได้ …”

สังเกตุว่า การทำความเข้าใจประโยคนี้ โมเดลจำเป็นจะต้องจดจำให้ได้ว่า “มัน” คำเกือบสุดท้าย อ้างถึงคำว่า “แมว” ซึ่งอยู่ตอนต้นของประโยค ซึ่งเป็นปัญหาที่ยากมาก เพราะว่า RNNs จะค่อยๆประมวลผลคำทีละคำ แล้วส่งต่อผลลัพธ์ของคำก่อนหน้าไป ประมวลคำที่อยู่ถัดไป

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

ถึงแม้ว่ามีโมเดลหลายๆตัวต่อยอดจาก RNNs โดยการสร้าง Gate เพื่อควบคุมสิ่งที่จะจำ หรือ ลืม เพื่อแก้ไขปัญหานี้ อย่าง LSTMs และ GRUs แต่ก็ยังไม่สามารถแก้ปัญหาได้อย่างแท้จริง นักวิจัยมักพบว่า มันทำได้แค่ยืดระยะเวลาให้โมเดลจำได้นานขึ้นแค่ช่วงเวลาหนึ่งเท่านั้นเอง ในประโยคมีความยาวมากๆ ข้อมูลก็ยังค่อยๆหายไปอยู่ดี

นอกจากนี้ ด้วยความที่ RNNs ต้องการผลลัพธ์จากข้อมูลก่อนหน้ามาใช้ในการประมวลผลข้อมูลที่มีในปัจจุบัน มันจะมีลักษณะที่ต้องรอจัดการข้อมูลไปทีละลำดับๆ ไม่สามารถจัดการข้อมูลไปพร้อมกันได้ (parallelization) จึงทำให้โมเดลลักษณะนี้ ทำงานได้ช้ากว่าโมเดลอื่นๆ

สำหรับอีกหนึ่งมหาอำนาจ อย่าง CNNs หรือ Convolution Neural Networks ซึ่งใช้ข้อมูลเฉพาะที่มีอยู่ในปัจจุบัน แต่มีจุดเด่น คือ แทนที่จะใช้ข้อมูลทุกๆจุดมาคำนวนผลลัพธ์ มันจะใช้ข้อมูลเพียงกลุ่มเล็กๆ ที่อยู่ใกล้ๆกัน (local connections) เช่น ในการประมวลผลประโยค “แมวสีส้มตัวอ้วนเดินยืดยาดอยู่หน้าบ้าน” แทนที่จะประมวลผลเป็นคำๆ

[“แมว”, “สี”,“ส้ม”,“ตัว”,“อ้วน”,“เดิน”,“ยืด”,“ยาด”,“อยู่”,“หน้า”, “บ้าน”]

แต่ใน CNNs มันจะประมวลผลในลักษณะของ N-Grams หรือ กลุ่มๆของคำที่อยู่ติดกัน เช่น

[“แมวสีส้ม”, “สีส้มตัว”,“ส้มตัวอ้วน”,“ตัวอ้วนเดิน”,“อ้วนเดินยืด”,“เดืนยืดยาด”, …]

ตัวอย่าง หนึ่งหน่วยประมวลผลของ CNN ซึ่งนำเข้า กลุ่มคำ ไปประมวลผล

เพราะเหตุนี้ CNNs จึงสามารถใช้งานได้ดีในลักษณะงานที่เป็น local (and position-invariant) pattern recognision หรือ ปัญหาที่สามารถหาคำตอบได้โดยสังเกตุจากแพทเทิร์น เช่น Spam Detection หรือ Name Entity Recognition ซึ่งเมื่อพิจารณากรณี Long-range dependencies ที่พูดไปแล้ว จะพบว่าจริงๆแล้ว CNNs ก็สามารถเรียนรู้ความสัมพันธ์แบบนั้นได้ แต่กว่าที่ข้อมูลส่วนที่อยู่ไกลกันจะได้รับการประมวลผลร่วมกัน ต้องใช้จำนวน layers มากในสเกล O(log(n)/log(k)) โดย n คือ ระยะห่างของคำ และ k คือ ความกว้างของ local pattern ที่แต่ละ layer ของ CNNs จัดการได้

ตัวอย่าง การส่งต่อข้อมูลใน CNN โดยยิ่งคำที่อยู่ไกลกัน ยิ่งต้องอาศัยหลาย layers กว่าโมเดลจะเจอข้อมูลของทั้งสองคำ

แต่เพราะว่า CNNs ไม่จำเป็นจะต้องรอข้อมูลที่อยู่ลำดับก่อนหน้า จึงหมายความว่า CNNs สามารถคำนวนผลทุกๆ(กลุ่ม)คำในประโยคได้พร้อมๆกัน แต่อย่างนั้น CNNs กลับไม่สามารถทำงานได้ดี ในปัญหา Machine Translation ซึ่งจำเป็นจะต้องทำความเข้าใจภาพรวมของทั้งประโยค ไม่ใช่แค่ ภายในส่วนเล็กๆแค่ส่วนเดียว

สุดท้ายนี้ จึงเห็นได้ว่า ทั้ง RNNs และ CNNs ต่างมีข้อจำกัด ทั้งในเรื่อง Long-range dependencies และ Parallelisation จึงเป็นเรื่องที่น่าตื่นเต้น เมื่อพบว่า Transformer สามารถแก้ปัญหาทั้งสองได้ พร้อมๆกัน

Brief Explanation of Self-Attention

Transformer ได้เสนอเทคนิคที่เรียกว่า Self-Attention โดยไอเดีย คือ ในการแปลคำแต่ละคำ โมเดลจะเลือกสนใจเฉพาะคำที่เกี่ยวข้อง (related context) และมีความสำคัญ (important information) ที่จำเป็นต้องใช้ในเพื่อแก้ปัญหา (ในที่นี้คือ Machine Translation) แทนที่จะต้องสนใจโครงสร้างทั้งประโยค ซึ่งประกอบไปด้วยคำที่ไม่เกี่ยวข้อง

เธอชอบแมวเพราะว่าพวกมันนุ่มนิ่มและน่ารัก

She loves cats because they are fluffy and cute.

สังเกตว่า การจะแปล คำว่า “ชอบ” เป็น คำว่า “loves” จำเป็นต้องรู้ว่า

  1. ชอบ ความหมายเหมือนกัน love ในภาษาอังกฤษ
  2. love ใช้คู่กับ she จะต้องเปลี่ยนเป็น loves (verb-noun agreement)

แต่สิ่งที่ตามหลัง “loves” จะเป็นอะไรก็ได้ อาจจะเป็น หมา, กระต่าย หรือ แม้กระทั้ง สปาเกตตี้ ก็ไม่ได้ส่งผลต่อ คำว่า “loves”

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

Figure from https://arxiv.org/abs/1502.03044

ทั้งนี้ ข้อดีของ Attention Mechanism คือ เราสามารถประมวลผลทุกๆคำในประโยคพร้อมๆกัน เพราะว่า แต่ละคำมีความอิสระต่อ ซึ่งนั้นแปลว่า เราสามารถสั่งให้มันเรียนรู้ไปพร้อมๆกันได้ทีเดียวทั้งประโยค แต่ในขณะเดียวกัน โครงสร้างนี้บังคับให้แต่ละคำ ต้องประมวลกับคำอื่นๆทั้งประโยค แต่จะโฟกัสไปแค่คำบางคำที่เกี่ยวข้องกับมัน นั้นคือ มันสามารถจัดการกับ long-range dependency ได้อย่างสบายๆ

แต่เพราะต้องประมวลผลกับคำอื่นๆทั้งประโยค หลายคนอาจจะมีคำถามว่า ทำไมไม่ใช้ Fully-connected Network ไปเลย หรือก็คือ ใส่ Neural unit เยอะๆ ต่อกับทุกๆคำ แต่สิ่งที่เกิดขึ้น คือ Fully-connected Network ที่ไม่มี Attention สอนยากกว่ามาก คล้ายๆกับการเรียนอะไรสักอย่างด้วยตัวเอง โดยไม่มีใครแนะแนวทางให้ กว่าจะสามารถเข้าใจ ก็จะต้องใช้เวลาเรียนรู้นานกว่าปกติ หรือ บางครั้งอาจจะมืดแปดด้าน จบลงด้วยการปิดหนังสือ แล้วกลับไปนอน

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

แรกเริ่มเดิมที ผู้เขียนตั้งใจเขียนแค่บทความเดียว แต่เขียนไปเขียนมา รู้สึกว่ามันยาวมาก เขียนเท่าไรก็ไม่เสร็จสักที เลยขอแบ่งออกเป็นหลายๆ ส่วน อันนี้เป็นแค่ส่วนแรกของซีรีย์

Part II จะทำการแยกย่อย อธิบายองค์ประกอบต่างๆใน Transformer

Part III มาศึกษาเทคนิคการเทรน กว่าจะได้โมเดลนี้มา แค่สั่งให้มันท่อง ก-ฮ เพียงอย่างเดียว อาจจะไม่เพียงพอ พร้อมกับศึกษาว่า ท้ายที่สุดแล้ว ก็มาดูกันว่า อะไรคือสิ่งที่เกิดขึ้นภายในโมเดล

ฝากติดตามอ่านด้วยนะครับ :)

Credit

ก่อนอื่นต้องขอขอบคุณ เปเปอร์ต้นฉบับ Attention Is All You Need สำหรับเนื้อหาทั้งหมดนี้ และก็ต้องขอขอบคุณแหละข้อมูลเพิ่มเติมทั้งหลาย

  • All You Need Is Attention … แค่ใส่ใจกันเท่านั้นก็พอ บทความภาษาไทยดีๆ เป็น inspiration ของบทความนี้เลยก็ว่าได้
  • The Annotated Transformer แนะนำให้อ่านแล้วรันโค้ดตาม เพราะ บทความนี้ย่อยเปเปอร์ออกมาเป็นโค้ดได้ชัดเจนและเจ๋งมากๆ ทำให้เข้าใจภาพการทำงานจริงๆ ไม่ใช้แค่สมการ !@#$%
  • The Illustrated Transformer อีกหนึ่งบทความจาก Jay Alammar ซึ่งอธิบาย Transformer ด้วยภาพ ทำให้ทั้งเข้าใจง่าย +เรียบง่าย ไปพร้อมๆกัน
  • Attention? Attention! สุดท้าย เป็นบทความรวบรวมหัวข้อต่างๆที่น่าสนใจเกี่ยวกับ Attention

สุดท้ายนี้

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

2. ผู้เขียนพึ่งเริ่มศึกษางานวิจัยทางด้านนี้ ถ้ามีข้อมูลส่วนใดผิดพลาด กรุณาอย่าด่าแรง และ ขออภัยมา ณ ที่นี้ และเช่นเดียวกันกับข้อ 1) ยินดีรับฟังคอมเม้น เพื่อผู้เขียนจะได้นำไปปรัปปรุงในโอกาสถัดๆไป :)

--

--