פוסט
Distillation: מודל קטן שלומד ממודל גדול
מה זה knowledge distillation, למה ההסתברויות הרכות של מורה מלמדות יותר מהתשובה הנכונה, ואיך עושים distillation ל-LLM בפועל: נתונים מהמורה, סינון, ו-fine-tuning לתלמיד.
מודלים גדולים חכמים ויקרים. מודלים קטנים זולים ומהירים, אבל פחות מוכשרים. Distillation (זיקוק) מנסה לקבל קצת משניהם: מודל מורה גדול מלמד מודל תלמיד קטן לחקות אותו בעבודה מסוימת. הרבה מהמודלים הקטנים והמהירים של היום אומנו בחלקם בדרך הזו.
דוגמת ה-soft targets הורצה עם Python 3.9 והפלט שלה אמיתי. קוד נתוני המורה מבוסס על התיעוד הרשמי של ה-API ולא הורץ. התיאוריה מגיעה מהמאמר Distilling the Knowledge in a Neural Network (Hinton, Vinyals ו-Dean, 2015).
הרעיון
אימון רגיל מלמד מודל מתוויות “קשות”: התמונה הזו היא חתול, נקודה. מורה מאומן יודע יותר מזה. ההסתברויות שלו אומרות שהתמונה כמעט בטוח חתול, קצת דומה לכלב, ובכלל לא דומה למכונית. Hinton והשותפים שלו קוראים למידע הנוסף הזה “ידע אפל” (dark knowledge), והראו שאימון תלמיד על כל התפלגות ההסתברויות של המורה (soft targets) מעביר אותו.
Soft targets ו-temperature
ההסתברויות של המורה הן בדרך כלל חדות מאוד, ולכן המאמר מרכך אותן עם temperature, אותו כפתור מהפוסט על temperature:
import math
def softmax(scores, t):
exps = [math.exp(s / t) for s in scores]
return [e / sum(exps) for e in exps]
# הציונים של המורה עבור: cat, dog, fox, car
teacher_logits = [6.0, 4.0, 3.0, -2.0]
for t in (1, 4):
print(f"T={t}:", [round(p, 3) for p in softmax(teacher_logits, t)])
T=1: [0.844, 0.114, 0.042, 0.0]
T=4: [0.452, 0.274, 0.213, 0.061]
ב-T=1 התשובה היא כמעט רק “חתול”. ב-T=4 התלמיד רואה גם שכלב ושועל קרובים לחתול הרבה יותר ממכונית. מאמנים את התלמיד להתאים להסתברויות המרוככות האלה, בדרך כלל יחד עם התוויות הנכונות.
Distillation של LLM בפועל
Distillation קלאסי צריך את הציונים הגולמיים (logits) של המורה. מ-LLM מתארח מקבלים בדרך כלל רק את הטקסט שלו, ולכן בפועל distillation של LLM הוא הרבה פעמים ברמת הרצף: המורה כותב תשובות, ועושים לתלמיד fine-tuning עליהן. השלבים:
- אוספים קלטים אמיתיים לעבודה: השאלות, המסמכים או הפניות שהמודל הקטן יטפל בהם.
- המורה עונה עליהם, עם ה-prompt הכי טוב שיש לכם, אולי עם effort גבוה וחשיבה.
- מסננים: זורקים תשובות שגויות או באיכות נמוכה, עם בדיקות בקוד או עם מודל מעריך. תשובות גרועות של המורה הופכות להרגלים גרועים של התלמיד.
- עושים fine-tuning לתלמיד על הזוגות שנשארו, בשיטה מהפוסט הקודם (LoRA עובד כאן היטב).
- מעריכים את התלמיד מול המורה על סט בדיקה שהושאר בצד.
יצירת נתוני המורה היא לולאה שכותבת JSONL בפורמט של fine-tuning:
import json
import anthropic
client = anthropic.Anthropic()
SYSTEM = "Classify the ticket. Answer with one label: billing, bug, account or other."
with open("tickets.txt") as f, open("train.jsonl", "w") as out:
for ticket in f:
ticket = ticket.strip()
reply = client.messages.create(
model="claude-opus-5-5",
max_tokens=200,
system=SYSTEM,
messages=[{"role": "user", "content": ticket}],
)
label = reply.content[-1].text.strip().lower()
if label in {"billing", "bug", "account", "other"}: # סינון איכות פשוט
example = {"messages": [{"role": "system", "content": SYSTEM},
{"role": "user", "content": ticket},
{"role": "assistant", "content": label}]}
out.write(json.dumps(example) + "\n")
לאלפי קלטים, שלחו אותם כ-batch: סקירת המודלים מציינת ש-Message Batches עולה 50% פחות מהמחיר הרגיל, והתוצאות מגיעות מאוחר יותר במקום מיד.
לפני שעושים distillation
- בדקו את תנאי השימוש של המורה. ספקי מודלים מגבילים הרבה פעמים שימוש בפלט של מודל כדי לאמן מודלים אחרים, במיוחד מתחרים.
- זקקו עבודה צרה. תלמיד קטן יכול להשתוות למורה גדול במשימה אחת עם פורמט ברור, לא בכל דבר.
- חשבו את העלות. קריאות למורה, סינון ואימון עולים כסף וזמן. זה משתלם כשהתלמיד יטפל בכמות גדולה של בקשות, או חייב לרוץ איפה שהמודל הגדול לא יכול (על מכשיר, בלי אינטרנט, על השרתים שלכם).
- השוו קודם למודל קטן רגיל. מודל קטן עדכני עם prompt טוב לפעמים כבר מספיק טוב.
הפוסט הבא עוסק בהרצת מודלים על המחשב שלכם, שם מגיעים בסוף רוב התלמידים המזוקקים.