فاز 19 · درس 32

امبدینگ توکن و امبدینگ مکانی در پایتورچ

نوع
ساختنی
زمان
حدود 90 دقیقه
زبان‌ها
Python
پیش‌نیاز
درس‌های فاز 04، درس‌های ترنسفورمر فاز 07، و درس‌های 30 و 31 از همین فاز
یک نقشه با نشانگرهای موقعیت مکانی در کنار مهره‌های شطرنج با برچسب‌های برداری روی یک صفحه مشبک مدرن
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. قرارداد شکل داده‌ها
  4. ماتریس امبدینگ توکن
  5. امبدینگ مکانیِ یادگیری‌پذیر
  6. امبدینگ مکانی سینوسی
  7. ترکیب امبدینگ‌ها
  8. تحلیل مقایسه‌ای
  9. مواردی که در این درس بررسی نمی‌شوند
  10. راهنمای خواندن کدها

مدل‌های ترنسفورمر به خودیِ خود شناختی از ترتیب کلمات یا همان موقعیت توکن‌ها در جمله ندارند. داده‌های متنی پس از تبدیل به شناسه‌های عددی وارد مدل می‌شوند، اما پردازش موازی در معماری ترنسفورمر باعث می‌شود جایگاه کلمه‌ی اول با کلمه‌ی هفدهم یکسان به نظر برسد؛ مگر اینکه اطلاعات مکانی را به بردار معنایی توکن اضافه کنیم.

در این درس یاد می‌گیرید که چطور ماتریس امبدینگ توکن (Token Embedding) و دو رویکرد اصلی امبدینگ مکانی (Positional Embedding)—یعنی روش یادگیری‌پذیر و روش سینوسی—را با پایتورچ بسازید. در ادامه بررسی می‌کنیم که چگونه با جمع‌کردن این دو بردار، ورودی استاندارد و لازم برای لایه‌های بعدی ترنسفورمر را آماده کنید.

شناسه‌ها عدد صحیح‌اند، اما مدل بردار می‌خواهد. دو جدول جستجو (lookup table) میان این دو نشسته‌اند و انتخاب جدول مکانی مشخص می‌کند مدل چه چیزهایی را می‌تواند یاد بگیرد.

اهداف یادگیری

  • ساخت جدول جستجوی امبدینگ توکن (token embedding) برای نگاشت شناسه‌های واژگان به بردارهای متراکم (dense vector).
  • ساخت جدول جستجوی امبدینگ مکانیِ یادگیری‌پذیر (learned positional embedding) با اندیس‌گذاری بر اساس مکان توکن.
  • ساخت امبدینگ مکانی سینوسیِ ثابت (sinusoidal positional embedding) با اندیس‌گذاری مکانی و بدون هیچ پارامتری.
  • ترکیب امبدینگ توکن و امبدینگ مکانی در قالب یک ورودی واحد برای بلوک ترنسفورمر (transformer).
  • مقایسه‌ی امبدینگ‌های یادگیری‌پذیر و سینوسی از نظر تعمیم‌پذیری به طول و تعداد پارامترها.
جستجوی امبدینگانتخاب سطر · افزودن مکان
EMBEDDING LOOKUPA token id is not arithmetic; it is an index. The id selects one row of the token table, returning a dense vector the model treats as the meaning of that id. Position has no inherent vector either, so a parallel positional embedding is looked up by slot and summed elementwise. The result is the (B, T, D) tensor the first attention block consumes.جدول توکن (V, D)id 0id 1id 2id 3id 4id 5سطر 3بردار توکن (D)بردار مکان (D)+ورودی (B,T,D)
شناسه توکن یک مقدار حسابی نیست؛ بلکه یک اندیس است. این شناسه یک سطر از جدول توکن را انتخاب می‌کند و یک بردار متراکم برمی‌گرداند که مدل آن را معنای آن شناسه در نظر می‌گیرد. مکان نیز ذاتاً برداری ندارد، بنابراین یک امبدینگ مکانی موازی بر اساس جایگاه جستجو شده و به‌صورت درایه‌به‌درایه جمع می‌شود. نتیجه، تنسور (B, T, D) است که بلوک اتنشن اول آن را مصرف می‌کند.

صورت مسئله

نخستین نقطه‌ی برخورد مدل با شناسه‌ی توکن، جستجوی یک سطر در ماتریس امبدینگ توکن است. این ماتریس به‌ازای هر شناسه‌ی واژگان یک سطر و به‌ازای هر بُعد مدل یک ستون دارد. حاصل این جستجو برداری است که ادامه‌ی مدل آن را معنای آن شناسه در نظر می‌گیرد. در پس‌انتشار (backpropagation)، تنها سطرهایی به‌روزرسانی می‌شوند که در گذر رو به جلو (forward pass) استفاده شده باشند. در طول فرایند آموزش، هندسه‌ی این سطرها یاد می‌گیرد که شباهت را در جهت‌های برداری بازنمایی کند.

