فاینتیون کردن مدلهای LLM بزرگ (مثل 70B) همیشه دوتا چالش اصلی داره: یا سختافزار سنگین میخواد که نداریم، یا وزنهای مدل بستهس (مثل GPT-4) و دسترسی نداریم. مقالهی Proxy-Tuning یه تکنیک decoding-time معرفی میکنه که بدون دست زدن به وزنهای مدل اصلی، اون رو با استفاده از مدلهای کوچیکتر هدایت کنین.
روش کار خیلی هکری و جالبه: فرض کنید یه مدل Llama2-70B-Base دارید و میخواید بشه Chat. جای اینکه ۷۰ میلیارد پارامتر رو آپدیت کنید، میرید یه مدل Llama2-7B برمیدارید، فاینتیونش میکنید (میشه Expert) و نسخهی خامش رو هم نگه میدارید (میشه Anti-Expert).
توی زمان اینفرنس (Inference Time)، خروجی نهایی اینطوری محاسبه میشه:
Logits_Final = Logits_LargeBase + (Logits_SmallExpert - Logits_SmallAntiExpert)
ایده اصلی اینه که تفاوت بین مدل کوچیکِ تیونشده و تیوننشده، یه "جهت" یا Direction رو توی فضای احتمال توکنها نشون میده. ما این جهت رو برمیداریم و اعمال میکنیم روی مدل بزرگ. نتیجه؟ مدل بزرگِ خام، رفتار مدل تیونشده رو تقلید میکنه ولی دانش و قدرت استدلال خودش رو حفظ میکنه.
نکات فنی و نتایج عملی که از پیادهسازی این روش درمیاد:
عملکرد عجیب روی بنچمارکها: روی Llama2-70B، این روش تونسته ۸۸٪ فاصلهی بین مدل Base و مدلِ واقعیِ Chat (که کلی RLHF شده) رو پُر کنه. توی تسکهای Knowledge-Intensive حتی بهتر از فاینتیون مستقیم عمل کرده، چون فرآیند فاینتیون مستقیم گاهی باعث Catastrophic Forgetting یا از دست رفتن دانش مدل میشه، اما اینجا وزنهای اصلی دستنخورده باقی میمونن.
کاربرد روی مدلهای Black-Box: حتی اگه به وزنها دسترسی ندارید ولی به Logits دسترسی دارید (مثل بعضی APIها)، میتونید از این روش استفاده کنید. توی مقاله روی GPT-3.5 تست زدن (فقط با دسترسی به top-5 logits) و تونستن با یه مدل ۷ میلیاردی، خروجی GPT-3.5 رو برای رخدادهای زمانی جدید (Temporal Adaptation) اصلاح کنن.
به نظر من این تکنیک برای سناریوهای Enterprise که دیتای حساس دارن شاهکاره. شما یه مدل کوچیک ۷ میلیاردی رو روی دیتای خصوصی تیون میکنید (که ارزونه و سریعه) و بعد اون رو به عنوان یه "آداپتور زمان اجرا" میذارید کنار یه مدل غولپیکر جنرال. بدون اینکه دیتای شما وارد پروسه سنگین آموزش مدل بزرگ بشه، استایل و فرمت رو منتقل کردید.
چالش اصلی فقط Latency هست. شما عملاً دارید برای هر توکن، سه تا Forward Pass انجام میدید (یکی مدل بزرگ، دو تا مدل کوچیک). البته چون مدلهای کوچیک خیلی سریعن و میشه موازیشون کرد، سربارش وحشتناک نیست ولی قابل چشمبوشی هم نیست.
این روش یه حقیقت تلخ و شیرین رو هم درباره Alignment برملا میکنه: اینکه بخش بزرگی از چیزی که ما بهش میگیم "RLHF" یا "Instruction Tuning"، صرفاً تغییر استایل و فرمت خروجیه، نه اضافه کردن دانش عمیق. مدل کوچیک استایل رو یاد میگیره و به مدل بزرگ تزریق میکنه.
لینک پیادهسازی و مقاله برای تست:
📃 Paper: Tuning Language Models by Proxy
https://arxiv.org/abs/2401.08565v4
💻 Code Implementation
https://github.com/alisawuffles/proxy-tuning
🛠 Join @LLMEngineers Community
Post #259
1.27K
- ❤ 11
- 🔥 5