Transfer Learning2019متوسط10 دقيقة قراءة

نقل التعلُّم بكفاءة المُعاملات في معالجة اللغة الطبيعية

Parameter-Efficient Transfer Learning for NLP

Houlsby, N. · Giurgiu, A. · Jastrzebski, S. · Morrone, B. · de Laroussilhe, Q. · Gesmundo, A. · Attariyan, M. · Gelly, S. — ICML

المشكلة

حتى عام 2019 كان السيناريو المعتاد في معالجة اللغة الطبيعية واضحاً: تأخذ نموذجاً كبيراً مُدرَّباً مسبقاً مثل BERT، ثم تُعيد جميع معاملاته على كل مهمة. الدقة ممتازة، لكن التكلفة باهظة. BERT-Large وحده فيه 340 مليون معامل، يُنتج نسخة كاملة لكل مهمة. عشر مهام تعني 3.4 مليار معامل في التخزين، وكل نسخة معزولة عن الأخرى فلا تستفيد مهمة ممّا تعلّمته مهمة ثانية. البديل — تجميد النموذج وتدريب رأس صغير فوقه — يحلّ مشكلة التخزين لكنه يخسر جزءاً كبيراً من الدقة.

الإسهام

تقترح الورقة وحدات المحوّل (Adapters): طبقات صغيرة بمعمارية تُدرج داخل كل طبقة من طبقات (Transformer). النموذج الأصلي يبقى مُجمَّداً بالكامل ولا يُدرَّب إلا المحوّلات. كل محوّل يضغط التمثيل من البُعد d إلى بُعد أصغر m عبر إسقاط خطي، يمرّره بدالة تنشيط لاخطية، ثم يعيده إلى d مع وصلة تخطّي. على مع BERT-Large بلغت الدقة 0.4% فقط أقل من الكامل، بإضافة 3.6% فقط من المعاملات لكل مهمة مقابل 100% في الضبط الكامل. جُرِّب التصميم على 26 مهمة تصنيف نصي متنوعة.

الأثر

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

تخيّل مصنعاً ضخماً يُنتج أدوات ممتازة لكل الاستخدامات. لو أردت تصنيع منتج جديد، فإن الضبط الدقيق الكامل يشبه أن تبني مصنعاً جديداً بالكامل — نفس الآلات ونفس التصميم مع تعديلات بسيطة. تكلفة غير منطقية.

تتّبع منهجاً أذكى: تُركّب قوالب صغيرة يمكن فكّها وتبديلها على الآلات الموجودة. كل قالب تكلفته شبه معدومة، يُعدّل المُخرجات بالقدر الكافي للمنتج الجديد، ويُستبدل في ثوانٍ. المصنع نفسه لا يتغيّر. عشرة منتجات؟ عشرة قوالب صغيرة — لا عشرة مصانع.

المشكلة: هدر الضبط الدقيق الكامل

في عام 2019 كان خط العمل المعتاد في واضحاً: تأخذ مثل BERT، وتنسخ كل أوزانه، ثم تُعيد تدريب كل معامل فيه على كل جديدة. هذا ما نسمّيه الضبط الدقيق الكامل، والنتائج من حيث الدقة ممتازة — لكن التكلفة غير معقولة.

لنأخذ مثالاً عملياً: BERT-Large فيه 340 مليون معامل. لو عندك عشر مهام — تحليل مشاعر، إجابة عن أسئلة، استخراج كيانات، وغيرها — فأنت تُخزّن عشر نسخ مستقلة أي 3.4 مليار معامل. والأسوأ أن كل نسخة منعزلة عن البقية: لا تستفيد مهمة ممّا تعلّمته مهمة أخرى. وإذا ظهرت مهمة جديدة غداً تبدأ العملية من الصفر.

البديل المباشر هو : تُجمّد النموذج بالكامل وتُدرّب فوقه رأس تصنيف صغيراً فقط. هذا يحلّ مشكلة التخزين — هيكل مشترك واحد ورؤوس خفيفة لكل مهمة — لكنه يخسر جزءاً ملموساً من الدقة. الورقة تُبيّن أن استخراج السمات مع BERT يتخلّف عدة نقاط عن الضبط الدقيق الكامل على مهام GLUE.

