چیت‌شیت

کدگذاری مکانی: سینوسی، RoPE و ALiBi

Positional Encoding: Sinusoidal, RoPE, ALiBi

انتخاب، ساخت و بررسی روش مکانی: مقایسه‌ی سینوسی، یادگیری‌شده، RoPE، YaRN و ALiBi در پایتون.

  • ۱۱ بخش
  • ۳ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مقایسه‌ی رو در رو
  2. محل اِعمال هر روش
  3. کد پیاده‌سازی سه روش
  4. وظایف در کد
  5. بررسی ویژگی نسبی RoPE
  6. مقادیر پیش‌فرض و اعداد
  7. زمینه‌ی طولانی با RoPE
  8. فیلدهای کانفیگ برای بررسی
  9. اشکال‌زدایی
  10. چه زمانی کدام را استفاده کنیم؟
  11. پرسش‌ها

مقایسه‌ی رو در رو

مقایسه
روشمحل اِعمالبرون‌یابیهزینه‌ی آموزشاستفاده‌شده در
سینوسی مطلقامبدینگ‌ها، جمعضعیفرایگانترنسفورمر اولیه، 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

محل اِعمال هر روش

معماری
lookupsumXposdotaddشناسه‌های توکن(B, T)امبدینگ توکن(B, T, D)افزودن PE مطلقسینوسی یا یادگیری‌شدهQ و Kبه‌ازای هر هدRoPEچرخش Q و Kامتیازهاضرب داخلی q در k تقسیم بر رادیکال dبایاس ALiBiمنهای m_h ضربدر فاصلهسافت‌مکسسپس ضرب در V

کد پیاده‌سازی سه روش

کد
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 یا Kapply_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

گام‌به‌گام
  1. بردارهای اولیهتولید q و k با rng.gauss(0, 1)، d = 16.
  2. چرخشاعمال apply_rope(q, pq) و apply_rope(k, pk) با تابع یکسان.
  3. امتیازمحاسبه‌ی dot(q_rot, k_rot) برای جفت‌های (3, 5)، (7, 9)، (100, 102)، (1024, 1026).
  4. انتظارتمام سطرها با فاصله‌ی 2، با خطای محاسبات ممیز شناور، ضرب داخلی یکسانی بدهند.
  5. پیمایش پایه (base)امتیاز در pos=4096 و pos=4098 برای پایه‌های 10000، 100000 و 1_000_000.
  6. نتیجه‌گیریپایه‌ی بزرگ‌تر موجب چرخش کندتر و طول زمینه‌ی طولانی‌تر بدون پیچش فاز می‌شود.

مقادیر پیش‌فرض و اعداد

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
base10000.0سینوسی و RoPE
rope_theta500000.0Llama 3 8B، مقیاس‌شده از 10k
causalTruealibi_bias موقعیت‌های j > i را ماسک می‌کند
DEFAULT_INIT_STD0.02مقداردهی اولیه‌ی جدول یادگیری‌شده
max_offset8neighbour_cosine_curve
max_context_length128DemoConfig
d_model64مقدار 32 را امتحان کن و نوارها را ببین
GPT-2 learned table1024زمینه‌ی 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_windowW توکن آخر برای لایه‌های پنجره‌ای
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 برای تنظیم زمینه‌های طولانی.
تفاوت یادگیری‌شده و سینوسی در مقداردهی اولیه؟
همسایه‌ها در روش یادگیری‌شده تصادفی‌اند، اما در سینوسی به‌نرمی افت می‌کنند.