Attention Is All You Need

Self-Attention คืออะไร (แบบจับต้องได้)

ชุด Attention · บทที่ 1 ·

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

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

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

ห้องประชุม ของคำว่ามอง

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

ตรงไหนที่ภาพห้องประชุมหลุด คนในภาพคือตำแหน่งของ token ไม่ใช่คนจริง และ token ไม่จำเป็นต้องยาวเท่าหนึ่งคำในภาษา ใบคำถาม ป้าย และบันทึกเป็นเวกเตอร์ q, k, v ที่แปลงจาก representation ผ่านเมทริกซ์คนละชุด ไม่ใช่ป้ายภาษาที่ใครเขียนติดไว้ ไม่มีการลุกขึ้นผลัดกันถาม การคำนวณภายในเลเยอร์ทำพร้อมกันได้ และ “การฟัง” คือผลรวมถ่วงน้ำหนัก ไม่ใช่การชี้คนเดียวแล้วปิดหูคนอื่น

นิยามในเปเปอร์สั้นกว่าภาพนี้เยอะ Self-attention ซึ่งบางทีเรียก intra-attention คือกลไก attention ที่ผูกตำแหน่งต่าง ๆ ของลำดับเดียวกันเข้าด้วยกัน เพื่อคำนวณตัวแทนของลำดับนั้น ผู้เขียนบอกว่ามันถูกใช้มาแล้วในงานอ่านแล้วตอบ, การสรุปความ, textual entailment, และการเรียนตัวแทนประโยคที่ไม่ผูกกับงานเดียว Transformer ไม่ได้เกิดวันแรกที่มีคำว่า attention

เท่าที่ผู้เขียนอ้างไว้ Transformer เป็น transduction model ตัวแรกที่สร้างตัวแทนของอินพุตและเอาต์พุตด้วย self-attention โดยไม่ใช้ RNN ที่เรียงตามตำแหน่ง และไม่ใช้ convolution แต่ละชั้นยังมี feed-forward, residual และ layer norm ชื่อเปเปอร์จึงไม่ได้แปลว่าข้างในเหลือสมการ attention ก้อนเดียว และไม่ได้แปลว่าไม่มีใครเคยทำ attention มาก่อน เปเปอร์เองยกงาน self-attention ที่มีอยู่แล้ว แล้วบอกว่าส่วนใหญ่ยังเกาะกับ recurrent network อยู่ ยกเว้นไม่กี่กรณี

วิธีเก่า อ่านทีละคำ แล้วส่ง กระเป๋า ใบเดียวต่อ

โมเดลแปลภาษาที่เก่งตอนนั้นเป็น encoder-decoder ข้างในเป็น recurrent network หรือ convolutional network และตัวที่เก่งสุดยังมี attention เป็นสะพานระหว่าง encoder กับ decoder เปเปอร์เกริ่นด้วย LSTM กับ gated recurrent network ว่าเป็นแนวที่ตั้งหลักอยู่ในงาน sequence modeling กับงาน transduction อย่าง language modeling และ machine translation

วิธีคิดของ recurrent model คือจัดตำแหน่งของสัญลักษณ์ให้ตรงกับขั้นเวลา สถานะซ่อน h ที่เวลา t เป็นฟังก์ชันของสถานะซ่อนก่อนหน้า h ที่เวลา t−1 กับอินพุตของตำแหน่ง t ภาพที่ตรงกับประโยคนี้คือกระเป๋าใบเดียว เดินจากคำไปคำ คำใหม่เปิดกระเป๋า หยิบของเก่าออกมาผสมกับตัวเอง แล้วส่งกระเป๋าต่อ ไม่มีทางลัดข้ามคำ

ข้อจำกัดที่เปเปอร์ชี้ไม่ใช่ว่าความจำคนไม่ดี ข้อจำกัดคือลำดับขั้นนั้นขนานข้างในตัวอย่างหนึ่งไม่ได้ ขั้น t ต้องรอขั้น t−1 พอประโยคยาว ข้อจำกัดนี้เริ่มเจ็บ เพราะหน่วยความจำของเครื่องจำกัดการกองแบตช์ข้ามตัวอย่าง มีคนพยายามลดต้นทุนด้วย factorization tricks และ conditional computation เปเปอร์ยอมรับว่าอย่างหลังช่วยทั้งความเร็วและคุณภาพ แต่ข้อจำกัดเชิงลำดับยังอยู่

ทาง convolution ที่เปเปอร์ยกไว้ในหมวดพื้นหลังคือ Extended Neural GPU, ByteNet, และ ConvS2S พวกนี้คำนวณตัวแทนของทุกตำแหน่งขนานกันได้ แต่จำนวนปฏิบัติการที่ต้องใช้เพื่อเชื่อมสองตำแหน่งยังโตตามระยะห่าง แบบเชิงเส้นสำหรับ ConvS2S และแบบลอการิทึมสำหรับ ByteNet เปเปอร์บอกว่าแบบนั้นทำให้ความสัมพันธ์ระยะไกลเรียนยากขึ้น ใน Transformer จำนวนปฏิบัติการที่เชื่อมสองตำแหน่งลดเหลือค่าคงที่ แลกกับความละเอียดที่ลดลงเพราะการเฉลี่ยตำแหน่งตามน้ำหนัก attention และผู้เขียนบอกว่าจะต้านผลนั้นด้วย multi-head attention

ลองเดาก่อนว่ากระเป๋าใบนี้เก็บของเป็นชิ้น ๆ ไหม สถานะซ่อนเป็นเวกเตอร์ที่ถูกคำนวณใหม่ทุกขั้น ทั้งใบถูกเขียนทับ ไม่ได้หยิบของเก่าออกมาเป็นชิ้นเดิม รุ่น gated อย่าง LSTM มี forget gate ส่วน GRU มี update gate กับ reset gate ช่วยคุมการเปลี่ยนสถานะ RNN พื้นฐานไม่ได้ต้องมีประตูพวกนี้ ภาพกระเป๋าใช้ได้ข้อเดียว คือข่าวจากตำแหน่งต้นทางต้องผ่านทุกขั้นระหว่างทางก่อนจะถึงตำแหน่งปลายทาง

งานเดียวกัน มาตรเดียวกัน วางข้างกัน

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

ถ้าเทียบการคำนวณ representation ของประโยคที่รู้ token ครบแล้ว RNN ต้องส่งสถานะจากตำแหน่งก่อนหน้าไปตำแหน่งถัดไป ส่วน self-attention คำนวณคะแนนของคู่ตำแหน่งได้ขนานกันในเลเยอร์เดียว กำลังเทียบการประมวลผลข้อความที่มีอยู่ ไม่ได้บอกว่าโมเดลสร้างคำตอบทั้งประโยคพร้อมกัน แต่ละเลเยอร์ยังต้องรอผลจากเลเยอร์ก่อน อย่าใช้คำว่าพร้อมกันข้ามทั้งก้อน

เรามีประโยคครบแล้ว งานเดียวกันทั้งสองฝั่งคือส่งข้อมูลจากตำแหน่งแมวไปเติมตัวแทนที่ตำแหน่งพรม ไม่ได้ให้แปลทั้งประโยค ฝั่ง RNN ที่เดินซ้ายไปขวาต้องส่งสถานะผ่าน มอง แล้วหนู แล้วบน กว่าจะถึงพรม รวมสี่ช่วงระหว่างห้าตำแหน่ง ส่วน self-attention ของ encoder มีทางเชื่อมคู่นี้โดยตรงในหนึ่งเลเยอร์ กำลังเทียบทางเดินของข้อมูล ไม่ใช่วินาทีบนจีพียู