فالسؤال الطبيعي: هل يوجد حلّ وسط بين الطرفين؟ هل يمكن تحقيق دقة الضبط الدقيق الكامل بتدريب جزء صغير جداً من المعاملات فقط؟

افتح في المختبر
قارن تكلفة المعاملات بين الضبط الدقيق الكامل وضبط المحوّلات عبر مهام متعددة.
تستيقظ التجربة عند وصولك…

الحل: وحدات المحوّل

الفكرة الأساسية أنيقة في بساطتها. بدلاً من تحديث كل معاملات BERT، جمِّد النموذج المُدرَّب مسبقاً بالكامل وأدرج داخل كل طبقة من طبقات المُحوِّل وحدات صغيرة قابلة للتدريب تُسمّى المحوّلات. أثناء الضبط الدقيق لا يُحدَّث إلا معاملات المحوّلات و، وكل شيء آخر يبقى تماماً كما تركه .

كل محوّل مبني على مبدأ عنق الزجاجة. تخيّل ممرّاً ضيّقاً داخل مبنى واسع: المعلومات تدخل بعرضها الكامل (البُعد d، مثلاً 1024 في BERT-Large)، ثم تُضغط إلى بُعد أصغر بكثير m (مثلاً 64)، تمرّ عبر لاخطية، ثم تعود إلى العرض الأصلي d. تُضيف المدخل مباشرةً إلى المخرج، فيبدأ المحوّل كدالة هويّة تقريبية ويتعلّم تدريجياً التعديلات التي تحتاجها كل مهمة.

في كل طبقة من طبقات المُحوِّل يُدرج محوّلان: واحد بعد وآخر بعد . كلاهما يتبعه وصلة تخطّي تضمن أن مخرجات الطبقة لا تبتعد كثيراً عن مخرجاتها الأصلية.

افتح في المختبر
اسحب المنزلق لتغيير بُعد عنق الزجاجة m وشاهد كيف تتدفق البيانات عبر مسار المحوّل: إسقاط تنازلي ← تنشيط ← إسقاط تصاعدي ← وصلة تخطّي.
تستيقظ التجربة عند وصولك…
Adapter(x)=Wupσ ⁣(Wdownx)+x\text{Adapter}(\mathbf{x}) = W_{\text{up}} \cdot \sigma\!\bigl(W_{\text{down}} \cdot \mathbf{x}\bigr) + \mathbf{x}
وحدة المحوّل — عنق زجاجة مع وصلة تخطّيx هي الحالة الخفية ببُعد d. المصفوفة W_down تضغط التمثيل إلى بُعد أصغر m، والرمز σ يمثّل دالة تنشيط لاخطية (مثل ReLU أو GeLU). المصفوفة W_up تُعيد التمثيل إلى البُعد الأصلي d، والحدّ + x هو وصلة التخطّي. إجمالي المعاملات الجديدة لكل محوّل: 2md + d + m (شاملة الانحيازات).

موضع المحوّلات داخل طبقة المُحوِّل

جرّب الباحثون عدة مواضع لإدراج المحوّلات ووجدوا أن الأفضل هو وضع محوّلين في كل طبقة من طبقات المُحوِّل:

  1. المدخل ← الانتباه متعدد الرؤوس ← المحوّل ← الجمع وتسوية الطبقة
  2. ← شبكة التغذية الأمامية ← المحوّل ← الجمع وتسوية الطبقة

لاحظ أن كل محوّل يأتي بعد الطبقة الفرعية الأساسية لكن قبل الجمع مع وتسوية الطبقة. الفائدة من هذا الترتيب أن المحوّل يستطيع تعديل المخرجات قبل دمجها مع المدخل الأصلي عبر وصلة التخطّي.

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

افتح في المختبر
شاهد أين تُدرج المحوّلات داخل طبقة المحوِّل. الكتل الزرقاء هي المكوّنات المُجمَّدة من التدريب المسبق، والكتل البرتقالية هي المحوّلات القابلة للتدريب.
تستيقظ التجربة عند وصولك…

