ทางหลัก residual: บวกเพิ่ม ไม่เขียนทับ
Transformer ใช้วิธีแบบที่สอง: เวกเตอร์ (vector)รายการตัวเลขเรียงกัน มองเป็นลูกศรหรือพิกัดบนแผนที่ก็ได้ เช่น (0.9, 0.8)ดูคำศัพท์ทั้งหมด ของแต่ละ token วิ่งไปตาม ทางหลักของเวกเตอร์ (residual stream, residual connection)เส้นทางที่เวกเตอร์ของแต่ละ token ไหลผ่านทุกชั้น แต่ละชั้นอ่านแล้ว "บวกส่วนแก้" กลับเข้าไป แทนการเขียนทับดูคำศัพท์ทั้งหมด ผ่านทุก ชั้น (layer, Transformer block)หนึ่งรอบการประมวลผลที่มีทั้ง attention และ MLP โมเดลจริงซ้อนกันหลายสิบชั้น โดยแต่ละชั้นแก้เวกเตอร์ของทุก token ทีละนิดดูคำศัพท์ทั้งหมด
attention และ MLP แต่ละตัว อ่าน เวกเตอร์ คำนวณส่วนแก้ แล้ว บวก กลับเข้าไป:
ลองคิดตามบนแผนที่ 2 มิติแบบบทที่ 2 สมมติว่า "มัน" เริ่มที่ (0, 0.5)
- attention บวก (0.6, 0.1) ได้ (0.6, 0.6)
- MLP บวก (0.2, 0.1) ได้ (0.8, 0.7)
ผลขยับเข้าใกล้แมว (0.9, 0.8) ทีละนิด
ทำไมสำคัญ? ไม่มีชั้นไหนลบของเดิมทิ้งตรงๆ ข้อมูลจากชั้นล่างจึงส่งถึงชั้นบนได้ (เว้นแต่ชั้นหลังเรียนรู้ให้บวกค่าตรงข้ามมาหักล้าง) และโมเดลลึกหลายสิบชั้นก็ฝึกได้ง่ายขึ้นมาก (บทที่ 4)
อีกตัวช่วยคือ การปรับขนาดเวกเตอร์ (layer normalization, RMSNorm)ขั้นที่ปรับขนาดสำเนาของเวกเตอร์ก่อนส่งเข้า attention หรือ MLP และอีกครั้งก่อนแปลงเป็น logit ตัวเลขที่แต่ละส่วนเห็นจึงอยู่ในช่วงพอดี ไม่ใหญ่หรือเล็กเกินไปดูคำศัพท์ทั้งหมด ก่อน attention หรือ MLP จะอ่าน โมเดลปรับขนาดสำเนาของเวกเตอร์ให้อยู่ในช่วงพอดี เช่น (2, 4, 6, 8) กับ (20, 40, 60, 80) ออกมาเท่ากัน เพราะตัดเรื่องขนาดออก
สรุปหนึ่งชั้น: ปรับขนาด → attention → บวก แล้วปรับขนาด → MLP → บวก
ทุกชั้นไม่เขียนทับ แต่บวกส่วนแก้ลงบนเวกเตอร์เดิม (residual stream) และปรับขนาดสำเนาที่อ่านไปคำนวณทุกครั้ง

มังคุด
ถ้าบวกไปเรื่อยๆ 32 ชั้น ตัวเลขไม่ใหญ่จนล้นเหรอ?