Tracks
ลองจินตนาการว่าต้องอ่านนวนิยายที่ทุกคำบนหน้าถูกสลับลำดับแบบสุ่ม ถึงแม้จะเข้าใจทุกคำ แต่โครงเรื่องก็สูญหายหมด เพราะลำดับของคำเป็นตัวกำหนดความหมาย เมื่อนักวิศวกรเริ่มออกแบบโมเดลภาษาขนาดใหญ่ (LLMs) ก็เจออุปสรรคคล้ายกัน จะสอนให้โมเดลเข้าใจลำดับของคำได้อย่างไร ในเมื่อกลไกหลักของมันประมวลผลทุกอย่างพร้อมกัน?
นี่คือบทบาทของ positional encoding ในบทความนี้ เราจะสำรวจกลไกภายในของ positional encoding และวิธีที่มันมอบ “สัมผัสแห่งลำดับ” ให้กับทรานส์ฟอร์เมอร์ เราจะไล่ดูวิวัฒนาการตั้งแต่สูตรไซนูซอยด์ดั้งเดิมไปจนถึงการฝังแบบหมุนสมัยใหม่ และวิธีนำไปใช้ในโปรเจกต์แมชชีนเลิร์นนิงถัดไป หากยังใหม่กับสถาปัตยกรรมพื้นฐาน แนะนำให้อ่านคู่มือของเราเรื่องการทำงานของทรานส์ฟอร์เมอร์ก่อน
Positional Encoding คืออะไร?
Positional encoding คือเทคนิคที่ช่วยให้โครงข่ายประสาทเข้าใจลำดับเชิงต่อเนื่องของข้อมูลอินพุต มันทำหน้าที่เป็นชุดพิกัดที่แทนตำแหน่งสัมพัทธ์หรือสัมบูรณ์ของโทเค็น และผสานรวมเข้ากับตัวแทนข้อมูลมาตรฐานของคุณ
ก่อนที่ข้อความจะเข้าสู่โครงข่ายประสาท คำจะถูกแปลงเป็นรูปแบบตัวเลขต่อเนื่องที่เรียกว่า embeddings อย่างไรก็ตาม embedding มาตรฐานจะจับเฉพาะความหมายเชิงความหมาย (semantic) เท่านั้น ไม่บอกอะไรเกี่ยวกับตำแหน่งของคำในข้อความ สามารถเรียนรู้กระบวนการนี้โดยละเอียดได้ในคอร์สIntroduction to Embeddings with the OpenAI APIของเรา
Positional encoding คือชั้นคณิตศาสตร์เพิ่มเติมที่ถูกใส่ลงไปใน embedding ของโทเค็นโดยตรง โดยการรวมตัวแทนเชิงความหมายเข้ากับตราประทับตำแหน่ง โมเดลทรานส์ฟอร์เมอร์จึงแยกแยะคำที่เหมือนกันซึ่งปรากฏในส่วนต่าง ๆ ของประโยคได้
ปัญหา permutation invariance
ข้อมูลลำดับพึ่งพา “ลำดับ” อย่างมาก ในภาษาธรรมชาติ ประโยค "the dog bit the man" มีความหมายต่างจาก "the man bit the dog" อย่างสิ้นเชิง

