مدلهای ترنسفورمر به خودیِ خود شناختی از ترتیب کلمات یا همان موقعیت توکنها در جمله ندارند. دادههای متنی پس از تبدیل به شناسههای عددی وارد مدل میشوند، اما پردازش موازی در معماری ترنسفورمر باعث میشود جایگاه کلمهی اول با کلمهی هفدهم یکسان به نظر برسد؛ مگر اینکه اطلاعات مکانی را به بردار معنایی توکن اضافه کنیم.
در این درس یاد میگیرید که چطور ماتریس امبدینگ توکن (Token Embedding) و دو رویکرد اصلی امبدینگ مکانی (Positional Embedding)—یعنی روش یادگیریپذیر و روش سینوسی—را با پایتورچ بسازید. در ادامه بررسی میکنیم که چگونه با جمعکردن این دو بردار، ورودی استاندارد و لازم برای لایههای بعدی ترنسفورمر را آماده کنید.
شناسهها عدد صحیحاند، اما مدل بردار میخواهد. دو جدول جستجو (lookup table) میان این دو نشستهاند و انتخاب جدول مکانی مشخص میکند مدل چه چیزهایی را میتواند یاد بگیرد.
اهداف یادگیری
- ساخت جدول جستجوی امبدینگ توکن (token embedding) برای نگاشت شناسههای واژگان به بردارهای متراکم (dense vector).
- ساخت جدول جستجوی امبدینگ مکانیِ یادگیریپذیر (learned positional embedding) با اندیسگذاری بر اساس مکان توکن.
- ساخت امبدینگ مکانی سینوسیِ ثابت (sinusoidal positional embedding) با اندیسگذاری مکانی و بدون هیچ پارامتری.
- ترکیب امبدینگ توکن و امبدینگ مکانی در قالب یک ورودی واحد برای بلوک ترنسفورمر (transformer).
- مقایسهی امبدینگهای یادگیریپذیر و سینوسی از نظر تعمیمپذیری به طول و تعداد پارامترها.
صورت مسئله
نخستین نقطهی برخورد مدل با شناسهی توکن، جستجوی یک سطر در ماتریس امبدینگ توکن است. این ماتریس بهازای هر شناسهی واژگان یک سطر و بهازای هر بُعد مدل یک ستون دارد. حاصل این جستجو برداری است که ادامهی مدل آن را معنای آن شناسه در نظر میگیرد. در پسانتشار (backpropagation)، تنها سطرهایی بهروزرسانی میشوند که در گذر رو به جلو (forward pass) استفاده شده باشند. در طول فرایند آموزش، هندسهی این سطرها یاد میگیرد که شباهت را در جهتهای برداری بازنمایی کند.
شناسههای توکن بهتنهایی ترتیبی ندارند. مدل به سیگنال دومی نیاز دارد تا بفهمد جایگاه یکم با جایگاه هفدهم فرق میکند. دو گزینهی اصلی برای این سیگنال عبارتاند از: امبدینگ مکانیِ یادگیریپذیر (یک جدول جستجوی دوم، با یک سطر بهازای هر جایگاه) و امبدینگ مکانیِ سینوسیِ ثابت (یک فرمول ریاضی بدون پارامتر). این انتخاب پیامدهای خودش را دارد. جدول یادگیریپذیر یک پارامتر است و به بیشینهی طول متنی (context length) که مدل با آن آموزش دیده محدود میشود. جدول سینوسی روی کاغذ پارامتری ندارد و فرمول آن به هر جایگاهی تعمیم مییابد؛ اما در این درس، ماژول SinusoidalPositionalEmbedding یک جدول ثابت را تا max_context_length از پیش محاسبه میکند و متد forward در صورت عبور از این حد خطا میدهد؛ بنابراین هر دو ماژول در اینجا یک بیشینهی طول متن را تحمیل میکنند. علاوه بر این، حتی اگر جدول بهاندازهی کافی برای اندیسگذاری بزرگ باشد، باز هم مدل فراتر از طول دیدهشده در زمان آموزش به مشکل میخورد.
در این درس هر دو نوع را میسازیم و آنها را با امبدینگ توکن ترکیب میکنیم تا ورودی واحدی برای بلوک اتنشن (attention) درس بعدی آماده شود.
قرارداد شکل دادهها
ورودیِ مرحلهی امبدینگ یک بَچ از شناسههای توکن با شکل (B, T) است. خروجی یک تنسور با شکل (B, T, D) خواهد بود که در آن D بُعد مدل است. همهی نمونههای بَچ طول متن 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) ورودی سه کار را بهترتیب انجام میدهد: خواندن شناسههای توکن، جستجوی بردارهای توکن، افزودن بردارهای مکانی، و در نهایت بازگرداندن حاصلجمع.
فرایند برادکستینگ در مرحلهی جمع، تنسور مکانی با شکل (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 تغییر دهید و ببینید نوارهای طول موج سینوسی چطور تغییر میکنند.
