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

الوحدة 4 — الضبط الدقيق الموفّر للمعاملات (PEFT)

بعد أن أوضحت الوحدة السابقة استحالة الضبط الكامل عمليًّا، تدخل عائلة كاملة من التقنيات لحلّ المعضلة: PEFT — Parameter-Efficient Fine-Tuning. الفكرة المركزية بسيطة: بدل تحديث كلّ الأوزان (المليارات السبعة)، جمّد معظمها ودرّب مجموعة صغيرة جدًّا من المعاملات الإضافية.

المبدأ العام

نموذج مُدرَّب مسبقًا يحمل تمثيلات عامّة قوية للغة. المهمّة الجديدة (كتابة محاضر اجتماعات) لا تتطلّب إعادة تعلّم اللغة، بل مجرّد تحوير طفيف لسلوك النموذج. رياضيًّا، أي أنّ الفرق بين أوزان النموذج المضبوط والنموذج الأصلي قليل الرتبة (low rank) في الغالب: تعديلات محدودة على قنوات معلومات محدّدة، لا إعادة توزيع شاملة.

هذا الحدس هو أساس PEFT: بدل تخزين مصفوفة WضبطW_{\text{ضبط}} كاملة، نخزّن تحديثًا ΔW\Delta W صغيرًا جدًّا، ونستعمل عند الاستدلال Wأصلي+ΔWW_{\text{أصلي}} + \Delta W.

أوّل عائلة: المحوّلات (Adapters)

كان المحوّلات (adapters) الاقتراح الأوّل في 2019. الفكرة: إدراج طبقات صغيرة جديدة بين طبقات النموذج الأصلي، وتجميد كلّ الأوزان الأصلية. هذه الطبقات المُدخَلة تُدرَّب فقط.

بنية المحوّل النموذجية:

class Adapter(nn.Module):
def __init__(self, hidden_size, bottleneck_size=64):
super().__init__()
self.down = nn.Linear(hidden_size, bottleneck_size)
self.up = nn.Linear(bottleneck_size, hidden_size)
self.activation = nn.GELU()

def forward(self, x):
return x + self.up(self.activation(self.down(x)))

بتخفيض البعد من 4096 إلى 64 ثمّ إعادة توسّعه، عدد المعاملات الجديدة صغير جدًّا (بضعة ملايين لنموذج بسبعة مليارات). العلاقة الأخيرة x + ... تضمن أنّ المحوّل ينطلق ككائن محايد لا يشوّش على النموذج الأصلي.

عيب المحوّلات: تُضيف زمنًا لكلّ استدلال، لأنّ طبقاتها الجديدة تُنفَّذ في سلسلة مع طبقات النموذج.

عائلة ثانية: ضبط البادئة (Prefix Tuning)

الاقتراح الثاني، من 2021، أكثر لطفًا: بدل إضافة طبقات جديدة، درِّب متّجهات دخل افتراضية توضع في أوّل التسلسل. النموذج يتعلّم أن يفسّرها كتعليمات مضغوطة.

مثال: تُضاف 20 متّجه (prefix) قابل للتعلّم في مقدّمة كلّ إدخال. عند كلّ استدلال، تُلصَق هذه المتّجهات ببداية التمثيل ويبقى النموذج كما هو.

المزية: عدد معاملات صغير جدًّا (عشرات الآلاف بدل الملايين). العيب: النتائج ضعيفة نسبيًّا على المهامّ المعقّدة، والتقارب أبطأ. اليوم في 2026 لم يعد يُستعمل كثيرًا خارج بعض حالات المحادثة الخفيفة.

عائلة ثالثة: LoRA

الاقتراح الحاسم، من ورقة Microsoft في 2021، هو LoRA (Low-Rank Adaptation). الفكرة تُطبّق حدس قليلي الرتبة مباشرة على مصفوفات النموذج: بدل تدريب ΔW\Delta W كاملة، تُكتَب على شكل جداء مصفوفتين صغيرتين B×AB \times A برتبة منخفضة rr.

النتيجة: عدد معاملات مذهل الصغر (أقلّ من 1% من النموذج الأصلي)، ولا زمن استدلال إضافي (يمكن دمج ΔW\Delta W في الأوزان الأصلية بعد التدريب). الوحدة التالية مكرَّسة له بالكامل.

مكتبة PEFT من Hugging Face

هذه العائلات الثلاث (وأخرى) موحَّدة في مكتبة peft من Hugging Face. واجهة الاستعمال بسيطة:

from peft import LoraConfig, get_peft_model, TaskType

config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "v_proj"],
)

model = get_peft_model(base_model, config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.062

النتيجة النموذجية: أقلّ من 5 ملايين معامل قابل للتدريب على نموذج بسبعة مليارات. أي تخفيض بمعامل 1500 تقريبًا.

ما يُجمَّد وما يُدرَّب

الرسم الذهني الأساسي:

  • مُجمَّد: كلّ أوزان النموذج الأصلي (embeddings، attention، MLP، layer norms).
  • قابل للتدريب: فقط الطبقات المُدرَجة (adapters) أو المصفوفات الصغيرة (LoRA) أو المتّجهات المُلصَقة (prefix).

هذا التجميد يوفّر ذاكرة مضاعفة: ذاكرة الأوزان الأصلية تبقى كما هي، لكنّها لا تحتاج إلى تخزين تدرّجات ولا حالات مُستمثِل. الوفر التقديري لنموذج بسبعة مليارات ينزل من 127 غيغا (ضبط كامل) إلى نحو 20-24 غيغا فقط، أي حجم بطاقة استهلاكية كـ RTX 4090.

مزايا أخرى لعائلة PEFT

  • حفظ خفيف: المحوّل المُدرَّب حجمه بضعة ميغا، لا 14 غيغا. يمكن حفظ عشرات المحوّلات المتخصّصة (واحد لكلّ عميل، واحد لكلّ مجال) وتحميل المناسب عند الحاجة.
  • حماية أفضل من النسيان الكارثي: بما أنّ أوزان النموذج الأصلي مُجمَّدة، الكفاءات العامّة تُصان بالبناء.
  • إمكانية الجمع: يمكن تحميل عدّة محوّلات معًا لدمج تخصّصات.
الفكرة الجامعة

كلّ عائلات PEFT تنطلق من الحدس نفسه: تعديل صغير في الأوزان يكفي لتخصيص نموذج مُدرَّب مسبقًا. الفروق بين العائلات هي في مكان التعديل، لا في مبدأه.

عودة إلى الحدود

PEFT لا يجعل الضبط الدقيق سحرًا: إذا كانت المهمّة تتطلّب حقًّا معرفة جديدة (لا مجرّد شكل أو أسلوب)، فحتّى LoRA لن يخلق تلك المعرفة من العدم. راجع دائمًا شجرة قرار الوحدة 1.

الخلاصة

  • PEFT يُجمّد أوزان النموذج الأصلي ويدرّب فقط مجموعة صغيرة من المعاملات الإضافية.
  • ثلاث عائلات رئيسية: المحوّلات (طبقات مُدرَجة)، وضبط البادئة (متّجهات مُلصقة)، وLoRA (تحديث قليل الرتبة).
  • مكتبة peft من Hugging Face توحّد الاستعمال بواجهة LoraConfig + get_peft_model.
  • الوفر في الذاكرة يجعل الضبط ممكنًا على بطاقة استهلاكية واحدة، مع حماية ضمنية من النسيان الكارثي.

في الوحدة التالية: تفكيك LoRA رياضيًّا — الرتبة، ألفا، والوحدات المستهدفة.