Fig. 3

ประโยคเดียวกัน อ่านทีละคำ กับมองทุกคำ ในขั้นเดียว

ซ้ายเดินตามโซ่แบบ recurrent ขวาเชื่อมทุกตำแหน่งในขั้นเดียวแบบ self-attention สไลเดอร์ขยับได้แค่ฝั่งซ้าย เพราะฝั่งขวาจบตั้งแต่ขั้นแรก

ประโยค “แมว มอง หนู บน พรม” เป็นตัวเลขตัวอย่างของภาพ ไม่ใช่ประโยคจากเปเปอร์ สัญลักษณ์ O(n) กับ O(1) ยกมาจากตารางที่ 1 ส่วน d_model = 512 คือขนาดของโมเดลฐานในหมวด 3.1

งานเดียวกัน ส่งสัญญาณจากคำว่าแมวไปถึงคำว่าพรม มาตรเดียวกัน ขั้นลำดับ จำนวนคำที่เห็น และถึงหรือยัง

เลื่อนขั้นของ recurrent หรือโฟกัสสไลเดอร์แล้วกดลูกศร

Recurrent

อ่านทีละคำ ส่งสถานะต่อตามโซ่

  1. 1แมว
  2. 2มอง
  3. 3หนู
  4. 4บน
  5. 5พรม

Self-attention

ทุกตำแหน่งมองทุกตำแหน่งในขั้นเดียว

  1. 1แมว
  2. 2มอง
  3. 3หนู
  4. 4บน
  5. 5พรม
มาตร
ทีละคำ
ทุกคำทีเดียว
ขั้นลำดับ
1 จาก 5
1
คำที่เห็น
1 จาก 5
5 จาก 5
ถึงคำว่าพรม
ยังไม่ถึง
ถึงแล้ว
เส้นทางยาวสุดในเลเยอร์
O(n)
O(1)

ในภาพฝั่งซ้ายเดินมาแล้ว 0 ช่วง จาก 4 ช่วงระหว่าง 5 คำ นับช่วงในรูปนี้ ไม่ใช่ตัวเลขที่ตารางที่ 1 รายงาน

recurrent step = 1/5 | seen = 1/5 | reached "พรม" = no | self-attention step = 1 | seen = 5/5 | reached "พรม" = yes | path = O(n) vs O(1) | n = 5 | d_model = 512 | n < d | ตารางที่ 1

รูปที่ 3. งานเดียวกันบนประโยคตัวอย่างห้าคำ ฝั่ง recurrent ใช้ขั้นลำดับเพิ่มทุกคำตามที่ตารางที่ 1 เขียนว่า O(n) ฝั่ง self-attention เชื่อมทุกตำแหน่งด้วยขั้นลำดับ O(1) ค่า d_model = 512 เอามาจากโมเดลฐาน เพื่อวางข้างเงื่อนไข n < d ในหมวด 4 ไม่ใช่เวลาที่จับจากจีพียู

เลื่อนสไลเดอร์จนสุด ฝั่งซ้ายถึงพรมเมื่อขั้นที่ 5 ฝั่งขวาไม่ขยับเลย เพราะมันถึงตั้งแต่ขั้น 1 นี่คือหัวใจของตารางที่ 1 ในส่วนขั้นลำดับกับความยาวเส้นทาง ไม่ใช่ผล BLEU

ในรายการห้าตำแหน่งมีสี่ช่วงให้เดิน ตารางที่ 1 ไม่ได้รายงานเลข 4 มันรายงาน O(n) กับ O(1) เลขช่วงใต้รูปเป็นการนับช่วงระหว่างตำแหน่ง ไม่ใช่ลูกศรที่วาดไว้ และไม่ใช่ผลทดลอง

นิพจน์ในตารางบอกว่างานต่อเลเยอร์ของ self-attention โตตาม n²·d ส่วน recurrent โตตาม n·d² ประโยคบนจอมี n = 5 โมเดลฐานมี d_model = 512 และ 5 < 512 ดังนั้นนิพจน์แรกเล็กกว่า นี่คืองานต่อเลเยอร์ ไม่ใช่วินาทีที่จับจากเครื่อง

ลองเดาว่าประโยคยาวขึ้นแล้วฝั่งไหนจะงานหนักขึ้น สัญลักษณ์ O ซ่อนค่าคงที่ และ self-attention โตแบบกำลังสองของความยาว ถ้า n ใหญ่กว่า d นิพจน์ของ self-attention ไม่เล็กกว่า recurrent อีกต่อไป เปเปอร์เองเสนอทางออกสำหรับลำดับยาวมาก คือ restricted self-attention ที่มองแค่เพื่อนบ้านขนาด r แล้วความยาวเส้นทางสูงสุดกลายเป็น O(n/r) ผู้เขียนบอกว่าตั้งใจจะไปศึกษาต่อ ยังไม่ได้ลงผลการทดลองของทางออกนั้นในเปเปอร์นี้ อีกจุดที่รูปไม่ได้แสดง การสร้างคำแปลทีละคำยังเป็น auto-regressive อยู่ decoder ยังกินสัญลักษณ์ที่สร้างไปแล้วเป็นอินพุตของคำถัดไป เปเปอร์ปิดท้ายว่าการทำให้ generation ลำดับน้อยลงเป็นเป้าหมายวิจัยอีกข้อ รูปนี้จึงเป็นเรื่องการเชื่อมตำแหน่งในหนึ่งเลเยอร์ ไม่ใช่เรื่องแปลทั้งย่อหน้าจบในหนึ่งขั้น

query, key, value คือของสามชิ้น ไม่ใช่สามคน

ฟังก์ชัน attention ในเปเปอร์ map จาก query หนึ่งตัว กับคู่ key-value ชุดหนึ่ง ไปเป็นเอาต์พุต query, key, value, และเอาต์พุตเป็นเวกเตอร์ทั้งหมด เอาต์พุตคือผลรวมถ่วงน้ำหนักของ value น้ำหนักของแต่ละ value มาจากฟังก์ชันความเข้ากันได้ระหว่าง query กับ key คู่ของมัน

ใน self-attention ของ encoder ทั้ง query, key, และ value มาจากที่เดียวกัน คือเอาต์พุตของเลเยอร์ก่อนหน้าใน encoder แต่ละตำแหน่ง attend ได้ถึงทุกตำแหน่งของเลเยอร์ก่อนหน้านั้น

สูตรที่เปเปอร์ตั้งชื่อว่า Scaled Dot-Product Attention คือ

Attention(Q, K, V) = softmax(QKᵀ / √d_k) V

Q คือกอง query, K กอง key, V กอง value เอา query ทุกตัวคูณกับ key ทุกตัวพร้อมกัน หารด้วยรากที่สองของมิติ key แล้ว softmax เพื่อให้แต่ละแถวรวมเป็น 1 จากนั้นคูณด้วย V น้ำหนักจึงไม่ใช่คำตอบสุดท้าย คำตอบสุดท้ายคือ value ที่ถูกผสมตามน้ำหนักนั้น

ใบคำถามกับป้ายพอเข้าโมเดลเป็นเวกเตอร์ q กับ k คูณช่องที่ตรงกันแล้วบวกทุกช่อง เรียกว่า dot product ได้คะแนนของคู่นั้น q, k, v แปลงมาจาก representation X ด้วยเมทริกซ์ที่ฝึกแยกกัน

Q = XW^Q, K = XW^K, V = XW^V

Attention(Q, K, V) = softmax(QKᵀ / √d_k) V