ในอดีต Recurrent Neural Networks (RNNs) และ Long Short-Term Memory (LSTM) จัดการเรื่องนี้โดยธรรมชาติ เพราะประมวลผลโทเค็นแบบลำดับ กล่าวคือ เครือข่ายจะรับคำที่สองหลังจากจบคำแรกเท่านั้น ในทำนองเดียวกัน Convolutional Neural Networks (CNNs) ประมวลผลข้อมูลด้วยหน้าต่างเลื่อนแบบเฉพาะที่ ซึ่งจับการจัดเรียงเชิงพื้นที่ของพิกเซลหรือคำข้างเคียง
ทรานส์ฟอร์เมอร์ละทิ้งการประมวลผลแบบลำดับโดยสิ้นเชิง มันประมวลผลโทเค็นทั้งหมดแบบขนาน กลไกหลักคือself-attention ซึ่งคำนวณคะแนนความสัมพันธ์แบบจับคู่ระหว่างทุกโทเค็นในลำดับพร้อมกันในคราวเดียว ทางคณิตศาสตร์ self-attention มีสมบัติไม่เปลี่ยนต่อการสับลำดับ (permutation invariant) หากสลับลำดับอินพุต กลไกนี้จะให้คะแนนความสนใจเหมือนเดิมสำหรับคู่คำ
หากไม่มีวิธีรักษาลำดับ โมเดลจะสูญเสียข้อมูลลำดับอย่างสิ้นเชิง ความหมายเชิงความหมายจะยุบเหลือเพียงถุงคำที่ไม่เรียงลำดับ Positional encoding แก้ปัญหา permutation invariance โดยปรับเวกเตอร์อินพุตให้แตกต่างกันตามตำแหน่ง ทำให้ self-attention ลงทะเบียนโทเค็นที่ตำแหน่ง 1 แตกต่างจากตำแหน่ง 10
Positional Encoding ทำงานอย่างไร?
Positional encoding ทำงานโดยปรับแก้เวกเตอร์โทเค็นอินพุตเชิงคณิตศาสตร์ก่อนจะเข้าสู่เลเยอร์ self-attention เพื่อให้โมเดลคำนวณความสัมพันธ์โดยอิงทั้งความหมายและตำแหน่ง
เพื่อให้เห็นภาพ ลองนึกถึง embedding ของโทเค็นเป็นป้ายชื่อในงานสัมมนา ป้ายชื่อบอกว่าบุคคลนั้นเป็นใคร แต่ตำแหน่งที่นั่งไม่ได้เปลี่ยนว่าเขาเป็นใครหรือเกี่ยวข้องกับใคร Positional encoding เปรียบเหมือนการใส่เลขที่นั่งบนป้ายชื่อ เมื่อนำมารวมกัน เราจะรู้ทั้งตัวตนและที่นั่ง ซึ่งเพิ่มบริบทต่อปฏิสัมพันธ์ที่อาจเกิดขึ้น
ในทรานส์ฟอร์เมอร์ การรวมกันนี้มักทำผ่านการบวกแบบองค์ประกอบต่อองค์ประกอบ โมเดลจะนำเวกเตอร์ embedding เชิงความหมายของคำมาบวกกับเวกเตอร์ positional encoding ที่มีขนาดเท่ากัน ผลลัพธ์คือเวกเตอร์ที่มีการปรับแต่งเล็กน้อย ซึ่งเลเยอร์ถัดไปเรียนรู้ที่จะแปลความหมายเป็นพิกัดเชิงพื้นที่
ตัวอย่างการคำนวณ
มาดูตัวอย่างอย่างง่าย สมมติว่ามีพื้นที่ embedding ขนาด 4 มิติ เราต้องการประมวลผลคำว่า "DataCamp" ที่ตำแหน่ง 0 ในลำดับ
- Semantic embedding: โครงข่ายดึง embedding ของ "DataCamp" ซึ่งอาจมีลักษณะเป็น [0.51, -0.22, 0.88, 0.14]
- Positional encoding: สูตรตำแหน่งจะสร้างเวกเตอร์พิกัดสำหรับตำแหน่ง 0 สำหรับตัวอย่างนี้ สมมติว่าคำนวณได้ [0.00, 1.00, 0.00, 1.00]
- การผสม: บวกสองเวกเตอร์เข้าด้วยกันแบบองค์ประกอบต่อองค์ประกอบ
- อินพุตสุดท้าย: เฟส forward รับค่า [0.51, 0.78, 0.88, 1.14]
แม้โทเค็นเดียวกัน "DataCamp" จะปรากฏทีหลังที่ตำแหน่ง 5 เวกเตอร์ positional encoding ก็จะต่างออกไป ส่งผลให้เวกเตอร์อินพุตสุดท้ายดูแตกต่างอย่างสิ้นเชิงต่อกลไก self-attention