شناسه‌های توکن به‌تنهایی ترتیبی ندارند. مدل به سیگنال دومی نیاز دارد تا بفهمد جایگاه یکم با جایگاه هفدهم فرق می‌کند. دو گزینه‌ی اصلی برای این سیگنال عبارت‌اند از: امبدینگ مکانیِ یادگیری‌پذیر (یک جدول جستجوی دوم، با یک سطر به‌ازای هر جایگاه) و امبدینگ مکانیِ سینوسیِ ثابت (یک فرمول ریاضی بدون پارامتر). این انتخاب پیامدهای خودش را دارد. جدول یادگیری‌پذیر یک پارامتر است و به بیشینه‌ی طول متنی (context length) که مدل با آن آموزش دیده محدود می‌شود. جدول سینوسی روی کاغذ پارامتری ندارد و فرمول آن به هر جایگاهی تعمیم می‌یابد؛ اما در این درس، ماژول SinusoidalPositionalEmbedding یک جدول ثابت را تا max_context_length از پیش محاسبه می‌کند و متد forward در صورت عبور از این حد خطا می‌دهد؛ بنابراین هر دو ماژول در اینجا یک بیشینه‌ی طول متن را تحمیل می‌کنند. علاوه بر این، حتی اگر جدول به‌اندازه‌ی کافی برای اندیس‌گذاری بزرگ باشد، باز هم مدل فراتر از طول دیده‌شده در زمان آموزش به مشکل می‌خورد.

در این درس هر دو نوع را می‌سازیم و آن‌ها را با امبدینگ توکن ترکیب می‌کنیم تا ورودی واحدی برای بلوک اتنشن (attention) درس بعدی آماده شود.

قرارداد شکل داده‌ها

ورودیِ مرحله‌ی امبدینگ یک بَچ از شناسه‌های توکن با شکل (B, T) است. خروجی یک تنسور با شکل (B, T, D) خواهد بود که در آن D بُعد مدل است. همه‌ی نمونه‌های بَچ طول متن T یکسانی دارند و هر جایگاه دارای برداری با بُعد یکسان D است.

(B, T) شناسه‌های توکنجستجوی امبدینگ توکن(B, T, D) بردارهای توکنپخش موقعیت 0..T-1جستجوی امبدینگ مکانی(B, T, D) بردارهای موقعیتجمع عنصربه‌عنصر(B, T, D) ورودی به اتنشن

این ترکیب از جنس جمع است، نه الحاق (concatenation). جمع‌کردن، D را در سراسر شبکه ثابت نگه می‌دارد و به مدل اجازه می‌دهد در هر لایه و به‌ازای هر ویژگی جداگانه تصمیم بگیرد که معنای توکن دست بالا را داشته باشد یا موقعیت آن.

ماتریس امبدینگ توکن

امبدینگ توکن یک تنسور پارامتری با شکل (V, D) است که V همان اندازه‌ی واژگان (vocabulary size) است. فریم‌ورک PyTorch آن را در قالب nn.Embedding(V, D) ارائه می‌دهد. هنگام مقداردهی اولیه، درایه‌ها از یک توزیع گاوسی کوچک برداشته می‌شوند؛ برای مدل‌های در مقیاس ترنسفورمر، این توزیع معمولاً میانگین صفر و انحراف معیار حدود 0.02 دارد. مهم‌تر از مقدار دقیق اولیه، ثبات آن در اجراهای گوناگون است.

گذر رو به جلو فقط یک عملیات اندیس‌گذاری ساده است. کتابخانه‌ی PyTorch با بیرون کشیدن سطرها، شناسه‌های صحیح 64 بیتی با شکل (B, T) را به مقادیر اعشاری با شکل (B, T, D) می‌نگارد. در گام رو به عقب (backward pass)، گرادیان‌ها تنها در سطرهایی انباشته می‌شوند که در گذر رو به جلو استفاده شده‌اند. دو سطری که اصلاً در بَچ حضور نداشته‌اند، در آن گام گرادیان صفر دریافت می‌کنند.