เดินทีละขั้น หาคะแนนทุกคู่จาก QKᵀ ปรับสเกลด้วย √d_k แจกน้ำหนักทีละแถวด้วย softmax แล้วเอาน้ำหนักไปผสม value ได้แถวใหม่ของ representation สมมติองค์ประกอบของ q และ k เป็นตัวแปรสุ่มอิสระ ค่าเฉลี่ย 0 ความแปรปรวน 1 ตามเชิงอรรถของเปเปอร์ ผลคูณแต่ละคู่มีความแปรปรวน 1 พอบวก d_k คู่ ความแปรปรวนรวมเป็น d_k ส่วนเบี่ยงเบนมาตรฐานเป็น √d_k ภายใต้สมมติฐานเดียวกัน ถ้าเพิ่มช่องจาก 16 เป็น 64 สเกลความแกว่งก่อนหารเพิ่มจาก 4 เป็น 8 นี่เป็นเลขคณิตของสมมติฐาน ไม่ใช่การวัดจากเวกเตอร์จริง และไม่ได้บอกว่าเวกเตอร์ทุกชุดมีสถิตินี้เป๊ะ

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

ตารางสมมติ แล้วเดิน ให้ถึงข้อมูล ที่ผสมแล้ว

รูปแรกเป็นของเล่น น้ำหนักถูกตั้งไว้เพื่อให้มือคลิกแล้วเห็นเส้นหนาเส้นบาง ไม่ได้ถอดมาจากหัว attention หัวใดในเปเปอร์ ภาคผนวกของเปเปอร์มีรูป attention จริงบนประโยคภาษาอังกฤษ ผู้เขียนบรรยายว่าในเลเยอร์ 5 จาก 6 ของ encoder มีหัวที่ตาม dependency ระยะไกลของคำว่า making เพื่อปิดวลี making…more difficult และมีหัวที่ดูเหมือนเกี่ยวกับ anaphora ของคำว่า its โดยน้ำหนักของคำนั้นแหลมมาก อีกสองตัวอย่างในรูปที่ 5 ของภาคผนวกถูกบรรยายว่าคนละหัวเรียนคนละงาน เปเปอร์ใช้คำว่า appear และ seems บทนี้ไม่ก็อปภาพเหล่านั้นมา และไม่แปลงคำบรรยายนั้นเป็นคะแนนความถูก

Fig. 1

ตารางสมมติ ใครกำลังถาม และรวบรวม ข้อมูล ให้ตำแหน่งไหน

เริ่มที่คำว่าแมว แล้วลองคลิกมอง ถ้าอยากชวนตาไปที่คำถาม “มองใคร?” แถวของมองถูกตั้งให้หนูได้ 55% จากนั้นลองบน แถวนั้นให้พรมมากสุด ทั้งห้าตำแหน่งยังอยู่ ที่เปลี่ยนคือใครกำลังถาม รูปนี้กับรูปถัดไปใช้แถวเดียวกัน

คลิกคำ หรือกด Tab แล้วกด Enter

แผนภาพ attention ระหว่างคำ ตัวเลขตัวอย่างของคำว่าแมว แมว 18% มอง 12% หนู 40% บน 10% พรม 20%
  1. แมว
    18%
  2. มอง
    12%
  3. หนู
    40%
  4. บน
    10%
  5. พรม
    20%

บนจอแคบ ดูรายการนี้แทนรูปเส้น คำที่กำลังถามติดแถบเข้ม ตัวเลขแต่ละแถวคือน้ำหนักที่แบ่งให้คำนั้น รวมแถวของตัวเอง

query = "แมว" | strongest = "หนู" (40%) | ตัวเลขตัวอย่าง

รูปที่ 1. ตารางสมมติบนประโยค “แมว มอง หนู บน พรม” ความหนาของทุกเส้น รวมเส้นวนเข้าหาตัวเอง ใช้สเกลเดียวกัน เส้นดำคือน้ำหนักที่คำให้ตัวเอง วงกลมบนจอวางให้คนอ่าน ไม่ได้แปลว่าหน้านี้คำนวณ positional encoding แล้ว น้ำหนักเป็นตัวเลขตัวอย่าง ไม่ใช่น้ำหนักจากภาคผนวกของเปเปอร์

เราตั้งให้มองสนใจหนู 55% เพื่อวาดภาพคำถาม “มองใคร?” ได้ง่าย ๆ ลองอ่านเป็นน้ำหนักสำหรับผสมข้อมูลก่อน ไม่ใช่กฎไวยากรณ์ที่โมเดลทุกตัวต้องทำตาม ถ้าจะบอกว่าโมเดลจริงมักทำแบบนี้ ต้องเอา attention จากโมเดลนั้นมาดูอีกที ภาคผนวกของเปเปอร์เป็นการดูรูป ไม่ใช่ตารางคะแนนไวยากรณ์

ลองกดพรม รอบนี้น้ำหนักมากสุดกลับมาหาตัวเอง 30% คำหนึ่งเก็บข้อมูลตัวเองไว้ได้ ชื่อ self-attention หมายถึง Q, K, V มาจากลำดับชุดเดียวกัน ไม่ได้บังคับให้ทุกคำสนใจตัวเองมากสุด บรรทัดสถานะรายงานน้ำหนักที่สูงสุดในแถว รวมช่องของตัวเอง ถ้าเสมอกันจะรายงานทุกคำที่เสมอนั้น

ทำไมต้องหาร ด้วยราก ของ d_k

แบบ scaled เอาคะแนน dot product มาหารด้วย √d_k อีกที ถ้า d_k = 64 ก็หาร 8 หรือพูดอีกแบบว่าคูณ 1/8 ไม่ใช่หาร 1/8 จำนวน 64 นี้คือจำนวนช่องของ key ไม่ใช่จำนวนคำในประโยค dot-product ที่ไม่หารแบบนี้มีคนใช้อยู่แล้ว อีกแบบที่พบบ่อยคือ additive attention ซึ่งคำนวณความเข้ากันได้ด้วยเครือข่าย feed-forward ชั้นซ่อนชั้นเดียว เปเปอร์บอกว่าความซับซ้อนเชิงทฤษฎีพอ ๆ กัน แต่ในทางปฏิบัติ dot-product ใช้การคูณเมทริกซ์ที่ไลบรารีทำให้ไวไว้แล้ว จึงกินที่น้อยกว่า

เมื่อ d_k เล็ก สองแบบทำงานพอ ๆ กัน เมื่อ d_k ใหญ่ additive attention ชนะ dot-product ที่ไม่มีการสเกล softmax ไม่ได้ตกใจเพราะเลขใหญ่เฉย ๆ นะ [100,100,100] ยังแบ่งให้เท่ากันสามส่วน เหมือน [0,0,0] เป๊ะ ที่ทำให้น้ำหนักไปกองแทบช่องเดียวคือคะแนนนำทิ้งห่างช่องอื่นมากเมื่อเทียบกับอุณหภูมิ ภายใต้สมมติฐานของเปเปอร์ พอ d_k โต สเกลความแกว่งของ dot product ก็โตตาม การหารด้วย √d_k ช่วยคุมสเกลนี้และลดโอกาสที่ softmax จะอิ่มตัวจนเปลี่ยนคะแนนนิดหน่อยแล้วน้ำหนักแทบไม่ขยับ ไม่ได้หมายความว่าทุกเกรเดียนต์ในโมเดลจะเป็นศูนย์ เชิงอรรถประกอบสมมติฐานนี้ไว้ว่า ถ้าองค์ประกอบของ q และ k เป็นตัวแปรสุ่มอิสระ ค่าเฉลี่ย 0 ความแปรปรวน 1 ผลคูณจุดจะมีค่าเฉลี่ย 0 และความแปรปรวนเท่ากับ d_k การหารด้วย √d_k คือทางต้านผลนั้น

