PEFT documentation
ضبط الموجهات الواعية بالسياق: تطوير التعلم في السياق باستخدام الأساليب المعادية
ضبط الموجهات الواعية بالسياق: تطوير التعلم في السياق باستخدام الأساليب المعادية

صُمم Context-Aware Prompt Tuning (CPT) لتعزيز التصنيف بعدد قليل من الأمثلة من خلال تحسين ترميزات السياق فقط. تجمع هذه الطريقة بين الأفكار المستمدة من التعلم في السياق (ICL) وPrompt Tuning (PT) والتحسين العدائي، مع التركيز على جعل تكييف النموذج فعالاً من حيث المعاملات وفي الوقت نفسه فعالاً. في CPT، يتم تحسين ترميزات رموز السياق المحددة فقط، بينما تبقى بقية النموذج مجمدة. ولمنع الإفراط في التكيّف والحفاظ على الاستقرار، يستخدم CPT اضطرابات مضبوطة للحد من التغييرات المسموح بها في ترميزات السياق ضمن نطاق محدد. بالإضافة إلى ذلك، لمعالجة ظاهرة التحيز للحدث الأخير — حيث تميل الأمثلة القريبة من نهاية السياق إلى أن تُعطى الأولوية على الأمثلة السابقة — يطبق CPT معامل خسارة متناقص.
ملخص الورقة البحثية هو:
يمكن لنماذج اللغة الكبيرة (LLMs) تنفيذ التعلم بعدد قليل من الأمثلة (few-shot learning) باستخدام إما أساليب قائمة على التحسين أو التعلم في السياق (In-Context Learning - ICL). غالبًا ما تعاني الأساليب القائمة على التحسين من الإفراط في التخصيص (overfitting)، لأنها تتطلب تحديث عدد كبير من المعلمات باستخدام بيانات محدودة. على النقيض من ذلك، يتجنب ICL الإفراط في التخصيص، لكنه عادةً ما يكون أدنى أداءً مقارنةً بالأساليب القائمة على التحسين، وهو حساس للغاية لاختيار أمثلة العرض وترتيبها وتنسيقها. للتغلب على هذه التحديات، نقدم ضبط الموجهات الواعي بالسياق (Context-aware Prompt Tuning - CPT)، وهو أسلوب مستوحى من ICL وضبط الموجهات (Prompt Tuning - PT) والهجمات المعادية. يبني CPT على استراتيجية ICL المتمثلة في دمج الأمثلة قبل المدخلات، ويمددها من خلال دمج تعلم يشبه PT لتحسين تضمين السياق (context embedding) عبر التحسين التكراري، مستخرجًا رؤى أعمق من أمثلة التدريب. يعدّل نهجنا بعناية رموز سياق محددة، مع مراعاة البنية الفريدة للأمثلة داخل السياق. بالإضافة إلى تحديث السياق باستخدام تحسين يشبه PT، يستلهم CPT من الهجمات المعادية، حيث يعدّل المدخلات بناءً على التسميات الموجودة في السياق مع الحفاظ على القيمة الجوهرية للبيانات التي يوفرها المستخدم. لضمان المتانة والاستقرار أثناء التحسين، نستخدم خوارزمية هبوط التدرج المُسقط (projected gradient descent)، مع تقييد تضمينات الرموز (token embeddings) لتبقى قريبة من قيمها الأصلية، مما يحمي جودة السياق. أثبتت طريقتنا دقةً أعلى عبر مهام تصنيف متعددة باستخدام نماذج LLM متنوعة، متفوقةً على الخطوط الأساسية الحالية ومعالجة تحدي الإفراط في التخصيص في التعلم بعدد قليل من الأمثلة بفعالية.
اطّلع على المثال للحصول على دليل خطوة بخطوة حول كيفية تدريب نموذج باستخدام CPT.
مبدأ العمل
يُشبه ضبط الاستعلام الواعي بالسياق (Context-aware Prompt Tuning) ضبط الاستعلام (Prompt Tuning) في أنه يمكنك اختيار نص استعلام (prompt) من اختيارك، وجعل رموز هذا الاستعلام، وهذا الاستعلام فقط، قابلة للتدريب بفضل وجود طبقة تضمين ثانية (token embedding) مخصصة لرموز الاستعلام فقط. عند استعلامك عن نموذج CPT، يُضاف استعلامك «الناعم» (soft prompt) إلى بداية التضمين الخاص بمدخلاتك العادية. يختلف CPT عن ضبط الاستعلام في أن استعلامك الناعم يمكن الآن أن يُسياق (contextualized) من خلال تحديد أجزاء معينة بحيث لا تُدرَّب. وتتكون مصفوفة تضمين الرموز الخاصة بـ CPT من تضمين ثابت (static embedding) مُهيّأ من مصفوفة التضمين الخاصة بالنموذج الأساسي، وقيم دلتا (delta) قابلة للتعلم ومخصصة لكل رمز.
يُعدّ CPT مفيدًا عندما يكون لديك موجه (prompt) يحتوي على تعليمات إلى جانب أمثلة وقيم مرجعية/تسميات. قد تكون التعليمات غير مثالية، وبالتالي تستفيد من التحسين أثناء التدريب (كما في ضبط الموجه prompt tuning)، لكن الأمثلة/التسميات التي شملتها في الموجه لا يُفترض أن تتغير. يمكن فرض ذلك من خلال تحديد صريح لمكان انتهاء الموجه وبداية الأمثلة. كما يضيف CPT خسارة (loss) للرموز (tokens) إلى خسارة التنبؤ بالرمز التالي القياسية لنموذجك الخاصة بالأمثلة الموجودة في الموجه، وذلك لاستغلال الأمثلة المعطاة على نحو أمثل.
يستخدم CPT خمسة معرّفات أنواع مختلفة لتمييز الأقسام المختلفة في الاستدعاء:
- 0: فاصل: سيتم تجاهله بالكامل، وهو مفيد لرموز بداية/نهاية الجملة
- 1: علامة الإدخال: الرموز التي تصف الأمر (prompt) والتي تحدد قالب جانب الإدخال بأكمله، بما في ذلك المعلومات الإضافية
- 2: استعلام الإدخال: الرموز التي تصف مدخلات المستخدم في مثال
- 3: علامة الإخراج: الرموز التي تصف بداية الإخراج المتوقع لمثال
- 4: label: الرموز التابعة لوسم المثال
هذا الأمر تجريدي للغاية، لذا إليك مثالاً على موجه CPT والمعرّفات النوعية المقابلة له. نفترض أن كل كلمة = 1 رمز (token) من أجل التبسيط:
prompt_text = "Example 1: Input: 1+1 Answer: 2 Example 2: 1+3 Answer: 4"
token_ids = [15, 2, 11, 9, 1, 9, 11, 3, 11, 8, 9, 4, 2, 4, 9, 11, 3, 6, 8, 9, 10]
# BOS, Example 1 : Input : 1 + 1 Answer : 2 Example 2 : 1 + 3 Answer : 4
type_ids = [0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8]
# 1, 1, 1, 2, 2, 2, 3, 3, 4تُمثّل token_ids موجهك المُرمَّز بواسطة مُرمِّز النموذج الأساسي، وتُطابق ~CPTConfig.cpt_token_ids. أما type_ids فهي معرِّفات أنواع الرموز للموجه، وتُعرِّف الأقسام المختلفة للموجه وتُطابق ~CPTConfig.cpt_tokens_type_mask.
للمعرّفات الفردية تأثيرات مختلفة على عملية التدريب:
- 0: سيتم تجاهلها بالكامل، ولا تساهم في دالة الخسارة، ولا تُدرَّب هذه الرموز، وهي مفيدة للرموز الموجودة لأسباب تقنية فقط والتي من شأنها أن توسّع مساحة المعاملات بلا فائدة (مثل رموز EOS)
- 1 و 3: تُؤخذ هذه الرموز في الاعتبار عند التنسيق، ويُتحكم في أقصى معيار لفرق تضمينها بواسطة
opt_projection_format_epsilon(). يتحكم المعيار في أقصى مقدار يمكن أن يشير إليه التضمينات الدلتا المتعلمة لهذا النوع. تعني المعايير الأعلى احتمالًا أكبر لتغير المعنى. - 2: تُؤخذ هذه الرموز في الاعتبار كمدخلات لمثال، ويتم التحكم في أقصى معيار لفرق تضمينها من خلال
opt_projection_epsilon(). يتحكم المعيار في أقصى مقدار يمكن أن يشير إليه التضمينات الدلتا المتعلمة لهذا النوع. المعايير الأعلى تعني احتمالًا أكبر لتغير المعنى. - 4: تُضاف رموز التسمية الخاصة بالموجّه كأهداف إضافية للتنبؤ بالرمز التالي إلى الدالة القياسية على بيانات التدريب الخاصة بك؛ بينما تُستبعد جميع رموز الموجّه الناعم الأخرى من الدالة. ولا تتغير التضمينات الدلتاوية لرموز التسمية أبدًا للحفاظ على دلالات التسمية كما هي.
قد تلاحظ أن الأرقام في type_ids في المثال الثاني مُزاحة بمقدار 4. يستخدم CPT وزناً أُسياً لخسارة الأمثلة التي تقدمها في الأمر (prompt)، حيث يكون المثال الأخير هو الأقل تخامداً، بينما تكون خسارة المثال الأول هي الأكثر تخامداً. يمنح هذا وزناً أكبر للأمثلة الأقرب إلى استعلام الإدخال الفعلي، ويُتحكم به عبر opt_loss_decay_factor() عند ضبط opt_weighted_loss_type() على "decay". من خلال إزاحة الأمثلة بمقدار 4، يمكننا تعداد الأمثلة المختلفة بحيث تمنح الخسارة أوزاناً متخامدة مختلفة لكل مثال.
لاحظ أن cpt_tokens_type_mask يصف التلميح الناعم (soft prompt) نفسه فقط. عند التدريب، مرّر أيضاً متجه input_type_mask إلى جانب كل دفعة (batch)، مع إسناد معرّفات الأنواع إلى الرموز (tokens) الخاصة بمدخلاتك الفعلية (باستخدام المعرّفات 0-4 كما هو موضح أعلاه، مع وضع علامة 0 على رموز الحشو أو رموز نهاية الجملة). يقوم CPT تلقائياً بإزاحة هذه المعرّفات بعدد الأمثلة في تلميحك، لذا لا حاجة منك لإزاحتها بنفسك. وهذا يعادل إضافة المدخلات في نهاية قائمة أمثلتك في التلميح. ضع في اعتبارك أن المعرّفات تُفسَّر على أساس الباقي (modulo 4): فإزاحتها بمضاعف لـ 4 أمرٌ غير ضار، لكن أي إزاحة أخرى تغيّر بصمت الرموز التي تساهم في حساب الخسارة. إذا لم يتم تمرير input_type_mask، فإن CPT يعود إلى حساب الخسارة على تسلسل المدخلات بأكمله، أي بافتراض النوع 4 لجميع رموز المدخلات.
نظرة عامة على الاختبارات
لا يوجد حتى الآن معيار مرجعي لهذه الطريقة. يمكنك المساهمة بإعداد تجربة، لكن تأكد أولاً من إنشاء مشكلة هنا.
واجهة برمجة التطبيقات
CPTConfig
فئة peft.CPTConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falsenum_virtual_tokens: int = Nonetoken_dim: int = Nonenum_transformer_submodules: Optional[int] = Nonenum_attention_heads: Optional[int] = Nonenum_layers: Optional[int] = Nonemodules_to_save: Optional[list[str]] = Nonecpt_token_ids: list[int] | None = Nonecpt_mask: list[int] | None = Nonecpt_tokens_type_mask: list[int] | None = Noneopt_weighted_loss_type: typing.Literal['none', 'decay'] | None = 'none'opt_loss_decay_factor: float | None = 1.0opt_projection_epsilon: float | None = 0.1opt_projection_format_epsilon: float | None = 0.1tokenizer_name_or_path: str | None = None )
فئة CPT Configuration التي توسّع PeftConfig من أجل ضبط الموجهات الواعية بالسياق (CPT).
تُقدّم هذه الفئة معلمات إضافية مطلوبة لـ CPT، مثل:
- أقنعة أنواع الرموز
- تهيئة ضبط الموجه
- وزن الدالة
- إعدادات الإسقاط
لمزيد من التفاصيل، راجع الورقة البحثية: https://huggingface.co/papers/2410.17222
CPTEmbedding
CPTEmbedding هو طبقة تضمين مخصصة مصممة للضبط الواعي للسياق (CPT) في PEFT. يقوم بمبادرة التضمينات، وتطبيق الإسقاطات الخاصة بالموجّهات، وحساب الخسارة باستخدام أقنعة التسميات.
calculate_loss
< source >( base_model_outputlabelscpt_type_maskconfig ) → ModelOutput
المعاملات
- base_model_output (ModelOutput) — المخرجات من النموذج الأساسي والتي تتضمن القيم اللوجستية (logits).
- labels (torch.Tensor) — التسميات الصحيحة (Ground-truth) للرموز المدخلة.
- cpt_type_mask (torch.Tensor) — قناع نوع الرموز المستخدم لتصفية مصطلحات الخسارة الصالحة.
- config (Namespace) — كائن التهيئة الذي يحتوي على معاملات الضبط المتعلقة بالخسارة.
يعيد
ModelOutput
مخرجات النموذج الأساسي مع الخسارة المحسوبة.
يُحسب خسارة نماذج CPT مع خيار التلاشي الأسي.
forward
< source >( indices ) → torch.Tensor
يحسب تضمينات الاستعلام ويطبّق تعديلات الدلتا.
يطبّق إسقاطاً قائماً على إبسilon على التضمينات الدلتاوية للتحكم في معيارها.
يُعدّ خطافًا عكسيًا لتحديث تدرّجات الرموز بشكل انتقائي بناءً على قناع نوع رمز CPT.