الدرس 9 من 9

الـ Fine-tuning و LoRA

آخر أداة في الصندوق، مش أول واحدة.

يعني إيه Fine-tuning؟

زي الـ transfer learning في المرحلة ٦ بالظبط: تاخد موديل لغة متدرب، وتكمل تدريبه على أمثلة من عندك عشان يتقن مهمة أو أسلوب معين. مثلاً ردود خدمة عملاء بطريقة شركتك، أو تصنيف تذاكر الدعم لفئاتك.

اختار الأداة الصح

المشكلةالحل الأنسب
الموديل مش فاهم المطلوب أو بيرد بشكل مش مظبوطPrompt engineering الأول
الموديل محتاج معلومات مش عنده أو بتتغيرRAG
محتاج أسلوب أو شكل ثابت جداً على آلاف الطلبات، أو موديل أصغر وأرخص يعمل مهمة واحدة كويسFine-tuning
⚠ Fine-tuning مش هيعلّمه معلوماتغلطة شائعة: «هعمل fine-tuning على مستندات الشركة عشان يعرفها». الـ fine-tuning بيعلّم أسلوب وسلوك أحسن بكتير ما بيعلّم حقائق، وممكن يخلّي الموديل يألف بثقة أكبر. للمعلومات استخدم RAG.

المشكلة: الموديلات ضخمة

موديل فيه ٧ مليار وزن، تدريبه كله محتاج ذاكرة GPU ضخمة، وكل نسخة متدربة حجمها عشرات الجيجات. هنا ييجي LoRA.

الـ LoRA: عدّل حتة صغيرة ذكية

بدل ما تعدل مصفوفة الأوزان الكبيرة W نفسها، بتجمّدها وتضيف جنبها مصفوفتين صغيرين جداً A و B، حاصل ضربهم بيمثل التعديل. فاكر قاعدة الـ shapes؟ (d × r) @ (r × d) بيطلع (d × d)، ولو r صغير (زي 8)، عدد الأوزان بيقل بشكل رهيب:

W_new = W (frozen) + B · AB حجمها d×r و A حجمها r×d، و r صغير جداً
lora_math.py
d = 4096          # size of one weight matrix in a 7B-parameter model
r = 8             # LoRA rank

full = d * d                  # fine-tune the whole matrix
lora = d * r + r * d          # only A and B

print(f"full matrix: {full:>12,} weights")
print(f"LoRA (r={r}):  {lora:>12,} weights")
print(f"LoRA trains {lora / full:.2%} of the weights")

أقل من نص في المية من الأوزان! وده معناه ذاكرة أقل بكتير، وتدريب ممكن على GPU واحد في Colab، والنسخة المتدربة حجمها ميجات مش جيجات، وتقدر تعمل كذا LoRA لمهام مختلفة فوق نفس الموديل الأساسي.

شكله في الكود

lora_setup.py
from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model

base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B")   # a small open model

config = LoraConfig(
    r=8,                                  # rank: size of A and B
    lora_alpha=16,                        # scaling factor
    target_modules=["q_proj", "v_proj"],  # attach LoRA to attention's Q and V!
    lora_dropout=0.05,
    task_type="CAUSAL_LM",
)
model = get_peft_model(base, config)
model.print_trainable_parameters()
# then train with your examples using the transformers Trainer or TRL's SFTTrainer

لاحظ q_proj و v_proj: دول مصفوفات الـ Query والـ Value في الـ attention اللي شرحناها. كل حاجة في المرحلة دي بتتربط ببعض.

الداتا أهم من الكود

الـ fine-tuning نجاحه كله في جودة الأمثلة: مئات لآلاف أمثلة (سؤال ← الإجابة المثالية) نضيفة ومتنوعة وبتمثل الحالات الحقيقية. ١٠٠ مثال ممتاز أحسن من ١٠٠٠٠ مثال عشوائي.

🤖 معظم الـ Fine-tuning في الواقعأغلب الشركات بتعمل fine-tuning لموديلات مفتوحة صغيرة على مهام محددة جداً، عشان تبقى أرخص وأسرع ومتقدرش تبعت داتاها برا. وأغلب التطبيقات التانية بيكفيها prompt كويس و RAG. ابدأ بالأسهل دايماً.
الدرس اللي فات