ในงานนี้ใช้ 8 หัวขนาน แต่ละหัวมี d_k = d_v = d_model / h = 64 เพราะ d_model ของโมเดลฐานคือ 512 ตัวหารของแต่ละหัวจึงเป็น √64 = 8 นี่เป็นเลขคณิตจากค่าที่เปเปอร์เลือก ไม่ใช่ไฮเปอร์พารามิเตอร์อีกตัวที่หมุนอิสระจาก d_k

ต้นทุนรวมของแปดหัวยังพอ ๆ กับหัวเดียวที่มิติเต็ม เพราะแต่ละหัวถูกบีบให้แคบลง แล้วค่อยต่อกันและโปรเจกชันด้วยเมทริกซ์ W^O อีกรอบ สูตร multi-head คือเอา head ที่ i ซึ่งเป็น attention ของ Q, K, V หลังคูณด้วย W^Q, W^K, W^V ของหัวนั้น มาต่อกัน แล้วคูณ W^O

คะแนนชุดเดิม แบ่งน้ำหนัก ยังไง แล้วผสม value

ค้างคำที่เลือกในรูปแรกไว้ รูปนี้ไม่เปลี่ยนว่าใครกำลังถาม มันเปลี่ยนวิธีแจกน้ำหนักจากแถวเดิม แล้วเอาค่าที่แจกได้ไปคูณ value สมมติหนึ่งมิติ ค่า value ที่ตั้งไว้คือ 10, 20, 30, 40, 50 ตามลำดับคำ แมว มอง หนู บน พรม ที่ T = 1 แถบต้องตรงกับตารางในรูปแรก เพราะ logit ของของเล่นคือ log ของน้ำหนักแถวนั้น

กลับมาที่ห้องประชุม สมมติมีน้ำหนักให้แจกทั้งหมด 100% คะแนนจับคู่ยังไม่ใช่ส่วนแบ่ง softmax เอาคะแนน s ไปคำนวณ exp(s/T) แล้วหารด้วยผลรวม exp ของทุกตำแหน่ง จึงได้ส่วนแบ่งรวม 1 ลด T แล้วส่วนแบ่งของคะแนนมากสุดยิ่งเด่น เพิ่ม T แล้วส่วนแบ่งเข้าใกล้กัน ตำแหน่งที่ไม่ถูก mask ไม่ได้หายไป แต่อาจเหลือน้อยจนเลขปัดเป็น 0%

หารด้วย √d_k ก็คือตั้ง T ไว้ที่ค่านั้น ถ้าเรียกคะแนนดิบว่า s สูตร softmax(s/√d_k) ก็คือ softmax ที่อุณหภูมิ T = √d_k พอดีนะ ต่างกันที่เปเปอร์ผูกตัวหารนี้กับขนาดของ key ไม่ได้เพิ่มปุ่ม T อิสระให้หมุน ส่วน T ในรูปนี้หาร log(w) ของตารางสมมติเพิ่ม เพื่อให้เราลองดูว่าน้ำหนักจะแหลมหรือแผ่ยังไง การหมุนมันไม่ได้เปลี่ยน d_k และไม่ใช่ปุ่มสุ่มคำตอน generate งบ 100% คือผลรวมของหนึ่งแถว ไม่ใช่เวลาอ่านหรืองบคำนวณ

Fig. 2

คะแนนชุดเดิม จะแบ่ง น้ำหนักให้ คนละเท่าไรดี

คลิกคำในรูปแรก แล้วเลื่อน T แถบ เส้น และผลรวมด้านล่างขยับตามคำเดียวกัน

ตัวเลขตัวอย่าง ทั้งน้ำหนักและ value ไม่ใช่ logit จากโมเดลจริง รูปนี้ไม่ได้คำนวณ QKᵀ

encoder ไม่มี mask ทุกตำแหน่งอยู่ใน softmax

แมว
18%
มอง
12%
หนู
40%
บน
10%
พรม
20%

decoder ตั้ง logit อนาคตเป็นลบอนันต์ก่อน softmax

แมว
100%
มอง
0%
หนู
0%
บน
0%
พรม
0%

softmax(log(w) / T) | T = 1.00 | ตัวเลขตัวอย่าง | query = "แมว" | sum(p) = 1 | เปอร์เซ็นต์บนแถบปัดเป็นจำนวนเต็ม

ขั้นสุดท้าย คูณ value แล้วบวก ไม่ได้หยุดที่เปอร์เซ็นต์

  • แมว 0.18×101.8
  • มอง 0.12×202.4
  • หนู 0.40×3012.0
  • บน 0.10×404.0
  • พรม 0.20×5010.0

รวม 30.20 | ใช้ค่าเต็มคำนวณ แล้วปัดเพื่อแสดง | ตัวเลขตัวอย่าง | query = "แมว" | ไม่ใช่เปอร์เซ็นต์

รูปที่ 2. ซ้ายคือแถวเดียวกับรูปที่ 1 ขวาคือแถวเดียวกันหลัง causal mask ของ decoder ตำแหน่งปัจจุบันดูได้ถึงตัวเอง แต่ดูคำถัดไปไม่ได้ ในตัวอย่างเริ่มต้น query แมว และ T = 1 ผลรวมคือ 30.2 ตัวเลขบนแถบและในผลรวมเปลี่ยนตามคำที่เลือกกับ T ผลรวมไม่ใช่เปอร์เซ็นต์ และไม่ได้แปลว่าเลือกคำไหนเป็นคำตอบ ในโมเดลจริง value มีหลายช่อง การคูณแล้วบวกทำแบบนี้ทุกช่อง T ของสไลเดอร์เป็นตัวหารเพิ่มเติมของ log(w) ไม่ได้เปลี่ยน d_k ส่วน scaling ในเปเปอร์มองเป็น temperature ที่ตรึงเท่ากับ √d_k ได้

ค้างที่มองกับ T = 1 ไว้ก่อน แถวนั้นให้หนู 55% แต่ยังไม่ได้ย้ายคำว่าหนูมาแทนอะไร ลองหยิบ value ตามสัดส่วน 10% ของ 10, 8% ของ 20, 55% ของ 30, 10% ของ 40 และ 17% ของ 50 บวกแล้วได้ 31.6 นี่คือของที่ตำแหน่งมองรับกลับมาในของเล่นหนึ่งช่องนี้ ถ้าเปลี่ยนคนถาม ส่วนผสมก็เปลี่ยน ลองไปพรม แล้วดูว่ากลับมาหาตัวเองได้แค่ไหน ผลรวมบนจอจะขยับตามคำที่คลิกกับค่า T ไม่ได้ค้างที่ 31.6

รูปซ้ายเปิดให้ทุกตำแหน่งดูได้ทั้งประโยค แบบ self-attention ฝั่ง encoder ใน Transformer ต้นฉบับ ฝั่งขวาเป็น decoder ที่กำลังเขียนต่อ ต้องปิดทางไปตำแหน่งอนาคตด้วย causal mask ก่อนเข้า softmax ไม่ใช่คำนวณเสร็จแล้วค่อยซ่อนเส้น ระหว่างฝึก คำนวณหลายตำแหน่งขนานกันได้โดยยังเคารพหน้ากากนี้ ส่วนตอนสร้างข้อความก็ยังออก token ต่อ token