یک نکته‌ی ظریف: در انتهای مدل، امبدینگ توکن و لایه‌ی تصویر کردنِ خروجی (output projection) اغلب وزن‌های مشترک دارند (اشتراک ماتریس وزن‌ها یا weight tying). وقتی چنین شود، در هر گام رو به عقب، از سمت خروجی تمام سطرهای ماتریس امبدینگ لمس می‌شوند. ما در این درس هر دو را به‌شکل ماژول‌های جداگانه پیاده می‌کنیم، اما همین ماتریس می‌تواند در یک مدل کامل هر دو نقش را ایفا کند.

امبدینگ مکانیِ یادگیری‌پذیر

امبدینگ مکانیِ یادگیری‌پذیر یک nn.Embedding دوم با شکل (max_context_length, D) است. کلید جستجو در این جدول، شناسه‌ی جایگاه است: 0, 1, 2, ..., T-1. گذر رو به جلو، این بردار موقعیت را در امتداد بُعد بَچ برادکستینگ (broadcasting) می‌کند.

نقطه‌ضعف جدول یادگیری‌پذیر این است که اگر مدل فقط تا جایگاه T-1 آموزش دیده باشد، نمی‌توان آن را برای جایگاه T صدا زد؛ چون چنین سطری در ماتریس وجود ندارد. مدل‌های محیط عملیاتی (پروداکشن) از نوع فقط-دیکودر (decoder-only) که از این طرح استفاده می‌کنند، بیشینه‌ی طول متن را درون معماری تثبیت می‌کنند و از پردازش ورودی‌های بلندتر سر باز می‌زنند.

امبدینگ مکانی سینوسی

امبدینگ مکانی سینوسی تابعی از موقعیت به بردار است. موقعیت p و ویژگی i چنین مقداری تولید می‌کنند:

