چیتشیت
RLHF، DPO و تنظیم ترجیحات (Preference Tuning)
RLHF, DPO and Preference Tuning
مدل پاداش بههمراه PPO در مقایسه با DPO و خانوادهی آن. توابع زیان، تنظیمات بتا و KL، حالتهای شکست و راهکارها.
فهرست مطالب
مقایسهی RLHF با DPO
مقایسه| عامل | RLHF (PPO) | DPO |
|---|---|---|
| مدلهای نیازمند آموزش | 3: مدل SFT، پاداش، خطمشی | 1: فقط خطمشی |
| حلقههای آموزش | 3: حلقه SFT، RM، PPO | 2: حلقه SFT، DPO |
| ابَرپارامترها | lr، ضریب KL، نسبت برش (clip ratio)، lr مدل RM، دورهها (epochs) | lr، بتا (beta)، دورهها (epochs) |
| مدل پاداش | آموزش جداگانه | ضمنی در احتمالهای مدل |
| الگوریتم | PPO، پیچیده و ناپایدار | یادگیری نظارتشده، پایدار |
| مدلها در حافظه | 3 تا 4 مدل در طول PPO | 2 مدل: مدل فعلی و مدل مرجع |
| توان محاسباتی | سه حلقه | حدود یکسوم RLHF |
| داده | حلقهی برخط (online) با امتیازدهیهای جدید | مجموعهدادهی ترجیحات ثابت |
چه زمانی از کدام استفاده کنیم؟
نکتهها- DPO: بین 5,000 تا 20,000 جفت ترجیحات، توان محاسباتی محدود، یا آزمایشهای مکرر روی مجموعهداده.
- RLHF: مقیاس بزرگ، پاداشهای چندهدفه، یا حلقهی امتیازدهی برخط و تکرارشونده.
- SimPO: سوگیری طول (length bias) مشهود است؛ همچنین مدل مرجع را حذف میکند.
- KTO: تنها برچسبهای تکی و غیرجفتی «خوب» یا «بد» دارید.
- ORPO: تمایل دارید فرآیند را تکمرحلهای از مدل پایه شروع کنید، بدون چکپوینت SFT.
- BPO: لاگهای DPO کاهش log-prob پاسخ برگزیده را نشان میدهند.
- IPO: شدت ترجیحات بسیار متغیر است و DPO به اشباع میرسد.
پایپلاین RLHF
معمارییک دوره DPO (پروژهی پایانی)
گامبهگام- مدل مرجعدر بلاک
torch.no_grad()، مقادیر log-prob پاسخهای برگزیده و ردشده را یکبار ذخیره کنید. - خطمشیتابع
sequence_log_probمقادیر log-prob توکنهای تکمیل را جمع میکند. توکنهای پرامپت اثری ندارند. - حاشیه (Margin)تفاضل
diff_w - diff_l، یعنی نسبت لگاریتمی برگزیده منهای نسبت لگاریتمی ردشده. - تابع زیان (Loss)محاسبهی
-F.logsigmoid(beta * margin)برای هر سهگانه. - گاماجرای
opt.zero_grad()،loss.backward()وopt.step()روی بهینهساز Adam. - بررسیاگر حاشیه افزایش نیابد یا تابع زیان کاهش پیدا نکند، تابع
run_demoمقدار 1 برمیگرداند.
تابع زیان DPO و فریز مدل مرجع
کدpython
diff_w = logp_w_pol - logp_w_ref # نسبت لگاریتمی برگزیده
diff_l = logp_l_pol - logp_l_ref # نسبت لگاریتمی ردشده
margin = diff_w - diff_l # شکاف پاداش ضمنی تقسیم بر بتا
z = beta * margin
loss = -F.logsigmoid(z) # سیگموئید لگاریتمی منفیِ پایدار
policy.load_state_dict(reference.state_dict()) # شروع از وزنهای برابر
for p in reference.parameters():
p.requires_grad = False # مدل مرجع هرگز تغییر نمیکند
target = 1.0 / (2.0 * beta) if beta > 0 else 0.0
loss = (margin - target) ** 2 # گونهی IPO
مدل پاداش و پاداش KL (ساده)
کدpython
p = sigmoid(r_pos - r_neg) # احتمال پیروزی پاسخ برگزیده در Bradley-Terry
grad_scale = 1 - p
w[t] += lr * grad_scale * c # افزایش توکنهای برگزیده، کاهش توکنهای ردشده
kl_term = kl(probs_new, probs_ref)
reward = rm_score - beta * kl_term # پاداش با جریمهی KL
advs = [(r - mean_r) / sd_r for r in rewards] # مزیتهای نرمالشده
ratio = math.exp(logp - log_pi_old)
clipped = (adv > 0 and ratio > 1 + eps) or (adv < 0 and ratio < 1 - eps)
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| آموزش یک RM مبتنی بر Bradley-Terry | train_rm(n_pairs=500, lr=0.1) |
| حلقهی اسباببازی PPO-RLHF | rlhf_loop(w, updates=300, beta=0.1) |
| TRL PPO با KL انطباقی | PPOConfig(init_kl_coef=0.05, target_kl=6.0) |
| آموزش DPO، درس 10.08 | dpo_train(..., lr=5e-6, beta=0.1) |
| پیمایش پارامتر بتا (Sweep) | betas=[0.01, 0.1, 0.3, 1.0] |
| log-prob پاسخ | sequence_log_prob(policy, prompt, chosen) |
| مقایسهی شش تابع زیان | python3 code/main.py |
| پروژهی پایانی سرتاسری (end-to-end) | sys.exit(run_demo()) |
توابع زیان
مفهومها- تابع زیان RM
- رابطهی $-\log \sigma(R_\phi(x, y_+) - R_\phi(x, y_-))$، تابع لجستیک دوتایی Bradley-Terry.
- پاداش ضمنی
- $r = \beta \log \frac{\pi^*(y \mid x)}{\pi_{\text{ref}}(y \mid x)} + \beta \log Z(x)$ که در آن $Z(x)$ حذف میشود.
- DPO: رابطه $-\log \sigma(\beta (\log \frac{\pi(y_w)}{\pi_{\text{ref}}(y_w)} - \log \frac{\pi(y_l)}{\pi_{\text{ref}}(y_l)}))$
- IPO
- خطای مربعات شکاف نسبت لگاریتمی در برابر $\frac{1}{2\beta}$؛ شکاف کراندار میماند.
- SimPO
- عبارت نرمالشده با طول $\frac{\beta}{|y|} \log \pi(y \mid x)$ بههمراه حاشیهی $\gamma$؛ بدون مدل مرجع.
- علامت گرادیان
- $\partial L / \partial \log \pi_\theta(y_w) = -\beta (1 - \sigma(z))$؛ احتمال برگزیده افزایش مییابد.
پیشفرضها
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
RLHF KL β | 0.01-0.05 | بازهی معمول |
InstructGPT KL β | 0.02 | lr=1.5e-5، تعداد 4 دورهی PPO |
PPO clip ε | 0.2 | نسبت برشخورده به بازهی 1 ± ε |
TRL `init_kl_coef` | 0.05 | با target_kl=6.0 |
DPO β, lesson 10.08 | 0.1 | نقطهی بهینه بین 0.1 تا 0.3 |
DPO lr, lesson 10.08 | 5e-6 | 5 دوره |
Capstone `DPOConfig` beta | 0.2 | lr برابر 1e-3، تعداد 30 دوره |
Capstone `warmup_epochs` | 8 | ابتدا پیشآموزش مدل مرجع |
عیبیابی
عیبیابیپاداش رشد میکند ولی ارزیابی انسانی ثابت است
- علت
- دور زدن پاداش (Reward hacking)
- راهحل
- توقف زودهنگام، افزایش β، غنیتر کردن دادههای RM
پاسخها بیش از حد طولانی میشوند
- علت
- سوءاستفاده از طول (Length hacking)
- راهحل
- پاداش نرمالشده با طول، یا استفاده از SimPO
میانگین KL فراتر از 5 تا 10
- علت
- دریفت خطمشی از SFT
- راهحل
- پارامتر β انطباقی با هدفگذاری روی یک KL ثابت
خطمشی بهسختی تغییر میکند
- علت
- β بیش از حد بالاست
- راهحل
- کاهش β
کاهش log-prob برگزیده در DPO
- علت
- تخریب پاسخ برگزیده
- راهحل
- جریمهی BPO روی پاسخ برگزیده
شکاف DPO منفجر میشود
- علت
- شکاف پاداش ضمنی بیکران است
- راهحل
- IPO، با محدود کردن شکاف به 1/(2 beta)
امتیازهای RM غیرقابلاعتمادند
- علت
- RM کوچکتر از خطمشی است
- راهحل
- اندازهی RM باید دستکم هماندازهی خطمشی باشد
حدود 30٪ برچسبهای نویزی
- علت
- ترجیحات مبهم
- راهحل
- فیلتر دادهها با نرخ توافق، تنظیم دمای BT
پرسشها
پرسش و پاسخ- چرا جفتها، نه امتیازهای مطلق؟
- انسانها دو پاسخ را بهخوبی با هم مقایسه و رتبهبندی میکنند، اما به یک پاسخ منفرد ضعیف امتیاز میدهند.
- چرا عبارت KL لازم است؟
- خطمشی را نزدیک به توزیع دادههایی نگه میدارد که RM روی آنها آموزش دیده است.
- چرا RM آخرین توکن را میخواند؟
- ماسک علّی به آن امکان میدهد کل توالی را مشاهده کند.
- بهازای هر جفت DPO چند گذر رو به جلو نیاز است؟
- چهار گذر: دو مدل ضرب در دو پاسخ.
- آیا الگوریتمهای همترازی مستقیم (DAA) از بیشبهینهسازی در اماناند؟
- خیر؛ آنها در عوض نسبتِ مدل مرجع را بیشبهینهسازی میکنند.