ของเล่นนี้คือหนึ่งหัว ถ้ามีหลายหัว แต่ละหัวมีเมทริกซ์ของตัวเอง คำนวณส่วนผสมเอง แล้วต่อผลเข้าด้วยกันผ่าน W^O ไม่ใช่จับทุกหัวมาเฉลี่ย และไม่ได้สั่งล่วงหน้าว่าหัวนี้ต้องดูกรรม อีกหัวต้องดูประธาน ห้องนี้ยังต้องรู้ว่าใครอยู่ตำแหน่งไหน ถ้าสลับแถวทุกอย่างพร้อมกันใน self-attention ที่ไม่มีข้อมูลตำแหน่งและไม่มี mask ผลก็สลับแถวตาม มันไม่ได้รู้ลำดับจากชื่อคำเอง Transformer ต้นฉบับจึงบวก positional encoding เข้ากับ embedding วิธีอื่นอาจใส่ตำแหน่งคนละแบบ อย่าสรุปว่าทุกโมเดลบวกแบบเดียวกัน

แปดหัว แปดก้อนผสม

แทนที่จะทำ attention ครั้งเดียวด้วย key, value, และ query มิติ d_model ทั้งก้อน เปเปอร์ใช้ linear projections แยกกัน h ชุด ลงไปที่มิติ d_k, d_k, และ d_v แล้วทำ attention ขนานกัน จากนั้นต่อผลแล้วโปรเจกชันกลับ เหตุผลที่ให้ไว้คือ multi-head attention ทำให้โมเดล attend ข้อมูลจาก subspace คนละชุด ที่ตำแหน่งคนละที่ พร้อมกันได้ หัวเดียวแล้วเฉลี่ย จะขัดขวางเรื่องนี้

ใช้ห้องเดิมต่อก็ได้ คนที่ตำแหน่งมองมีใบคำถาม ป้าย และบันทึกแปดชุด แต่ละชุดแปลงด้วยเมทริกซ์ของหัวนั้นเอง เลยคิดน้ำหนักและทำบันทึกผสมของตัวเองออกมาแปดก้อน จากนั้นเอาแปดก้อนมาต่อกันแล้วผ่าน W^O อีกที ไม่ได้โหวตเลือกหัวที่ชนะ และไม่ได้แจกล่วงหน้าว่าชุดไหนต้องหา grammar แบบไหน หน้าที่พวกนั้นถ้าจะเกิด ก็ต้องเรียนขึ้นมาเอง

เปเปอร์ไม่ได้รายงานว่าหัวที่ 3 รับผิดชอบไวยากรณ์ด้วยความถูกต้องกี่เปอร์เซ็นต์ ภาคผนวกเป็นการตรวจดูการกระจายน้ำหนัก attention แล้วบรรยายว่าหลายหัวดูเหมือนเกี่ยวกับโครงสร้างประโยค คำว่า clearly learn to perform different tasks อยู่ในย่อหน้านั้น เป็นข้อสังเกตจากการดูรูป ไม่ใช่ตารางคะแนน

ในตารางที่ 3 แถว (A) ผู้เขียนเปลี่ยนจำนวนหัวโดยให้ปริมาณการคำนวณคงที่ แล้วย่อหน้าสรุปว่าหัวเดียวแย่กว่าค่าที่ดีสุด 0.9 BLEU และหัวมากเกินไปคุณภาพก็ตก ตัวเลข 0.9 นั้นเป็นคำสรุปของผู้เขียนบนชุดพัฒนา newstest2013 ไม่ใช่ BLEU ของชุดทดสอบ newstest2014

attention ในโมเดลนี้ มีสามที่ ไม่ใช่ที่เดียว

เปเปอร์ใช้ multi-head attention สามแบบ

แบบแรก encoder-decoder attention query มาจากเลเยอร์ก่อนหน้าของ decoder ส่วน key กับ value มาจากเอาต์พุตของ encoder ทุกตำแหน่งใน decoder จึง attend ข้ามอินพุตได้ทั้งสาย เปเปอร์บอกว่าแบบนี้เลียนแบบ encoder-decoder attention ที่โมเดล sequence-to-sequence ใช้อยู่แล้ว

แบบที่สอง self-attention ใน encoder ทุกอย่างมาจากที่เดียวกัน แต่ละตำแหน่งมองได้ทุกตำแหน่งของเลเยอร์ก่อนหน้า รูปที่ 3 คือภาพย่อของแบบนี้

แบบที่สาม self-attention ใน decoder แต่ละตำแหน่งมองได้ถึงทุกตำแหน่งใน decoder ที่ไม่เลยตัวเอง รวมตำแหน่งปัจจุบัน ผู้เขียนต้องกันไม่ให้ข้อมูลไหลย้อนไปทางซ้าย เพื่อรักษาสมบัติ auto-regressive วิธีทำคือมาสก์การเชื่อมที่ผิดกฎข้างใน scaled dot-product attention โดยตั้งค่าที่จะเข้า softmax เป็นลบอนันต์ รูปที่ 2 ของเปเปอร์เป็นที่ที่ผู้เขียนชี้ให้ไปดู mask นี้ นอกจาก mask แล้ว embedding ของเอาต์พุตยังถูกเลื่อนหนึ่งตำแหน่ง เพื่อให้คำทำนายที่ตำแหน่ง i ขึ้นกับเอาต์พุตที่รู้แล้วเฉพาะตำแหน่งก่อน i

ตรงไหนที่คำว่า attention คือทั้งหมดหลุด ชื่อเปเปอร์เป็นข้ออ้างว่าไม่ต้องมี recurrence และไม่ต้องมี convolution แบบที่ใช้เดินลำดับ แต่ละเลเยอร์ยังมีโครงข่าย feed-forward แบบตำแหน่งต่อตำแหน่ง สองชั้นเชิงเส้นคั่นด้วย ReLU มิติในคือ d_ff = 2048 มิติเข้าและออกคือ d_model = 512 น้ำหนักชุดนี้ใช้ร่วมกันทุกตำแหน่ง แต่คนละชุดกันคนละเลเยอร์ เปเปอร์บอกเองว่าอธิบายอีกแบบได้ว่าเป็น convolution สองชั้นที่มี kernel ขนาด 1 รอบ ๆ แต่ละ sub-layer มี residual connection ตามด้วย layer normalization เขียนเป็น LayerNorm(x + Sublayer(x)) ทุก sub-layer รวมทั้งชั้น embedding จึงต้องออกมิติ 512 เพื่อให้บวก residual ได้ นอกจากนี้ยังมีการเข้ารหัสตำแหน่ง เพราะถ้าไม่มี recurrence และไม่มี convolution โมเดลจะไม่รู้ลำดับของโทเค็นเอง สโลแกนจึงจริงในความหมายที่เปเปอร์นิยาม คือตัวผสมข้ามตำแหน่งเป็น attention ไม่จริงในความหมายว่าสมการ attention ก้อนเดียวคือทั้งโมเดล

regularization มีสามอย่างตามที่เปเปอร์นับ dropout บนเอาต์พุตของแต่ละ sub-layer ก่อนบวก residual และ normalize อีกทีบนผลบวกของ embedding กับ positional encoding โมเดลฐานใช้ P_drop = 0.1 และ label smoothing ค่า 0.1 ซึ่งเปเปอร์บอกว่าทำให้ perplexity แย่ลง เพราะโมเดลเรียนที่จะไม่มั่นใจเกินไป แต่ accuracy กับ BLEU ดีขึ้น

ไม่มีลำดับ ในสาย ก็ต้องฉีด ตำแหน่งเข้าไป

positional encoding ถูกบวกเข้ากับ input embedding ที่ก้นของทั้ง encoder และ decoder มิติเท่ากับ d_model เพื่อให้บวกกันได้ เปเปอร์ใช้ไซน์และโคไซน์คนละความถี่

