ממודל בסיס לעוזר: SFT, RLHF, DPO ו-GRPO
בקשו ממודל בסיס הייקו והוא יחזור על עצמו. ואז ראו איך reward model לומד להעדיף אורך על פני נכונות.
בעמוד הזה
בקשו מ-GPT-2 — מודל שפה שעבר pretraining ברמה טובה — לכתוב הייקו על הים:
prompt: Write a haiku about the sea.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.הוא לא מבולבל, והוא לא נכשל בתפקידו. הוא עושה בדיוק את מה שפרק 10 אימן אותו לעשות: בהינתן טקסט כלשהו, להפיק טקסט המשך סביר. באינטרנט, שורה כמו Write a haiku about the sea. מגיעה לעיתים קרובות לפני פרוזה על הים, ומשפט שזה עתה הופיע הוא בעל סבירות חריגה להופיע שוב. המודל הוא מנבא next-token מעולה ועוזר חסר תועלת.
עכשיו אותה בקשה למודל שנבנה באותה דרך — Qwen2.5, חצי מיליארד פרמטרים, פי ארבעה מהגודל של GPT-2 שלמעלה ועדיין זעיר בכל קנה מידה של 2026 — אחרי שלבי האימון שעליהם הפרק הזה מדבר:
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.פי ארבעה פרמטרים לא מלמדים מודל להפסיק לדבר. הפער בין שני הפלטים האלה הוא לא קנה מידה, לא ארכיטקטורה ולא נפח נתונים. הוא post-training: שלב שני, קטן בסדרי גודל מ-pretraining, שלוקח מנבא טקסט והופך אותו למשהו שעונה.
שלב ראשון: להראות לו איך נראית תשובה
קישור למקטע: שלב ראשון: להראות לו איך נראית תשובההצעד הראשון הוא הכי פחות זוהר, והוא עושה את רוב העבודה. אוספים דוגמאות של הוראות שמשויכות לתגובות טובות, וממשיכים לאמן עליהן עם אותו loss בדיוק מפרק 8 — לחזות את ה-token הבא — אבל רק על חלק התגובה. זהו supervised fine-tuning, או SFT.
לא מלמדים כאן שום דבר חדש על שפה. מה שמלמדים הוא פורמט: שטקסט בצורה הזאת מגיע לפני טקסט בצורה ההיא, ואז הוא מפסיק. הביטו שוב בכישלון של מודל הבסיס. הוא ענה על השאלה במשפט הראשון ואז לא הצליח לעצור, כי שום דבר באימון שלו מעולם לא סימן סוף של תגובה. עצירה היא התנהגות נלמדת.
זו גם הסיבה שצריך לומר למודל איפה הגבולות, וזה בדיוק מה ש-chat template עושה:
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
What is the capital of France?<|im_end|>
<|im_start|>assistantהסימונים <|im_start|> ו-<|im_end|> הם tokens אמיתיים באוצר המילים, שנוספו לפני fine-tuning, והמודל ראה מיליונים מהם בדיוק במיקומים האלה. כך הוא יודע של מי התור ואיפה תור מסתיים.
דלגו על ה-template ותנו למודל שאלה עירומה, ואתם נותנים לו רצף שהוא לא ראה באימון. נמדד, אותו מודל, אותה שאלה, אותו greedy decoding:
ללא ה-template — המחרוזת הגולמית What is the capital of France?:
The capital of France is Paris.
To verify this, I will use a simple
Python code snippet to confirm that
Paris is indeed the capital city of
France.
[...and then it starts writing a
Python script to check its own answer]עם ה-template:
The capital of France is Paris.התשובה נכונה בשני המקרים, אבל בלי הסימונים המודל נסחף לכתיבת Python כדי לבדוק את עצמו, כי ה-prompt שקיבל לא דומה לשום דבר שעליו עבר fine-tuning. זו הסיבה הנפוצה ביותר ל״המודל נהיה טיפש יותר כשקראתי לו ישירות״: ה-template אינו קישוט סביב המודל, הוא חלק מהמודל, ו-template שגוי הוא ירידה שקטה באיכות בלי שום שגיאה שמצורפת אליה.
שלב שני, והבעיה שהוא נועד לפתור
קישור למקטע: שלב שני, והבעיה שהוא נועד לפתורל-SFT יש תקרה, והתקרה היא הנתונים. כדי לעשות fine-tuning על הדגמה צריך שמישהו יכתוב את התגובה האידיאלית — וברוב השאלות המעניינות, כתיבת תשובה טובה היא קשה, איטית, יקרה, ומייצרת בדיוק תשובה אחת שאי אפשר באמת לאמת את איכותה.
מה שבני אדם טובים בו הוא השוואה. כשמציגים למתייג שתי תגובות, הוא יכול לומר בצורה אמינה איזו טובה יותר בתוך כמה שניות, בלי להיות מסוגל לייצר אף אחת מהן. זו העובדה שעליה בנוי כל השלב השני, וזה החלק שרוב ההסברים מציגים הפוך:
בני אדם לא כותבים את התשובות. הם מדרגים זוגות.
אז הנתונים הם זוגות — prompt, שתי תגובות, ואיזו מהן ניצחה. אי אפשר לחבר את זה ל-next-token loss, כי אין רצף יעד. צריך מכונה אחרת.
ה-reward model, ומה הוא באמת לומד
קישור למקטע: ה-reward model, ומה הוא באמת לומדאי אפשר לבקש מבן אדם לדרג כל תגובה במהלך האימון — אלה מיליוני שיפוטים. לכן מאמנים מודל לחקות את בני האדם: reward model שלוקח תגובה ומחזיר סקלר.
אימון שלו מהשוואות משתמש בתוצאה מ-1952. מודל Bradley–Terry2 אומר שאם לשני פריטים יש חוזקות סמויות, ההסתברות שאחד ינצח את השני היא הפונקציה הלוגיסטית של ההפרש ביניהן. הופכים את זה, וזה נהיה loss: בהינתן שבן אדם העדיף את על פני , ממקסמים
שבקוד הוא כל לולאת האימון:
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean() שימו לב למה שהמודל אף פעם לא רואה: ציון מוחלט. הוא לומד רק הפרשים, וזה בדיוק מה שהנתונים מכילים.
עכשיו החלק ששווה למדוד. reward model לומד את מה שהמתייגים תגמלו, ומתייגים הם אנשים. הנה סימולציה שבה האיכות האמיתית של תגובה תלויה רק בכך שהיא שימושית ונכונה — אורך לא שווה כלום — אבל למתייג המדומה יש העדפה קלה לתשובות ארוכות יותר כשכל היתר קרוב, הטיה אנושית מתועדת היטב. מאמנים את ה-reward model על 2,000 השוואות וקוראים את המשקלים שלו:
| הטיית האורך של המתייג | משקל שנלמד על שימושיות | על נכונות | על אורך |
|---|---|---|---|
| 0.0 | +1.00 | +1.00 | +0.01 |
| 0.3 | +0.98 | +1.00 | +0.15 |
| 0.6 | +0.97 | +1.00 | +0.27 |
| 1.2 | +1.00 | +0.99 | +0.59 |
ה-reward model עובד באופן מושלם. הוא למד בנאמנות את ההעדפות שהוצגו לו — כולל החלק בהעדפות האלה שאין לו שום קשר לאיכות. reward model אינו מדד לטוב; הוא מדד למה שהמתייגים בחרו, וכל הטיה במאגר התיוג היא עכשיו מקדם בפונקציה גזירה שמודל גדול בהרבה עומד לבצע מולה אופטימיזציה.
Reward hacking, נמדד
קישור למקטע: Reward hacking, נמדדמה שמביא אותנו למה שקורה כשמבצעים אופטימיזציה מולו. תנו ל-policy תקציב מאמץ קבוע לחלק בין תכונות התגובה, עם אסימטריה מציאותית: להיות שימושי ולהיות נכון הם יקרים, ולהיות ארוך יותר הוא זול — פשוט ממשיכים לכתוב.
Reward ליחידת מאמץ, עבור המודל שאומן למעלה: שימושיות 8.26, נכונות 8.31, אורך 31.70. אורך משתלם כמעט פי ארבעה מנכונות, לא כי ה-reward model מקולקל, אלא כי הוא זול.
בצעו אופטימיזציה מול ה-reward הזה וצפו בשני המספרים:
| הציון של ה-reward model | איכות אמיתית | אורך שהופק | |
|---|---|---|---|
| policy התחלתי | 12.588 | 0.974 | 3.365 |
| אחרי אופטימיזציה | 31.696 | 0.000 | 12.497 |
ה-reward עלה פי 2.5. הדבר שה-reward היה אמור למדוד ירד ל-אפס. ה-policy גילה שהוא יכול לקבל ציון עצום על ידי כתיבה ארוכה בלי לומר כלום, ולאף חלק בלולאת האימון לא הייתה דרך לשים לב, כי ה-reward model הוא ההגדרה של טוב בתוך הלולאה.
זהו reward hacking, ואם אי פעם תהיתם למה מודלי צ'אט כל כך מילוליים, הטבלה הזאת היא חלק גדול מהתשובה.
מה באמת קונים עם קנס KL
קישור למקטע: מה באמת קונים עם קנס KLההגנה הסטנדרטית היא להעניש את ה-policy על התרחקות גדולה מדי מנקודת ההתחלה שלו, כאשר מודדים מרחק באמצעות סטיית KL מפרק 4:
הרפרנס הוא מודל ה-SFT — ה-policy לפני שלב ה-reinforcement. הטענה היא שזה מונע מהמודל לנדוד להתנהגות מנוונת. בואו נראה כמה מהטענה הזאת שורד מדידה. אותו setup, סריקה על פני :
| reward | איכות אמיתית | אורך | KL | |
|---|---|---|---|---|
| 0 | 31.699 | 0.000 | 12.498 | 2.994 |
| 1 | 31.697 | 0.000 | 12.497 | 2.993 |
| 5 | 28.318 | 0.285 | 10.700 | 2.163 |
| 15 | 12.860 | 1.542 | 2.552 | 0.151 |
| 30 | 10.426 | 1.719 | 1.303 | 0.025 |
| 60 | 9.632 | 1.769 | 0.908 | 0.005 |
| מודל הרפרנס לבדו | 9.162 | 1.791 | 0.687 | 0 |
קראו את השורה האחרונה מול כל השאר. ב- וב- הקנס לא עושה כלום: ה-reward שווה כל כך הרבה יותר מה-KL שה-optimiser משלם את הקנס ומבצע hacking בכל זאת. בין 5 ל-15 ההתנהגות מתנדנדת. וב-, האיכות האמיתית טיפסה חזרה ל-1.769 — שזה עדיין נמוך מ-1.791 שהיה למודל הרפרנס לפני שכל זה התחיל.
הסתייגות אחת לפני שמצטטים את המספר הזה איפשהו: ה-1.791 בשורה האחרונה וה-0.974 שהטבלה הראשונה נותנת ל-policy ההתחלתי הם שתי מדידות שונות של אותו מודל pre-RL, שנלקחו בנפרד בשני הניסויים. השוו שורות בתוך טבלה, לעולם לא ביניהן — המסקנה של כל טבלה עומדת על השורות שלה, ואף אחת מהן אינה תלויה ב-baseline של השנייה.
אז הסיכום הכנה אינו ״קנס KL מונע reward hacking״. הוא:
קנס KL לא מונע reward hacking. הוא מגביל עד כמה ה-policy יכול לזוז מהרפרנס — ומכיוון שהכשל דורש תזוזה, זה עוזר. אבל זו רצועה, לא תיקון: ב- נמוך הרצועה נקרעת, וב- גבוה מקבלים בחזרה את מודל הרפרנס וכל השלב היקר לא קנה דבר.
הרצועה השימושית צרה, המיקום שלה תלוי ב-reward model, ואין דרך למצוא אותה אלא להסתכל. זו הסיבה שמודל הרפרנס חייב להיות טוב — ה-KL הוא רצפה באיכות של הרפרנס, לא תקרה על הכשל — וזה חלק גדול מהסיבה שהשלב הזה קשה בפועל ולא בעיקרון.
PPO, ולמה DPO אכל אותו
קישור למקטע: PPO, ולמה DPO אכל אותוהאלגוריתם שגרם לזה לעבוד בקנה מידה הוא Proximal Policy Optimization.3 בפסקה אחת: הוא מעריך את ה-advantage של כל תגובה, מעדכן את ה-policy כדי להגדיל את ההסתברות של תגובות מעל ה-baseline, וגוזם את הגודל של כל עדכון יחיד כדי שאומדן advantage גדול לא יהרוס את ה-policy בצעד אחד. כשהוא מיושם על מודלי שפה4, המשמעות היא להחזיק ארבעה מודלים במשחק בו-זמנית — ה-policy, הרפרנס, ה-reward model ו-critic — כאשר ה-policy מייצר דגימות חדשות לאורך האימון.
זה עובד, זה יצר את InstructGPT ואת כל מה שנגזר ממנו, וזה באמת קשה: ארבעה מודלים בזיכרון, דגימה בתוך לולאת האימון, ומוניטין של חוסר יציבות שהורווח ביושר. להעמיד פנים שאפשר לממש את זה בפוסט בבלוג יהיה לא ישר, ולכן הפרק הזה לא עושה זאת.
מה שהחליף אותו לרוב המטרות הגיע מהבחנה אחת. לאובייקטיב עם רגולריזציית KL שלמעלה יש policy אופטימלי בצורה סגורה, ואפשר להפוך את הביטוי הזה: את ה-reward אפשר לכתוב במונחי ה-policy האופטימלי והרפרנס. הצבה של זה בחזרה בתוך ה-Bradley–Terry loss גורמת ל-reward model להיעלם לגמרי. מה שנשאר הוא supervised loss על זוגות העדפה — בלי דגימה, בלי critic, בלי reward model, שני מודלים בזיכרון במקום ארבעה.
זהו Direct Preference Optimization,5 והוא שתי שורות:
def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
"""pi_* and ref_* are summed log-probabilities of a full response."""
logits = beta * ((pi_w - ref_w) - (pi_l - ref_l))
return -F.logsigmoid(logits) קראו מה הוא אומר. הכמות שנדחפת למעלה היא עד כמה יותר ה-policy מעדיף את המנצח לעומת הרפרנס, פחות עד כמה יותר הוא מעדיף את המפסיד. הרפרנס אינו קנס שמוברג אחר כך — הוא בתוך ה-loss, ולכן DPO לא צריך איבר KL נפרד.
התכונה החשובה ביותר נמצאת ב-gradient. חשבו את ה-loss ואת ה-gradient שלו על אותו זוג בחמישה מצבים שונים של ה-policy:
| מצב ה-policy | loss | גודל gradient |
|---|---|---|
| כבר מעדיף חזק את המנצח | 0.5130 | 0.0401 |
| כבר מעדיף אותו, חלש | 0.6685 | 0.0488 |
| זהה לרפרנס | 0.6931 | 0.0500 |
| מעדיף את המפסיד | 0.7981 | 0.0550 |
| מעדיף חזק את המפסיד | 1.0055 | 0.0634 |
ה-gradient גדל ככל שה-policy טועה יותר. זוגות שהמודל כבר מטפל בהם תורמים כמעט כלום; זוגות שבהם הוא הפוך שולטים בעדכון. DPO משקלל כל דוגמה לפי כמה ה-policy טועה כרגע, אוטומטית, בלי תזמון — והמנגנון הזה של שקלול עצמי הוא מה שעושה את העבודה שה-advantage estimate וה-critic של PPO עשו. (ה-loss בשורה השלישית הוא בדיוק , שהוא העוגן לבדיקת כל מימוש: policy שזהה לרפרנס שלו לא למד כלום ואמור לשבת על .)
GRPO6 בוחר דרך אחרת החוצה מאותה בעיה. הוא שומר על לולאת הדגימה אבל מוחק את ה-critic: במקום לאמן מודל לחזות את ה-baseline, הוא דוגם קבוצה של תגובות לאותו prompt ומשתמש בממוצע ה-reward של הקבוצה כ-baseline ישירות. ה-advantage של תגובה הוא עד כמה היא הייתה טובה יותר מהאחיות שלה. זה מחליף מודל שלם ב-batch גדול יותר, וזה מה שהפך אימון עם rewards ניתנים לאימות — הנושא של פרק 12 — למעשי.
הצגת פרטים
עוד שלושה חלקים בנוף ה-post-training, בקצרה.
RLAIF ו-Constitutional AI.7 המתייג לא חייב להיות אנושי. תנו למודל סט כתוב של עקרונות ובקשו ממנו לבקר ולתקן את הפלטים שלו, או לבחור בין שני מועמדים, וקיבלתם dataset העדפות שמיוצר במהירות ובעלות של מכונה. ההתנגדות הברורה — המודל בודק את שיעורי הבית של עצמו — אמיתית, והתשובה הכנה היא שזה עובד טוב יותר מכפי שזה נשמע כי שיפוט קל יותר מיצירה, וזו אותה אסימטריה שעליה נשען כל הפרק.
LIMA, וכמה מעט נתונים זה דורש.8 אלף הדגמות שנבחרו בקפידה יצרו assistant תחרותי. ההסבר המוצע הוא ש-pretraining כבר התקין את הידע ואת הפורמט, ו-post-training צריך רק לבחור אילו מההתנהגויות הקיימות של המודל להציף. אם זה נכון, איכות נתוני post-training גוברת על כמות — וההתנהגות של התחום מאז מרמזת שאנשים מאמינים בזה.
LoRA ו-QLoRA.910 Fine-tuning של כל משקל במודל גדול דורש זיכרון עבור המשקלים, ה-gradients שלהם ומצב ה-optimiser — שישה-עשר הבתים לפרמטר מפרק 10, מעל שני הממוצעים שפרק 6 בנה ביד — בקנה מידה שדורש cluster. LoRA מקפיא את המשקלים המקוריים ומאמן לצידם זוג מטריצות בדרגה נמוכה, מה שמקטין את מספר הפרמטרים הניתנים לאימון בסדרי גודל; QLoRA בנוסף מכמת את הבסיס הקפוא ל-4 ביטים. שניהם מכוסים כאן כטכניקה. האם fine-tuning הוא בכלל הדבר הנכון להוציא עליו כסף זו שאלה אחרת, והיא של פרק 20.
מס ה-alignment, והשאלה שאף אחד לא ענה עליה
קישור למקטע: מס ה-alignment, והשאלה שאף אחד לא ענה עליהשני דברים לקחת הלאה.
הראשון הוא שלשלב הזה יש עלות, והיא מופיעה כיכולת. מודלים לעיתים קרובות נעשים גרועים יותר בצורה מדידה בכמה משימות benchmark אחרי alignment training — מס ה-alignment — כי האובייקטיב השתנה: תגובה בטוחה, מסויגת ומעוצבת היטב אינה תמיד התגובה שממקסמת דיוק. חלק מהפער הזה צומצם בהנדסה, וחלק ממנו הוא פשרה אמיתית ולא באג שצריך לתקן.
השני הוא השאלה שהמילה aligned מסתירה. מיושר עם מי? השרשרת היא: חברה כותבת הנחיות, קבלנים מפרשים אותן, ההשוואות שלהם מאמנות reward model, ה-reward model מעצב policy, וה-policy עונה לשאלה של מישהו שלא ראה שום דבר מזה. כל חוליה היא בחירה של אנשים ספציפיים, ולאף אחד מהאלגוריתמים בפרק הזה אין דעה בשאלה אם הבחירות האלה טובות.
זו לא מליצה רטורית. זו הסיבה הקונקרטית לכך ששני מודלי frontier מסרבים לבקשות שונות, לכך שאותו מודל משנה את דעתו בין גרסאות, ולכך ש-״aligned״ הוא תיאור של תהליך ולא תכונה של ארטיפקט. המתמטיקה בפרק הזה סגורה. החלק הזה לא.
לאן זה הולך מכאן
קישור למקטע: לאן זה הולך מכאןPost-training לימד את המודל לענות. הוא לא לימד אותו לחשוב לפני שהוא עונה, והשניים שונים באופן שמתברר כניתן לאימון.
פרק 12 עוסק במה שקורה כשנותנים למודל להשקיע יותר חישוב בשאלה קשה בזמן התשובה במקום בזמן האימון — chain of thought, reinforcement learning מ-rewards ניתנים לאימות, והסיבה שמודל שמראה את העבודה שלו לא רק מסביר את עצמו אלא מחשב אחרת. הוא גם פורע את החוב מהפרק הזה: GRPO נמצא בו, עושה את העבודה שה-critic של PPO היה עושה בעבר, על rewards שלא צריכים מתייג בכלל כי הוכחה או נבדקת או שלא.
מקורות ושיטה
קישור למקטע: מקורות ושיטההדורות שלמעלה מגיעים מ-gpt2 ומ-Qwen/Qwen2.5-0.5B-Instruct עם greedy decoding, כך שהם משתחזרים בדיוק. פרק 11 של Hugging Face LLM Course עובר על SFT ו-DPO עם trl ו-peft אם תרצו להריץ את הדבר האמיתי ולא את הסימולציה; פרק 7 בספרו של Sebastian Raschka, Build a Large Language Model (From Scratch), מממש instruction fine-tuning מקצה לקצה בלי ספרייה.
הפניות
קישור למקטע: הפניות-
Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). ההאצלה מכוונת: תיבת אוצר המילים שלמעלה היא תת-הקבוצה השימושית הקטנה ביותר, והנושא האמיתי הוא ספר. ↩
-
Bradley, R. A. and Terry, M. E. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika 39(3/4), pp. 324–345 (1952). מודל ההשוואות הזוגיות שמתחת לכל reward model שנמצא בשימוש כיום. ↩
-
Schulman, J., Wolski, F., Dhariwal, P., Radford, A. and Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017). ↩
-
Ouyang, L. et al. Training language models to follow instructions with human feedback. arXiv:2203.02155 (2022). InstructGPT — המאמר שהפך את המתכון התלת-שלבי לסטנדרט. קדם לו Christiano et al. (arXiv:1706.03741), שהציג למידה של reward model מהשוואות אנושיות, ו-Stiennon et al. (arXiv:2009.01325), שיישם אותה על סיכום. ↩
-
Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. and Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). הגזירה שמסירה את ה-reward model נמצאת בסעיף 4 ושווה קריאה מלאה; היא קצרה מהמוניטין שלה. ↩
-
Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). מציג את GRPO בסעיף 4.1. ↩
-
Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022). ↩
-
Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023). ↩
-
Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021). ↩
-
Dettmers, T., Pagnoni, A., Holtzman, A. and Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023). ↩