การแสดงภาพ Attention: หัวใจของ Transformer [วิดีโอ]
(3blue1brown.com)- Attention ของ Transformer คือกลไกที่อัปเดต embedding ของ token ให้สอดคล้องกับบริบท ทำให้แม้เป็นคำเดียวกัน เวกเตอร์ก็เคลื่อนไปสู่ความหมายที่ต่างกันตามคำรอบข้าง
- attention head หนึ่งตัวสร้างเวกเตอร์ query/key/value จากแต่ละ token แล้วคำนวณ attention pattern ซึ่งเป็นน้ำหนักความเกี่ยวข้องระหว่างคำ ด้วย dot product ของ key-query และ softmax
- โมเดล autoregressive แบบ GPT ใช้ masking เพื่อไม่ให้ token ด้านหลังส่งผลต่อ token ด้านหน้า และเนื่องจากขนาดของ attention pattern เป็นกำลังสองของความยาวบริบท การขยาย context window ขนาดใหญ่จึงเป็นภาระมาก
- ในตัวอย่าง GPT-3 เมทริกซ์ key/query มีพารามิเตอร์อย่างละ 1,572,864 ตัว และ value map ถูกแบ่งเป็นการแปลงแบบ low-rank ทำให้ต่อหนึ่ง head มีพารามิเตอร์ประมาณ 6.3 ล้านตัว
- Transformer ที่ทำ attention head และ block หลายชุดซ้ำ ๆ จะเรียนรู้วิธีอัปเดตบริบทได้หลากหลาย และแกนสำคัญของความสำเร็จอยู่ที่ ความสามารถในการทำ parallelization เพื่อประมวลผลการคำนวณจำนวนมากบน GPU ได้อย่างรวดเร็ว
บทบาทของ attention ใน Transformer
- Transformer ใช้ข้อความอินพุตเพื่อทำนาย token ถัดไป โดยอินพุตจะถูก tokenize ก่อน เพื่อแบ่งเป็นคำหรือชิ้นส่วนของคำ
- แต่ละ token จะถูกแปลงเป็น embedding ซึ่งเป็นเวกเตอร์มิติสูง
- ทิศทางใน embedding space นี้สามารถสอดคล้องกับความหมายได้
- ตัวอย่างเช่น การเลื่อนไปในทิศทางหนึ่งอาจย้าย embedding ของคำนามเพศชายไปยัง embedding ของคำนามเพศหญิงที่สอดคล้องกันได้
- เป้าหมายของ attention คือค่อย ๆ ปรับ embedding เริ่มต้น เพื่อให้ไม่เพียงมีข้อมูลของคำเดี่ยว ๆ แต่ยังบรรจุ ความหมายเชิงบริบท ที่สมบูรณ์ยิ่งขึ้นด้วย
เหตุผลที่คำเดียวกันเปลี่ยนไปตามบริบท
- ใน “American shrew mole”, “One mole of carbon dioxide”, “Take a biopsy of the mole” คำว่า mole มีความหมายต่างกัน
- ในขั้น embedding แรก เวกเตอร์ของ mole ใกล้เคียงกับ lookup table ที่ไม่ดูบริบท จึงเหมือนกันทั้งสามกรณี
- ในขั้นถัดไปคือ attention block embedding รอบข้างสามารถส่งข้อมูลไปยัง embedding ของ mole เพื่ออัปเดตค่าได้
- โมเดลที่เรียนรู้มาอย่างดีจะเชื่อมโยงความหมายหลายแบบของ mole กับทิศทางต่าง ๆ ใน embedding space และคำนวณว่าจะเติมอะไรเข้าไปใน embedding ทั่วไปตามบริบท
- เช่น “Eiffel tower” และ “miniature Eiffel tower” embedding ของคำหนึ่งสามารถถูกอัปเดตได้ไม่เพียงจากคำใกล้ ๆ แต่ยังจากข้อมูลที่มาจาก token ที่อยู่ไกลออกไปด้วย
- ในการทำนายคำถัดไป จะใช้เฉพาะเวกเตอร์สุดท้ายเท่านั้น ดังนั้น embedding ของคำสุดท้ายในอินพุตยาว ๆ จึงต้องบรรจุข้อมูลบริบททั้งหมดที่จำเป็นต่อการทำนายไว้ในระดับหนึ่ง
ลำดับการคำนวณของ attention head เดี่ยว
- คำอธิบายพื้นฐานจะอิงกับ single head of attention
- ในประโยคตัวอย่าง “A fluffy blue creature roamed the verdant forest.” สมมติสถานการณ์ที่คำคุณศัพท์อัปเดต embedding เริ่มต้นของคำนามที่สอดคล้องกัน
- ตัวอย่างนี้มีไว้เพื่อแสดงสิ่งที่ attention head สามารถทำได้
- พฤติกรรมจริงของ head ตีความได้ยาก เพราะเป็นผลจากการที่พารามิเตอร์จำนวนมากถูกปรับเพื่อลด cost function
- embedding เริ่มต้นมีทั้งข้อมูลคำและข้อมูลตำแหน่ง และแสดงเป็น
\vec{E} - เป้าหมายคือสร้าง embedding ใหม่
\vec{E}'ที่สะท้อนบริบทจาก embedding เดิม -
Query
- ขั้นแรก คูณ embedding ของแต่ละ token ด้วย query matrix
W_Qเพื่อสร้างเวกเตอร์ query\vec{Q} - อาจคิดได้ว่าคำนามตั้งคำถามทำนองว่า “มีคำคุณศัพท์อยู่ข้างหน้าหรือไม่?”
- องค์ประกอบของ
W_Qเป็นพารามิเตอร์ของโมเดลที่เรียนรู้ได้ และตีความได้ยากว่า head ใด head หนึ่งทำอะไรจริง ๆ - ในเชิงตัวอย่าง อาจมองว่าเป็นการ map embedding ของคำนามไปยังทิศทางที่ “มองหาคำคุณศัพท์ในตำแหน่งก่อนหน้า”
- ขั้นแรก คูณ embedding ของแต่ละ token ด้วย query matrix
-
Key
- พร้อมกันนั้น คูณ embedding แต่ละตัวด้วย key matrix
W_kเพื่อสร้างเวกเตอร์ key\vec{K} - key มองได้ว่าเป็นคำตอบที่เป็นไปได้ต่อ query และอยู่ใน space มิติเล็กกว่าชุดเดียวกับ query
- ระดับการเรียงแนวกันของ key และ query วัดด้วย dot product
- ยิ่ง dot product ใหญ่ เวกเตอร์ทั้งสองก็ยิ่งเรียงแนวกันมากขึ้น
- หาก key ของ fluffy และ blue เข้ากันได้ดีกับ query ของ creature ก็จะได้ค่าบวกขนาดใหญ่
- เมื่อคำนวณ dot product ของ key-query ทุกคู่ จะได้ตารางคะแนนที่บอกว่าคำใดเกี่ยวข้องกับการอัปเดตความหมายของคำอื่นมากเพียงใด
- พร้อมกันนั้น คูณ embedding แต่ละตัวด้วย key matrix
Attention pattern และ softmax
- คะแนน dot product อาจมีค่าตั้งแต่
-\inftyถึง\inftyจึงใช้ softmax กับแต่ละคอลัมน์เพื่อ normalize ให้เป็นค่าระหว่าง 0 ถึง 1 - ตารางที่ normalize แล้วเรียกว่า attention pattern
- แต่ละคอลัมน์มองได้ว่าเป็นน้ำหนักว่าคำทางซ้ายเกี่ยวข้องกับการอัปเดตคำด้านบนมากเพียงใด
- บทความ Transformer ต้นฉบับเขียนสิ่งนี้ในรูปแบบที่กระชับกว่า
QและKคืออาร์เรย์ทั้งหมดของเวกเตอร์ query และ keyK^TQแทนตาราง dot product ของ key-query ที่เป็นไปได้ทั้งหมด- ในสัญกรณ์ของบทความ query และ key อยู่ตามแถวและเขียนในรูป
QK^Tทำให้เป็นรูปที่พลิกตามแนวทแยงจากภาพที่อธิบายที่นี่
- เพื่อเสถียรภาพเชิงตัวเลข จะมีพจน์หารด้วย
\sqrt{d_k}ซึ่งเป็นรากที่สองของมิติใน key-query space - softmax ครอบทั้งสมการ แต่ในเชิงความหมายจะถูกใช้แยกทีละคอลัมน์
Masking และข้อจำกัดของขนาด context
- ระหว่างการฝึก โมเดลไม่ได้ทำนายแค่ token ถัดไปตัวเดียวจากข้อความที่ให้มา แต่ยังทำนาย token ถัดไปที่เป็นไปได้หลังแต่ละ subsequence ไปพร้อมกันด้วย
- ตัวอย่างข้อความหนึ่งจึงทำงานเหมือนตัวอย่างฝึกหลายตัว ทำให้มีประสิทธิภาพสูงขึ้น
- ในตัวอย่าง GPT หาก token ด้านหลังส่งผลต่อ token ด้านหน้า อาจทำให้คำตอบของ token ถัดไปรั่วไหลได้ จึงใช้ masking
- ตั้งค่าตำแหน่งนั้นเป็นลบอนันต์ก่อน softmax
- หลัง softmax ตำแหน่งนั้นจะเป็น 0 และคอลัมน์ยังคงอยู่ในสภาพที่ normalize แล้ว
- ไม่ใช่ว่าจะมีเฉพาะ attention ที่ใช้ masking เสมอ แต่ในตัวอย่าง GPT จะใช้ตลอดเพื่อไม่ให้ token ด้านหลังส่งผลต่อ token ด้านหน้า
- ขนาดของ attention pattern เท่ากับ กำลังสองของ context size
- ด้วยเหตุนี้ context size จึงอาจเป็นข้อจำกัดสำคัญของโมเดลภาษาขนาดใหญ่
- มีรูปแบบดัดแปลงที่ทำให้กลไก attention ขยายขนาดได้มากขึ้นสำหรับ context window ที่ใหญ่กว่า แต่ที่นี่จะกล่าวถึงเฉพาะรูปแบบพื้นฐานเท่านั้น
วิธีที่ value ใช้อัปเดต embedding จริง
- attention pattern ให้น้ำหนักว่าคำใดจะอัปเดตคำใด และขั้นถัดไปคือการสร้างปริมาณการเปลี่ยนแปลงจริงของ embedding
- คูณ embedding แต่ละตัวด้วย value matrix
W_Vเพื่อสร้างเวกเตอร์ value- เวกเตอร์ value อยู่ใน space มิติสูงเดียวกับ embedding
- มันบอกว่าเมื่อคำที่เกี่ยวข้องปรับความหมายของคำอื่น ควรเพิ่มการเปลี่ยนแปลงที่เป็นรูปธรรมแบบใด
- ในแต่ละคอลัมน์ เมื่อนำเวกเตอร์ value มาคูณด้วยน้ำหนักที่สอดคล้องกันใน attention pattern แล้วรวมทั้งหมด จะได้ปริมาณการเปลี่ยนแปลง
\Delta \vec{E} - เมื่อเพิ่มการเปลี่ยนแปลงนี้เข้าไปใน embedding เดิม จะได้ embedding ใหม่
\vec{E}'ที่สะท้อนบริบท- ในตัวอย่าง creature ดูดซับข้อมูลของ fluffy และ blue จึงมีความหมายใกล้กับ “fluffy blue creature” มากขึ้น
- เมื่อนำกระบวนการเดียวกันไปใช้กับทุกคอลัมน์ จะได้ embedding ที่ปรับแต่งแล้วสำหรับลำดับ token ทั้งหมดออกมาจาก attention block
- attention head เดี่ยวถูกกำหนดพารามิเตอร์ด้วยเมทริกซ์พารามิเตอร์ที่เรียนรู้ได้สามประเภท ได้แก่ key matrix, query matrix, value matrix
การคำนวณพารามิเตอร์ตาม GPT-3
- ในตัวอย่าง GPT-3 เมทริกซ์ key และ query มีคอลัมน์ 12,288 คอลัมน์ ซึ่งสอดคล้องกับมิติ embedding และมีแถว 128 แถว ซึ่งสอดคล้องกับมิติของ key-query space
- แต่ละเมทริกซ์มี พารามิเตอร์ 1,572,864 ตัว
- หากกำหนด value matrix เป็นเมทริกซ์จัตุรัส 12,288×12,288 จะเพิ่ม พารามิเตอร์ 150,994,944 ตัว ซึ่งใหญ่กว่า key/query มาก
- ในทางปฏิบัติ การแยก value map ออกเป็นเมทริกซ์เล็กสองตัวเพื่อทำให้จำนวนพารามิเตอร์ใกล้เคียงกับ key/query จะมีประสิทธิภาพกว่า
- เมทริกซ์ตัวแรกลด embedding space ขนาดใหญ่ลงเป็น space เล็ก เช่น 128 มิติ
- เมทริกซ์ตัวที่สองยกจาก space เล็กกลับขึ้นไปเป็น embedding space
- จากมุมมองพีชคณิตเชิงเส้น นี่คือการจำกัด value map ทั้งหมดให้เป็น การแปลงแบบ low-rank
- ในคำอธิบายนี้เรียกเมทริกซ์ทั้งสองว่า
Value_\downarrow,Value_\uparrowแต่ไม่ใช่ชื่อที่ใช้กันตามธรรมเนียม - เมื่อรวมเมทริกซ์ทั้งสี่แล้ว attention head หนึ่งตัวมีพารามิเตอร์ประมาณ 6.3 ล้านตัว
Self-attention และ cross-attention
- โครงสร้างถึงตรงนี้ หากกล่าวให้แม่นยำยิ่งขึ้นคือ self-attention head
- cross-attention head ปรากฏในโมเดลที่ประมวลผลชุดข้อมูลสองชุดที่ต่างกัน
- ตัวอย่างเช่น ในโมเดลแปลภาษา key อาจมาจากภาษาหนึ่ง และ query มาจากอีกภาษาหนึ่ง
- attention pattern สามารถแสดงว่าคำในภาษาหนึ่งสอดคล้องกับคำในอีกภาษาอย่างไร
- ใน cross-attention จุดที่ต่างจาก self-attention คือ key map และ query map ทำงานกับ dataset ที่ต่างกัน
- ในการตั้งค่าอย่างการแปลภาษา มักไม่มี masking เพราะดูเหมือนไม่มีแนวคิดที่ token ด้านหลังส่งผลต่อ token ด้านหน้า
Multi-headed attention และ block ที่ทำซ้ำ
- attention block จริงประกอบด้วย multi-headed attention ที่รันหลาย head แบบขนาน
- GPT-3 ใช้ attention head 96 ตัว ในแต่ละ block
- เมทริกซ์ key/query ที่แตกต่างกัน 96 ชุดสร้าง attention pattern ที่แตกต่างกัน 96 แบบ
- แต่ละ head สร้างลำดับเวกเตอร์ value ด้วยเมทริกซ์ value ของตัวเอง
- ที่แต่ละตำแหน่งของ token จะรวมปริมาณการเปลี่ยนแปลง
\Delta \vec{E}ที่ทุก head เสนอ แล้วบวกเข้ากับ embedding เดิม
- การรันหลาย head แบบขนานทำให้โมเดลมีความจุในการเรียนรู้หลายวิธีที่บริบทเปลี่ยนความหมาย
- ใน GPT-3 block ของ multi-headed attention หนึ่ง block ที่มี 96 head มีพารามิเตอร์ประมาณ 600 ล้านตัว
- ในบทความและการใช้งานจริง เมทริกซ์ที่สอดคล้องกับ
Value_\uparrowของแต่ละ head จะถูกรวมเป็น output matrix ขนาดใหญ่ตัวเดียวและเชื่อมกับ multi-headed attention block ทั้งหมด- โดยทั่วไปเมื่อพูดถึง value matrix ของ head ใด head หนึ่ง จะหมายถึงขั้น projection แรกที่เรียกว่า
Value_\downarrowในที่นี้
- โดยทั่วไปเมื่อพูดถึง value matrix ของ head ใด head หนึ่ง จะหมายถึงขั้น projection แรกที่เรียกว่า
วิธีที่ความหมายสะสมใน Transformer ที่ลึกขึ้น
- ข้อมูลภายใน Transformer ไม่ได้ผ่าน attention block เพียงตัวเดียว แต่ผ่าน attention block หลายตัวและ multi-layer perceptron
- แม้ embedding ของคำหนึ่งจะดูดซับบริบทบางส่วนไปแล้ว ก็ยังมีโอกาสได้รับอิทธิพลจาก embedding รอบข้างที่ประณีตขึ้นต่อไป
- ยิ่งเครือข่ายลึกขึ้น embedding แต่ละตัวก็ยิ่งรับความหมายจาก embedding อื่นมากขึ้น และมีความจุในการ encode คุณลักษณะเชิงนามธรรมระดับสูงขึ้น เช่น อารมณ์ โทน หรือเป็นบทกวีหรือไม่
- GPT-3 มี 96 layer และพารามิเตอร์ที่เกี่ยวข้องกับ key/query/value ถูกอธิบายว่ามีรวม น้อยกว่า 58,000 ล้านตัว
- นี่คิดเป็นประมาณหนึ่งในสามของพารามิเตอร์ทั้งเครือข่าย และส่วนที่เหลือจำนวนมากมาจาก block ที่อยู่ระหว่าง attention
- ความสำเร็จส่วนใหญ่ของกลไก attention ไม่ได้อยู่ที่พฤติกรรมเฉพาะอย่างใดอย่างหนึ่ง แต่อยู่ที่ ความสามารถในการทำ parallelization สูง ซึ่งทำให้ใช้ GPU คำนวณจำนวนมากได้ในเวลาสั้น
- เพราะบทเรียนจาก deep learning คือการขยายขนาดสามารถนำไปสู่การปรับปรุงเชิงคุณภาพครั้งใหญ่ในความสามารถของโมเดล สถาปัตยกรรมที่ parallelize ได้และเอื้อต่อการขยายจึงมีข้อได้เปรียบมาก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
จากมุมมองของคนที่ทำเคมีควอนตัมและแมชชีนเลิร์นนิงมาบ้าง พอดูวิดีโอนี้แล้ว ความคล้ายคลึงระหว่าง โมเดล Transformer กับ กลศาสตร์ควอนตัม ค่อนข้างสะดุดตา
ในกลศาสตร์ควอนตัม สถานะของระบบทางกายภาพทั้งหมดถูกเข้ารหัสเป็นเวกเตอร์ที่ถูกทำให้เป็นปกติในมิติสูงมาก หรือก็คือครึ่งเส้นตรงในปริภูมิ Hilbert และการเปลี่ยนแปลงตามเวลารับผิดชอบโดยตัวดำเนินการเลื่อนเวลา ซึ่งมองคร่าว ๆ ได้ว่าเป็นเมทริกซ์ unitary U = exp(-iHt)
ในวิดีโอบอกว่าการทำนายโทเคนถัดไปถูกกำหนดโดยการคำนวณเวกเตอร์ embedding ที่รับรู้บริบทถัดไปจากเวกเตอร์ embedding ที่รับรู้บริบทตัวสุดท้ายเท่านั้น จึงดูเหมือนผลลัพธ์จากการใช้ฟังก์ชันสถานะเชิงเส้นกับเวกเตอร์มิติสูง
ให้ความรู้สึกคล้ายกับการสร้าง Hamiltonian ของทั้งระบบแบบออฟไลน์จากข้อมูลฝึก จากนั้นทำ reparameterization หน้าต่างบริบทซึ่งเป็นระบบย่อยเฉพาะ ไปยัง basis ที่เข้ากับ Hamiltonian นั้น ใช้การเลื่อนเวลาไปหนึ่งขั้น แล้วแปลงกลับมาเป็น basis เดิม
แต่สำหรับคนที่ทำวิจัยด้านหนึ่งมานาน ทุกปัญหาก็มักดูเหมือนตะปูที่พอดีกับค้อนของสาขานั้น เลยสงสัยว่าคนอื่นก็มองเห็นความคล้ายนี้ไหม หรือมันฝืนเกินไป
ถ้าการใช้ตัวดำเนินการหนึ่งครั้งทำให้สถานะของเอกภพเดินหน้าไปหนึ่งช่วงเวลา Planck ก็สงสัยว่าเราจะสังเกตเห็นความแตกต่างระหว่างเอกภพแบบนั้นกับเอกภพที่เวลาต่อเนื่องได้หรือไม่
เพิ่งนึกถึงความเชื่อมโยงกับสิ่งที่เกิดขึ้นในฟิสิกส์ยุคนั้นได้ตอนนี้เอง
วิดีโอ YouTube ของ CodeEmporium ตามได้ง่ายกว่า: https://www.youtube.com/watch?v=Nw_PJdmydZY
Transformer อธิบายด้วยอุปมาได้ยาก และจริง ๆ ก็ยังไม่มีคำอธิบายดี ๆ ว่าทำไมมันถึงทำงานได้ ดังนั้นอาจจะดีกว่าที่จะแสดงกลไกให้เห็นเฉย ๆ แล้วปล่อยให้ผู้ชมตีความเอง
นอกจากนี้ dot product อธิบายว่าเป็นการฉายเวกเตอร์เข้าหากันจะง่ายกว่า
เหตุผลที่หลัง “the cat sat on the ...” มีคำว่า “mat” ตามมา ก็เพราะเป็นคำที่ปรากฏบ่อยที่สุดในชุดข้อมูล และโครงข่ายประสาทก็เป็นโมเดลของความถี่แบบนั้น
เหตุผลที่มันดูเหมือนรู้จัก “London in UK” แต่ไม่รู้จัก “London in France” ก็เพราะในชุดข้อมูล “UK” ปรากฏบ่อยกว่ามาก
ตัวอัลกอริทึมเองไม่ได้ทำอะไรที่น่าสนใจเป็นพิเศษ นอกเหนือจากการจัดรูปการคำนวณให้เข้ากับฮาร์ดแวร์ คุณค่ามาจากโครงสร้างความน่าจะเป็นแบบมีเงื่อนไขในข้อมูล และโครงสร้างนั้นเป็นผลจากการที่ผู้คนจัดเรียงคำอย่างมีประโยชน์เพื่อส่งต่อข้อมูลให้กัน
รู้ว่าเป็นคำอธิบายที่ไม่สมบูรณ์ แต่ก็คิดว่าดีกว่าไม่มีอะไรเลย
มีภาพแสดงผลที่น่าเชื่อถือว่า LLM ทำงานอย่างไรเมื่อจัดการคำของ่าย ๆ: https://bbycroft.net/llm
ช่วยเสริมคำอธิบายละเอียดของ 3blue1brown ได้ดี
เป็นวิดีโอที่ยอดเยี่ยม แสดงให้เห็นได้ดีว่าทำไม การคูณเมทริกซ์ Q*K ถึงเป็นคอขวด เพราะถ้าความยาวของลำดับ หรือหน้าต่างบริบทคือ S ก็ต้องเก็บเมทริกซ์ขนาด SxS ซึ่งเป็นผลลัพธ์ของ query ทุกตัวกับ key ทุกตัวไว้ในหน่วยความจำ
ไอเดียค่อนข้างใหม่ในการปรับปรุงคอขวดนี้คือ Ring Attention และบทความนี้อธิบายได้ดี: https://learnandburn.ai/p/how-to-build-a-10m-token-context
บทความดังกล่าวผมเป็นคนแก้ไข
ใน Unsloth นั้น Flash Attention ทำให้การใช้หน่วยความจำเพิ่มขึ้นแบบเชิงเส้น ไม่ใช่กำลังสอง, การ fine-tuning เร็วขึ้น 2 เท่า, ใช้ VRAM ลดลง 80% และ inference ก็เร็วขึ้น 2 เท่าเช่นกัน อย่างไรก็ตามปริมาณการคำนวณยังเป็น O(N^2) อยู่
สำหรับบริบทยาว ๆ รุ่นล่าสุดของ Unsloth ใส่บริบทได้ยาวกว่า HF+FA2 ถึง 4 เท่า ด้วย overhead เพิ่มเพียง +1.9% ทำให้รองรับ บริบท 228K บน H100 ได้
บทความก่อนหน้า “But what is a GPT?” ก็ดีมากเช่นกัน: https://www.3blue1brown.com/lessons/gpt
วิดีโอนี้ทำให้ผมเข้าใจว่า กลไก Attention ไม่ได้เป็นฟังก์ชันเฉพาะอย่างใดอย่างหนึ่ง แต่ใกล้เคียงกับฟังก์ชันเมตาประเภทหนึ่งมากกว่า
ถ้าผมเข้าใจถูก Attention + น้ำหนักที่เรียนรู้มา ทำให้ Transformer เรียนรู้ฟังก์ชันที่ค่อนข้างเป็นไปตามอำเภอใจได้ในระดับหนึ่ง และในฟังก์ชันนั้นก็มีกลไกการจับคู่อย่าง scaled dot-product รวมอยู่ด้วย
ดังนั้นผมคิดว่า linear attention คงยากมากที่จะเข้าใกล้ความสามารถของ Attention มาตรฐานได้ เพราะ พจน์กำลังสอง ที่สำรวจคู่ input-output ทุกคู่เป็นคุณสมบัติที่ขาดไม่ได้
เหตุผลใหญ่ที่วิดีโอนี้เข้าใจง่ายคือ แอนิเมชัน วิธีที่มันขยาย·หดตัวและคลี่ออกให้ตรงกับจังหวะการพูดทำออกมาได้ดีมาก
ผมทำงานในสาขาที่เกี่ยวข้องใกล้ชิด และวิดีโอนี้ถูกใส่เข้าไปใน เอกสาร onboarding ของทีมเราทันที
อีกจุดสำคัญคือโค้ดสำหรับการทำ visualization จำนวนมากถูกอัปไว้บน GitHub: https://github.com/3b1b/videos/tree/master/_2024/transformers
ในที่สุดก็เข้าใจแล้ว ไม่รู้เหมือนกันว่าวิดีโออื่น ๆ ทำไมถึงทำให้สับสนขนาดนั้น
เลยทำให้คิดว่าความสามารถด้านการสอนกับความสามารถด้านการวิจัยโดยทั่วไปอาจเป็นทักษะที่แทบจะไม่คาบเกี่ยวกัน
ข้อแรก ศัพท์มาตรฐานไม่ค่อยดี “attention” ยังพอมีสัญชาตญาณให้เข้าใจได้แบบเฉียด ๆ แต่ “self-attention” แย่กว่า และ “key” กับ “value” ก็ไม่ต้องพูดถึง
ข้อสอง เปเปอร์หลัก ๆ อย่าง Attention is All You Need, เปเปอร์ BERT ฯลฯ เขียนอธิบายได้ไม่ดี ไม่ได้จะลดทอนผลงานนะ แต่เปเปอร์ที่ทรงอิทธิพลและมีความก้าวหน้าครั้งใหญ่ก็อธิบายได้ไม่ดีได้ และผมคิดว่ากรณีนี้ก็เป็นแบบนั้นจริง ๆ
ข้อสาม โดยรวมแล้วสถาปัตยกรรมเหล่านี้ถูกค้นพบด้วยวิธีลองโยนสารพัดอย่างเข้าไปแล้วดูว่าอะไรเข้ากันได้ดี ไม่ได้มีขั้นตอนคิดเชิงลึกก่อนว่าทำไมโครงสร้างแบบนี้น่าจะทำงานได้ดีแล้วค่อยทดลองยืนยัน แต่เป็นเชิงประจักษ์ตั้งแต่ต้นจนจบ
ดังนั้นเราจึงยังไม่เข้าใจอย่างสมบูรณ์ว่าทำไมมันถึงทำงานได้ดีขนาดนี้ คำอธิบายทั้งหมดจึงค่อนข้างเป็นการหาเหตุผลย้อนหลัง และช่วงหลังยังมีงานที่บอกเป็นนัยว่า ถ้าปรับแต่งมากพอ โครงสร้างอื่น ๆ ก็อาจทำงานได้ดีใกล้เคียงกัน การอธิบายสิ่งที่เราเองยังไม่เข้าใจอย่างสมบูรณ์นั้นเป็นเรื่องยาก
อยากรู้ว่ามีแหล่งอ้างอิงที่อธิบายว่าสถาปัตยกรรมปัจจุบันวิวัฒนาการมาอย่างไรไหม อยากเห็นเส้นทางจากไอเดียแกนกลางที่เรียบง่ายมาก ๆ ไปจนถึงเปเปอร์ “all you need” อันโด่งดัง
ไม่อย่างนั้นอุปกรณ์หลายอย่างดูเหมือนโผล่มาอย่างกะทันหัน มีการคำนวณเยอะ แต่มีสัญชาตญาณน้อย
Jeremy Howard เคยบอกบน Twitter ว่าเขาเห็นไอเดียนี้หลายเวอร์ชันมาหลายครั้ง ซึ่งฟังดูเหมือนเป็นไอเดียที่เป็นธรรมชาติ ถ้าได้เห็นตัวอย่างว่าไอเดียนี้ปรากฏขึ้นที่อื่นอย่างไร ก็น่าจะช่วยสร้างสัญชาตญาณได้
แนวทาง RNN/LSTM นี้มีจุดอ่อนคือ representation ขนาดคงที่ และความยากในการตัดสินใจว่าควรใช้ส่วนใดของลำดับอินพุตเมื่อต้องสร้างส่วนหนึ่ง ๆ ของเอาต์พุต Bahdanau และคณะจัดการปัญหานี้ด้วยโครงสร้างที่รวมกลไก Attention เข้ากับ encoder-decoder RNN ทำให้มองเห็นสถานะในอดีตทั้งหมดของ RNN ไม่ใช่แค่สถานะสุดท้าย
RNN ฝึกได้ไม่มีประสิทธิภาพ Jakob Uszkoreit จึงต้องการหาวิธีใช้ประโยชน์จากฮาร์ดแวร์ขนานขนาดใหญ่ได้ดีขึ้น และสังเกตว่าภาษาไม่ได้เป็นเพียงลำดับต่อเนื่อง แต่ยังมีลำดับชั้นด้วย เขาเสนอ layer structure ที่ประมวลผลโทเค็นของลำดับย่อยแบบขนานในแต่ละชั้น ขณะเดียวกันยังคง Attention แบบ Bahdanau ไว้ เพื่อให้โทเค็นอ้างอิงถึงกันผ่าน self-attention ในการทำนายชั้นถัดไป
อิมพลีเมนต์ช่วงแรกทำงานได้ แต่ไม่ได้ดีกว่าวิธีอื่นในเวลานั้นอย่าง convolution และต่อมา Noam Shazeer ก็พัฒนาไอเดียนั้นต่อจนได้โครงสร้างที่ทำงานได้ดีกว่ามาก ผ่านการทดลองตัดองค์ประกอบที่ไม่จำเป็นออก จนกลายเป็น Transformer ดั้งเดิม เท่าที่รู้ผมไม่แน่ใจว่าใครเป็นคนคิดรูปแบบ Attention แบบอิง key ในโครงสร้างสุดท้าย
Transformer ดั้งเดิมในเปเปอร์ Attention is All You Need มี encoder และ decoder แยกกัน ตามแนวทางที่อิง RNN มาก่อน และถูกใช้ในโมเดลยุคแรกอย่าง BERT ของ Google ด้วย แต่สำหรับ language model สิ่งนี้ไม่จำเป็น ดังนั้น GPT ของ OpenAI จึงใช้เฉพาะส่วน decoder และตอนนี้โดยรวมทุกคนก็ใช้แนวทางนี้กัน ใน Transformer แบบ decoder-only ประโยคอินพุตจะเข้าสู่ชั้นล่างสุด จากนั้นถูกแปลงทีละขั้นเมื่อผ่านแต่ละชั้น แล้วออกมาจากด้านบน ที่ท้ายลำดับอินพุตจะมีโทเค็นสิ้นสุดต่อท้าย และมันจะถูกแปลงเป็นโทเค็นถัดไปของลำดับเอาต์พุต กล่าวคือโทเค็นสุดท้าย