PE(pos, 2i) = sin(pos / 10000^(2i/d_model))

PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))

pos คือตำแหน่ง i คือดัชนีของมิติ ความยาวคลื่นเรียงเป็นลำดับเรขาคณิตจาก 2π ถึง 10000·2π เหตุผลที่เลือกฟังก์ชันนี้เป็นสมมติฐานของผู้เขียนว่าโมเดลจะ attend ตามตำแหน่งสัมพัทธ์ได้ง่าย เพราะเมื่อเลื่อนที่คงที่ k ใด ๆ PE ที่ pos+k เขียนเป็นฟังก์ชันเชิงเส้นของ PE ที่ pos ได้ ผู้เขียนไม่ได้วางบทพิสูจน์ของประโยคนั้นไว้ในเปเปอร์ และไม่ได้รายงานการทดลองแยกที่วัดว่า extrapolate ไปประโยคยาวกว่าตอนเทรนได้กี่โทเค็น

อีกแบบที่ลองคือ learned positional embedding ตารางที่ 3 แถว (E) บนชุดพัฒนาอังกฤษเป็นเยอรมัน newstest2013 ให้ perplexity 4.92 เท่ากับโมเดลฐาน และ BLEU 25.7 เทียบกับ 25.8 ของฐาน เปเปอร์เรียกผลคู่นี้ว่า nearly identical แล้วเลือกไซน์เพราะมันอาจ extrapolate ไปความยาวที่ไม่ได้เจอตอนเทรน คำว่าอาจเป็นเหตุผลการเลือก ไม่ใช่ช่องในตาราง

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

ตารางที่ 1 มีสี่แถว ไม่ใช่สองแถว

รูปที่ 3 วาง recurrent ข้าง self-attention เพราะสองแถวนั้นตอบคำถามอ่านทีละคำกับมองทีเดียวได้ตรงสุด ตารางที่ 1 ของเปเปอร์ยังมี convolution และ self-attention แบบจำกัดเพื่อนบ้าน ถ้าตัดสองแถวนั้นทิ้ง จะเหมือนเปเปอร์ไม่เคยพูดถึงทางเลือกอื่น ทั้งที่หมวด 4 ใช้พื้นที่กับมันพอสมควร

n คือความยาวลำดับ d คือมิติของตัวแทน k คือขนาด kernel ของ convolution r คือขนาดเพื่อนบ้านของ restricted self-attention ตัวเลขด้านล่างคือสัญลักษณ์จากตาราง ไม่ใช่การจับเวลาใหม่

Self-Attention

ความซับซ้อนต่อเลเยอร์ O(n²·d)

ขั้นลำดับ O(1)

เส้นทางยาวสุด O(1)

Recurrent

ความซับซ้อนต่อเลเยอร์ O(n·d²)

ขั้นลำดับ O(n)

เส้นทางยาวสุด O(n)

Convolutional

ความซับซ้อนต่อเลเยอร์ O(k·n·d²)

ขั้นลำดับ O(1)

เส้นทางยาวสุด O(log_k(n))

Self-Attention แบบจำกัด

ความซับซ้อนต่อเลเยอร์ O(r·n·d)

ขั้นลำดับ O(1)

เส้นทางยาวสุด O(n/r)

ตามตารางที่ 1 ของ Vaswani et al. ความยาวเส้นทางสูงสุด ความซับซ้อนต่อเลเยอร์ และจำนวนขั้นลำดับขั้นต่ำ ของเลเยอร์สี่แบบ

convolution หนึ่งชั้นที่ kernel แคบกว่า n เชื่อมไม่ครบทุกคู่ ถ้า kernel ติดกันต้องซ้อน O(n/k) ชั้น ถ้าเป็น dilated convolution แบบ ByteNet เส้นทางยาวสุดเป็น O(log_k(n)) เปเปอร์บอกว่าชั้น convolution โดยทั่วไปแพงกว่า recurrent เป็นตัวคูณ k ส่วน separable convolution ลดความซับซ้อนลงเหลือ O(k·n·d + n·d²) และแม้จะตั้ง k = n ความซับซ้อนนั้นก็เท่ากับ self-attention บวก feed-forward แบบจุดต่อจุด ซึ่งเป็นทางที่โมเดลนี้เดิน

เงื่อนไข n < d ที่ทำให้ self-attention ถูกกว่า recurrent ในนิพจน์นี้ เปเปอร์บอกว่าเป็นกรณีบ่อยของประโยคในงานแปลที่ใช้ word-piece หรือ byte-pair ไม่ใช่กฎของทุกลำดับบนโลก

ตัวเลขแปลภาษา อ่านให้ตรงช่อง

งานแปลในเปเปอร์คือ WMT 2014 อังกฤษเป็นเยอรมันประมาณ 4.5 ล้านคู่ประโยค เข้ารหัสแบบ byte-pair มีคลังคำร่วมของต้นทางกับปลายทางประมาณ 37,000 โทเค็น และอังกฤษเป็นฝรั่งเศส 36 ล้านประโยค แยกโทเค็นเป็น word-piece 32,000 คำ แบตช์จับคู่ตามความยาวโดยประมาณ แต่ละแบตช์มีโทเค็นต้นทางราว 25,000 และโทเค็นปลายทางราว 25,000

เครื่องคือหนึ่งเครื่องที่มี NVIDIA P100 แปดตัว โมเดลฐานใช้ขั้นละประมาณ 0.4 วินาที เทรน 100,000 ขั้น หรือ 12 ชั่วโมง โมเดลใหญ่ขั้นละ 1.0 วินาที เทรน 300,000 ขั้น หรือ 3.5 วัน บทนำบอกว่าคุณภาพระดับ state of the art ใหม่ของการแปลไปถึงได้หลังเทรนสั้นสุดสิบสองชั่วโมงบน P100 แปดตัว ซึ่งตรงกับเวลารุ่นฐาน ไม่ใช่รุ่นใหญ่

optimizer คือ Adam ด้วย β1 = 0.9, β2 = 0.98, และ ε = 10⁻⁹ learning rate เพิ่มเชิงเส้นในช่วง warmup 4,000 ขั้นแรก แล้วลดตามหนึ่งต่อรากที่สองของเลขขั้น ตอนถอดรหัสใช้ beam ขนาด 4 และ length penalty α = 0.6 เลือกจากชุดพัฒนา ความยาวเอาต์พุตสูงสุดตอน inference คือความยาวอินพุตบวก 50 และหยุดก่อนได้ รุ่นฐานเฉลี่ย 5 checkpoint ท้ายที่เขียนทุก 10 นาที รุ่นใหญ่เฉลี่ย 20 checkpoint ท้าย

ตารางที่ 2 เทียบ BLEU บน newstest2014 กับต้นทุนการเทรนที่ผู้เขียนประมาณเอง วิธีประมาณคือเวลาคูณจำนวนจีพียูคูณค่า TFLOPS แบบ single-precision ที่ประมาณว่าเครื่องไหว เชิงอรรถให้ค่า 2.8, 3.7, 6.0, และ 9.5 TFLOPS สำหรับ K80, K40, M40, และ P100 ตามลำดับ นี่ไม่ใช่การนับฟล็อปจากกราฟของแต่ละโมเดล

