Transfer Learning
التعلّم بالنقل (Transfer Learning) Transfer Learning
التعلّم بالنقل يأخذ نموذجًا مدربًا على بيانات ضخمة (مثل ImageNet) ويعدّل جزءًا منه لمهمة محددة — يقلل وقت التدريب ويحسّن الأداء، خصوصًا مع بيانات محدودة.
التعلّم بالنقل ينقل معرفة نموذج مدرب على مهمة كبيرة (مثل تصنيف ImageNet وفق البرنامج التعليمي الرسمي لـ PyTorch: حوالي 1.2 مليون صورة و1000 فئة) إلى مهمتك الأصغر. النموذج المدرب مسبقًا (pre-trained) استخلص سمات بصرية عامة (حواف، أنسجة، أشكال) قابلة لإعادة الاستخدام. خطتان رئيسيتان:
Feature Extraction: تجمّد أوزان النموذج المدرب (لا تتدرب) واستخدمه فقط كمستخلص سمات، ثم درّب مصنّفًا صغيرًا فوقه (طبقة Linear مثلًا). سريع ومناسب حين مهمتك قريبة من المهمة الأصلية.
Fine-Tuning: فكّ تجميد بعض الطبقات الأخيرة (أو كلها) وأكمل التدريب ليتكيّف النموذج مع بياناتك. يُمارَس عادةً بمعدّل تعلّم أصغر من الطبقات المُهيّأة حديثًا، لكن القيمة المناسبة تعتمد على النموذج والبيانات والمُحسّن — لا يوجد رقم عالمي صالح. أبطأ من Feature Extraction، وقد يحسّن الأداء حين مهمتك مختلفة عن الأصلية أو بياناتك كبيرة، لكن لا يُضمن أنه أفضل من feature extraction في كل حالة.
في PyTorch: torchvision.models توفّر ResNet, VGG, EfficientNet مدربة مسبقًا. في Hugging Face: نفس الشيء لنماذج NLP. لا يضمن التعلّم بالنقل تحسّنًا دائمًا — إن كانت مهمتك بعيدة عن بيانات التدريب الأصلية، قد لا يفيد بل قد يضر.
الصياغة
import torchvision.models as models
# 1) حمّل نموذج مدرب مسبقًا
model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
# 2) تجمّد المعاملات (Feature Extraction)
for param in model.parameters():
param.requires_grad = False
# 3) استبدل الطبقة الأخيرة بمصنّف جديد
model.fc = nn.Linear(512, num_classes)📄 مثال
import torch
import torch.nn as nn
import torchvision.models as models
# 1) ResNet18 مدرب على ImageNet
model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
# 2) تجمّد كل الأوزان الموجودة
for param in model.parameters():
param.requires_grad = False
# 3) استبدل الطبقة الأخيرة (1000 فئة → 5 فئات مثلًا)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 5)
# 4) الآن فقط model.fc.parameters() قابل للتعلّم
trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"معاملات قابلة للتعلّم: {trainable:,}")
# Fine-tuning: فك تجميد آخر طبقة أو اثنتين
for param in model.layer4.parameters():
param.requires_grad = Trueأهم النقاط
| النقطة | الوظيفة |
|---|---|
| Pre-trained Model | نموذج مدرب على بيانات ضخمة — ResNet, BERT, GPT |
| Feature Extraction | تجميد الأوزان، تدريب مصنّف جديد فقط — سريع |
| Fine-tuning | تعديل بعض/كل الأوزان بمعدل تعلّم صغير — أبطأ وأكثر مرونة، وقد يحسّن الأداء حسب المهمة والبيانات |
| Freeze / Unfreeze | تجميد (requires_grad=False) أو إتاحة أوزان معيّنة للتدريب |
💡 نصائح عملية
- ابدأ بـ Feature Extraction أولًا — أبسط وأسرع. انتقل لـ Fine-tuning فقط إن لم تكفِ
- جرّب learning rate صغير نسبيًا لـ Fine-tuning ثم ارفعه أو اخفضه حسب سلوك الخسارة — لا توجد قيمة ثابتة صحيحة لكل نموذج/بيانات
⚠️ أخطاء شائعة
- افتراض أن التعلّم بالنقل دائمًا يحسّن الأداء — إن كانت بياناتك مختلفة جذريًا عن بيانات pre-training، قد لا يفيد
- Fine-tuning بـ learning rate مفرط — قد يُضعف التمثيلات المدربة مسبقًا أو يزعزع استقرار التدريب (catastrophic forgetting). القيمة الآمنة تعتمد على النموذج والبيانات والمُحسّن
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار AI-ML الكامل بالعربي.
📚 للتعمق التقني الكامل بالإنجليزية: PyTorch Documentation