مکانیزم اتنشن کامل (Full Attention) در طول توالیهای بالا رفتاری سنگین دارد و هزینهی محاسبات و حافظهی آن با توان دو افزایش پیدا میکند. مدلهای زبانی مدرن برای کار با بافتهای 32K تا 128K نمیتوانند در تمام لایهها به هر توکن اجازهی دیدن کل توکنهای پیشین را بدهند؛ زیرا حجم کش KV و حافظهی فعالسازی سرسامآور میشود.
برای رفع این چالش، مهندسان معماریهای جایگزینی توسعه دادهاند: اتنشن پنجرهی لغزان (SWA)، اتنشن تنک یا بلوکی (Sparse Attention)، و اتنشن تفاضلی (Differential Attention). این روشها توپولوژی ماتریس امتیازها را دگرگون میکنند و بار محاسباتی و اندازه کش KV را تا دهها برابر کاهش میدهند.
در شرایطی که سختافزارهای پردازشی پیشرفته محدود و گرانقیمت هستند، بهینهسازی مدلها در سطح معماری اهمیت دوچندان پیدا میکند. در این درس با مفاهیم ریاضی، اثرات حافظهای و پیادهسازی این ساختارها با FlexAttention در PyTorch آشنا میشوید تا بدانید مدلهایی مانند Gemma 3 یا DeepSeek چگونه چنین بافتهای بلندی را مدیریت میکنند.
اتنشن کامل (Full attention) مثل یک دایره است: هر توکن تمام توکنهای دیگر را میبیند و حافظه تاوانش را پس میدهد. سه مدل جایگزین، شکل این دایره را تغییر میدهند و نیمی از هزینهها را برمیگردانند.
صورت مسئله
اتنشن کامل از نظر طول توالی، هزینهی حافظهی و هزینهی محاسباتی دارد. برای مدل Llama 3 70B با طول بافت 128K، این یعنی 16 میلیارد درایهی اتنشن در هر لایه، ضرب در 80 لایه. فلشاتنشن (Flash Attention در درس 12) هزینهی حافظهی فعالسازی (activation memory) از مرتبهی را پنهان میکند، اما بار محاسباتی ریاضی را تغییر نمیدهد؛ هنوز هم هر توکن به تمام توکنهای دیگر اتنشن دارد.
سه دسته از مدلهای جایگزین، توپولوژی خود ماتریس اتنشن را دگرگون میکنند:
- اتنشن پنجرهی لغزان (Sliding window attention یا SWA): هر توکن بهجای کل پیشوند قبلی، فقط به یک پنجرهی ثابت از همسایگانش اتنشن دارد. حافظه و محاسبات به کاهش مییابد که در آن اندازهی پنجره است. نمونهها: Gemma 2/3، لایههای اول Mistral 7B، و Phi-3-Long.
- اتنشن تنک / بلوکی (Sparse / block attention): فقط زوجهای انتخابی
(i, j)امتیازدهی میشوند و وزن بقیه اجباراً صفر میشود. نمونهها: Longformer، BigBird، و sparse transformer متعلق به OpenAI. - اتنشن تفاضلی (Differential attention): محاسبهی دو نقشهی اتنشن با تصویر کردن (projection) جداگانهی Q/K و سپس تفریق آنها از یکدیگر. این کار اثر «سینک اتنشن» (attention sink) را که وزن زیادی را بیدلیل به اولین توکنها میکشاند، خنثی میکند. نمونه: مدل DIFF Transformer از مایکروسافت (2024).
این روشها در کنار هم کار میکنند. یک مدل پیشروی سال 2026 معمولاً آنها را ترکیب میکند: بیشتر لایهها از نوع SWA-1024 هستند، از هر پنج لایه یکی اتنشن کامل سراسری (global) است، و چند سر (head) تفاضلی هم کار بازیابی اطلاعات را دقیق میکنند. نسبت 5:1 لایههای SWA به سراسری در Gemma 3، اکنون به انتخاب استاندارد و مرجع تبدیل شده است.
مفاهیم پایه
اتنشن پنجرهی لغزان (SWA)
هر پرسش (query) در موقعیت فقط به موقعیتهای بازهی (در SWA علیتی یا causal) یا بازهی (در حالت دوطرفه) اتنشن دارد. توکنهای بیرون از این پنجره در ماتریس امتیاز، مقدار میگیرند.
full causal: sliding window (W=4):
positions 0-7 positions 0-7, W=4
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
0 | x 0 | x
1 | x x 1 | x x
2 | x x x 2 | x x x
3 | x x x x 3 | x x x x
4 | x x x x x 4 | x x x x
5 | x x x x x x 5 | x x x x
6 | x x x x x x x 6 | x x x x
7 | x x x x x x x x 7 | x x x x
به ازای و ، ماتریس امتیازها در حالت میانگین 1024 × 8192 سطر غیرصفر دارد؛ یعنی کاهشی 8 برابری.
کوچکتر شدن کش KV با SWA: در هر لایه تنها کافی است آخرین توکن از K و V نگهداری شوند. برای ساختاری شبیه Gemma 3 (پنجرهی 1024 و طول بافت 128K)، حجم کش KV تا 128 برابر کاهش مییابد.
افت کیفیت: ترنسفورمرهایی که صرفاً از SWA استفاده میکنند، در بازیابیهای بازهی طولانی دچار مشکل میشوند. راهحل: چیدمان متناوب لایههای SWA در کنار لایههای اتنشن کامل. مدل Gemma 3 از نسبت 5 به 1 برای لایههای SWA به سراسری بهره میبرد. مدل Mistral 7B از پشتهای از لایههای causal-SWA استفاده میکرد که در آن اطلاعات از طریق پنجرههای همپوشان «رو به جلو جریان مییافتند»؛ هر لایه میدان دید (receptive field) مؤثر را به اندازهی گسترش میدهد و بعد از L لایه، مدل میتواند تا L × W توکن به عقب اتنشن داشته باشد.
اتنشن تنک / بلوکی
از قبل یک الگوی تنک N × N را مشخص کنید. سه ساختار استاندارد وجود دارد:
- محلی + استرایددار (OpenAI sparse transformer): به آخرین توکن بهعلاوهی توکنهایی با فاصلهی منظمِ
strideاز آن نقطه به عقب اتنشن داده میشود. این روش هم اطلاعات محلی و هم بلندمدت را با هزینهی محاسباتی پوشش میدهد. - روش Longformer / BigBird: پنجرهی محلی + مجموعهی کوچکی از توکنهای سراسری (مثل
[CLS]) که هم به همهی توکنها اتنشن دارند و هم بقیه به آنها اتنشن میورزند + اتصالات تصادفی و تنک. این الگو از نظر تجربی، طول بافت را با حفظ همان کیفیت تا 2 برابر افزایش میدهد. - اتنشن تنک نیتیو (Native Sparse Attention از DeepSeek، سال 2025): یادگیری اینکه کدام بلوکهای
(Q, K)اهمیت دارند و سپس رد کردن بلوکهای صفر در سطح کرنل (kernel). این روش با FlashAttention نیز سازگار است.
اتنشن تنک در واقع دستاوردی در حوزهی مهندسی کرنل است. ریاضیات آن ساده است (ماسک کردن ماتریس امتیاز)؛ برگ برندهی اصلی در این است که درایههای صفر اصلاً در حافظهی SRAM لود نمیشوند. کتابخانهی FlashAttention-3 و رابط برنامهنویسی FlexAttention در سال 2026، اعمال الگوهای تنک سفارشی را در PyTorch کاملاً روان و سازگار کردهاند.
اتنشن تفاضلی (DIFF Transformer، سال 2024)
اتنشن معمولی با مشکلی به نام «سینک اتنشن» مواجه است: تابع سافتمکس (softmax) جمع هر سطر را مجبور به 1 شدن میکند؛ بنابراین توکنهایی که نمیخواهند به چیز خاصی اتنشن داشته باشند، وزن زیادی را روی اولین توکن (یا چند توکن اول) تخلیه میکنند. این اتفاق ظرفیتی را که باید صرف محتوای واقعی میشد، تلف میکند.
اتنشن تفاضلی این ایراد را با محاسبهی دو نقشهی اتنشن و تفریق آنها برطرف میکند:
که در آن یک اسکالر یادگیریپذیر است (معمولاً بین 0.5 تا 0.8). ماتریس A1 وزنهای واقعی محتوا را ثبت میکند و A2 سینک را میگیرد. تفریق این دو، سینک را خنثی کرده و وزن را دوباره به توکنهای مرتبط اختصاص میدهد.
نتایج گزارششده (مایکروسافت 2024): 5 تا 10 درصد پرپلکسیتی (perplexity) کمتر، 1.5 تا 2 برابر بافت مؤثر طولانیتر با همان طول آموزش، و بازیابی بسیار دقیقتر اطلاعات مدفون در میان انبوه دادهها (needle-in-a-haystack).
مقایسهی مدلهای مختلف
| ساختار | محاسبات | کش KV | کیفیت در مقایسه با کامل | استفاده در محیط عملیاتی |
|---|---|---|---|---|
| اتنشن کامل | در هر لایه | مبنا (baseline) | لایهی پیشفرض در تمام مدلها | |
| پنجرهی لغزان (پنجرهی 1024) | در هر لایه | افت 0.1 پرپلکسیتی، عالی در ترکیب با لایههای سراسری | Gemma 2/3، Phi-3-Long | |
| تنک محلی + استرایددار | ترکیبی | شبیه به SWA | sparse transformer در OpenAI، مدل Longformer | |
| مدل BigBird (محلی + سراسری + تصادفی) | حدوداً | ترکیبی | همکیفیت با اتنشن کامل در بافت 2 برابری | نسخههای اولیهی BERT با طول بافت بالا |
| تنک نیتیو (DeepSeek-V3.2) | اختلاف کمتر از 0.05 پرپلکسیتی | DeepSeek-V3.2، سال 2025 | ||
| تفاضلی | 5 تا 10 درصد بهبود پرپلکسیتی | DIFF Transformer، مدلهای اولیهی 2026 |
پیادهسازی از صفر
کد code/main.py را ببینید. در اینجا مقایسهگری برای ماسکهای علیتی میسازیم که حالتهای کامل، SWA، محلی + استرایددار، و تفاضلی را روی یک توالی فرضی و ساده در کنار هم نشان میدهد.
گام 1: ماسک علیتی کامل (پایهی مقایسه)
def causal_mask(n):
return [[0.0 if j <= i else float("-inf") for j in range(n)] for i in range(n)]
ماسک پایهای که از درس 07 به یاد داریم. ماتریس مثلثی پایینی؛ با وزن صفر در بالای قطر اصلی.
گام 2: ماسک علیتی پنجرهی لغزان
def swa_mask(n, window):
M = [[float("-inf")] * n for _ in range(n)]
for i in range(n):
lo = max(0, i - window + 1)
for j in range(lo, i + 1):
M[i][j] = 0.0
return M
یک پارامتر دارد: window. اگر window >= n باشد، به همان اتنشن علیتی کامل میرسید. اگر window = 1 باشد، هر توکن فقط به خودش اتنشن دارد.
گام 3: ماسک تنک محلی + استرایددار
def strided_mask(n, window, stride):
M = [[float("-inf")] * n for _ in range(n)]
for i in range(n):
lo = max(0, i - window + 1)
for j in range(lo, i + 1):
M[i][j] = 0.0
for j in range(0, i + 1, stride):
M[i][j] = 0.0
return M
یک پنجرهی محلی پرتراکم بهعلاوهی توکنهایی به فواصل ثابت stride به سمت ابتدای توالی. میدان دید با افزودن لایهها بهصورت لگاریتمی رشد میکند.
گام 4: اتنشن تفاضلی
def diff_attention(Q1, K1, Q2, K2, V, lam):
A1 = softmax_causal(Q1 @ K1.T / sqrt_d)
A2 = softmax_causal(Q2 @ K2.T / sqrt_d)
return (A1 - lam * A2) @ V
دو بار محاسبهی اتنشن و تفریق آنها با یک ضریب ترکیب یادگیریپذیر. در کد، نقشهی حرارتی سینک اتنشن را در حالت تکی و تفاضلی مقایسه میکنیم و محو شدن سینک را میبینیم.
گام 5: اندازهی کش KV
میزان حافظهی کش را به ازای هر لایه در طول توالی برای هر ساختار چاپ کنید. نسخههای SWA و تنک، مصرف حافظه را 10 تا 100 برابر کاهش میدهند؛ در حالی که حالت تفاضلی آن را دو برابر میکند. باید این بهای مصرف حافظه را آگاهانه بپردازید.
استفاده از ابزارهای واقعی
الگوهای عملیاتی سال 2026:
from transformers import AutoModelForCausalLM
# Gemma 3 mixes SWA (window=1024) and global layers at 5:1.
model = AutoModelForCausalLM.from_pretrained("google/gemma-3-27b-it")
# print(model.config.sliding_window, model.config.layer_types)
ابزار FlexAttention در PyTorch 2.5 به بالا یک تابع ماسک دریافت میکند:
from torch.nn.attention.flex_attention import flex_attention, create_block_mask
def swa_pattern(b, h, q_idx, kv_idx):
return (q_idx - kv_idx < 1024) & (q_idx >= kv_idx)
mask = create_block_mask(swa_pattern, B=batch, H=heads, Q_LEN=n, KV_LEN=n)
out = flex_attention(q, k, v, block_mask=mask)
این تابع در قالب یک کرنل سفارشی Triton کامپایل میشود. سرعت آن در الگوهای رایج تا 10 درصدی FlashAttention-3 میرسد و تابع ماسک آن هم یک تابع سادهی پایتونی است.
چه زمانی از کدام استفاده کنیم:
- اتنشن کامل خالص: تمام لایهها تا بافتهای حدود 16K، یا زمانهایی که کیفیت بازیابی اطلاعات اولویت اول است.
- ترکیب SWA و سراسری: بافتهای طولانی (بیشتر از 32K)، در شرایطی که آموزش و استنتاج با محدودیت حافظه روبهرو است؛ انتخاب پیشفرض سال 2026 برای بافتهای بالای 32K.
- اتنشن تنک بلوکی: کرنل و الگوی سفارشی؛ فقط برای کاربردهای خاص (مثل بازیابی تخصصی یا دادههای صوتی).
- اتنشن تفاضلی: هر سناریویی که مشکل سینک اتنشن به آن آسیب میزند (سیستمهای RAG با بافت طولانی، پیدا کردن دادههای خاص در انبوه اطلاعات).
خروجی این درس
فایل outputs/skill-attention-variant-picker.md را بررسی کنید. این مهارت با توجه به طول بافت هدف، نیازهای بخش بازیابی، و محدودیتهای پردازشی در آموزش و استنتاج، توپولوژی اتنشن مناسب را برای یک مدل جدید انتخاب میکند.
تمرینها
- ساده. کد
code/main.pyرا اجرا کنید. مطمئن شوید که حالت SWA باwindow=4تمام درایههای بیرون از 4 توکن آخر هر سطر را صفر میکند. بررسی کنید که باwindow=nدقیقاً خروجی اتنشن علیتی کامل بهصورت بیتی بازتولید شود. - متوسط. اتنشن SWA علیتی با
window=1024را روی پروژهی نهایی درس 07 پیاده کنید. آن را 1,000 گام روی مجموعهدادهی tinyshakespeare آموزش دهید. افت تابع زیان اعتبارسنجی (val loss) و کاهش حداکثر حافظهی مصرفی را در مقایسه با اتنشن کامل بسنجید. - سخت. ساختار ترکیب لایههای 5:1 مدل Gemma 3 (پنج لایه SWA و یک لایه سراسری) را در مدل پروژهی نهایی پیاده کنید. با پارامترهای برابر، مقادیر تابع زیان (loss)، حافظه، و کیفیت متن تولیدی را با دو حالت پایهی «کاملاً SWA» و «کاملاً سراسری» مقایسه کنید.
- سخت. اتنشن تفاضلی را با یک پارامتر یادگیریپذیر برای هر سر (head) بسازید. مدل را روی یک تسک بازیابی ساختگی (شامل یک دادهی هدف در میان 2,000 دادهی گمراهکننده) آموزش دهید. دقت بازیابی را با یک مدل پایهی اتنشن معمولی با تعداد پارامتر برابر مقایسه کنید.
اصطلاحات کلیدی
| اصطلاح | در گفتوگوها | معنای دقیق فنی |
|---|---|---|
| اتنشن پنجرهی لغزان (SWA) | «اتنشن محلی» | هر پرسش فقط به توکن آخر خود اتنشن دارد؛ کش KV تا کاهش پیدا میکند. |
| میدان دید مؤثر | «مدل تا چند گام قبل را میبیند» | در یک پشتهی لایهای از SWA با پنجرهی ، حداکثر تا توکن است. |
| مدلهای Longformer و BigBird | «محلی + سراسری + تصادفی» | الگوهای تنک همراه با تعداد کمی توکن سراسریِ همیشه فعال؛ روشهای اولیهی پشتیبانی از بافت طولانی. |
| اتنشن تنک نیتیو (Native Sparse Attention) | «ترفند کرنلِ DeepSeek» | یادگیری میزان تنک بودن در سطح بلوکها؛ رد کردن بلوکهای صفر در سطح کرنل بدون افت کیفیت. |
| اتنشن تفاضلی | «دو نقشه، یکی تفریق میشود» | در DIFF Transformer: تفریق نقشهی دوم اتنشن (ضرب در ضریب یادگیریپذیر ) از اولی برای حذف اثر سینک اتنشن. |
| سینک اتنشن | «سرازیر شدن وزن به توکن 0» | نرمالسازی با سافتمکس مجموع سطرها را 1 میکند؛ پرسشهای بدون بار معنایی وزن خود را روی موقعیت 0 خالی میکنند. |
| FlexAttention | «تعریف ماسک با توابع پایتونی» | رابط برنامهنویسی PyTorch 2.5 به بالا که توابع دلخواه ماسک را به کرنلهایی با سرعت FlashAttention کامپایل میکند. |
| ترکیب نوع لایهها | «نسبت 5:1 پنجرهی لغزان به سراسری» | چیدمان متناوب لایههای تنک و اتنشن کامل در یک پشته برای حفظ کیفیت همزمان با مصرف حافظهی کمتر. |
برای مطالعهی بیشتر
- Beltagy, Peters, Cohan (2020). Longformer: The Long-Document Transformer — مقالهی مرجع ترکیب پنجرهی لغزان با توکنهای سراسری.
- Zaheer et al. (2020). Big Bird: Transformers for Longer Sequences — الگوی محلی + سراسری + تصادفی.
- Child et al. (2019). Generating Long Sequences with Sparse Transformers — الگوی محلی + استرایددار از OpenAI.
- Gemma Team (2024). Gemma 2: Improving Open Language Models at a Practical Size — ترکیب متناوب 1:1 لایههای SWA و سراسری.
- Gemma Team (2025). Gemma 3 technical report — ساختار ترکیبی 5:1 با پنجرهی 1024 که به استاندارد مدلها تبدیل شده است.
- Ye et al. (2024). Differential Transformer — مقالهی معرفی مدل DIFF Transformer.
- Yuan et al. (2025). Native Sparse Attention — اتنشن تنک یادگیریپذیر در مدل DeepSeek-V3.2.
- PyTorch — FlexAttention blog and docs — مستندات مرجع FlexAttention برای الگوهای ماسکگذاری بهشکل تابع که در بخش ابزارها معرفی شد.