Sinusoidal Positional Encoding
งานวิจัยดั้งเดิม "Attention Is All You Need" ได้เสนอวิธีอันชาญฉลาดในการสร้างเวกเตอร์ตำแหน่งด้วยตรีโกณมิติพื้นฐาน วิธีนี้ไม่ต้องใช้พารามิเตอร์ที่ต้องเรียนรู้ และอาศัยฟังก์ชันคณิตศาสตร์คงที่ล้วน ๆ
พื้นฐานทางคณิตศาสตร์
Sinusoidal positional encoding ใช้ฟังก์ชันไซน์และโคไซน์ที่ความถี่ต่างกันเพื่อเข้ารหัสข้อมูลตำแหน่ง สูตรดั้งเดิมกำหนดว่า สำหรับตำแหน่ง (pos) และดัชนีมิติ (i) เฉพาะภายในเวกเตอร์ embedding การเข้ารหัสคำนวณดังนี้:
-
สำหรับมิติคู่ (
2i):PE(pos, 2i) = sin(pos / 10000^(2i/dmodel)) -
สำหรับมิติคี่ (
2i+1):PE(pos, 2i+1) = cos(pos / 10000^(2i/dmodel))
ในสูตรนี้ dmodel คือขนาดรวมของเวกเตอร์ embedding เมื่อเลื่อนไปตามมิติตั้งแต่ดัชนี 0 จนถึง dmodel ความยาวคลื่นของฟังก์ชันไซนูซอยด์จะเพิ่มขึ้นแบบเรขาคณิต
ข้อดีและคุณสมบัติ
ความถี่ที่เพิ่มแบบเรขาคณิตนี้มีข้อดีหลายประการ
- ผลลัพธ์ไซน์และโคไซน์ถูกจำกัดอยู่ระหว่าง -1 ถึง 1 ความเป็นขอบเขตนี้ทำให้ positional encoding ไม่มีอิทธิพลเชิงตัวเลขมากเกินไปเหนือ embedding เชิงความหมาย
- ฟังก์ชันมีคาบ ด้วยสูตรบวกเชิงตรีโกณมิติ การแปลงเชิงเส้นสามารถแทน encoding ของตำแหน่งอนาคต (
pos + k) เป็นฟังก์ชันของตำแหน่งปัจจุบัน (pos) ได้ง่าย คุณสมบัตินี้เปิดทางให้โมเดลเรียนรู้การเข้ารหัสตำแหน่งแบบสัมพัทธ์โดยธรรมชาติ - Sinusoidal encoding ใช้พารามิเตอร์คงที่ ไม่ต้องมีเวทที่ต้องเรียนรู้ ลดภาระหน่วยความจำลงมาก และเพราะทำงานบนฟังก์ชันคณิตศาสตร์ต่อเนื่อง โมเดลจึงมีศักยภาพเชิงทฤษฎีในการคาดคะเนนอกช่วงการฝึก (extrapolation) กล่าวคือ แมปพิกัดตำแหน่งสำหรับลำดับที่ยาวกว่าที่เคยฝึกได้
การมองเห็นภาพ
เพื่อช่วยทำความเข้าใจ sinusoidal encoding การมองเป็นฮีตแมปจะเป็นประโยชน์

