پارادایم جدیدی به اسم RL with Verifiable Rewards یا RLVR اومده که reward model های یادگیرنده رو با توابع پاداش صریح (explicit reward functions) جایگزین کرده. این کار هم بهینهتره و هم قابل اتکاتر.
تا چند وقت پیش الگوریتم استاندارد برای این کار PPO بود. PPO خیلی سنگین و پیچیدهست چون برای اجرا به سه تا مدل همزمان نیاز داره: مدل اصلی که داره آموزش میبینه، یه کپی ثابت از همون مدل به عنوان رفرنس، و یه مدل سوم به اسم value model که کارش فقط تخمین زدن امتیاز مورد انتظار بود. این ساختار خیلی منابع مصرف میکرد.
الگوریتمهای جدیدتر مثل Group Relative Policy Optimization یا GRPO این بازی رو عوض کردن. GRPO خیلی هوشمندانه اون value model رو حذف کرده. به جاش، مدل چند بار برای یه پرامپت جواب تولید میکنه، reward function شما بهشون امتیاز میده و بعد با یه سری محاسبات آماری ساده مثل میانگین و انحراف معیار، مشخص میکنه کدوم جوابها «بهتر از میانگین» بودن. این سادگی باعث شده RL به قدری بهینه بشه که حتی روی GPUهای رایگان Colab هم قابل اجرا باشه.
به نظر من، سختترین و خلاقانهترین بخش کار، طراحی reward function هست. اینجا جاییه که هنر مهندسی شما مشخص میشه. چند تا مثال عملی:
برای فرمتبندی: میشه با یه regex ساده چک کرد که خروجی فرمت درستی داره یا نه. اگر داشت امتیاز مثبت، نداشت منفی. حتی میشه برای وجود کلیدهای درست ولی مقادیر غلط، امتیاز نسبی داد.
برای ریاضیات: به جای چک کردن جواب نهایی، میشه امتیاز نسبی یا distance-based scoring داد. یعنی هر چی جواب مدل به جواب واقعی نزدیکتر بود، امتیاز بیشتری بگیره.
برای کدنویسی: سادهترین حالت اینه که چک کنیم کد تولید شده بدون خطا اجرا میشه یا نه. if code_runs: return 1 else: return 0. این یه جایزه قابل تایید و شفافه.
یه نکته کلیدی که خیلیا نادیده میگیرن: هیچوقت یه مدل پایه (base model) رو مستقیما با RL آموزش ندین. این کار به پدیدهای به اسم reward starvation منجر میشه. یعنی مدل پایه اینقدر خروجیهای پرت و بیربط تولید میکنه که تقریباً هیچوقت شانسی هم یه امتیاز مثبت نمیگیره و در نتیجه هیچی برای یادگرفتن وجود نداره. راهحل اینه که قبل از شروع RL، مدل رو با یه SFT سریع روی چند صد مثال باکیفیت «آمادهسازی» (prime) کنین تا فرمت کلی جوابها رو یاد بگیره و خروجیهاش حداقل قابل امتیازدهی باشن.
بحث کوانتیزیشن هم خیلی مهمه. میشه مدلها رو تا ۸ برابر کوچکتر کرد در حالی که فقط ۱٪ افت دقت داشته باشن. کلیدش کوانتیزیشن پویا (dynamic quantization) هست. یعنی به جای اینکه همه لایهها رو یکسان کوانتیزه کنیم، لایههای حساستر مثل attention رو با دقت بالاتر نگه میداریم و بقیه رو فشرده میکنیم. برخلاف تصور قبلی، این فقط outlier ها یا مقادیر خیلی بزرگ نیستن که مهمن؛ گاهی مقادیر خیلی کوچیک در لایههای خاصی هستن که تاثیر حیاتی روی دقت دارن (مراجعه کنید به
مقاله super weights).
در نهایت، سرعت پردازندههای گرافیکی به خاطر محدودیتهای فیزیکی در دقت عددی (مثل FP4) احتمالاً به زودی به سقف خودش میرسه. این یعنی بهینهسازی نرمافزاری و الگوریتمی از همیشه مهمتر میشه. استفاده از torch.compile میتونه سرعت آموزش رو بالا ببره ولی همیشه سرراست نیست و نیاز به تنظیم دقیق داره.
خلاصه اینکه مسیر پیشرفت الان تو سه تا حوزهست: الگوریتمهای بهینهتر مثل GRPO، تکنیکهای کوانتیزیشن دقیق، و بهینهسازیهای نرمافزاری در سطح کرنل.
📃
منبع : ویدیو ۳ ساعته فنی از Daniel Han، یکی از بنیانگذارهای Unsloth🛠 Join
@LLMEngineers Community