angle = p / (10000 ** (2 * (i // 2) / D))
emb[p, 2k]     = sin(angle)
emb[p, 2k + 1] = cos(angle)

این تابع پارامتری ندارد. هر جایگاه بردار یکتایی دریافت می‌کند. طول موج در امتداد بُعدهای مختلف ویژگی‌ها به‌صورت هندسی تغییر می‌کند؛ بنابراین بُعدهای پایین‌تر موقعیت کلی و بُعدهای بالاتر موقعیت دقیق را کدگذاری می‌کنند.

ویژگی ناشی از انتخاب هم‌زمان sin و cos این است که بردار موجود در موقعیت p + k یک تابع خطی از بردار موقعیت p خواهد بود. این ویژگی مسیر همواری پیش پای لایه‌ی اتنشن می‌گذارد تا آفست‌های موقعیت نسبی را یاد بگیرد. در این حالت، مدل برای بیان رابطه‌ای مثل «پنج توکن عقب‌تر را ببین» نیازی به پارامتر جداگانه ندارد.

در این درس، کل جدول سینوسی را یک‌بار هنگام ساخت شیء محاسبه می‌کنیم و در زمان گذر رو به جلو فقط از آن اندیس می‌گیریم.

ترکیب امبدینگ‌ها

پایپ‌لاین (pipeline) ورودی سه کار را به‌ترتیب انجام می‌دهد: خواندن شناسه‌های توکن، جستجوی بردارهای توکن، افزودن بردارهای مکانی، و در نهایت بازگرداندن حاصل‌جمع.

PosEmbTokEmbLayerCallerPosEmbTokEmbLayerCallerforward(شناسه‌ها با ابعاد (B, T))ids -> (B, T, D)0..T-1 -> (T, D)tok + pos (پخش در طول B)(B, T, D)

فرایند برادکستینگ در مرحله‌ی جمع، تنسور مکانی با شکل (T, D) را در امتداد بُعد بَچ تکرار می‌کند. کتابخانه‌ی PyTorch این کار را خودکار انجام می‌دهد، چون تنسور مکانی پس از unsqueeze شکلی برابر با (1, T, D) پیدا می‌کند.

تحلیل مقایسه‌ای

این درس هر دو روش را روی ورودی‌های یکسان اجرا می‌کند و دو شاخص تحلیلی را نشان می‌دهد:

اولی تعداد پارامترهاست. مدل یادگیری‌پذیر، علاوه بر امبدینگ توکن، max_context_length * D پارامتر اضافه می‌کند؛ در حالی که نسخه‌ی سینوسی هیچ پارامتری اضافه نمی‌کند.

دومی شباهت کسینوسی (cosine similarity) میان امبدینگ‌های موقعیت‌های مجاور است. مدل سینوسی افتی یکنواخت و پیش‌بینی‌پذیر دارد، چون تابع آن پیوسته است. اما در مدل یادگیری‌پذیر، هنگام مقداردهی اولیه شباهت‌ها تقریباً تصادفی‌اند، چون سطرها مستقل از یکدیگر مقدار گرفته‌اند. پس از آموزش، مدل یادگیری‌پذیر معمولاً به ساختار هموار مشابهی می‌رسد، اما باید این ساختار را خودش از دل داده‌ها کشف کند.

مواردی که در این درس بررسی نمی‌شوند

این درس شامل کدگذاری مکانی دورانی (RoPE) یا AliBi نیست. این‌ها گزینه‌های مدرن در مدل‌های ترنسفورمر پروداکشن هستند. هر دو از همان قرارداد شکل داده‌ها مانند امبدینگ‌های این درس پیروی می‌کنند (اعمال تبدیل وابسته به مکان روی بردارهایی با شکل (B, T, D))، اما به‌جای ورودی، در مرحله‌ی تصویر کردنِ اتنشن اعمال می‌شوند. درس بعدی به ساخت بلوک اتنشن اختصاص دارد و یکی از بخش‌های اختیاری آن گنجاندن روتاری درون لایه‌های تصویر پرسش و کلید (query-key projections) در آنجاست.

علاوه بر این، در این درس امبدینگ‌ها را آموزش نمی‌دهیم. آموزش به تابع زیان (loss) نیاز دارد؛ تابع زیان خروجی مدل را می‌خواهد؛ و خروجی مدل به اتنشن و سر مدل زبانی (LM head) وابسته است. این مباحث در درس بعدی و درس پس از آن بررسی می‌شوند.

راهنمای خواندن کدها

فایل main.py سه ماژول تعریف می‌کند: ماژول TokenEmbedding که پوششی دور nn.Embedding(V, D) است؛ ماژول LearnedPositionalEmbedding که nn.Embedding(L, D) را می‌پوشاند؛ و ماژول SinusoidalPositionalEmbedding که جدول را از پیش محاسبه کرده و آن را در قالب یک بافر ارائه می‌دهد. ماژول EmbeddingComposer امبدینگ توکن و امبدینگ مکانی را به یکدیگر متصل می‌کند. دموی انتهای فایل شکل‌ها، تعداد پارامترها و شاخص شباهت موقعیت‌های مجاور را چاپ می‌کند. آزمون‌های موجود در code/tests/test_embeddings.py شکل، رفتار برادکستینگ، تعداد پارامترها و فرمول سینوسی را بررسی و تثبیت می‌کنند.

ابتدا دمو را اجرا کنید. سپس بُعد مدل D را از 64 به 32 تغییر دهید و ببینید نوارهای طول موج سینوسی چطور تغییر می‌کنند.

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسمرحله امبدینگ چه ابعادی (shape) از شناسه‌های (B, T) تولید می‌کند؟
  2. حین درسامبدینگ‌های توکن و مکانی در این درس چگونه با هم ترکیب می‌شوند؟
  3. حین درسیک SinusoidalPositionalEmbedding چه تعداد پارامتر قابل یادگیری اضافه می‌کند؟
  4. حین درسکدام کدگذاری مکانی نمی‌تواند توالی طولانی‌تر از حد تعیین‌شده در ساخت خود را بپذیرد؟
  5. پس از درسچرا طرح سینوسی از هر دو تابع sin و cos روی جفت‌های مجاور ویژگی‌ها استفاده می‌کند؟
  6. پس از درسچرا در گام رو به عقبِ امبدینگ، فقط سطرهایی از جدول توکن که در بچ ظاهر شده‌اند به‌روزرسانی می‌شوند؟

سؤالات متداول

تفاوت امبدینگ مکانی یادگیری‌پذیر با امبدینگ سینوسی چیست؟

امبدینگ یادگیری‌پذیر یک جدول وزنی با پارامترهای آموزش‌پذیر است و به بیشینه‌ی طول دیده‌شده در آموزش محدود می‌شود؛ اما امبدینگ سینوسی از یک فرمول ریاضی ثابت و بدون پارامتر ساخته می‌شود.

چرا امبدینگ توکن و امبدینگ مکانی با هم جمع می‌شوند و الحاق (concat) نمی‌شوند؟

عمل جمع بُعد بردارها (D) را در کل شبکه ثابت نگه می‌دارد و به مدل اجازه می‌دهد روی هر بُعد ویژگی تصمیم بگیرد که بار معنایی غالب باشد یا اطلاعات مکانی.

آیا روش‌های جدیدتر مثل RoPE در ورودی مدل با امبدینگ جمع می‌شوند؟

خیر؛ روش‌های مدرن مثل RoPE یا AliBi به جای مرحله‌ی ورودی اولیه، در لایه‌ی اتنشن و روی تصویرهای پرسش و کلید (Q و K) اعمال می‌شوند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.