แกน x แทนขนาดมิติของ embedding ส่วนแกน y แทนตำแหน่งของโทเค็น
มิติต่ำทางซ้ายสวิงจากค่าลบไปบวกอย่างรวดเร็ว ช่วยแยกแยะตำแหน่งของโทเค็นที่อยู่ใกล้กัน เมื่อดัชนีมิติเพิ่มขึ้น ความยาวคลื่นก็ยาวขึ้นและการเข้ารหัสเปลี่ยนช้าลง มิติเหล่านี้จับความต่างของตำแหน่งระยะไกล
สำหรับ 50 ตำแหน่งที่แสดง มิติที่สูงหลายมิติดูเหมือนแถบแนวตั้งเกือบสม่ำเสมอ เกิดจากความยาวคลื่นที่ยาวมากจนค่าไซน์ยังใกล้ 0 และค่าโคไซน์ยังใกล้ 1 ภายในลำสั้นนี้ จึงเป็นลายสลับของมิติคู่ไซน์–คี่โคไซน์ ไม่ใช่รหัสไบนารีง่าย ๆ หากเป็นลำดับที่ยาวขึ้น มิติเหล่านี้ก็จะเริ่มแปรผันอย่างเห็นได้ชัด
ข้อสรุปคือความถี่ที่ต่างกันทำให้โมเดลรับข้อมูลตำแหน่งได้หลายสเกล: มิติที่เปลี่ยนเร็วจับความต่างละเอียดระหว่างโทเค็นใกล้กัน ส่วนมิติที่เปลี่ยนช้าติดตามตำแหน่งโดยรวมในลำดยาว
Learned Positional Encoding
แม้สูตรคณิตศาสตร์คงที่จะสง่างาม แต่สถาปัตยกรรมดีปเลิร์นนิงสมัยใหม่มักพึ่งข้อมูลเพื่อเรียนรู้ตัวแทนที่เหมาะสมที่สุด Learned positional embeddings จึงยกภาระเรื่องผังตำแหน่งไปไว้ในช่วงฝึกทั้งหมด
แนวคิดและการใช้งาน
แทนที่จะฮาร์ดโค้ดค่าตำแหน่งด้วยไซน์และโคไซน์ Learned positional embeddings ปฏิบัติต่อพิกัดตำแหน่งเป็นพารามิเตอร์ที่เรียนรู้ได้
โมเดลจะเริ่มจากเมทริกซ์ embedding ว่าง ๆ ที่แต่ละแถวตรงกับตำแหน่งในลำดับ ระหว่างลูปการฝึกแบบbackpropagation มาตรฐาน เครือข่ายจะอัปเดตเวทตำแหน่งเหล่านี้ควบคู่กับ embedding ของโทเค็นเชิงความหมายเพื่อทำให้loss function โดยรวมต่ำที่สุด
ข้อดีเชิงเปรียบเทียบ
ข้อดีหลักของ learned positional embeddings คือความยืดหยุ่นสูงสุด มีอิสระเต็มที่ในการเรียนรู้ตัวแทนตำแหน่งที่เหมาะกับชุดข้อมูลเฉพาะ สถาปัตยกรรมอย่าง BERT และ GPT-2 ทำให้แนวทางนี้เป็นที่นิยมด้วยความสามารถในการปรับตัวสูงและผลงานที่แข็งแกร่งในงานปลายทาง
ข้อจำกัดและความท้าทาย
ข้อจำกัดสำคัญคือขอบเขตความยาวลำดับที่ตายตัว หากฝึกด้วยเวกเตอร์ตำแหน่งที่เรียนรู้ได้สูงสุด 2,048 ตำแหน่ง โมเดลจะไม่สามารถประมวลผลเอกสารที่มี 2,049 โทเค็นได้จริง
ข้อจำกัดนี้ทำให้การคาดคะเนความยาวยากมาก และมักต้องฝึกใหม่ที่มีต้นทุนสูงเพื่อขยายหน้าต่างบริบท
Relative Positional Encoding
เมื่อโมเดลพัฒนาไปสู่การรองรับเอกสารที่ยาวขึ้น วิศวกรตระหนักว่าตำแหน่งสัมบูรณ์ของคำมักสำคัญน้อยกว่าระยะห่างสัมพัทธ์กับคำอื่น
การเปลี่ยนกรอบคิดสู่ตำแหน่งสัมพัทธ์
พิจารณาวลี "the rapid advancement of AI" ความสัมพันธ์ทางไวยากรณ์ระหว่าง "advancement" และ "AI" เหมือนเดิมไม่ว่าวลีจะอยู่ต้นเอกสารหรือท้ายเอกสาร Relative positional encoding จึงละทิ้งพิกัดกริดสัมบูรณ์และมุ่งที่ระยะห่างระหว่างโทเค็นที่โต้ตอบกันล้วน ๆ
การใช้งานในกลไก attention
เพื่อใช้งานการเข้ารหัสแบบสัมพัทธ์ วิศวกรจะปรับการคำนวณคะแนน attention โดยตรง แทนที่จะไปเปลี่ยน embedding อินพุตตั้งแต่ต้นเครือข่าย
เมื่อคำนวณคะแนน attention ระหว่างเมทริกซ์ "query" และ "key" จะเพิ่มเทอมไบแอสที่เรียนรู้ได้ซึ่งแทนระยะห่างสัมพัทธ์ การปรับนี้รับประกันคุณสมบัติไม่เปลี่ยนต่อการเลื่อนตำแหน่งภายในข้อความ หากต้องการเจาะลึกการทำงานของเมทริกซ์เหล่านี้ อ่านคู่มือของเราเรื่องกลไก attention ใน LLMs
การแลกเปลี่ยนเชิงปฏิบัติ
แนวทางนี้ให้ความเข้าใจบริบทที่แม่นยำสูง แต่แลกมาด้วยภาระคำนวณหนัก การคำนวณเมทริกซ์ระยะห่างสัมพัทธ์เฉพาะสำหรับแต่ละหัว attention ทำให้การใช้หน่วยความจำเพิ่มขึ้นมาก และทำให้กลไกแคชภายในที่ใช้เร่งการสร้างข้อความซับซ้อนขึ้น
ข้อมูลตำแหน่งแบบสัมบูรณ์ vs สัมพัทธ์
การตัดสินใจเลือกระหว่างแบบสัมบูรณ์และสัมพัทธ์ขึ้นกับงานเฉพาะ
- การเข้ารหัสแบบสัมบูรณ์ เหมาะมากเมื่อเลย์เอาท์เชิงพื้นที่ตายตัวและต้องการความเร็ว
- การเข้ารหัสแบบสัมพัทธ์ เหนือกว่าอย่างมากสำหรับงานประมวลผลภาษาธรรมชาติแบบยาว ที่โครงสร้างไวยากรณ์ขึ้นกับระยะทางบริบทเฉพาะที่มากกว่าพิกัดสัมบูรณ์ของเอกสาร
Rotary Position Embedding (RoPE)
เพื่อมุ่งสู่ความลงตัวของสถาปัตยกรรมทรานส์ฟอร์เมอร์ นักวิจัยได้เสนอ Rotary Position Embedding (RoPE) ซึ่งผสานคุณสมบัติเด่นของการเข้ารหัสตำแหน่งแบบสัมบูรณ์และสัมพัทธ์ และกลายเป็นมาตรฐานอุตสาหกรรมอย่างรวดเร็ว
แนวทางเชิงนวัตกรรม
RoPE รวมการวางแบบสัมบูรณ์และระยะห่างสัมพัทธ์ผ่านการแปลงแบบหมุน แทนที่จะบวกเวกเตอร์เข้ากับ embedding หรือใส่ไบแอสหนัก ๆ ลงในการคำนวณ attention RoPE จะทำแผนที่เวกเตอร์ embedding ไปยังระนาบเชิงซ้อนและหมุนด้วยมุมเฉพาะ ขนาดของมุมถูกกำหนดอย่างเข้มงวดโดยตำแหน่งสัมบูรณ์ของโทเค็นในลำดับ

