"แมวกินปลา" ≠ "ปลากินแมว": โมเดลรู้ลำดับคำยังไง
กลไกความสนใจ (attention)วิธีที่แต่ละคำเลือกว่าจะ "ฟัง" คำอื่นในประโยคมากน้อยแค่ไหน โดยใช้ softmax แบ่งน้ำหนักให้รวมได้ 100%ดูคำศัพท์ทั้งหมด ในบทที่ 2 เทียบทุกคู่ด้วย ไม่ได้ดูลำดับเลย สองประโยคจึงเป็น "ถุงคำ" (bag of words) ใบเดียวกัน
ทางแก้คือเติม ข้อมูลตำแหน่ง (positional encoding, RoPE)วิธีบอกโมเดลว่าแต่ละ token อยู่ลำดับที่เท่าไร เพราะ attention ล้วนๆ ไม่รู้ลำดับคำ วิธีที่นิยมในโมเดลรุ่นใหม่คือ RoPE ซึ่งหมุน query และ key ตามตำแหน่ง คะแนนจึงขึ้นกับระยะห่างระหว่างคำด้วยดูคำศัพท์ทั้งหมด รุ่นใหม่หลายตัวใช้ RoPE (rotary position embedding) คือ หมุน q และ k ก่อนเทียบกัน คำที่ตำแหน่ง m หมุนไป
ผลคือมุมระหว่าง query (ตำแหน่ง m) กับ key (ตำแหน่ง n) เปลี่ยนไป ขึ้นกับ ระยะห่าง ไม่ใช่จุดเริ่ม ส่วนที่เหลือของคะแนนยังมาจากเนื้อหาของ q และ k
ลองคิดตาม ให้ θ = 30° และ q = k = (1, 0) (ให้เห็นแค่ส่วนของตำแหน่ง):
- query ตำแหน่ง 3 หมุน 90° ได้ (0, 1) และ key ตำแหน่ง 1 หมุน 30° ได้ (0.8660, 0.5000) → ผลคูณจุด (dot product)เอาตัวเลขตำแหน่งเดียวกันของสองเวกเตอร์มาคูณกัน แล้วบวกรวม ยิ่งชี้ไปทางเดียวกันยิ่งได้ค่ามากดูคำศัพท์ทั้งหมด = 0.5000
- เลื่อนทั้งคู่ไป 1 ตำแหน่ง (4 และ 2) ได้ (−0.5000, 0.8660) กับ (0.5000, 0.8660) → dot ยังเป็น 0.5000
ลองเลื่อนทั้งสองคำโดยให้ห่างเท่าเดิม แล้วดูค่า dot
ถ้าติด: กดปุ่ม "เลื่อนทั้งคู่ +1 →" ครั้งเดียวก็ผ่าน
RoPE หมุน query และ key ตามตำแหน่ง dot product จึงขึ้นกับเนื้อหาของสองคำและ "ระยะห่าง" ไม่ใช่ตำแหน่งตายตัว

มังคุด
ถ้าย้ายประโยคไปท้ายเอกสารยาวๆ ความสัมพันธ์ระหว่างคำก็ยังเหมือนเดิมเหรอ?