पाठ 13 / 27

Distillation: बड़े मॉडल से छोटे को सिखाना

मज़बूत मॉडल से डेटा label करवाएँ जो सस्ते को प्रशिक्षित करे।

आकार नहीं, व्यवहार की नक़ल

Distillation छोटे student को बड़े teacher की नक़ल करना सिखाती है। आम LLM नुस्ख़ा: यथार्थवादी इनपुट जुटाएँ, मज़बूत मॉडल से (जाँचों के साथ) उत्तर बनवाएँ, नमूने की समीक्षा करें, और उन जोड़ियों पर छोटे मॉडल को fine-tune करें। संकरे कार्य पर student कहीं कम लागत और latency पर teacher के पास पहुँच सकता है। सावधानियाँ: student teacher की ग़लतियाँ विरासत में पाता है; आउटपुट से अन्य मॉडल प्रशिक्षित करने पर provider की शर्तें देखें; मानव-सत्यापित test डेटा पर मापें, सिर्फ़ teacher से सहमति पर नहीं; डेटा विविध रखें।

Teacher labels से मदद पाया student, चलाकर

मैंने यह Python, numpy 2.5.3 और scikit-learn 1.9.1 के साथ, निश्चित random seeds पर चलाया। यह छोटे क्लासिकल मॉडल प्रशिक्षित करता है, language model नहीं: तंत्र (gradient descent, learning rate, overfitting, forgetting, low-rank अद्यतन) वही विचार हैं जो LLM के fine-tuning पर लागू होते हैं, पर संख्याएँ LLM के परिणाम नहीं हैं। Linear teacher held-out पर 0.885 पाता है। 300 शोर वाले असली labels पर छोटा tree 0.723 पाता है; 4,700 और बिना-label इनपुट के teacher labels मिलने पर 0.791, यानी सुधरता है पर teacher से नीचे रहता है।

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

rng = np.random.default_rng(6)
X = rng.normal(size=(8000, 12)); w = rng.normal(size=12)
y = (X @ w + rng.normal(size=8000) * 1.2 > 0).astype(int)      # noisy real labels
Xtr, ytr, Xte, yte = X[:300], y[:300], X[5000:], y[5000:]

teacher = LogisticRegression(max_iter=2000).fit(Xtr, ytr)                       # the "big" model trained on the labelled data
Xunl = X[300:5000]                                                               # plenty of UNLABELLED inputs
teacher_labels = teacher.predict(Xunl)

student_alone = DecisionTreeClassifier(max_depth=6, random_state=0).fit(Xtr, ytr)
student_distilled = DecisionTreeClassifier(max_depth=6, random_state=0).fit(np.vstack([Xtr, Xunl]), np.concatenate([ytr, teacher_labels]))
print("teacher                         :", round(teacher.score(Xte, yte), 3))
print("small student, real labels only :", round(student_alone.score(Xte, yte), 3))
print("small student + teacher labels  :", round(student_distilled.score(Xte, yte), 3))

Output:

teacher                         : 0.885
small student, real labels only : 0.723
small student + teacher labels  : 0.791

Teacher आउटपुट का नमूना पढ़ें

प्रशिक्षण से पहले कम से कम कुछ दर्जन teacher उत्तर पढ़ें; हर छोड़ी व्यवस्थित त्रुटि student की आदत बन जाती है।

त्वरित जाँच: Distilled student का मूल्यांकन कैसे होना चाहिए?

  • सिर्फ़ इससे कि वह teacher की कितनी नक़ल करता है
  • मानव-सत्यापित test डेटा पर, सिर्फ़ teacher से सहमति पर नहीं
  • बिल्कुल नहीं
  • सिर्फ़ मॉडल आकार से
Answer

मानव-सत्यापित test डेटा पर, सिर्फ़ teacher से सहमति पर नहीं — Teacher की ग़लतियों से मेल खाना लक्ष्य नहीं; सही होना है।