มุมมองทางคณิตศาสตร์
ในพื้นที่ 2 มิติ การหมุนใช้เมทริกซ์หมุน 2D มาตรฐาน สำหรับมิติที่สูงขึ้น RoPE จะแบ่งมิติของ embedding เป็นคู่ ๆ และใช้การหมุน 2D เฉพาะกับแต่ละส่วนตามดัชนีตำแหน่งสัมบูรณ์
ด้วยสมบัติเชิงเรขาคณิตของเมทริกซ์หมุน ผลคูณจุดของเวกเตอร์ query ที่ถูกหมุนกับเวกเตอร์ key ที่ถูกหมุนจึงขึ้นกับเพียงมุมสัมพัทธ์ระหว่างกัน ดังนั้น RoPE ใช้การแมปตำแหน่งสัมบูรณ์เพื่อเข้ารหัสระยะห่างสัมพัทธ์ระหว่างโทเค็นตามธรรมชาติ
RoPE เทียบกับ sinusoidal encoding
ดังที่ภาพด้านบนแสดง การเข้ารหัสแบบไซนูซอยด์เปลี่ยนทั้งขนาดและทิศของเวกเตอร์เดิม ขณะที่ RoPE รักษาขนาดไว้ และต้องการแค่มุมระหว่างสองตำแหน่งเพื่อเข้าใจระยะห่างสัมพัทธ์
Attention With Linear Biases (ALiBi)
ขณะที่ RoPE พึ่งคณิตศาสตร์การหมุนที่ซับซ้อน อีกเทคนิคหนึ่งชื่อ Attention with Linear Biases (ALiBi) เลือกแนวทางที่ต่างไปอย่างสิ้นเชิง
ความเรียบง่ายและประสิทธิภาพ
ALiBi ตัดทิ้งแนวคิดการเพิ่มข้อมูลตำแหน่งให้กับ embedding ของโทเค็นตั้งแต่ต้น โดยปล่อยให้ word embeddings เข้าสู่ทรานส์ฟอร์เมอร์โดยไม่แตะต้อง
แทนที่จะทำเช่นนั้น ALiBi จะเข้าแทรกในขั้นตอนสุดท้ายของการคำนวณ attention ทันทีที่โลจิตของ attention กำลังจะผ่านฟังก์ชันsoftmax ALiBi จะลบค่าปรับโทษแบบคงที่ตามสัดส่วนของระยะห่างระหว่างสองโทเค็น ยิ่งคำสองคำห่างกันมากเท่าใด ค่าปรับโทษที่ลบออกจากคะแนน attention ก็ยิ่งมาก
ประสิทธิผล
วิธีนี้ใช้งานง่ายและมีประสิทธิภาพสูง จุดเด่นที่สุดคือความสามารถยอดเยี่ยมในการคาดคะเนความยาวนอกช่วง โมเดลที่ฝึกด้วย ALiBi บนลำดับ 1,024 โทเค็นสามารถสร้างข้อความที่สอดคล้องกันบนลำดับที่ยาวเป็นสองเท่าได้อย่างง่ายดายโดยไม่ล่ม
สำหรับผู้ปฏิบัติที่สนใจเทคนิคขั้นสูงอื่น ๆ เพื่อเร่งการสร้างข้อความและงานอินเฟอเรนซ์ ดูคู่มือของเราเรื่องspeculative decoding
ควรใช้ Positional Encoding แบบไหน เมื่อใด
เริ่มจากสิ่งที่กำลังสร้าง แล้วเลือกวิธีที่เหมาะสม — บางครั้งวิธีเดียว บางครั้งหลายวิธีร่วมกัน
- ต้องการเบสไลน์ที่เรียบง่าย ไร้พารามิเตอร์: Sinusoidal (สูตรคงที่ ไม่ต้องฝึก)
- ความยาวลำดับตายตัว และต้องการประสิทธิภาพสูงสุดกับชุดข้อมูลเฉพาะ: แบบเรียนรู้ (Learned)
- ต้องรองรับลำดับที่ยาวกว่าช่วงที่ฝึก: RoPE เป็นตัวเลือกที่แข็งแกร่งที่สุดในกลุ่มเทคนิคที่คาดคะเนนอกช่วงได้
- ไวยากรณ์ขึ้นกับระยะห่างระหว่างโทเค็น ไม่ใช่ตำแหน่งสัมบูรณ์: แบบสัมพัทธ์ หรือ RoPE
- กำลังสร้าง LLM ใช้งานทั่วไปสมัยใหม่: RoPE
- การคาดคะเนความยาวเป็นเป้าหมายอันดับหนึ่ง และต้องการการใช้งานที่ง่ายที่สุด: ALiBi
- ต้องการข้อดีของตำแหน่งสัมพัทธ์โดยไม่แบกรับภาระหน่วยความจำและแคช: RoPE (แบบสัมพัทธ์ให้ประโยชน์ใกล้เคียงกันแต่แพงกว่า)
การใช้งานจริงและข้อพิจารณาด้านสถาปัตยกรรม
การเชื่อมทฤษฎีกับปฏิบัติต้องเข้าใจวิธีผนวก positional encodings เข้ากับโค้ดจริงและจัดการข้อจำกัดด้านสถาปัตยกรรม
การติดตั้ง positional encoding ในทรานส์ฟอร์เมอร์
เมื่อต้องเพิ่ม positional encodings ให้ทรานส์ฟอร์เมอร์ในเฟรมเวิร์กอย่าง PyTorch นักพัฒนามักสร้างมอดูลเฉพาะ มอดูลนี้จะสร้างเมทริกซ์ encoding ครั้งเดียวและลงทะเบียนเป็นบัฟเฟอร์เพื่อป้องกันการอัปเดตโดยไม่ตั้งใจระหว่าง backpropagation
ด้านล่างเป็นการใช้งานจริงมาตรฐานของ forward pass ที่ผนวกการเข้ารหัสแบบไซนูซอยด์ การเข้ารหัสถูกคำนวณครั้งเดียวจากสูตรไซน์และโคไซน์และไม่เปลี่ยนระหว่างการฝึก จึงเก็บเป็นบัฟเฟอร์แทนที่จะเป็นพารามิเตอร์ที่เรียนรู้ได้ (และไม่เพิ่มต้นทุนการฝึก)
import torch
import torch.nn as nn
import math
class PositionalEncoding(nn.Module):
def __init__(self, d_model: int, max_len: int = 5000):
super().__init__()
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
# Calculate the division term for frequencies
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
# Apply sine to even indices and cosine to odd indices
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
pe = pe.unsqueeze(0)
# Register as a buffer
self.register_buffer('pe', pe)
def forward(self, x: torch.Tensor) -> torch.Tensor:
# Add positional encoding directly to the input embeddings
seq_len = x.size(1)
x = x + self.pe[:, :seq_len, :]
return x
ใน __init__ มอดูลจะคำนวณตาราง encoding ล่วงหน้าถึง max_len ตำแหน่ง: position เป็นคอลัมน์ของดัชนี (0, 1, 2, …) และ div_term คือความถี่ ซึ่งเท่ากับ 1 / 10000^(2i/d_model) ทำให้มิติต่ำได้คลื่นเร็ว และมิติสูงได้คลื่นช้า
การใช้ sin กับมิติคู่ (0::2) และ cos กับมิติคี่ (1::2) จะเติมตาราง จากนั้น forward ทำงานเพียงอย่างเดียวขณะรันจริง: ตัดตารางให้ยาวเท่าลำดับอินพุต แล้วบวกกับ embedding ของโทเค็นแบบองค์ประกอบต่อองค์ประกอบ สังเกตว่ามอดูลสมมติรูปทรงข้อมูลแบบแบตช์มาก่อน [batch, seq_len, d_model] จึงตัดตามมิติที่ 1
Position bias และปรากฏการณ์ lost-in-the-middle
ผลข้างเคียงที่ไม่ตั้งใจของการแมปลำดับยาวคือ position bias ซึ่งมักปรากฏเป็นปรากฏการณ์ “หลงกลางเรื่อง” (lost-in-the-middle) เมื่อประมวลผลเอกสารขนาดใหญ่ โมเดลภาษามักจดจำข้อเท็จจริงจากจุดเริ่มหรือจุดท้ายของพรอมป์ตได้ดีกว่าส่วนตรงกลาง ฟังดูคุ้น ๆ เพราะความจำของมนุษย์ก็คล้ายกัน (อย่างน้อยกับฉัน อย่าบอกนะว่ามีแค่ฉันที่จำต้นและท้ายหนังสือได้ดีกว่าส่วนอื่น!)
ทฤษฎีกล่าวว่าสิ่งนี้เกิดขึ้นเพราะกลไก attention ถูกถาโถมด้วยบริบทที่ไม่เกี่ยวข้องและโดยธรรมชาติจะยึดกับโทเค็นต้น ๆ (ซึ่งกำหนดคำสั่ง) และโทเค็นล่าสุด (ซึ่งอยู่ในความจำล่าสุด) เพื่อบรรเทาอคตินี้ นักพัฒนาจึงใช้กลยุทธ์แบ่งชิ้นส่วนขั้นสูงและระบบเรียกค้นเชิงความหมาย
Positional encoding สำหรับโดเมนเฉพาะทาง
ทรานส์ฟอร์เมอร์ไม่ได้จำกัดอยู่กับข้อความอีกต่อไป แนวคิด positional encoding ปรับตัวได้อย่างรวดเร็วเพื่อรองรับข้อมูลประเภทต่าง ๆ ในหลายโดเมน
สำหรับวิชันทรานส์ฟอร์เมอร์ ภาพจะถูกแบ่งเป็นตารางแพตช์ การเข้ารหัสลำดับ 1 มิติธรรมดาไม่สามารถจับความใกล้เชิงพื้นที่ในพื้นที่ 2 มิติได้ ดังนั้นโมเดลด้านภาพจึงมักใช้ positional encoding แบบเรียนรู้ 2 มิติที่คำนึงถึงทั้งพิกัด X และ Y ของแพตช์ภาพ
การปรับแบบคล้ายกันมีอยู่สำหรับแบบจำลองอนุกรมเวลาต่อเนื่อง ซึ่งมี encoding เฉพาะเพื่อติดตามระยะห่างเชิงเวลา ฤดูกาล และการประทับเวลา
งานวิจัยเพิ่มเติมเกี่ยวกับ Positional Encoding
เมื่อการแข่งขันสู่หน้าต่างบริบทที่ใหญ่ขึ้นเรื่อย ๆ ทวีความเร็วขึ้น การปรับละเอียดวิธีที่โมเดลเข้าใจตำแหน่งยังคงเป็นพื้นที่วิจัยที่คึกคักและสำคัญยิ่งในแมชชีนเลิร์นนิง
การคาดคะเนความยาวและการขยายบริบท
ผู้ใช้ยุคนี้ต้องการหน้าต่างบริบทขนาดมหึมาเพื่อประมวลผลทั้งโค้ดเบสหรือชุดนวนิยายในคราวเดียว เนื่องจากการฝึกโมเดลตั้งแต่ศูนย์บนลำดับที่ยาวมากมีค่าใช้จ่ายสูง นักวิจัยจึงพึ่งเทคนิคขยายบริบท
วิธีอย่าง positional interpolation จะบีบอัดพิกัดตำแหน่งของลำดับที่ยาวกว่ามากให้อยู่ในขอบเขตความยาวฝึกเดิมเชิงคณิตศาสตร์ วิธีแบบปรับตัวอย่าง YaRN จะปรับความถี่การหมุนของพารามิเตอร์ RoPE แบบไดนามิกเพื่อยืดความเข้าใจเรื่องระยะทางของโมเดลอย่างแนบเนียน
ทรานส์ฟอร์เมอร์ที่ไม่มี positional encoding แบบชัดเจน
น่าแปลกที่งานวิจัยบางส่วนชี้ว่า positional encoding แบบชัดเจนอาจไม่จำเป็นเสมอไป ในโมเดลภาษาชนิดตัวถอดรหัสเท่านั้น (decoder-only) ที่เป็นเหตุเป็นผล (causal) การทำ causal masking มาตรฐาน (กลไกที่บังคับให้โทเค็นมองย้อนกลับเท่านั้น) แฝงข้อมูลลำดับเวลาโดยเนื้อแท้
ซึ่งหมายความว่าอาจเรียนรู้กฎตำแหน่งโดยปริยายได้จาก causal mask เพียงอย่างเดียว ผ่านการปรับอุณหภูมิและการปรับสถาปัตยกรรมอย่างมีกลยุทธ์
ความท้าทายและทิศทางในอนาคต
เส้นแบ่งปลายทางคือการแลกเปลี่ยนระหว่างการปรับให้เหมาะเจาะกับช่วง (optimized สำหรับความยาวลำดับเฉพาะ) กับการคาดคะเนได้อย่างไร้ที่ติ (ให้โมเดลทั่วไปได้ไม่สิ้นสุด)
งานวิจัยที่เกิดขึ้นมุ่งเน้นอย่างหนักที่การเข้ารหัสพหุสื่อ สร้างตัวแทนตำแหน่งสากลที่ผสานพิกัดวิดีโอ 3 มิติเข้ากับสตรีมข้อความและเสียง คือหนึ่งในเป้าหมายของยุคถัดไปของโมเดลปัญญาประดิษฐ์
สรุป
Positional encoding คือสะพานเชื่อมระหว่างการประมวลผลแบบขนานกับความเข้าใจแบบลำดับ ทำให้เราสร้างโมเดลที่ประมวลผลข้อมูลจำนวนมากตามลำดับได้ เราได้สำรวจว่า embedding แบบเรียนรู้และแบบสัมพัทธ์มอบความยืดหยุ่นสูงสุดอย่างไร และนวัตกรรมสมัยใหม่อย่าง RoPE และ ALiBi สร้างสมดุลระหว่างความสง่างามทางคณิตศาสตร์กับประสิทธิภาพเชิงคำนวณได้อย่างไร
เมื่อหน้าต่างบริบทขยายจากหลักพันโทเค็นไปสู่หลักล้าน การบอกโครงข่ายประสาทอย่างชัดเจนว่าของแต่ละอย่างอยู่ที่ไหนด้วยคณิตศาสตร์ง่าย ๆ จะยังคงเป็นแกนกลางของการออกแบบโมเดล
หากต้องการเจาะลึกและลองปฏิบัติ แนะนำให้ลงทะเบียนในเส้นทางทักษะ Developing Large Language Models ของเรา
คำถามที่พบบ่อยเกี่ยวกับ Positional Encoding
Positional encoding ในแมชชีนเลิร์นนิงคืออะไร?
Positional encoding คือเทคนิคทางคณิตศาสตร์ที่ใช้มอบข้อมูลเกี่ยวกับลำดับของข้อมูลในซีเควนซ์ให้กับโครงข่ายประสาท
ทำไมโมเดลทรานส์ฟอร์เมอร์จึงต้องมี positional encoding?
ต่างจาก Recurrent Neural Networks แบบเก่าที่ประมวลผลข้อมูลทีละขั้น ทรานส์ฟอร์เมอร์ประมวลผลข้อมูลทั้งหมดพร้อมกันด้วยกลไก self-attention และเพราะ self-attention มีสมบัติไม่เปลี่ยนต่อการสับลำดับ จึงมองอินพุตเหมือนถุงคำที่ไม่เรียงลำดับ Positional encoding แก้ปัญหานี้ด้วยการฉีดพิกัดลำดับเข้าไปในข้อมูลก่อนที่โมเดลจะประมวลผล
ความแตกต่างระหว่างการเข้ารหัสตำแหน่งแบบสัมบูรณ์และแบบสัมพัทธ์คืออะไร?
การเข้ารหัสตำแหน่งแบบสัมบูรณ์กำหนดพิกัดคงที่ให้โทเค็นตามดัชนีที่แน่นอนในลำดับ ส่วนการเข้ารหัสแบบสัมพัทธ์ละเลยตำแหน่งบนกริดที่แน่นอนและคำนวณระยะห่างระหว่างโทเค็นที่โต้ตอบกัน โดยโฟกัสที่ระยะห่างเชิงบริบทเท่านั้น
Rotary Position Embedding (RoPE) คืออะไร?
RoPE เป็นวิธีการเข้ารหัสที่ใช้กันอย่างแพร่หลาย โดยแมป embedding ของโทเค็นไปยังระนาบเชิงซ้อนและหมุนตามมุมที่กำหนดโดยตำแหน่งสัมบูรณ์ เมื่อโมเดลคำนวณคะแนน attention ความสัมพันธ์ระหว่างเวกเตอร์สองตัวที่ถูกหมุนจะขึ้นกับระยะห่างสัมพัทธ์ระหว่างกันโดยสิ้นเชิง
Learned positional embeddings คืออะไร?
แทนที่จะใช้สูตรคณิตศาสตร์คงที่อย่างไซน์และโคไซน์ Learned positional embeddings ปฏิบัติต่อพิกัดเชิงพื้นที่เป็นเวทที่ฝึกได้ โมเดลจะเริ่มจากเมทริกซ์ตำแหน่งว่างและอัปเดตพิกัดเหล่านี้ระหว่างการฝึกเพื่อเรียนรู้ตัวแทนเชิงพื้นที่ที่เหมาะที่สุดสำหรับชุดข้อมูลเฉพาะ