ادامهٔ قوانین مقیاسپذیری
نمونههایی از توابع پیچیدهتر برای برازش منحنیهای یادگیری را میتوان در Alabdulmohsin et al. [2022] و Caballero et al. [2023] یافت.
اهمیت قوانین مقیاسپذیری در این است که برای پژوهش LLM جهتگیری فراهم میکنند: اگر هنوز در ناحیهٔ قانون توانی منحنی باشیم، استفاده از منابع بیشتر برای آموزش مدلهای بزرگتر مسیر بسیار امیدبخشی است. هرچند این نتیجه گروههای پژوهشی و شرکتهای بزرگ را به سرمایهگذاری بیشتر در منابع محاسباتی بسیار پرهزینه سوق میدهد، قوانین مقیاسپذیری همچنان مرزهای هوش مصنوعی را جلوتر میبرند. از سوی دیگر، فهم این قوانین به پژوهشگران در تصمیمگیری برای آموزش LLM کمک میکند؛ برای نمونه، با داشتن منابع محاسباتی موجود میتوان عملکرد احتمالی LLM را پیشبینی کرد.
نکتهٔ پایانی این بخش آن است که در LLMها، زیان آزمون کمتر همیشه به معنای عملکرد بهتر روی همهٔ وظایف پاییندستی نیست. برای سازگارکردن LLM چند مرحله مانند ریزتنظیم و پرامپتکردن وجود دارد که روی نتیجهٔ نهایی اثر میگذارند؛ بنابراین قوانین مقیاسپذیری وظایف پاییندستی مختلف در عمل میتواند متفاوت باشد.
۲.۳ مدلسازی دنبالههای بلند
پیشتر دیدیم که در آموزش بزرگمقیاس، با استفاده از داده و منابع محاسباتی بیشتر میتوان مدلهای زبانی بزرگتری ساخت. اما مقیاسدادن میتواند در جهتهای دیگری نیز رخ دهد. برای مثال، در بسیاری از کاربردها LLMها برای پردازش دنبالههای بسیار بلند سازگار میشوند. نمونهٔ جالب این است که LLM را روی متنهای فراوان با طول عادی پیشآموزش دهیم و سپس آن را برای دنبالههای توکنی بسیار بلندتر از آنچه در پیشآموزش دیده بهکار ببریم.
در این بخش از Pr(y|x) برای احتمال تولید متن استفاده میکنیم که x زمینه و y متن تولیدی است. سه نوع کلی مسئلهٔ مدلسازی دنبالهٔ بلند وجود دارد:
- تولید متن بر پایهٔ زمینهٔ بلند: x بلند است؛ مثلاً تولید خلاصهای کوتاه از متنی بسیار بلند.
- تولید متن بلند: y بلند است؛ مثلاً تولید داستانی بلند از چند کلیدواژه.
- تولید متن بلند بر پایهٔ زمینهٔ بلند: هر دو x و y بلندند؛ مثلاً ترجمهٔ یک سند بلند از چینی به انگلیسی.
پژوهشگران NLP اخیراً توجه بیشتری به کاربرد و ارزیابی LLM روی وظایفی با ورودیهای بسیار طولانی نشان دادهاند. تصور کنید LLM یک فایل منبع C++ با دهها هزار خط را بخواند و کارکرد برنامه را شرح دهد. مدلهایی که میتوانند زمینههای متنی بسیار گسترده را مدیریت کنند، گاهی «LLMهای زمینهبلند» (long-context LLMs) نامیده میشوند. این بخش روی همین مدلها تمرکز میکند، هرچند روشهای مطرحشده برای مسائل دیگر نیز قابل استفادهاند.
برای Transformer، پردازش دنبالهٔ بلند از نظر محاسباتی پرهزینه است، زیرا هزینهٔ خودتوجهی با مجذور طول دنباله رشد میکند. این امر آموزش و استقرار مدل برای ورودیهای بسیار بلند را دشوار یا ناممکن میسازد. دو مسیر پژوهشی عمده برای سازگارکردن Transformer با مدلسازی زمینهٔ بلند دنبال شده است:
- بررسی روشهای آموزش و معماریهای کارآمد برای یادگیری مدلهای خودتوجهی از دادهٔ دنبالهٔ بلند.
- سازگارکردن LLM پیشآموخته با دنبالههای بلند با ریزتنظیم اندک یا حتی بدون ریزتنظیم.
مسیر نخست را کوتاه بررسی میکنیم، زیرا در بحثهای عمومی معماریهای Transformer کارآمد پوشش داده شده است [Tay et al., 2020; Xiao and Zhu, 2023]. تمرکز اصلی بر مسیر دوم و روشهای محبوب LLMهای جدید خواهد بود. همچنین قوتها و محدودیتهای مدلهای دنبالهبلند بررسی میشوند.
۲.۳.۱ بهینهسازی از دید محاسبات با کارایی بالا (HPC)
بحث را با بهبود Transformer استاندارد از دید محاسبات با کارایی بالا آغاز میکنیم. بیشتر این بهبودها ویژهٔ LLM طراحی نشدهاند، اما بهطور گسترده در مدلهای مختلف یادگیری عمیق بهکار میروند [Kim et al., 2023]. روش رایج، پیادهسازی Transformer با دقت عددی پایین است؛ مثلاً استفاده از نوع دادهٔ ثابت ۸ یا ۱۶ بیتی بهجای ممیز شناور ۳۲ یا ۶۴ بیتی برای عملیات حسابی. این نوعهای کمدقت میتوانند کارایی و توان عملیاتی حافظه را افزایش دهند و پردازش دنبالههای بلند را آسانتر کنند. روش جایگزین، بهبود Transformer با تکنیکهای آگاه از سختافزار است؛ برای مثال روی GPUهای مدرن میتوان با پیادهسازیهای خودتوجهی آگاه از IO، کارایی را بهتر کرد [Dao et al., 2022; Kwon et al., 2023].
راه دیگر برای مدیریت دنبالههای بلند «موازیسازی دنباله» (sequence parallelism) است [Li et al., 2023b; Korthikanti et al., 2023]. مسئلهٔ عمومی توجه پرسوجوی qi در موقعیت i به کلیدهای K و مقادیر V را در نظر بگیرید. K را بر اساس سطرها به زیرماتریسهای {K[1],...,K[ν]} تقسیم میکنیم که هرکدام بخشی از دنباله را نشان میدهند؛ برای V نیز {V[1],...,V[ν]} ساخته میشود. سپس هر زوج K[u],V[u] به یک گرهٔ محاسباتی، مانند GPU در خوشه، داده میشود و گرهها همزمان عمل توجه را انجام میدهند.
خروجی خودتوجهی را میتوان نوشت:
Attqkv(qi,K,V) = ∑j=0m−1 αi,jvj (2.40)
که αi,j وزن توجه میان موقعیتهای i و j است. در Transformer، این وزن از نسخهٔ مقیاسشدهٔ ضرب داخلی qi و kj بهدست میآید. اگر βi,j امتیاز توجه باشد:
βi,j = qi·kj/√d + Mask(i,j) (2.41)
و وزن نرمالشده:
αi,j = Softmax(βi,j) = exp(βi,j) / ∑j′ exp(βi,j′) (2.42)
در هر گره، محاسبهٔ صورت رابطهٔ (۲.۴۲) ساده است چون اطلاعات لازم محلی است؛ اما مخرج شامل مجموع روی همهٔ j′ها است و به انتقال داده بین گرهها نیاز دارد. اگر vj,kj روی گره u باشند، مخرج را میتوان به مجموع سهمهای محلی گرهها شکست:
αi,j = exp(βi,j) / [∑kj′∈K[1]exp(βi,j′) + ... + ∑kj′∈K[u]exp(βi,j′) + ... + ∑kj′∈K[ν]exp(βi,j′)] (2.43)
در پیادهسازی مستقیم، جمع محلی هر گره جداگانه انجام و سپس نتایج گرهها با یک عملیات جمعی (collective operation) ترکیب میشوند. الگوریتمهای کارآمدی مانند all-reduce برای چنین کاری وجود دارند و کتابخانههای ارتباط جمعی پیادهسازی بهینهٔ آن را فراهم میکنند.
پس از بهدستآوردن وزنهای توجه، خود خروجی نیز به جمعهای محلی شکسته میشود:
Attqkv(qi,K,V) = ∑vj′∈V[1] αi,j′vj′ + ... + ∑vj′∈V[u] αi,j′vj′ + ... + ∑vj′∈V[ν] αi,j′vj′ (2.44)
ابتدا جمع وزندار مقادیر روی گرههای مختلف همزمان انجام و سپس نتایج با عملیات جمعی گردآوری میشوند. هرچند تمرکز این بخش دنبالهٔ بلند است، انگیزهٔ اصلی موازیسازی دنباله از همان روشهای آموزش توزیعشدهٔ شبکههای عمیق در بخش ۲.۲.۳ میآید و پیادهسازی میتواند از همان کتابخانهٔ پردازش موازی استفاده کند.
۲.۳.۲ معماریهای کارآمد
یکی از دشواریهای استفاده از Transformer برای دنبالههای بلند آن است که پیچیدگی زمانی خودتوجهی نسبت به طول دنباله درجهٔ دو است. افزون بر این، در استنتاج یک کش کلید–مقدار (KV cache) نگه داشته میشود که با پردازش توکنهای بیشتر رشد میکند. با اینکه اندازهٔ KV cache فقط بهصورت خطی با طول دنباله افزایش مییابد، برای ورودیهای بسیار بلند ردپای حافظه قابلتوجه میشود و حتی استقرار LLM برای این وظایف ناممکن میگردد. بنابراین معماری LLMهای زمینهبلند معمولاً از Transformer استاندارد فاصله میگیرد و به گونهها و جایگزینهای کارآمدتر روی میآورد.
یک رویکرد، استفاده از توجه تُنُک (sparse attention) بهجای خودتوجهی استاندارد است. ایده این است که هنگام توجه به یک توکن، تنها تعداد کمی از توکنها واقعاً مهماند و بیشتر وزنهای توجه نزدیک صفر هستند. بنابراین میتوان بیشتر وزنها را هرس و مدل توجه را بهصورت فشرده نمایش داد. خودتوجهی را در نظر بگیرید:
Attqkv(Q,K,V)=α(Q,K)V (2.45)
که ماتریس وزن α(Q,K)∈Rm×m از Softmax امتیازهای QKT/√d + Mask ساخته میشود. چون مدل زبانی توکن بعدی را فقط از زمینهٔ چپ پیشبینی میکند، خروجی در موقعیت i چنین است:
Attqkv(qi,K≤i,V≤i) = ∑j=0i αi,jvj (2.47)
در خودتوجهی اصلی، بردار وزن [αi,0...αi,i] چگال فرض میشود. در توجه تنک فقط برخی درایهها غیرصفر در نظر گرفته میشوند و بقیه در محاسبه نادیده گرفته میشوند. اگر G⊆{0,...,i} مجموعهٔ شاخصهای غیرصفر باشد:
Attsparse(qi,K≤i,V≤i) = ∑j∈G α′i,jvj (2.48)
وزنهای α′ روی مجموعهٔ G دوباره نرمال میشوند و بنابراین از وزنهای اصلی متفاوتاند. میزان تنکی با اندازهٔ G تعیین میشود. مدلهای sparse attention در نحوهٔ تعریف G متفاوتاند؛ یک الگوی ساده و رایج آن است که G پنجرهای از توکنهای نزدیک موقعیت i را بپوشاند [Parmar et al., 2018].
توجه تنک محاسبه را کم میکند، اما همچنان باید کل KV cache یعنی K≤i,V≤i در استنتاج نگهداری شود و برای دنبالهٔ بسیار بلند این کار حافظهبر است. یک جایگزین، توجه خطی (linear attention) است [Katharopoulos et al., 2020] که کش را صریحاً نگه نمیدارد. تابع هستهٔ φ(·) هر query و key را به q′i=φ(qi) و k′i=φ(ki) نگاشت میکند. با حذف Softmax تحت این تبدیلها، تقریب زیر حاصل میشود:۱۰
Attqkv(qi,K≤i,V≤i) ≈ Attlinear(q′i,K′≤i,V≤i) = (q′i μi)/(q′i νi) (2.49)
متغیرهای μi و νi بهصورت بازگشتی محاسبه میشوند:
μi = μi−1 + k′iTvi (2.50)
νi = νi−1 + k′iT (2.51)
این دو متغیر را میتوان بازنمایی تاریخچه تا موقعیت i دانست. مزیت آن است که لازم نیست همهٔ queryها و valueهای گذشته نگه داشته شوند؛ فقط جدیدترین μi,νi لازماند. بنابراین هزینهٔ هر گام ثابت میشود و مدل بهآسانی به دنبالهٔ بلند گسترش مییابد.
این رویکرد ترتیبی بهطور طبیعی از دید مدلهای بازگشتی نیز بهدست میآید. مدل بازگشتی در هر لحظه یک یا چند توکن را میخواند، حالت بازگشتی را بهروزرسانی و سپس ورودیهای قبلی را دور میاندازد. خروجی هر گام فقط به حالت بازگشتی وابسته است، نه همهٔ حالتهای گذشته. ردپای حافظه با اندازهٔ ثابت حالت بازگشتی تعیین میشود. این مدلها برای یادگیری بلادرنگ با جریان داده مناسباند. در NLP، استفاده از مدلهای بازگشتی برای مدلسازی زبان از نخستین تلاشهای موفق یادگیری بازنمایی دنباله بود. هرچند Transformer معماری پایهٔ LLMها شده، مدلهای بازگشتی همچنان برای LLMهای کارآمد قدرتمندند و اخیراً دوباره بهعنوان جایگزینی امیدبخش برای Transformer مورد توجه قرار گرفتهاند [Gu and Dao, 2023].
شکل ۲.۵ — مقایسهٔ خودتوجهی استاندارد، توجه تنک، توجه خطی و مدل بازگشتی. جعبههای آبی حالتهایی را نشان میدهند که برای تولید خروجی موقعیت i در کش نگه داشته میشوند؛ f(·) یک سلول بازگشتی است.
۲.۳.۳ کش و حافظه
LLMهای مبتنی بر Transformer استاندارد مدلهایی سراسریاند. برای پیشبینی توکنهای آینده باید تمام زمینهٔ سمت چپ در استنتاج ذخیره شود. به همین دلیل KV cache بازنماییهای کلید و مقدار همهٔ توکنهای تولیدشدهٔ قبلی را نگه میدارد و هزینهٔ کش با پیشرفت استنتاج افزایش مییابد. پیشتر روشهای بهینهسازی این کش با توجه تنک و خطی بررسی شد. ایدهٔ دیگری که با آن بحث همپوشانی دارد، رمزگذاری صریح زمینه با یک مدل حافظهٔ اضافی است.
۲.۳.۳.۱ KV cache با اندازهٔ ثابت
راه مستقیم، نمایش کلیدها و مقادیر با یک مدل حافظهٔ ثابتاندازه است. فرض کنید حافظهٔ Mem اطلاعات زمینهای را نگه میدارد. عمل توجه در موقعیت i را میتوان بهشکل کلی نوشت:
Att(qi,Mem) = Attqkv(qi,K≤i,V≤i) (2.52)
در مدل استاندارد، Mem=(K≤i,V≤i) و اندازهٔ آن با i رشد میکند. اگر Mem را متغیری با اندازهٔ ثابت تعریف کنیم، هزینهٔ Att(qi,Mem) نیز ثابت میشود. چند طراحی جایگزین وجود دارد:
- پنجرهٔ ثابت. حافظه فقط کلید و مقدار nc موقعیت اخیر را نگه میدارد:
Mem=(K[i−nc+1,i], V[i−nc+1,i]) (2.53)
این مدل نوعی توجه محلی است.۱۱
- بردارهای خلاصه. میتوان تاریخچه را به یک جفت بردار خلاصه فشرده کرد. سادهترین مثال، میانگین متحرک بدون وزن روی nc کلید و مقدار اخیر است:
Mem=(∑j=i−nc+1ikj/nc, ∑j=i−nc+1ivj/nc) (2.54)
نسخهٔ وزندار:
Mem=(∑βk/∑β, ∑βv/∑β) (2.55)
ضرایب β میتوانند آموختنی یا ابتکاری باشند؛ مثلاً برای موقعیتهای نزدیکتر وزن بزرگتر در نظر گرفته شود. اگر میانگین را به همهٔ موقعیتهای تا i گسترش دهیم، میانگین تجمعی بهدست میآید:
Mem=(∑j=0ikj/(i+1), ∑j=0ivj/(i+1)) (2.56)
و بهصورت بازگشتی:
Memi = ((ki,vi) + i·Memi−1)/(i+1) (2.57)
مزیت آن است که در استنتاج فقط یک جفت key-value ذخیره میشود. این حافظهها با مدلهای بازگشتی ارتباط دارند و روشهای پیشرفتهتر برای ساخت جایگزین خودتوجهی نیز توسعه یافتهاند [Ma et al., 2023].
- شبکهٔ عصبی بهعنوان حافظه. حافظه در هر گام خروجی قبلی خود و حالتهای فعلی مدل را میگیرد و خروجی جدید میسازد:
Mem = Update(Skv, Mempre) (2.58)
Skv مجموعهای از زوجهای کلید–مقدار اخیر است. اگر تنها جدیدترین زوج (ki,vi) را بگیرد و Update یک سلول بازگشتی باشد:
Mem=f((ki,vi),Mempre) (2.59)
بازگشت را میتوان در سطح segment نیز اعمال کرد. اگر Skv یک segment باشد و Update تابع FIFO باشد، segment جدید وارد حافظه و قدیمیترین segment حذف میشود:
Mem=FIFO(Skv,Mempre) (2.60)
اگر حافظه دو segment، جاری و قبلی، داشته باشد هر موقعیت به تاریخچهٔ دو segment متوالی نزدیک دسترسی دارد. این حافظهٔ محلی و گونههای آن در مدلهای بازگشتی سطح segment کاربرد زیادی داشتهاند [Dai et al., 2019; Hutchins et al., 2022; Bulatov et al., 2022].
- چند حافظه. Compressive Transformer [Rae et al., 2019] دو حافظهٔ ثابتاندازه دارد: Mem برای زمینهٔ محلی و CMem برای تاریخچهٔ دوربرد فشرده. توجه روی ترکیب آنها انجام میشود:
Attcom(qi,Mem,CMem)=Attqkv(qi,[Mem,CMem]) (2.61)
مدل در سطح segment کار میکند. وقتی segment جدید Skkv برسد، Mem با FIFO بهروزرسانی میشود:
Mem=FIFO(Skkv,Mempre) (2.62)
زوجهای قدیمی خارجشده با یک شبکهٔ فشردهسازی از ns زوج به ns/c زوج تبدیل میشوند و CMem نیز FIFO است:
CMem=FIFO(Ckkv,CMempre) (2.63)
فرض ضمنی آن است که زمینهٔ محلی باید با حداقل اتلاف اطلاعات صریح نگهداری شود، ولی زمینهٔ دوربرد را میتوان بیشتر فشرده کرد.
- ترکیب حافظهٔ محلی و سراسری. با توجه به سودمندی هر دو نوع زمینه، مدلهایی ساخته شدهاند که حافظهٔ محلی و بلندمدت را ترکیب میکنند [Ainslie et al., 2020; Zaheer et al., 2020; Gupta and Berant, 2020]. روش ساده و رایج، قراردادن چند توکن ابتدایی دنباله بهعنوان «توکن سراسری» در توجه است و معمولاً با توجه تنک همراه میشود. این کار به هموارشدن توزیع Softmax وزنهای توجه کمک و عملکرد را در زمینهٔ بسیار بزرگ پایدارتر میکند [Xiao et al., 2024]. عیب آن است که حافظهٔ سراسری ثابتاندازه میتواند باعث از دسترفتن اطلاعات شود؛ افزایش KV cache بازنمایی را بهتر، اما هزینهٔ محاسبه را بیشتر میکند.
شکل ۲.۶ — نمونههایی از KV cache ثابتاندازه در LLM: الف) کش پنجرهای، ب) کش بر پایهٔ میانگین متحرک، ج) شبکهٔ بازگشتی بهعنوان کش، د) کش ترکیبی شامل حافظهٔ فشرده و حافظهٔ محلی. جعبههای آبی کلیدها و مقادیر تولیدشده در استنتاج، سبز موارد ذخیره/رمزگذاریشده در حافظهٔ اصلی و نارنجی موارد حافظهٔ فشرده را نشان میدهند.
این روشها در معنای گسترده همگی گونههایی از توجه کارآمد هستند و با مباحث بخش قبل ارتباط نزدیک دارند.
۲.۳.۳.۲ مدلهای مبتنی بر حافظه
مدلهای حافظهٔ بالا با بهروزرسانی KV cache ساخته میشوند و معمولاً «حافظهٔ داخلی» نام دارند. خانوادهٔ دیگری از «حافظههای خارجی» بهصورت مدلی مستقل، زمینهٔ بزرگمقیاس را برای LLM قابل دسترسی میکنند. بسیاری از آنها بر روشهای حافظهمحور کلاسیک در یادگیری ماشین تکیه دارند [Bishop, 2006]. نمونهٔ رایج الگوریتم نزدیکترین همسایه است: بازنماییهای زمینه در یک datastore ذخیره و شبیهترین بازنماییها به query بازیابی میشوند تا توجه بهبود یابد.
روش k-nearest neighbors یا k-NN را در نظر میگیریم. چون تمرکز این بخش مدلسازی زبان است، هر نمونهٔ datastore یک زوج key-value متناظر با یک حالت زمینه است. «زمینه» در اینجا معنای گسترده دارد و لزوماً فقط پیشوند دنبالهٔ تولید نیست؛ حتی کل مجموعهداده را میتوان زمینهٔ پیشبینی توکن در نظر گرفت. در نتیجه میتوان بهجای جستوجوی فقط پیشوند همان دنباله، نزدیکترین وضعیت زمینه را میان مجموعهای از دنبالهها بازیابی کرد.
فرض کنید کلیدهای {kj} و مقادیر متناظر {vj} در یک پایگاه دادهٔ برداری ذخیره شدهاند.۱۲ برای هر query یعنی qi، k نزدیکترین همسایه پیدا میشود و زوجهای آنها حافظهٔ Memknn را میسازند. Mem نیز حافظهٔ محلی query، مانند KV cache توکنهای مجاور، است. هدف، توجه query هم به Mem و هم به Memknn است. میتوان این دو را در یک KV cache ترکیب کرد یا توجههای جداگانه گرفت. مدل Wu et al. [2021] دو توجه را خطی ترکیب میکند:
Att(qi,Mem,Memknn) = g⊙Attlocal + (1−g)⊙Attknn (2.64)
Attlocal=Att(qi,Mem) (2.65)
Attknn=Att(qi,Memknn) (2.66)
g∈Rd بردار ضریب است و میتواند خروجی یک دروازهٔ آموختنی باشد.
برای مدل زبانی استاندارد، میتوان کلید و مقدار همهٔ توکنهای دیدهشدهٔ قبلی در یک دنباله را در datastore گذاشت؛ در این حالت توجه k-NN در عمل تقریباً با نوعی sparse attention برابر میشود [Gupta et al., 2021]. میتوان زمینه را از یک دنباله به مجموعهای از دنبالهها نیز گسترش داد و زوجهای key-value کل دادهٔ آموزش را در datastore ذخیره کرد تا LLM بر اساس زمینهای عمومیتر پیشبینی کند. اگر دنبالهها زیاد باشند هزینه بالا میرود، اما چون این داده بخشی از مجموعهٔ آموزش است میتوان پیشاپیش ایندکس بردارها را ساخت و بهینه کرد تا بازیابی سریع باشد.
همهٔ این روشها را میتوان نمونههایی از رویکرد بازیابیمحور دید. کاربرد دیگر، k-NN language modeling یا k-NN LM است [Khandelwal et al., 2020]. ایده بر این مشاهده استوار است که حالتهای پنهان مشابه در Transformer اغلب پیشبینیکنندهٔ توکنهای مشابه در موقعیت بعدی هستند. هر آیتم datastore زوج (z,w) است که z حالت پنهان LLM در یک موقعیت و w توکن بعدی متناظر است. datastore معمولاً با جمعآوری بردار خروجی پشتهٔ Transformer و توکن بعدی در تمام موقعیتهای دادهٔ آموزش ساخته میشود.
در استنتاج، با داشتن بازنمایی hi برای پیشوند، k آیتم نزدیک {(z₁,w₁),...,(zk,wk)} بازیابی میشوند و wها بهعنوان توکنهای مرجع برای پیشبینی بهکار میروند. توزیع بازیابیمحور روی واژگان:
Prknn(·|hi) = Softmax([−d₀ ... −d|V|]) (2.67)
که dv فاصلهٔ hi تا zj است اگر wj ورودی vام واژگان باشد، و در غیر این صورت صفر تعریف شده است. سپس توزیع بازیابی با توزیع LLM درونیابی خطی میشود:
Pr(·|hi) = λPrknn(·|hi) + (1−λ)Prlm(·|hi) (2.68)
و توکن بعدی با بیشینهکردن این احتمال انتخاب میشود.
مانند سامانههای بازیابی اطلاعات (IR)، datastore میتواند خود متنها را نیز نگهداری و متن مرتبط با یک query را برگرداند. ترکیب IR با LLM به چارچوب «تولید تقویتشده با بازیابی» (Retrieval-Augmented Generation یا RAG) میرسد. در RAG، زمینهٔ x بهعنوان query استفاده و k قطعهٔ سند مرتبط {c₁,...,ck} بازیابی میشوند.۱۳ نتایج با زمینهٔ اصلی در یک قالب پرامپت g(·) ترکیب میشوند:۱۴
x′ = g(c₁,...,ck,x) (2.69)
سپس مدل با زمینهٔ x′ احتمال Pr(y|x′) را برای متن ادامه میدهد. مزیت RAG این است که معماری LLM لازم نیست تغییر کند؛ فقط ورودی با یک سامانهٔ IR خارجی غنی میشود.
شکل ۲.۷ — نمونههای حافظهٔ خارجی (datastore) برای مدلسازی زبان: الف) توجه تقویتشده با جستوجوی k-NN، ب) مدلسازی زبان k-NN، ج) تولید تقویتشده با بازیابی (RAG).
۲.۳.۳.۳ ظرفیت حافظه
مدل حافظه در LLM، چه KV cache ساده و چه datastore، در معنای گسترده یک رمزگذار اطلاعات زمینهای است. اگر بخواهیم بگوییم حافظه نمایندهٔ کل زمینه در پیشبینی توکن است، باید مطمئن شویم هر بخش زمینه را دقیق بازنمایی میکند. KV cache استاندارد همهٔ تاریخچه را ذخیره میکند و از این نظر ظرفیت کافی برای حفظ زمینه دارد. در بسیاری از کاربردها حفظ کامل لازم نیست؛ هدف آن است که LLM به اطلاعات مهم زمینه دسترسی داشته باشد. به همین دلیل مدلهای حافظهٔ فشرده و کارآمد توسعه یافتهاند. هرچه دنباله بلندتر شود، گرفتن اطلاعات مهم با حافظهٔ کمظرفیت دشوارتر است و در عمل هنگام پردازش زمینهٔ بلند اغلب ظرفیت مدل افزایش داده میشود.
مدل پرظرفیت معمولاً مطلوب است، اما آموزش و استقرار آن دشوارتر است. حالت چالشبرانگیز زمانی است که توکنها بهصورت جریان میرسند و زمینه پیوسته رشد میکند؛ ساخت LLM برای آن دشوار است چون Transformer باید روی دنبالههای بسیار بلند آموزش داده شود. یک راه، روشهای ناپارامتری مانند بازیابی است؛ مثلاً زوجهای key-value قبلی در پایگاه برداری ذخیره و زمینه با این حافظهٔ خارجی بازنمایی شود. هرچند این کار از چالش بازنمایی مستقیم زمینهٔ بلند در Transformer دور میشود، ساخت و بهروزرسانی حافظهٔ خارجی نیز پرهزینه است. چنین مدلهایی بیشتر برای مسائلی مناسباند که زمینه از پیش داده شده و در استنتاج ثابت است و برای جریان زمینهٔ رو به رشد مناسب نیستند.
وقتی اندازهٔ زمینه پیوسته رشد میکند، حافظهٔ ثابتاندازه گزینهای رایج است. مدل بازگشتی میتواند دنبالهای با طول دلخواه را به مجموعهٔ ثابتاندازهای از حالتهای پنهان خلاصه کند و هزینهٔ هر گام ثابت بماند. مدلهای بازگشتی در کاربردهای اولیهٔ یادگیری عمیق برای وابستگیهای دوربرد چندان قوی نبودند، اما پیشرفتهای جدید نشان دادهاند گونههای جدید آنها برای مدلسازی دنبالههای بسیار بلند مؤثرند [Bulatov et al., 2022; Hutchins et al., 2022; Munkhdalai et al., 2024; Ma et al., 2024].
تعریف عمومی واحدی برای ظرفیت حافظه در LLM وجود ندارد. رویکرد ساده میتواند مقدار فضای ذخیرهٔ مصرفشده برای اطلاعات زمینهای باشد؛ مثلاً اندازهٔ KV cache یا پایگاه دادهٔ برداری. مفهوم مرتبط، پیچیدگی مدل است که در یادگیری ماشین به شکلهای مختلف تعریف میشود و یکی از سادهترین معیارها تعداد پارامترها است. بااینحال، حافظههای بحثشده عمدتاً برای ذخیرهٔ اطلاعاتاند، نه افزودن پارامتر قابلآموزش؛ بنابراین ظرفیت حافظهٔ زیاد الزاماً به معنای مدل پیچیدهتر نیست. تعیین ظرفیت مناسب در عمل ساده نیست و باید میان بیشینهکردن عملکرد و کنترل ردپای حافظه توازن برقرار شود.
۲.۳.۴ اشتراکگذاری میان سرها و لایهها
در Transformer، KV cache ساختاری است که میتواند در چند بُعد مانند سرها، لایهها و طول دنباله تنظیم شود. LLM با L لایه را در نظر بگیرید؛ هر لایه τ سر توجه دارد و هر سر خروجی dh-بعدی تولید میکند. در استنتاج، کلید و مقدار تا m توکن ذخیره میشوند و پیچیدگی فضایی کش O(L·τ·dh·m) است. پیشتر دیدیم با ذخیرهٔ کمتر توکن میتوان این پیچیدگی را کم کرد؛ مثلاً sliding-window attention با پنجرهٔ mw پیچیدگی O(L·τ·dh·mw) دارد.
علاوه بر کاهش m، میتوان کش را در ابعاد دیگر هم کوچک کرد. روش پرکاربرد، اشتراکگذاری میان سرها در خودتوجهی چندسری است. خودتوجهی چندسری چند مجموعه query/key/value دارد و هر مجموعه یک head است:
Output = Merge(head₁,...,headτ)Whead (2.70)
headj = Attqkv(q[j]i,K[j]≤i,V[j]≤i) (2.71)
هر سر روی یک زیرفضای ویژگی متفاوت توجه انجام میدهد و KV cache باید کلیدها و مقادیر همهٔ سرها را نگه دارد.
«توجه چندپرسوجویی» (Multi-Query Attention یا MQA) [Shazeer, 2019] کلیدها و مقادیر را بین همهٔ سرها مشترک میکند، در حالی که query هر سر یکتا میماند. یک مجموعهٔ (K≤i,V≤i) و τ query داریم:
headj = Attqkv(q[j]i,K≤i,V≤i) (2.72)
با اشتراکگذاری key/value، اندازهٔ KV cache به O(L·dh·m) کاهش مییابد.
«توجه پرسوجوی گروهی» (Grouped Query Attention یا GQA) گسترشی طبیعی میان MHA و MQA است [Ainslie et al., 2023]. سرها به ng گروه تقسیم میشوند و هر گروه یک مجموعهٔ مشترک key/value دارد. اگر g(j) شناسهٔ گروه سر j باشد:
headj = Attqkv(q[j]i,K[g(j)]≤i,V[g(j)]≤i) (2.73)
اندازهٔ KV cache در GQA برابر O(L·ng·dh·m) است. مزیت GQA این است که با تنظیم ng میان کارایی محاسباتی و توان بیانی مدل توازن برقرار میشود. اگر ng=τ باشد مدل همان توجه چندسری استاندارد است؛ اگر ng=1 باشد به MQA تبدیل میشود. ادامهٔ بحث در بخش بعدی آمده است.
شکل ۲.۸ — سازوکارهای مختلف توجه QKV و اشتراکگذاری: الف) توجه تکسر، ب) توجه چندسر، ج) توجه چندپرسوجویی، د) توجه پرسوجوی گروهی، هـ) توجه چندسر میانلایهای.