ดูแถว Transformer กัน รุ่นฐานได้ 27.3 BLEU อังกฤษเป็นเยอรมัน และ 38.1 อังกฤษเป็นฝรั่งเศส รุ่นใหญ่ได้ 28.4 กับ 41.8 ส่วนต้นทุนในสองแถวนี้พิมพ์ 3.3×10¹⁸ กับ 2.3×10¹⁹ FLOPs ไว้ในช่องที่คร่อมคอลัมน์ต้นทุนของทั้งสองภาษา ไม่ได้แยกเลขต้นทุนรายคู่ภาษาให้สองค่า เราเลยไม่ใช้มันไปเติมตัวเลขฝรั่งเศสเอง

แถวคนอื่นในตารางเดียวกันของ v7 ที่ใช้วางข้างกันได้ เพราะคอลัมน์คือ BLEU บน newstest2014 เหมือนกัน มี ByteNet 23.75 บนอังกฤษเป็นเยอรมัน, GNMT + RL 24.6 และ 39.92, ConvS2S 25.16 และ 40.46, MoE 26.03 และ 40.56, GNMT + RL แบบ ensemble 26.30 และ 41.16, ConvS2S แบบ ensemble 26.36 และ 41.29 เปเปอร์สรุปว่าบนอังกฤษเป็นเยอรมัน รุ่นใหญ่ชนะผลที่ดีสุดที่เคยรายงาน รวม ensemble มากกว่า 2.0 BLEU ได้ 28.4 และแม้รุ่นฐานก็เกินโมเดลกับ ensemble ที่เคยตีพิมพ์ บนต้นทุนการเทรนที่ถูกกว่าคู่แข่งที่แข่งขันได้

บน WMT 2014 อังกฤษเป็นฝรั่งเศส รุ่นใหญ่ได้ 41.8 BLEU ตามบทคัดย่อและตารางที่ 2 ของ arXiv v7.1 รุ่นนี้ใช้ dropout 0.1 แทน 0.3 และดีกว่า single model ที่เคยตีพิมพ์ทั้งหมด โดยต้นทุนการเทรนน้อยกว่าหนึ่งในสี่ของโมเดลก่อนหน้า ประโยคหนึ่งในสี่เป็นคำกล่าวของผู้เขียน ไม่ใช่เลขที่บทนี้คำนวณเองจากตาราง เลข 28.4 ของอังกฤษเป็นเยอรมันตรงกันทั้งสองเอกสาร

1 ในไฟล์ v7 เดียวกัน ย่อหน้า 6.1 ยังพิมพ์ 41.0 arXiv v1 และฉบับ proceedings ของ NeurIPS 2017 ก็พิมพ์ 41.0

ตารางที่ 3 เป็นคนละชุดวัดกับตารางที่ 2 มันอยู่บนชุดพัฒนา newstest2013 ของอังกฤษเป็นเยอรมัน ไม่มี checkpoint averaging perplexity เป็นต่อ wordpiece ตาม byte-pair ของผู้เขียน ห้ามเอาไปเทียบ perplexity ต่อคำ แถวฐานคือ N = 6, d_model = 512, d_ff = 2048, h = 8, d_k = 64, d_v = 64, dropout 0.1, label smoothing 0.1, 100,000 ขั้น, perplexity 4.92, BLEU 25.8, พารามิเตอร์ 65 ล้าน แถวรุ่นใหญ่ท้ายตารางคือ N = 6, d_model = 1024, d_ff = 4096, h = 16, dropout 0.3, 300,000 ขั้น, perplexity 4.33, BLEU 26.4, พารามิเตอร์ 213 ล้าน BLEU 26.4 ตรงนี้จึงไม่ใช่ 28.4 ของชุดทดสอบ

ผู้เขียนสรุปจากตารางที่ 3 ว่าลดขนาด key d_k แล้วคุณภาพเสีย ซึ่งแปลว่าการตัดสินความเข้ากันได้ไม่ใช่เรื่องง่าย และฟังก์ชันที่ซับซ้อนกว่าผลคูณจุดอาจช่วยได้ โมเดลใหญ่ขึ้นแล้วดีขึ้นตามที่คาด และ dropout ช่วยมากเรื่อง overfitting แถว positional embedding เกือบเท่าฐาน ตามที่เล่าไปแล้ว

แล้วมัน ทำอย่างอื่น นอกจาก แปลได้ไหม

เปเปอร์ลอง English constituency parsing เพื่อดูว่า Transformer ย้ายงานได้หรือไม่ งานนี้เอาต์พุตมีข้อจำกัดเชิงโครงสร้างแรง และยาวกว่าอินพุตมาก ผู้เขียนบอกด้วยว่า RNN แบบ sequence-to-sequence ยังไปไม่ถึง state of the art ในระบอบข้อมูลน้อย

โมเดลที่เทรนเป็น Transformer 4 ชั้น d_model = 1024 บนส่วน Wall Street Journal ของ Penn Treebank ประมาณ 40,000 ประโยค และอีกการทดลองหนึ่งเป็น semi-supervised ด้วยคลัง high-confidence กับ BerkleyParser ตามที่เปเปอร์เขียน รวมประมาณ 17 ล้านประโยค คลังคำ 16,000 โทเค็นสำหรับชุด WSJ อย่างเดียว และ 32,000 สำหรับชุด semi-supervised การเลือก dropout, learning rate, และขนาด beam ทำแค่ไม่กี่ครั้งบนชุดพัฒนา section 22 นอกนั้นคงค่าจากโมเดลฐานของงานแปลอังกฤษเป็นเยอรมัน ตอน inference ความยาวสูงสุดเป็นความยาวอินพุตบวก 300 beam ขนาด 21 และ α = 0.3 ทั้งสองชุดการทดลอง

ตารางที่ 4 รายงาน F1 บน section 23 ของ WSJ คอลัมน์การเทรนไม่เหมือนกันทุกแถว การวางข้างกันที่งานเดียวกันจริงในตารางนี้คือกลุ่ม WSJ only, discriminative

ตามตารางที่ 4 F1 บน WSJ section 23 เฉพาะแถวที่การเทรนเป็น WSJ only, discriminative เรียงจากน้อยไปมาก เลขเหล่านี้มาจากพรีพรินต์ ไม่ได้วัดใหม่ ตารางต้นฉบับสะกดแถว Vinyals ว่า el al.

ในกลุ่มนี้ Transformer อยู่ที่ 91.3 สูงกว่าสามแถวแรก และต่ำกว่า Dyer et al. (2016) ที่ 91.7 ฝั่ง semi-supervised ในตารางเดียวกัน Transformer อยู่ที่ 92.7 ส่วน Zhu et al. กับ Huang & Harper (2009) อยู่ที่ 91.3 และ McClosky et al. (2006) กับ Vinyals & Kaiser et al. อยู่ที่ 92.1 แถวที่การเทรนคนละแบบยังมี Luong et al. (2015) แบบ multi-task ที่ 93.0 และ Dyer et al. แบบ generative ที่ 93.3

ประโยคสรุปของผู้เขียนคือ แม้จูนเฉพาะงานนี้น้อย โมเดลก็ทำได้ดีจนน่าแปลกใจ ได้ผลดีกว่าโมเดลที่เคยรายงานทั้งหมด ยกเว้น Recurrent Neural Network Grammar และเมื่อเทรนแค่ชุด WSJ 40,000 ประโยค Transformer ยังเหนือ BerkeleyParser ซึ่งต่างจาก RNN sequence-to-sequence แถว 91.7 กับ 93.3 ทำให้คำว่ายกเว้นตัวนั้นอ่านแล้วเห็นของจริง ไม่ใช่คำสุภาพ

