الفصل 3: النسيان الكارثي
الحفاظ على المعرفة أثناء الضبط الدقيق
النسيان الكارثي هو أحد أكبر التحديات في الضبط الدقيق. فهمه يساعدك في تصميم استراتيجيات تدريب أفضل.
ما هو النسيان الكارثي؟
يحدث النسيان الكارثي عندما يفقد الشبكة العصبية المعرفة المكتسبة سابقًا بعد تدريبها على بيانات جديدة.
سيناريو المثال
نموذج LLM مدرب مسبقًا يعرف:
- كيفية ترجمة اللغات
- المعرفة العامة بالعالم
- التفكير الرياضي
- توليد الشيفرات
بعد الضبط الدقيق على بيانات دعم العملاء:
- ✅ ممتاز في دعم العملاء
- ❌ قد يواجه صعوبة في الترجمة
- ❌ قد يفقد بعض المعرفة العامة
- ❌ قد ينخفض جودة توليد الشيفرات
لماذا يحدث ذلك؟
تداخل الأوزان
تخزن الشبكات العصبية المعرفة في أوزانها. عندما تقوم بالتدريب على بيانات جديدة:
الأوزان الأصلية (W) → تشفر المعرفة العامة
التدريب الجديد → يحدث تحديث لـ W إلى (W')
W' يتحسن للمهمة الجديدة → قد يكسر تمثيلات المهام القديمة
تغير التوزيع
يتكيف النموذج مع توزيع بياناتك الخاصة، مما قد يفقد التعميم.
قياس النسيان الكارثي
التقييم قبل/بعد
from lm_eval import evaluator
from lm_eval.models.huggingface import HFLM
def evaluate_model(model_path, tasks=["hellaswag", "arc_easy", "mmlu"]):
"""Evaluate model on standard benchmarks."""
model = HFLM(pretrained=model_path)
results = evaluator.simple_evaluate(
model=model,
tasks=tasks,
num_fewshot=0,
)
return results
# قبل الضبط الدقيق
baseline_results = evaluate_model("meta-llama/Llama-3.1-8B")
print("Baseline:", baseline_results)
# بعد الضبط الدقيق
finetuned_results = evaluate_model("./my-finetuned-model")
print("Fine-tuned:", finetuned_results)
# المقارنة
for task in ["hellaswag", "arc_easy", "mmlu"]:
baseline = baseline_results["results"][task]["acc"]
finetuned = finetuned_results["results"][task]["acc"]
diff = finetuned - baseline
print(f"{task}: {diff:+.2%} ({'↑' if diff > 0 else '↓'})")
اختبار خاص بالمهمة
# إنشاء مجموعة اختبار للقدرات التي تريد الحفاظ عليها
test_cases = [
{"prompt": "Translate to French: Hello, how are you?",
"expected_contains": "Bonjour"},
{"prompt": "What is 15 * 17?",
"expected_contains": "255"},
{"prompt": "Write a Python function to reverse a string",
"expected_contains": "def"},
]
def test_capabilities(model, tokenizer, test_cases):
"""Test if model retains specific capabilities."""
for test in test_cases:
output = model.generate(
tokenizer.encode(test["prompt"], return_tensors="pt"),
max_new_tokens=100
)
response = tokenizer.decode(output[0], skip_special_tokens=True)
passed = test["expected_contains"] in response
print(f"{'✅' if passed else '❌'} {test['prompt'][:50]}...")
استراتيجيات التخفيف
1. استخدام معدلات تعلم أقل
# الضبط الدقيق الكامل: معدل تعلم أقل يحافظ على المزيد من المعرفة
training_args = TrainingArguments(
learning_rate=1e-5, # أقل من الافتراضي
# مقابل 2e-5 أو أعلى لـ PEFT
)
2. عدد أقل من العصور التدريبية
# تدريب أقل = نسيان أقل
training_args = TrainingArguments(
num_train_epochs=1, # ابدأ بـ 1
# مراقبة أداء التحقق
# زيادة فقط إذا كان هناك نقص في التكيف
)
3. تقنيات التنظيم
اضمحلال الأوزان
training_args = TrainingArguments(
weight_decay=0.01, # معاقبة التغييرات الكبيرة في الأوزان
)
توطيد الأوزان المرنة (EWC)
# EWC يضيف عقوبة لتغيير الأوزان المهمة
# (تقنية بحثية، ليست مباشرة في HF Trainer)
loss = cross_entropy_loss + lambda * sum(
importance[i] * (theta[i] - theta_star[i])^2
for i in parameters
)
4. خلط البيانات / إعادة التشغيل
# خلط بيانات أسلوب التدريب المسبق الأصلية مع بيانات الضبط الدقيق
from datasets import concatenate_datasets
# بياناتك الخاصة
finetuning_data = load_dataset("your/dataset")
# بيانات التعليمات العامة للحفاظ على القدرات
general_data = load_dataset("databricks/dolly-15k", split="train[:1000]")
# خلطها (مثلاً، 80% خاصة، 20% عامة)
mixed_dataset = concatenate_datasets([
finetuning_data,
general_data.shuffle().select(range(len(finetuning_data) // 4))
])
5. استخدام PEFT بدلاً من ذلك
التخفيف الأكثر فعالية: لا تقم بتحديث جميع الأوزان
from peft import LoraConfig, get_peft_model
# تحديث محولات صغيرة فقط، مع الحفاظ على النموذج الأساسي
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
)
model = get_peft_model(base_model, lora_config)
# أوزان النموذج الأساسي مجمدة → لا نسيان كارثي!
ميزة PEFT
لماذا يمنع PEFT النسيان
الأدلة التجريبية
| الطريقة | أداء المهمة | الاحتفاظ بالمعايير |
|---|---|---|
| الضبط الكامل | 95% | 70-85% |
| LoRA | 93% | 95-99% |
| QLoRA | 92% | 95-99% |
عادةً ما تحتفظ طرق PEFT بأداء 95%+ من الأداء الأساسي في المهام غير ذات الصلة.
استراتيجية التقييم
بروتوكول تقييم شامل
def comprehensive_evaluation(model_path, baseline_path):
"""Evaluate both task performance and capability retention."""
# 1. تقييم خاص بالمهمة (هدف الضبط الدقيق الخاص بك)
task_score = evaluate_on_task(model_path, your_test_set)
# 2. معايير القدرة العامة
benchmarks = ["hellaswag", "arc_easy", "mmlu", "gsm8k"]
baseline_scores = {}
finetuned_scores = {}
for bench in benchmarks:
baseline_scores[bench] = evaluate_benchmark(baseline_path, bench)
finetuned_scores[bench] = evaluate_benchmark(model_path, bench)
# 3. حساب الاحتفاظ
retention = {}
for bench in benchmarks:
retention[bench] = finetuned_scores[bench] / baseline_scores[bench]
avg_retention = sum(retention.values()) / len(retention)
print(f"Task Performance: {task_score:.2%}")
print(f"Average Capability Retention: {avg_retention:.2%}")
# 4. تحليل التوازن
if task_score > 0.90 and avg_retention > 0.95:
print("✅ توازن جيد محقق")
elif task_score > 0.90 and avg_retention < 0.90:
print("⚠️ أداء مهمة عالي ولكن نسيان كبير")
else:
print("❌ النظر في تعديل التدريب")
return {
"task_score": task_score,
"retention": retention,
"avg_retention": avg_retention
}
ملخص أفضل الممارسات
لتقليل النسيان الكارثي:
| الاستراتيجية | الصعوبة | الفعالية |
|---|---|---|
| استخدام PEFT (LoRA/QLoRA) | سهل | ⭐⭐⭐⭐⭐ |
| معدل تعلم أقل | سهل | ⭐⭐⭐ |
| عدد أقل من العصور | سهل | ⭐⭐⭐ |
| خلط البيانات | متوسط | ⭐⭐⭐⭐ |
| اضمحلال الأوزان | سهل | ⭐⭐ |
| التوقف المبكر | سهل | ⭐⭐⭐ |
النهج الموصى به
- ابدأ مع PEFT (LoRA أو QLoRA)
- إذا كان PEFT غير كافٍ، جرب الضبط الدقيق الكامل مع:
- معدل تعلم منخفض (1e-5)
- عدد محدود من العصور (1-2)
- خلط البيانات
- تقييم شامل
النقاط الرئيسية
✅ النسيان الكارثي هو عندما تفقد النماذج المعرفة بعد الضبط الدقيق
✅ يحدث ذلك لأن الأوزان تعدل لتناسب توزيع البيانات الجديد
✅ طرق PEFT تتجنب النسيان بشكل كبير عن طريق إبقاء الأوزان الأساسية مجمدة
✅ للضبط الدقيق الكامل: استخدم معدل تعلم منخفض، عدد قليل من العصور، خلط البيانات
✅ قم دائمًا بتقييم كل من أداء المهمة واحتفاظ القدرة
✅ التوازن هو: التخصص في المهمة مقابل القدرة العامة
الخطوات التالية
اختبر معرفتك مع اختبار الوحدة 2، ثم تابع إلى الوحدة 3: الضبط الدقيق الفعال من حيث المعلمات.
تحقق سريع
قبل المتابعة، تأكد من أنك تستطيع الإجابة على:
- ما هو النسيان الكارثي ولماذا يحدث؟
- كيف تساعد طرق PEFT في منع النسيان الكارثي؟
- ما هي ثلاث استراتيجيات لتقليل النسيان في الضبط الدقيق الكامل؟