إنتقل إلى المحتوى الرئيسي

الفصل 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%
LoRA93%95-99%
QLoRA92%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)سهل⭐⭐⭐⭐⭐
معدل تعلم أقلسهل⭐⭐⭐
عدد أقل من العصورسهل⭐⭐⭐
خلط البياناتمتوسط⭐⭐⭐⭐
اضمحلال الأوزانسهل⭐⭐
التوقف المبكرسهل⭐⭐⭐

النهج الموصى به​

  1. ابدأ مع PEFT (LoRA أو QLoRA)
  2. إذا كان PEFT غير كافٍ، جرب الضبط الدقيق الكامل مع:
    • معدل تعلم منخفض (1e-5)
    • عدد محدود من العصور (1-2)
    • خلط البيانات
    • تقييم شامل

النقاط الرئيسية​

✅ النسيان الكارثي هو عندما تفقد النماذج المعرفة بعد الضبط الدقيق

✅ يحدث ذلك لأن الأوزان تعدل لتناسب توزيع البيانات الجديد

✅ طرق PEFT تتجنب النسيان بشكل كبير عن طريق إبقاء الأوزان الأساسية مجمدة

✅ للضبط الدقيق الكامل: استخدم معدل تعلم منخفض، عدد قليل من العصور، خلط البيانات

✅ قم دائمًا بتقييم كل من أداء المهمة واحتفاظ القدرة

✅ التوازن هو: التخصص في المهمة مقابل القدرة العامة


الخطوات التالية​

اختبر معرفتك مع اختبار الوحدة 2، ثم تابع إلى الوحدة 3: الضبط الدقيق الفعال من حيث المعلمات.


تحقق سريع​

قبل المتابعة، تأكد من أنك تستطيع الإجابة على:

  1. ما هو النسيان الكارثي ولماذا يحدث؟
  2. كيف تساعد طرق PEFT في منع النسيان الكارثي؟
  3. ما هي ثلاث استراتيجيات لتقليل النسيان في الضبط الدقيق الكامل؟