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

الوحدة 5 — LoRA: محوّلات الرتبة المنخفضة

LoRA (Low-Rank Adaptation) هو التقنية التي جعلت الضبط الدقيق ديمقراطيًّا. اقترحتها ميكروسوفت في 2021، وأصبحت خلال ثلاث سنوات المعيار الفعلي. هذه الوحدة تشرح كيف تعمل رياضيًّا، وكيف تختار قيم r وalpha والوحدات المستهدفة في ممارسة حقيقية.

الفكرة الرياضية

في محوّل عادي، مصفوفة الأوزان WW في طبقة الانتباه (مثل مصفوفة الاستعلام WqW_q) هي مصفوفة كبيرة، مثلًا 4096×40964096 \times 4096، أي 16.7 مليون معامل. عند الضبط الكامل، نتعلّم W=W+ΔWW' = W + \Delta W حيث ΔW\Delta W مصفوفة بالحجم نفسه.

الحدس الأساسي لـLoRA: التحديث ΔW\Delta W في أغلب الحالات قليل الرتبة. أي أنّه يمكن كتابته على شكل جداء:

ΔW=BA\Delta W = B \cdot A

حيث AA مصفوفة r×4096r \times 4096 وBB مصفوفة 4096×r4096 \times r. الرتبة rr صغيرة جدًّا (نموذجيًّا بين 4 و64).

عدد المعاملات الجديدة: r×4096+4096×r=8192rr \times 4096 + 4096 \times r = 8192 \cdot r. عند r=16r = 16: 131 ألف معامل بدل 16.7 مليون، أي تخفيض بمعامل 128.

المعادلة الكاملة

عند التمرير الأمامي عبر طبقة معدّلة بـLoRA، الحساب يصبح:

h=Wx+αrBAxh = W x + \frac{\alpha}{r} \cdot B A x

النموذج الأصلي يُنتج WxW x كالمعتاد، ثمّ يُضاف مسار جانبي عبر AA ثمّ BB. معامل αr\frac{\alpha}{r} يُطبَّق قبل الجمع.

عند بدء التدريب، AA يُهيَّأ عشوائيًّا وBB يُهيَّأ إلى صفر. النتيجة: BA=0BA = 0 في اللحظة الأولى، فيسلك النموذج كما لو أنّ LoRA غير موجود. هذه التهيئة المتقنة تضمن أنّ التدريب يبدأ من النموذج الأصلي، ثمّ يبتعد عنه تدريجيًّا.

دور الرتبة r

الرتبة rr هي المعامل الفائق الأهمّ. تختار كم من «قدرة التعبير» تُعطى للمحوّل:

  • r = 4 أو 8: كافٍ لتخصّصات أسلوبية بسيطة، مثل نبرة معيّنة أو تنسيق خفيف.
  • r = 16 أو 32: النطاق الأشيع، مناسب لمهامّ متوسّطة كتلخيص أو تصنيف نصوص، أو حالتنا (محاضر الاجتماعات).
  • r = 64 وأكثر: للمهامّ التي تتطلّب تحويلًا سلوكيًّا كبيرًا، أو حين يكون النموذج الأصلي بعيدًا عن مجال الهدف.

الخطأ الأشيع: رفع rr اعتقادًا بأنّ ذلك يحسّن دائمًا. في الواقع، rr مرتفع مع بيانات قليلة يؤدّي إلى فرط تخصيص أسرع. القاعدة العملية: ابدأ من r=16r = 16، ولا ترفع إلّا إذا رأيت خسارة تحقّق منخفضة مع خسارة تدريب لا تنخفض.

دور ألفا (lora_alpha)

α\alpha ليست معامل تعلّم، بل معامل تحجيم يُضرَب في مسار LoRA. حين تضاعف α\alpha، تضاعف بالفعل معدّل التعلّم الفعلي للمسار الجانبي.

القاعدة الشائعة: α=2r\alpha = 2 \cdot r. عند r=16r = 16، خذ α=32\alpha = 32. هذه القاعدة ثبتت تجريبيًّا في الأبحاث اللاحقة، وتُبقي مساهمة LoRA في النطاق الصحيح.

بديل حديث: rsLoRA (LoRA مُوحَّد الرتبة) يقترح αr\frac{\alpha}{\sqrt{r}} بدل αr\frac{\alpha}{r}، ممّا يُبقي التحجيم مستقرًّا حين ترفع rr.

الوحدات المستهدفة (target_modules)

في نموذج مبنيّ على المحوّل، المصفوفات الرئيسية في كلّ طبقة انتباه هي Wq,Wk,Wv,WoW_q, W_k, W_v, W_o، بالإضافة إلى مصفوفات 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، بـr=16r = 16 وكلّ المصفوفات الخطّية مستهدَفة، يعطي 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") # التبديل بين المحوّلات

هذا يجعل خدمة إنتاج تخدم مهامّ متعدّدة بنموذج أساس واحد في الذاكرة، وبضعة ميغا لكلّ تخصّص. توفير هائل في الاستضافة.

قاعدة الإبهام

ابدأ دائمًا من: r=16r = 16، α=32\alpha = 32، target_modules = كلّ الخطّية، lora_dropout = 0.05. عدِّل فقط إذا رأيت مشكلة محدّدة في المنحنيات.

خطأ الرتبة المتضخّمة

r=256r = 256 لا يعني نتيجة أفضل بمعامل 16. غالبًا يعطي نتيجة أسوأ، لأنّ معاملات إضافية بلا بيانات إضافية = فرط تخصيص أسرع. الرتبة العالية تُبرَّر فقط بمجموعة بيانات ضخمة.

الخلاصة

  • LoRA يكتب تحديث الأوزان على شكل جداء مصفوفتين برتبة منخفضة rr، مما يُقلّص المعاملات المُدرَّبة إلى أقلّ من 1%.
  • التهيئة B=0B = 0 تضمن انطلاق التدريب من النموذج الأصلي دون تشويش.
  • الرتبة r=16r = 16 وألفا =32= 32 نقطة انطلاق آمنة، مع كلّ المصفوفات الخطّية كوحدات مستهدَفة.
  • محوّل واحد لكلّ تخصّص، مع نموذج أساس مشترك، يفتح نمط استضافة اقتصاديًّا فريدًا.

في الوحدة التالية: QLoRA، والتكميم بأربعة بتّات الذي يضغط الفاتورة أكثر ويجعل النموذج بسبعة مليارات ممكنًا على بطاقة 24 غيغا واحدة.