هل تحسّن فعلًا
درس 5 من 6
5هل تحسّن فعلًا
الصورة الكبيرةخسارة تحقّق أقل لا تعني نموذجًا أفضل في مهمتك. تحتاج مجموعة تقييم مجمّدة تقيس المهمة نفسها، قبل الضبط وبعده، مع فاصل ثقة يخبرك هل الفرق حقيقي. وتحتاج شيئًا لا تقيسه الخسارة أبدًا: هل نسي النموذج ما كان يجيده قبل الضبط؟
ماذا تشاهد في الرسم: المتوسط يقول تحسّنًا بـ6.5 نقطة، لكن الشريط يقول أكثر: 22 سؤالًا صلحت و9 فسدت. اقرأ التسعة، فإن كانت من نوع واحد فالضبط كسر شيئًا محدّدًا.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
بعد الدورة التدريبية تمتحن الموظف بالامتحان نفسه الذي أخذه قبلها، وإلا لن تعرف هل تحسّن. وتتأكد أنه لم ينسَ ما كان يتقنه من قبل، لأن التركيز الشديد على مهارة جديدة قد يمحو مهارات قديمة دون أن تلاحظ.
مجموعة تقييم ثابتة ونفس المقياس قبل الضبط وبعده، مع مقارنة بخط أساس هندسة الأوامر. النسيان الكارثي catastrophic forgetting لا يظهر في خسارة المهمة، فتقيس أيضًا على مهام عامة، وتفحص عينات يدويًا لأن الرقم وحده قد يخدع.
قبل أن تبدأ
📋بيانات الضبط
عندك ملف اختبار مجمّد كُتب قبل التدريب ولم يتغيّر.
🎲الاحتمال
تعرف أن الرقم المقاس على عيّنة له مدى، وأن الفرق الصغير قد يكون صدفة.
الفكرة الجوهرية
خسارة تحقّق أقل لا تعني نموذجًا أفضل في مهمتك. في هذا الدرس تبني مجموعة اختبار مجمّدة، وتقارن قبل وبعد بفاصل ثقة، وتكشف النسيان، ثم تقرّر: تعتمد أم تتراجع.
1المجموعة المجمّدة
المجموعة المجمّدة أسئلة اختبار كُتبت قبل التدريب، ولم يرها، ولا تتغيّر بين التجارب. بدونها لا تُقارن نسختان.
انظر إلى الرسم: تُكتب المجموعة وتُحفظ في Git قبل التدريب، ولا تُلمس حتى التقييم النهائي.
2قبل وبعد بفاصل ثقة
تشغّل النموذجين على نفس الأسئلة، وتقارن سؤالًا بسؤال. ثم تعيد سحب نفس الأسئلة للنموذجين آلاف المرات، وتأخذ فاصل 95% للفرق.
انظر إلى الرسم: الدقة صعدت من 64.0% إلى 70.5%. السؤال الحقيقي هل الفاصل يستبعد الصفر.
import numpy as np
rng = np.random.default_rng(0)
n = 200
before = rng.random(n) < 0.71 # 1 = correct on the frozen eval set
after = before.copy()
flip_up = rng.choice(np.where(~before)[0], 22, replace=False)
flip_down = rng.choice(np.where(before)[0], 9, replace=False)
after[flip_up], after[flip_down] = True, False
diffs = []
for _ in range(2000): # paired bootstrap: resample the same questions for both
idx = rng.integers(0, n, n)
diffs.append(after[idx].mean() - before[idx].mean())
low, high = np.percentile(diffs, [2.5, 97.5])
print(f"before: {before.mean():.1%} after: {after.mean():.1%}")
print(f"improvement: {after.mean() - before.mean():+.1%}, 95% interval [{low:+.1%}, {high:+.1%}]")
print("questions fixed:", len(flip_up), " questions broken:", len(flip_down))
التحسّن 6.5 نقطة، والفاصل من +1% إلى +12%، أي أنه حقيقي على الأرجح لأن الفاصل لا يشمل الصفر، لكن حجمه غير مؤكّد. والسطر الأخير بنفس الأهمية: 22 سؤالًا صلحت و9 فسدت. اقرأ التسعة: إن كانت كلها من نوع واحد، فالضبط كسر شيئًا محدّدًا تحتاج إصلاحه.
3النسيان الكارثي
الضبط على مهمة ضيّقة قد يُضعف قدرات عامة كان النموذج يجيدها، ولا تراه في خسارة المهمة أبدًا. تكشفه مجموعة صغيرة عامة تشغّلها قبل وبعد.
انظر إلى الرسم: المهارة القديمة انهارت من 0.99 إلى 0.58 مع المهمة الجديدة وحدها، وبقيت 0.96 حين خلطنا أمثلة قديمة.
شبكة تتعلّم مهمة «قديمة»، ثم تُدرَّب على مهمة جديدة. مرة على الجديدة وحدها، ومرة مع خلط بعض الأمثلة القديمة.
import warnings
warnings.filterwarnings("ignore") # small runs stop before sklearn calls them converged
import numpy as np
from sklearn.neural_network import MLPClassifier
rng = np.random.default_rng(0)
def task(kind, n=600):
X = rng.normal(size=(n, 6))
X[:, 5] = 1.0 if kind == "old" else -1.0 # which task the input belongs to
y = (X[:, 0] + X[:, 1] > 0) if kind == "old" else (X[:, 2] - X[:, 3] > 0)
return X, y.astype(int)
old_train, new_train = task("old"), task("new")
old_test, new_test = task("old"), task("new")
def run(replay):
m = MLPClassifier(hidden_layer_sizes=(32,), learning_rate_init=0.01, random_state=0)
for _ in range(60):
m.partial_fit(*old_train, classes=[0, 1])
old_before = m.score(*old_test)
X, y = new_train
if replay: # mix in a quarter as many old examples
X = np.vstack([X, old_train[0][:150]])
y = np.concatenate([y, old_train[1][:150]])
for _ in range(60):
m.partial_fit(X, y)
return old_before, m.score(*old_test), m.score(*new_test)
for name, replay in [("new task only", False), ("new task + old examples", True)]:
before, after, new = run(replay)
print(f"{name:24} old skill {before:.2f} -> {after:.2f} new task {new:.2f}")
بالتدريب على الجديدة وحدها، انهارت المهمة القديمة من 0.99 إلى 0.58، أي قريبًا من التخمين، بينما نجحت الجديدة. بخلط 150 مثالًا قديمًا فقط، بقيت القديمة عند 0.96 والجديدة عند 0.98. نفس الظاهرة تحدث في النماذج اللغوية، وخسارة المهمة الجديدة لا تُظهرها أبدًا. فقط مجموعة القدرات العامة تكشفها.
4متى تتراجع
النموذج الأصلي يبقى خيارًا دائمًا. تتراجع حين لا يتجاوز التحسّن فاصل الثقة، أو يفسد أسئلة مهمّة، أو تنخفض القدرات العامة أكثر مما تقبل.
انظر إلى الرسم: سؤالان يقرّران. الاعتماد يحتاج فاصلًا فوق الصفر ومجموعة عامة صامدة.
واقرأ كل سؤال فسد بعينك. إن كانت كلها من نوع واحد، فالضبط كسر شيئًا محدّدًا تحتاج إصلاحه.
كيف يعمل، خطوة بخطوة: كيف تقارن النموذج قبل الضبط وبعده
تشغّل النموذجين على نفس أسئلة الاختبار المجمّد، وتحفظ صحة كل سؤال.
تعيد سحب نفس الأسئلة للنموذجين آلاف المرات، وتأخذ فاصل 95% للفرق.
تعدّ الأسئلة التي صلحت والتي فسدت، وتقرأ كل سؤال فسد.
تشغّل مجموعة عامة صغيرة قبل وبعد لتكشف النسيان، ثم تقرّر: تعتمد أو تتراجع.
مثال محلول
المجموعة المجمّدة هي ملف الاختبار من درس البيانات: لم يره التدريب، ولم يتغيّر منذ كُتب. نشغّل النموذج الأصلي والمضبوط عليه، ونقارن سؤالًا بسؤال.
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| خسارة تحقّق أقل تعني نموذجًا أفضل في مهمتي. | الخسارة تقيس احتمال الرموز لا صحة الإجابة. المهمة تُقاس بمجموعة اختبار مجمّدة تقيسها هي. |
| درجة النموذج على مجموعة التحقّق تقييم نهائي صادق. | اخترت نقطة التفتيش لأنها الأفضل عليها، فدرجتها هناك متفائلة. التقييم النهائي على الاختبار المجمّد فقط. |
| إن لم تنخفض خسارة المهمة فلم ينسَ النموذج شيئًا. | في المثال انهارت المهارة القديمة من 0.99 إلى 0.58 والمهمة الجديدة ناجحة. النسيان لا يظهر إلا حين تختبره صراحة. |
جرّب بنفسك
لماذا تقارن النموذجين سؤالًا بسؤال لا بالمتوسط فقط؟
22 صلحت و9 فسدت تعطي نفس المتوسط كـ13 صلحت وصفر فسد، لكن الأولى تعني أن الضبط كسر شيئًا تحتاج معرفته.
كيف تكتشف النسيان الكارثي؟
الخسارتان تقيسان المهمة الجديدة فقط. ما نُسي لا يظهر إلا حين تختبره صراحة.
بطاقات مراجعة سريعة
تحقق من فهمك
النموذج المضبوط تحسّن 2% في المهمة، والفاصل من −2% إلى +6%، وانخفض 8% في المجموعة العامة. هل تعتمده؟
لا. التحسّن قد يكون صفرًا أو سالبًا لأن الفاصل يشمل الصفر، والخسارة في القدرات العامة واضحة. تراجع إلى النموذج الأصلي، وجرّب في التشغيل القادم بيانات أنظف أو خلط أمثلة عامة. ضبط لا يثبت نفعه أسوأ من عدم الضبط، لأنه يضيف تكلفة صيانة.
في مثال النسيان، ما الذي حفظ المهارة القديمة، وكم كلّف؟
خلط 150 مثالًا قديمًا مع بيانات المهمة الجديدة. بقيت المهارة القديمة عند 0.96 ونزلت الجديدة من 0.99 إلى 0.98 فقط.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
مقالات1
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.