ตรงไหนที่คำว่า generalizes well ต้องชะลอ หลักฐานในเปเปอร์คืองานแปลสองคู่ภาษา กับ parsing ภาษาอังกฤษอีกงานหนึ่ง ไม่มีตารางสรุปความ ไม่มีตารางตอบคำถาม และไม่มีภาพหรือเสียง ทั้งที่บทสรุปบอกว่าอยากขยายไป modality อื่น และอยากลอง restricted attention สำหรับอินพุตใหญ่อย่างภาพ เสียง และวิดีโอ ประโยค generalize ในบทคัดย่อจึงหมายถึงสิ่งที่ตารางที่ 4 แสดง ไม่ได้หมายถึงทุกงานลำดับบนโลก

ถามอธิบายกลับ

ลองตอบในหัวก็พอ สามข้อนี้อยู่ในรูปบนหน้านี้กับในเปเปอร์ ไม่ต้องเขียนส่งที่ไหน และไม่ต้องไปหาเลขใหม่ เปิดเฉลยทีหลังได้ ถ้ายังไม่เปิดก็ไม่เป็นไร

ก่อนลาก แถบของคำว่าหนูในแถวของแมวควรเตี้ยลงไหมเมื่ออุณหภูมิสูงขึ้น

เตี้ยลงเข้าหา 20% ที่คำถามตั้งต้นคือแมว หนูได้ 40% จากตารางสมมติ T เป็นตัวหารก่อนเข้า exp พอ T โตขึ้นมาก ๆ ทุกตำแหน่งเข้าใกล้ 1/5 หรือ 20% เท่ากัน แถบหนูเลยลดเข้าหา 20% สไลเดอร์ไปได้แค่ T = 3 จึงยังไม่เท่ากันเป๊ะ ถ้าตอบว่าสูงขึ้น แปลว่ากำลังอ่าน T กลับทาง ถ้าคลิกคำอื่นก่อน แถวเปลี่ยน แต่เมื่อ T โตมากทุกแถวยังเข้าใกล้ 20% เหมือนกัน นี่เป็นของเล่น ไม่ใช่ปุ่มในเปเปอร์

เลื่อนขั้น recurrent จาก 1 ไป 5 แล้วฝั่ง self-attention เห็นกี่คำ

ยังเห็น 5 จาก 5 สไลเดอร์ไม่ใช่เวลาของทั้งโมเดล มันเป็นขั้นของฝั่ง recurrent เท่านั้น self-attention ในรูปนี้เชื่อมครบตั้งแต่ขั้นเดียว ตาม O(1) ในตารางที่ 1

ทำไมเปเปอร์หารด้วย √d_k ทั้งที่มีสไลเดอร์อุณหภูมิให้หมุน

การหารด้วย √d_k มองเป็น temperature ที่ตรึงไว้เท่ากับ √d_k ได้เลย ในโมเดลฐาน d_k = 64 จึงเท่ากับ T = 8 ถ้าเริ่มจากคะแนน dot product ดิบ แต่สไลเดอร์ของเรากำลังหาร log(w) ของตารางสมมติอีกชุด ไม่ได้เปลี่ยนมิติ key ของเปเปอร์ มันเป็นปุ่มทดลองเพิ่มเติม ไม่ใช่หลักฐานว่าสองสูตรนี้ไม่สมมูลกัน

ปิดสมุด

กลับมาที่มองอีกที ตอนแรกตำแหน่งนั้นมีแค่ข้อมูลของตัวเอง พอคลิกมองที่ T = 1 มันมีส่วนผสมจากทั้งประโยค ได้ 31.6 ในของเล่นหนึ่งช่อง query ใช้ถาม key ใช้เทียบ และ value เป็นของที่หยิบมาผสม การดูแต่เส้นหนายังเล่าไม่จบ ต้องดูด้วยว่าเส้นนั้นขนอะไรกลับมา

ก่อนเข้า stack บวกข้อมูลตำแหน่งกับ embedding ครั้งเดียว ที่ก้นของ encoder และที่ก้นของ decoder เพื่อให้รู้ว่าใครอยู่ตรงไหนก่อนเข้าชั้นแรก ในแต่ละชั้นยังมี attention, feed-forward, residual และ layer norm ชื่อ Attention Is All You Need จึงไม่ได้แปลว่าข้างในเหลือสมการ attention อย่างเดียว ส่วนทางเดินจากแมวไปพรม ฝั่ง encoder self-attention เชื่อมกันตรง ๆ ได้ในหนึ่งเลเยอร์ ฝั่ง recurrent ที่เดินซ้ายไปขวาเดินสี่ช่วงระหว่างห้าตำแหน่ง ถ้าขยายประโยค ทางเดินฝั่งแรกยังเป็น O(1) ส่วนฝั่งหลังโตเป็น O(n) ตรงนี้เรานับความยาวเส้นทางนะ ไม่ใช่งานทั้งหมด ถ้าจะเทียบงานต่อเลเยอร์ คู่นั้นคือ n²·d กับ n·d² ซึ่งเป็นอีกคอลัมน์ในตารางที่ 1 และทั้งคู่ก็ยังไม่ใช่วินาทีบนเครื่อง

ผู้เขียนแปดคนคือ Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin สังกัดที่พิมพ์ไว้เป็น Google Brain กับ Google Research เป็นหลัก Gomez สังกัด University of Toronto และเชิงอรรถบอกว่างานนี้ทำขณะอยู่ที่ Google Brain Polosukhin ก็เชิงอรรถคล้ายกันว่าทำขณะอยู่ที่ Google Research ลำดับชื่อสุ่ม เพราะถือว่ามีส่วนเท่ากัน Jakob เป็นคนเสนอให้ถอด RNN ออกแล้วลอง self-attention Noam เป็นคนเสนอ scaled dot-product attention, multi-head attention และวิธีเข้ารหัสตำแหน่งแบบไม่ต้องเรียนพารามิเตอร์ ในเชิงอรรถ ผู้เขียนขอบคุณ Nal Kalchbrenner กับ Stephan Gouws โค้ดที่ใช้เทรนอยู่ในแถวท้ายของตารางแหล่ง

แหล่งที่มา

ที่มาของตัวเลขเปเปอร์ทั้งบทอยู่ตารางนี้ครั้งเดียว ลิงก์เปเปอร์เปิดไปที่พรีพรินต์กับฉบับรีวิวได้

แหล่งประเภทใช้ตรงไหน
Vaswani et al., Attention Is All You Need. พรีพรินต์ arXiv:1706.03762v7, 2 สิงหาคม 2023. หน้าแรกประทับ NIPS 2017 ที่ Long Beach arxiv.org/abs/1706.03762v7 arxiv.org/pdf/1706.03762v7 พรีพรินต์ สูตร ตารางที่ 1–4 และภาคผนวก บทคัดย่อกับตารางที่ 2 พิมพ์ BLEU อังกฤษเป็นฝรั่งเศสของรุ่นใหญ่ 41.8 ย่อหน้า 6.1 ของไฟล์เดียวกันพิมพ์ 41.0
ฉบับรีวิว NeurIPS 2017 proceedings PDF คนละไฟล์กับ arXiv งานประชุมเดียวกับตรา NIPS 2017 NeurIPS 2017 PDF ผ่านการรีวิว บทคัดย่อ ตารางที่ 2 และย่อหน้า 6.1 พิมพ์ BLEU อังกฤษเป็นฝรั่งเศสของรุ่นใหญ่ 41.0 เลข 28.4 ของอังกฤษเป็นเยอรมันตรงกับพรีพรินต์
โค้ดที่เปเปอร์ชี้ในบทสรุป https://github.com/tensorflow/tensor2tensor โค้ด ไม่ได้ใช้เป็นแหล่งตัวเลขผลทดลอง