بُعد عنق الزجاجة: المفاضلة بين المعاملات والأداء

بُعد عنق الزجاجة m هو المقبض الوحيد الذي يتحكّم في المفاضلة بين كفاءة المعاملات والدقة. فكّر فيه كعرض ذلك الممرّ الضيّق:

حين يكون m صغيراً جداً (مثلاً 8) يكون عدد المعاملات ضئيلاً — نحو 0.1% من النموذج الأساسي — لكن الممرّ أضيق من أن ينقل كل المعلومات التي تحتاجها المهمة، فتنخفض الدقة بضع نقاط.

حين يكبر m (مثلاً 64) يتّسع الممرّ بما يكفي لنقل إشارات غنية، وتقترب الدقة من الضبط الدقيق الكامل. لكن بطبيعة الحال يزداد عدد المعاملات.

النقطة المثلى تختلف حسب المهمة، لكن الورقة وجدت أن m = 64 (بإضافة نحو 3.6% من المعاملات لكل مهمة) يصل إلى دقة تقلّ 0.4% فقط عن الضبط الكامل على GLUE. وحتى عند m = 8 (نحو 0.5% من المعاملات) يظلّ الأداء قوياً بشكل لافت — أفضل بكثير من استخراج السمات.

افتح في المختبر
حرِّك بُعد عنق الزجاجة m لترى كيف يتغيّر حجم المحوّل والدقة.
تستيقظ التجربة عند وصولك…

التدريب: ما يُجمَّد وما يُدرَّب

عند استخدام المحوّلات، تكون قواعد التدريب واضحة تماماً بخصوص أيّ المعاملات تُحدَّث وأيّها لا:

(لا تُحدَّث): كل معاملات المُحوِّل الأصلية — ، أوزان الانتباه ( Q وK وV)، طبقات التغذية الأمامية، ومعاملات تسوية الطبقة الأصلية.

قابلة للتدريب: أوزان الإسقاط التنازلي والتصاعدي في المحوّلات وانحيازاتها، ومعاملات تسوية الطبقة الخاصة بالمهمة، ورأس التصنيف النهائي.

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

بقية إعدادات التدريب مألوفة: من 2 إلى 4 حقب، بين 3e-5 و3e-4، و صغيرة. الفرق الجوهري أن يحسب لمعاملات المحوّلات فقط، فتصبح كل خطوة أخفّ حسابياً ويُتجنَّب للمعرفة المُكتسبة.

الفكرة في الكود

وحدة المحوّل — عنق زجاجة مع وصلة تخطّيpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import torch
import torch.nn as nn

class AdapterModule(nn.Module):
    """محوّل عنق الزجاجة: إسقاط تنازلي ← تنشيط ← إسقاط تصاعدي + تخطّي."""

    def __init__(self, d_model: int, bottleneck: int):
        super().__init__()
        self.down = nn.Linear(d_model, bottleneck)   # d ← m
        self.activation = nn.GELU()
        self.up = nn.Linear(bottleneck, d_model)     # m ← d
        # تهيئة قريبة من الصفر ليبدأ المحوّل كدالة هويّة
        nn.init.zeros_(self.up.weight)
        nn.init.zeros_(self.up.bias)

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        residual = x                         # احفظ المدخل للتخطّي
        x = self.down(x)                     # ضغط: d ← m
        x = self.activation(x)               # تنشيط غير خطي
        x = self.up(x)                       # توسيع: m ← d
        return x + residual                  # ناتج المحوّل + تخطّي

# مثال: BERT-Large (d=1024)، عنق الزجاجة m=64
adapter = AdapterModule(d_model=1024, bottleneck=64)
params = sum(p.numel() for p in adapter.parameters())
print(f"معاملات المحوّل: {params:,}")       # ← 132,096
# قارن: BERT-Large إجمالاً = 340,000,000
# المحوّل يُضيف فقط 0.04% لكل نقطة إدراج

النتائج: دقة شبه كاملة بجزء صغير من التكلفة

اختُبرت المحوّلات على 26 مهمة تصنيف نصي شملت مهام معيار GLUE التسعة كلها، باستخدام BERT-Large كنموذج أساسي. وهذه أبرز النتائج:

على معيار GLUE حققت المحوّلات مع m=64 متوسط نقاط يقلّ 0.4% فقط عن الضبط الدقيق الكامل، رغم أنها أضافت 3.6% فقط من المعاملات لكل مهمة مقابل 100% في الضبط الكامل.

حتى مع عنق زجاجة ضيّق جداً (m=8، أي نحو 0.5% من المعاملات) تفوّقت المحوّلات بفارق واضح على استخراج السمات الذي يُجمّد النموذج ولا يُدرّب إلا رأس التصنيف.

على مستوى المهام الست والعشرين كلها، وصلت المحوّلات إلى أداء يُضاهي أو يتجاوز الشريحة المئوية العشرين للضبط الكامل بمعاملات أقلّ بمراتب. وعلى الوسيط (الشريحة المئوية الخمسين) لم يتجاوز الفارق 0.8%.

أجرى الباحثون أيضاً على موضع الإدراج. وضع المحوّلات بعد كل من طبقة وشبكة التغذية الأمامية أعطى نتائج أفضل من وضعها بعد واحدة فقط. وإزالتها من الطبقات السفلى أضرّ بالأداء أكثر من إزالتها من العليا، مما يدلّ على أن التكيّف في الطبقات الأولى أهمّ.

ما الذي فتحته المحوّلات

  1. 2019

    وحدات المحوّل (هذه الورقة)

    قدّمت محوّلات عنق الزجاجة لـ BERT وأثبتت أن 3.6% من المعاملات تكفي للوصول إلى دقة الضبط الكامل تقريباً، فافتتحت بذلك مجال الضبط بكفاءة المعاملات.

  2. 2021

    الضبط بالبادئة

    أضاف Li وLiang متّجهات مستمرة قابلة للتعلّم إلى المفاتيح والقيم في كل طبقة انتباه، من دون أيّ تعديل على معمارية النموذج — تكييف يحصل بالكامل في فضاء المدخلات.

  3. 2021

    التكييف منخفض الرتبة

    فكّك Hu وزملاؤه تحديثات الأوزان إلى مصفوفات منخفضة الرتبة تُضاف بالتوازي لا بالتسلسل. الميزة الكبرى أن LoRA يُدمج مع الأوزان الأصلية عند الاستدلال بدون أيّ عبء إضافي، فتختفي مشكلة زمن الاستجابة.

  4. 2021

    ضبط المحثّات

    بيّن Lester وزملاؤه أن إلحاق بضعة رموز ناعمة قابلة للتعلّم ببداية المدخل يكفي لمُضاهاة الضبط الكامل كلما كبر النموذج. أقصى درجات البساطة: لا يُدرَّب سوى متّجهات المحثّ.

  5. 2023

    QLoRA — LoRA المُكمَّم

    جمع Dettmers وزملاؤه بين التكميم إلى 4 بتات وLoRA، فأصبح ضبط نماذج بـ 65 مليار معامل ممكناً على GPU واحدة. النتيجة الطبيعية للمسار الذي بدأته المحوّلات.

الأثر الأعمق لهذه الورقة ليس تقنياً بقدر ما هو تحوّل في طريقة التفكير. قبل المحوّلات كان المجتمع البحثي يتعامل مع الضبط الدقيق كخيار ثنائي: إما تُحدّث كل المعاملات أو تُجمّد كل شيء. ما أثبتته هذه الورقة أن هناك منطقة وسطى غنية — طيف كامل من كفاءة المعاملات تستطيع فيه وحدات صغيرة مُوجَّهة أن تلتقط ما تحتاجه المهمة مع الحفاظ على كل ما تعلّمه النموذج الأساسي. كل أسلوب ظهر بعد ذلك — من LoRA إلى إلى (IA)³ — يعمل في هذه المنطقة الوسطى التي رسمت حدودها المحوّلات.

المرجعHoulsby, Giurgiu, Jastrzebski, Morrone, de Laroussilhe, Gesmundo, Attariyan, Gelly. Parameter-Efficient Transfer Learning for NLP. ICML, 2019.

مصطلحات هذه الورقة