الوحدة 5 — LoRA: محوّلات الرتبة المنخفضة
LoRA (Low-Rank Adaptation) هو التقنية التي جعلت الضبط الدقيق ديمقراطيًّا.
اقترحتها ميكروسوفت في 2021، وأصبحت خلال ثلاث سنوات المعيار الفعلي. هذه
الوحدة تشرح كيف تعمل رياضيًّا، وكيف تختار قيم r وalpha والوحدات
المستهدفة في ممارسة حقيقية.
الفكرة الرياضية
في محوّل عادي، مصفوفة الأوزان في طبقة الانتباه (مثل مصفوفة الاستعلام ) هي مصفوفة كبيرة، مثلًا ، أي 16.7 مليون معامل. عند الضبط الكامل، نتعلّم حيث مصفوفة بالحجم نفسه.
الحدس الأساسي لـLoRA: التحديث في أغلب الحالات قليل الرتبة. أي أنّه يمكن كتابته على شكل جداء:
حيث مصفوفة و مصفوفة . الرتبة صغيرة جدًّا (نموذجيًّا بين 4 و64).
عدد المعاملات الجديدة: . عند : 131 ألف معامل بدل 16.7 مليون، أي تخفيض بمعامل 128.
المعادلة الكاملة
عند التمرير الأمامي عبر طبقة معدّلة بـLoRA، الحساب يصبح:
ال نموذج الأصلي يُنتج كالمعتاد، ثمّ يُضاف مسار جانبي عبر ثمّ . معامل يُطبَّق قبل الجمع.
عند بدء التدريب، يُهيَّأ عشوائيًّا و يُهيَّأ إلى صفر. النتيجة: في اللحظة الأولى، فيسلك النموذج كما لو أنّ LoRA غير موجود. هذه التهيئة المتقنة تضمن أنّ التدريب يبدأ من النموذج الأصلي، ثمّ يبتعد عنه تدريجيًّا.
دور الرتبة r
الرتبة هي المعامل الفائق الأهمّ. تختار كم من «قدرة التعبير» تُعطى للمحوّل:
- r = 4 أو 8: كافٍ لتخصّصات أسلوبية بسيطة، مثل نبرة معيّنة أو تنسيق خفيف.
- r = 16 أو 32: النطاق الأشيع، مناسب لمهامّ متوسّطة كتلخيص أو تصنيف نصوص، أو حالتنا (محاضر الاجتماعات).
- r = 64 وأكثر: للمهامّ التي تتطلّب تحويلًا سلوكيًّا كبيرًا، أو حين يكون النموذج الأصلي بعيدًا عن مجال الهدف.
الخطأ الأشيع: رفع اعتقادًا بأنّ ذلك يحسّن دائمًا. في الواقع، مرتفع مع بيانات قليلة يؤدّي إلى فرط تخصيص أسرع. القاعدة العملية: ابدأ من ، ولا ترفع إلّا إذا رأيت خسارة تحقّق منخفضة مع خسارة تدريب لا تنخفض.
دور ألفا (lora_alpha)
ليست معامل تعلّم، بل معامل تحجيم يُضرَب في مسار LoRA. حين تضاعف ، تضاعف بالفعل معدّل التعلّم الفعلي للمسار الجانبي.
القاعدة الشائعة: . عند ، خذ . هذه القاعدة ثبتت تجريبيًّا في الأبحاث اللاحقة، وتُبقي مساهمة LoRA في النطاق الصحيح.
بديل حديث: rsLoRA (LoRA مُوحَّد الرتبة) يقترح بدل ، ممّا يُبقي التحجيم مستقرًّا حين ترفع .
الوحدات المستهدفة (target_modules)
في نموذج مبنيّ على المحوّل، المصفوفات الرئيسية في كلّ طبقة انتباه هي
، بالإضافة إلى مصفوفات MLP: gate_proj, up_proj,
down_proj. LoRA لا يُطبَّق افتراضيًّا على كلّ هذه المصفوفات.
الخيارات الشائعة:
- q_proj, v_proj فقط: الخيار الأصلي في الورقة، الأخفّ في المعاملات. كافٍ لمهامّ سهلة.
- q_proj, k_proj, v_proj, o_proj: كلّ مصفوفات الانتباه، خيار متوازن.
- كلّ المصفوفات الخطّية: الاختيار الأكثر شمولًا. يعطي أفضل نتائج عمومًا لكنّه يزيد المعاملات المُدرَّبة قليلًا.
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
القاعدة العملية في 2026: استهدف كلّ المصفوفات الخطّية إذا كانت الميزانية تسمح، وعُد إلى q_proj/v_proj فقط إذا كانت الذاكرة ضيقة.
عدّ المعاملات المُدرَّبة
على نموذج Llama-3 8B، بـ وكلّ المصفوفات الخطّية مستهدَفة، يعطي
print_trainable_parameters() نحو:
trainable params: 41,943,040 || all params: 8,072,204,288 || trainable%: 0.52
أي أقلّ من 1% من النموذج، لكن يكفي عادةً للحصول على 95-98% من أداء الضبط الكامل. هذه هي «معجزة LoRA» التي غيّرت مشهد الضبط الدقيق.
عدّة محوّلات لنموذج واحد
مزية عظيمة لـLoRA: يمكن تدريب عدّة محوّلات لمهامّ مختلفة على نموذج أساس واحد، وتحميلها ديناميكيًّا:
model.load_adapter("./adapter-meetings", adapter_name="meetings")
model.load_adapter("./adapter-emails", adapter_name="emails")
model.set_adapter("meetings") # التبديل بين المحوّلات
هذا يجعل خدمة إنتاج تخدم مهامّ متعدّدة بنموذج أساس واحد في الذاكرة، وبضعة ميغا لكلّ تخصّص. توفير هائل في الاستضافة.
ابدأ دائمًا من: ، ، target_modules = كلّ الخطّية،
lora_dropout = 0.05. عدِّل فقط إذا رأيت مشكلة محدّدة في المنحنيات.
لا يعني نتيجة أفضل بمعامل 16. غالبًا يعطي نتيجة أسوأ، لأنّ معاملات إضافية بلا بيانات إضافية = فرط تخصيص أسرع. الرتبة العالية تُبرَّر فقط بمجموعة بيانات ضخمة.