گرادیان سیاست، ریشهٔ PPO و GRPO
خلاصهٔ کاملتر
نویسنده تو این پست، policy gradient (یعنی گرادیان پاداش موردانتظار نسبت به پارامترهای خود مدل) رو از صفر برای یه مدل زبانی درمیاره و همهچیزو با یه پرامپت ساده دنبال میکنه: «۱۷ × ۲۴ چنده؟». به گفتهٔ نویسنده، PPO و GRPO و DAPO همگی شاخوبرگ همین یه ایدهان.
تو زبون RL، مدل یه policy حساب میشه: هر قدم به چیزی که تا حالا نوشته نگاه میکنه و یه توزیع روی توکن بعدی میده. جواب که تموم شد، یه reward function بهش نمره میده؛ برای مسائل ریاضی و کدنویسی معمولاً یه verifier هست که جواب درست رو ۱ و غلط رو ۰ میده (به این حالت میگن RLVR). هدف اینه پارامترها طوری تنظیم بشن که میانگین این پاداش بالا بره.
مشکل اینجاست که این میانگین روی همهٔ جوابهای ممکنه، و با واژگان حدود ۱۵۰ هزارتایی حتی یه جواب ۱۰۰ توکنی بیشتر از ۱۰ به توان ۵۰۰ حالت داره. نمونهبرداری مقدارشو تخمین میزنه ولی مشتقپذیر نیست، چون توکنها گسستهان و داور هم چیزی نیست که بشه ازش backprop گرفت. راهحل یه اتحاد یهخطیه به اسم log-derivative trick که گرادیان رو میبره داخل میانگین.
چیزی که بیرون میاد تخمینزن REINFORCE هست: N تا جواب نمونه بگیر، هر کدوم رو نمره بده و میانگین «score ضربدر پاداش» رو حساب کن (score همون جهتیه که احتمال اون جواب رو بیشتر میکنه). نکتهٔ اصلی پست همینجاست: این عبارت دقیقاً گرادیان R log p هست، یعنی policy gradient چیزی نیست جز فاینتیون نظارتشده روی نمونههای خود مدل، که با پاداش وزن خورده.
score یه خاصیت مهم داره: وقتی نمونه از همون توزیعی بیاد که ازش مشتق میگیریم، میانگینش دقیقاً صفره. برای همین میشه هر baseline ثابتی رو از پاداش کم کرد بدون اینکه گرادیان موردانتظار عوض شه، ولی واریانس حسابی پایین بیاد. GRPO همین کارو میکنه: برای هر پرامپت G تا جواب میگیره و میانگین پاداش همون گروه رو baseline میذاره. حاصلش تو چند خط PyTorch جا میشه:
def reinforce_loss(logprobs, rewards, mask, group_size):
r = rewards.view(-1, group_size)
advantages = (r - r.mean(dim=1, keepdim=True)).view(-1)
seq_logprobs = (logprobs * mask).sum(dim=1)
return -(advantages * seq_logprobs).mean()نویسنده آخر سر یادآوری میکنه که هر دو اتحاد این پست فرض میکنن نمونهها از همون مدلی اومدن که داریم ازش مشتق میگیریم. تو عمل این فرض تقریباً هیچوقت دقیق برقرار نیست: جوابها رو یه موتور inference جدا مثل vLLM یا SGLang تولید میکنه که ممکنه دقت عددی متفاوتی داشته باشه یا هنوز وزنهای چند آپدیت قبل رو سرو کنه. به گفتهٔ نویسنده، دردسر از همین شکاف شروع میشه.
نکات کلیدی:
- REINFORCE، PPO، GRPO و DAPO همه شکلهای گستردهشدهٔ یه تخمینزن واحدن
- log-derivative trick اجازه میده گرادیان یه میانگین مشتقناپذیر رو با نمونهبرداری تخمین بزنیم
- با پاداش ۱/۰، policy gradient عملاً SFT روی جوابهای درست خود مدله و جوابهای غلط مستقیم سرکوب نمیشن
- کم کردن baseline از پاداش هیچ بایاسی اضافه نمیکنه ولی واریانس رو خیلی کم میکنه
- GRPO بهجای آموزش یه شبکهٔ critic، میانگین پاداش یه گروه G تایی رو baseline میذاره
- فرض on-policy تو عمل نقض میشه، چون موتور inference و موتور آموزش دقیقاً یه توزیع نمیدن




