چیتشیت
کدگذاری مکانی: سینوسی، RoPE و ALiBi
Positional Encoding: Sinusoidal, RoPE, ALiBi
انتخاب، ساخت و بررسی روش مکانی: مقایسهی سینوسی، یادگیریشده، RoPE، YaRN و ALiBi در پایتون.
فهرست مطالب
مقایسهی رو در رو
مقایسه| روش | محل اِعمال | برونیابی | هزینهی آموزش | استفادهشده در |
|---|---|---|---|---|
| سینوسی مطلق | امبدینگها، جمع | ضعیف | رایگان | ترنسفورمر اولیه، BERT اولیه |
| مطلق یادگیریشده | امبدینگها، جستجو (lookup) | هیچ | بسیار ناچیز | GPT-2، GPT-3 |
| RoPE | چرخش Q و K | خوب با مقیاسبندی | رایگان | Llama 2/3/4، Qwen 2/3، Mistral، DeepSeek-V3، Kimi |
| RoPE + YaRN | چرخش Q و K | عالی | مرحلهی فاینتیون | Qwen2-1M، Llama 3.1 128K |
| ALiBi | امتیازهای اتنشن | عالی | رایگان | BLOOM، MPT، Baichuan |
محل اِعمال هر روش
معماریکد پیادهسازی سه روش
کدpython
def sinusoidal_pe(n, d, base=10000.0): # افزودن به امبدینگها
theta = pos / (base ** (2 * i / d)) # یک فرکانس بهازای هر جفت i
pe[pos][2 * i] = math.sin(theta) # بُعد زوج
pe[pos][2 * i + 1] = math.cos(theta) # بُعد فرد
def apply_rope(x, pos, base=10000.0): # فراخوانی روی Q و K
c = math.cos(theta) # همان تتا مطابق بالا
out[2 * i] = a * c - b * s # چرخش دوبعدی جفت i
out[2 * i + 1] = a * s + b * c
def alibi_slopes(n_heads): # یک شیب بهازای هر هد
return [2 ** (-8 * (h + 1) / n_heads) for h in range(n_heads)]
row.append(-m * abs(i - j)) # بایاس برای شیب هد m
row.append(float("-inf")) # علّی و j > i
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| جدول سینوسی، n موقعیت | sinusoidal_pe(n, d, base=10000.0) |
| چرخش یک بردار Q یا K | apply_rope(x, pos, base=10000.0) |
| بایاس ALiBi بهازای هر هد | alibi_bias(n_heads, seq_len, causal=True) |
| جدول یادگیریشده، یک سطر بهازای هر موقعیت | LearnedPositionalEmbedding(max_context_length, d_model) |
| جدول ثابت بهصورت بافر | SinusoidalPositionalEmbedding(max_context_length, d_model) |
| جمع بردارهای توکن و موقعیت | EmbeddingComposer(token_emb, learned_pos) |
| تشخیص شباهت همسایگی | neighbour_cosine_curve(table, max_offset=8) |
| اجرای دمو | python3 code/main.py |
بررسی ویژگی نسبی RoPE
گامبهگام- بردارهای اولیهتولید
qوkباrng.gauss(0, 1)،d = 16. - چرخشاعمال
apply_rope(q, pq)وapply_rope(k, pk)با تابع یکسان. - امتیازمحاسبهی
dot(q_rot, k_rot)برای جفتهای (3, 5)، (7, 9)، (100, 102)، (1024, 1026). - انتظارتمام سطرها با فاصلهی 2، با خطای محاسبات ممیز شناور، ضرب داخلی یکسانی بدهند.
- پیمایش پایه (base)امتیاز در
pos=4096وpos=4098برای پایههای 10000، 100000 و 1_000_000. - نتیجهگیریپایهی بزرگتر موجب چرخش کندتر و طول زمینهی طولانیتر بدون پیچش فاز میشود.
مقادیر پیشفرض و اعداد
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
base | 10000.0 | سینوسی و RoPE |
rope_theta | 500000.0 | Llama 3 8B، مقیاسشده از 10k |
causal | True | alibi_bias موقعیتهای j > i را ماسک میکند |
DEFAULT_INIT_STD | 0.02 | مقداردهی اولیهی جدول یادگیریشده |
max_offset | 8 | neighbour_cosine_curve |
max_context_length | 128 | DemoConfig |
d_model | 64 | مقدار 32 را امتحان کن و نوارها را ببین |
GPT-2 learned table | 1024 | زمینهی 1025 فراتر از بازه است |
زمینهی طولانی با RoPE
مفهومها- پایه (base)
- مقیاسدهندهی فرکانس RoPE. برای افزایش زمینه هنگام استنتاج، آن را بیشتر کن.
- روش NTK-aware
- بازتنظیم
baseبهbase * (scale_factor)^(d/(d-2))هنگام افزایش از 4K به بالای 16K. - YaRN
- درونیابی بهازای هر بُعد با حفظ آنتروپی اتنشن. Llama 3.1 128K از آن استفاده میکند.
- LongRoPE
- انتخاب ضریبهای مقیاس هر بُعد با جستجوی تکاملی. Phi-3-Long از آن استفاده میکند.
- درونیابی مکانی
- کوچک کردن موقعیتها با ضریب گسترش؛ سپس فاینتیون روی 1 تا 5 میلیارد توکن.
- نتیجه
- گسترش طول زمینهی Llama 3 از 8K به 128K با مقیاسبندی RoPE.
فیلدهای کانفیگ برای بررسی
دستورها| دستور | عملکرد |
|---|---|
rope_theta | فرکانس پایهی RoPE |
max_position_embeddings | طول زمینهی آموزش |
model.config.rope_scaling | نوع و ضریب مقیاسبندی، مثلاً yarn |
"position": "rope-yarn" | Qwen 2.5 72B در ماشینحساب |
"position": "rope-sliding" | Gemma 2 9B، ترکیب RoPE با لایههای پنجرهای (sliding) |
"position": "learned" | GPT-2 Small با 1024 موقعیت |
sliding_window | W توکن آخر برای لایههای پنجرهای |
layer_types | تعیین لایههای کامل یا پنجرهای |
اشکالزدایی
عیبیابیseq_len <n> exceeds max_context_length <L>- علت
- طول ورودی بیشتر از اندازهی جدول است
- راهحل
- افزایش
max_context_length
d_model must be even for sinusoidal- علت
- فرد بودن
d_model - راهحل
- استفاده از
d_modelزوج
token and positional embeddings must share d_model- علت
- یکسان نبودن ابعاد
- راهحل
- ساخت هر دو با یک
d_modelیکسان
خروجی یکسان پس از بههمریختن ترتیب توکنها
- علت
- نبود سیگنال مکانی
- راهحل
- افزودن یک روش مکانی
شکست مدل یادگیریشده فراتر از طول دیدهشده در آموزش
- علت
- سطر مورد نظر در جدول وجود ندارد
- راهحل
- استفاده از RoPE بههمراه مقیاسبندی
شکست سینوسی فراتر از
max_len- علت
- عدم آموزش در آن موقعیتها
- راهحل
- استفاده از RoPE یا ALiBi
فاصلهی یکسان اما امتیازهای متفاوت در RoPE
- علت
- چرخش فقط روی Q یا K اعمال شده
- راهحل
- چرخش هر دو بردار با
apply_rope
افت عملکرد در زمینهی طولانی با RoPE
- علت
- پیچش فاز به دلیل کوچک بودن base
- راهحل
- افزایش
baseیا امتحان YaRN
چه زمانی کدام را استفاده کنیم؟
نکتهها- برای مدل دیکودر جدید از RoPE استفاده کن. همهی مدلهای Llama، Mistral، Qwen، DeepSeek و Gemma از RoPE استفاده میکنند.
- وقتی زمینه را افزایش میدهی و امکان پرداخت هزینهی فاینتیون را داری از RoPE + YaRN استفاده کن.
- وقتی برونیابی طول بیشترین اهمیت را دارد و امبدینگ اضافه نمیخواهی از ALiBi استفاده کن.
- وقتی جدولی بدون پارامتر در ورودی میخواهی از سینوسی استفاده کن. کاربرد آن در مدلهای مرزی جنبهی تاریخی دارد.
- از روش مطلقِ یادگیریشده فقط با طول زمینهی بیشینهی ثابت استفاده کن، مثل GPT-2.
- روشهای RoPE و ALiBi را در گام اتنشن اِعمال کن، نه در ورودی امبدینگها.
پرسشها
پرسش و پاسخ- چرا اتنشن به مکان نیاز دارد؟
- به ترتیب حساس نیست. بههم ریختن سطرهای
Xخروجی را نیز با همان ترتیب جابهجا میکند. - چرا RoPE نسبی است؟
- در ضرب داخلی، کسینوس اختلاف موقعیتها ضربدر تتا در هر جفت استخراج میشود.
- جمع یا پیوند (concatenate)؟
- جمع؛ چون اندازه بُعد
Dرا در کل شبکه ثابت نگه میدارد. - هزینهی پارامتری؟
- یادگیریشده مقدار
max_context_length * Dاضافه میکند؛ سینوسی صفر پارامتر دارد. - چرا RoPE فراگیر شد؟
- بدون تغییر معماری، مکانیابی نسبی و متغیر
baseبرای تنظیم زمینههای طولانی. - تفاوت یادگیریشده و سینوسی در مقداردهی اولیه؟
- همسایهها در روش یادگیریشده تصادفیاند، اما در سینوسی بهنرمی افت میکنند.