الفصل 1: فهم LoRA
الفكرة وراء التكيف منخفض الرتبة
LoRA (التكيف منخفض الرتبة) هي تقنية أنيقة تقوم على ملاحظة بسيطة ولكنها قوية: لا نحتاج إلى تحديث جميع المعلمات لتكييف النموذج مع مهام جديدة.
الفكرة الأساسية
الملاحظة الرئيسية
عند تحسين النماذج المدربة مسبقًا، غالبًا ما تكون تحديثات الأوزان ذات "رتبة جوهرية" منخفضة - مما يعني أن التغييرات يمكن التقاطها بواسطة مجموعة أصغر بكثير من المعلمات.
التشبيه
فكر في الأمر مثل تحرير مستند:
- التحسين الكامل: إعادة كتابة المستند بأكمله
- LoRA: إضافة ملاحظات لاصقة مع التصحيحات
يبقى المستند الأصلي (النموذج الأساسي) سليمًا، وتلتقط الملاحظات اللاصقة (محولات LoRA) التغييرات.
كيف يعمل LoRA
التحسين التقليدي
في طبقة الشبكة العصبية:
h = Wx
حيث W هي مصفوفة الأوزان بحجم (d × d).
التحسين الكامل يحدث تحديثًا مباشرًا لـ W:
W' = W + ΔW
حيث ΔW هو التغيير المتعلم لجميع المعلمات (d × d).
نهج LoRA
يمثل LoRA ΔW كمنتج لمصفوفتين أصغر:
ΔW = BA
حيث:
- B بحجم (d × r)
- A بحجم (r × d)
- r أصغر بكثير من d (r ≪ d)
تصبح عملية التمرير الأمامي:
h = Wx + BAx = (W + BA)x
التمثيل البصري
توفير المعلمات
مثال: مصفوفة أوزان 4096 × 4096
# Original weight matrix
d = 4096
original_params = d * d # 16,777,216 parameters
# LoRA with rank 16
r = 16
lora_params = d * r + r * d # 131,072 parameters
# Savings
reduction = 1 - (lora_params / original_params)
print(f"Parameter reduction: {reduction:.2%}") # 99.22%
لنموذج كامل
| النموذج | الأصلي | LoRA (r=16) | التخفيض |
|---|---|---|---|
| 7B | 7,000,000,000 | ~4,000,000 | 99.94% |
| 13B | 13,000,000,000 | ~8,000,000 | 99.94% |
| 70B | 70,000,000,000 | ~40,000,000 | 99.94% |
لماذا يعمل الترتيب المنخفض
البعد الجوهري
تظهر الأبحاث أن تحديثات التحسين تميل إلى التواجد في فضاء فرعي منخفض الأبعاد:
- النماذج المدربة مسبقًا لديها بالفعل تمثيلات غنية
- يتطلب تكييف المهام "توجيه" بدلاً من "إعادة البناء"
- العديد من أبعاد فضاء الأوزان زائدة عن الحاجة للمهام المحددة
الأدلة التجريبية
من ورقة LoRA الأصلية:
- غالبًا ما يكون r=4 كافيًا للعديد من المهام
- يوصى بـ r=8-16 للتكيفات المعقدة
- نادرًا ما يكون r=64+ ضروريًا، العوائد المتناقصة
التهيئة
مصفوفة A: توزيع غاوسي عشوائي
# A is initialized with small random values
A = torch.randn(r, d) * 0.01
مصفوفة B: صفر
# B is initialized to zero
B = torch.zeros(d, r)
لماذا هذه التهيئة؟
At training start: BA = 0 × A = 0
→ Output unchanged from base model
→ Stable training start
→ Gradual adaptation
أي الطبقات يجب استهدافها
بنية المحول
Attention Block:
├── Query projection (q_proj) ← Common target
├── Key projection (k_proj) ← Sometimes target
├── Value projection (v_proj) ← Common target
└── Output projection (o_proj) ← Sometimes target
Feed-Forward Block:
├── Gate projection (gate_proj) ← Sometimes target
├── Up projection (up_proj) ← Sometimes target
└── Down projection (down_proj) ← Sometimes target
التكوينات الشائعة
| التكوين | الوحدات المستهدفة | حالة الاستخدام |
|---|---|---|
| الحد الأدنى | q_proj, v_proj | تجارب سريعة |
| القياسي | q_proj, k_proj, v_proj, o_proj | متوازن |
| الكامل | كل الانتباه + FF | أقصى سعة |
دمج LoRA
أثناء الاستدلال (مع المحول)
# Two paths: base + LoRA
output = W @ x + B @ A @ x
عبء طفيف من الحساب الإضافي.
مدمج (بدون محول)
# Merge once
W_merged = W + B @ A
# Single path at inference
output = W_merged @ x
لا يوجد عبء - مطابق للنموذج المحسن.
مثال الدمج
from peft import PeftModel
# Load model with adapter
model = PeftModel.from_pretrained(base_model, "path/to/adapter")
# Merge adapter into base model
model = model.merge_and_unload()
# Now model is a regular model without adapter overhead
model.save_pretrained("merged-model")
أنواع LoRA
LoRA القياسي
الصيغة الأصلية الموضحة أعلاه.
LoRA+
تطبق معدلات تعلم مختلفة على مصفوفات A و B.
DoRA (التكيف منخفض الرتبة المفكك الأوزان)
يفصل بين حجم واتجاه الأوزان.
GaLore (إسقاط التدرج منخفض الرتبة)
يسقط التدرجات في فضاء منخفض الرتبة.
النقاط الرئيسية
✅ يمثل LoRA تحديثات الأوزان كمنتجات مصفوفة منخفضة الرتبة
✅ يدرب فقط ~0.01-0.1% من المعلمات الأصلية
✅ B مهيأة لتكون صفر لضمان بداية تدريب مستقرة
✅ من الشائع استهداف إسقاطات الانتباه (q_proj, v_proj)
✅ يمكن دمجها لعدم وجود عبء استدلال
✅ يعمل الترتيب المنخفض لأن التحسين له بعد جوهري منخفض
الخطوات التالية
تابع إلى الفصل 2: رياضيات LoRA للأسس الرياضية.
تحقق سريع
قبل المتابعة، تأكد من أنك تستطيع الإجابة على:
- كيف يمثل LoRA تحديثات الأوزان؟
- لماذا يتم تهيئة B لتكون صفر؟
- ماذا يعني "الترتيب المنخفض" في سياق LoRA؟