PEFT documentation
IA3
IA3
يُعدّ IA3 خيارًا ممتازًا عندما تحتاج إلى أصغر حجم ممكن للمُكيّف (adapter) — إذ يستخدم متجهات متعلَّمة بدلاً من مصفوفات منخفضة الرتبة، مما يجعله أحد أكثر الأساليب كفاءةً من حيث عدد المعاملات المتاحة. إذا كان أولويتك هي تقليل بصمة القرص/الذاكرة إلى الحد الأدنى وتسريع التدريب، فإن IA3 مرشح قوي.

المُكيّف المُدمج عبر تثبيط وتضخيم التفعيلات الداخلية، أو IA3، هو أسلوب يضيف ثلاثة متجهات متعلمة لإعادة قياس المفاتيح والقيم في طبقات الانتباه الذاتي والانتباه بين المُشفِّر والمُفكِّك، وكذلك التفعيل الوسيط في الشبكة العصبية الأمامية الموضعية.
ملخص الورقة البحثية هو:
يتيح التعلّم السياقي بعدد قليل من الأمثلة (ICL) لنماذج اللغة المُدرَّبة مسبقًا أداء مهمة لم تُشاهد من قبل دون أي تدريب قائم على التدرّجات، وذلك عبر إدخال عدد صغير من أمثلة التدريب كجزء من المدخلات. يتسبب ICL في تكاليف حسابية وذاكرة وتخزين كبيرة لأنه يتضمن معالجة جميع أمثلة التدريب في كل مرة يُصدر فيها نموذج التنبؤ. يقدّم الضبط الدقيق الفعّال من حيث المعاملات (PEFT) (مثل وحدات المحوّل، وضبط الموجهات، وطرق التحديث المتناثرة، وغيرها) نموذجًا بديلًا حيث تُدرَّب مجموعة صغيرة من المعاملات لتمكين النموذج من أداء المهمة الجديدة. في هذه الورقة، نقارن بدقة بين ICL بعدد قليل من الأمثلة وPEFT، ونُثبت أن الثاني يوفر دقة أفضل وتكاليف حسابية أقل بكثير. على طول الطريق، نُقدّم طريقة PEFT جديدة تُسمى (IA)^3 تقوم بتوسيع التفعيلات بواسطة متجهات مُتعلَّمة، محققة أداءً أقوى مع إدخال كمية صغيرة نسبيًا فقط من المعاملات الجديدة. كما نقترح وصفة بسيطة مبنية على نموذج T0 تُسمى T-Few يمكن تطبيقها على مهام جديدة دون ضبط أو تعديلات خاصة بالمهمة. نتحقق من فعالية T-Few على مهام غير مرئية تمامًا من خلال تطبيقها على معيار RAFT، محققة أداءً يتجاوز البشر لأول مرة وتتفوق على أحدث التقنيات بنسبة 6% مطلقة. جميع الأكواد المستخدمة في تجاربنا متاحة للعموم.
لجعل الضبط الدقيق أكثر كفاءة، يعيد IA3 (المُكيّف المُدمج عبر تثبيط التنشيطات الداخلية وتضخيمها) قياس التنشيطات الداخلية باستخدام متجهات متعلمة. تُحقن هذه المتجهات المتعلمة في وحدات الانتباه والتغذية الأمامية في البنية النموذجية القائمة على المحولات. هذه المتجهات المتعلمة هي المعاملات القابلة للتدريب الوحيدة أثناء الضبط الدقيق، وبالتالي تبقى الأوزان الأصلية مجمّدة. التعامل مع متجهات متعلمة (على عكس التحديثات منخفضة الرتبة المتعلمة لمصفوفة الأوزان كما في LoRA) يحافظ على عدد المعاملات القابلة للتدريب أصغر بكثير.
بما أنه يشبه LoRA، فإن IA3 يحمل العديد من المزايا نفسها:
- يجعل IA3 الضبط الدقيق أكثر كفاءة من خلال تقليل عدد المعلمات القابلة للتدريب بشكل كبير. (في حالة T0، يحتوي نموذج IA3 على حوالي 0.01% فقط من المعلمات القابلة للتدريب، بينما يحتوي حتى LoRA على أكثر من 0.1%)
- تُحافظ الأوزان المُسبقة التدريب الأصلية على حالة التجميد، مما يعني أنه يمكنك امتلاك عدة نماذج IA3 خفيفة الوزن وقابلة للنقل لمهام مختلفة في المراحل اللاحقة، مبنية على أساسها.
- أداء النماذج المُحسَّنة باستخدام IA3 مماثل لأداء النماذج المُحسَّنة بالكامل.
- لا يضيف IA3 أي تأخير في الاستدلال لأن أوزان المحوّل يمكن دمجها مع النموذج الأساسي.
من حيث المبدأ، يمكن تطبيق IA3 على أي مجموعة فرعية من مصفوفات الأوزان في الشبكة العصبية لتقليل عدد المعلمات القابلة للتدريب. ووفقاً لتنفيذ المؤلفين، تُضاف أوزان IA3 إلى طبقات المفتاح والقيمة والطبقات الأمامية (feedforward) في نموذج Transformer. وبشكل أكثر تحديداً، بالنسبة لنماذج transformer، تُضاف أوزان IA3 إلى مخرجات طبقات المفتاح والقيمة، وإلى مدخل الطبقة الأمامية الثانية في كل كتلة transformer.
بناءً على الطبقات المستهدفة لحقن معاملات IA3، يمكن تحديد عدد المعاملات القابلة للتدريب استنادًا إلى حجم مصفوفات الأوزان.
الاستخدام
بالنسبة للنماذج التوليدية ذاتية الرجوع، استهدف
k_projوv_projوdown_proj— فهذه هي الطبقات التي وجد مؤلفو العمل أنها الأكثر فعالية. اضبطfeedforward_modules=["down_proj"]حتى يعرف IA3 أي الوحدات هي طبقات التغذية الأمامية ويمكنه تطبيق التدرج الصحيح.
لمهمة تصنيف التسلسل، يمكن تهيئة إعداد IA3 لنموذج Llama على النحو التالي:
from peft import IA3Config, TaskType, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M")
peft_config = IA3Config(
task_type=TaskType.CAUSAL_LM,
target_modules=["k_proj", "v_proj", "down_proj"],
feedforward_modules=["down_proj"],
)
model = get_peft_model(model, peft_config)
model.print_healthcheck()متى تستخدم IA3 مقابل LoRA
يُعدّ IA3 فعّالاً بشكل خاص عندما تحتاج إلى أصغر محوِّلات ممكنة للنشر في بيئات محدودة التخزين، أو عندما ترغب في تقارب سريع مع عدد أقل من المعاملات القابلة للتدريب. قد يكون LoRA تفضيلاً أفضل عندما تحتاج إلى منظومة أوسع من متغيرات LoRA (مثل DoRA وQLORA وغيرها)، أو عندما تريد النهج الأكثر اختباراً على نطاق واسع مع دعم مجتمعي واسع.
نظرة عامة على الاختبارات
واجهة برمجة التطبيقات
IA3Config
فئة peft.IA3Config
< 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 = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonefeedforward_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_ia3_weights: bool = True )
المعاملات
- target_modules (
Optional[Union[List[str], str]]) — أسماء الوحدات التي سيتم تطبيق المُكيّف عليها. إذا تم تحديد هذا، فسيتم استبدال الوحدات التي تحمل الأسماء المحددة فقط. عند تمرير نص، سيتم إجراء مطابقة باستخدام تعبير نمطي. عند تمرير قائمة من النصوص، سيتم إجراء مطابقة دقيقة أو يتم التحقق مما إذا كان اسم الوحدة ينتهي بأي من النصوص الممررة. إذا تم تحديده على أنه ‘all-linear’، فسيتم اختيار جميع وحدات linear/Conv1D، باستثناء طبقة الإخراج. إذا لم يتم تحديده، فسيتم اختيار الوحدات وفقًا لبنية النموذج. إذا لم تكن البنية معروفة، فسيتم رفع خطأ — في هذه الحالة، يجب عليك تحديد الوحدات المستهدفة يدويًا. - exclude_modules (
Optional[Union[List[str], str]]) — أسماء الوحدات التي لا يُطبَّق عليها المُكيّف. عند تمرير نص، يتم إجراء مطابقة باستخدام تعبير نمطي. عند تمرير قائمة من النصوص، يتم إجراء مطابقة دقيقة أو يُتحقق مما إذا كان اسم الوحدة ينتهي بأي من النصوص المُمرَّرة. - feedforward_modules (
Optional[Union[List[str], str]]) — أسماء الوحدات التي سيتم التعامل معها كوحود تقدّمية، كما في الورقة الأصلية. ستُضرب متجهات (IA)³ في مدخل هذه الوحدات، بدلاً من مخرجها. يجب أن يكونfeedforward_modulesاسماً أو مجموعة فرعية من الأسماء الموجودة فيtarget_modules. - fan_in_fan_out (
bool) — اضبط هذا على True إذا كانت الطبقة التي سيتم استبدالها تخزن الأوزان على شكل (fan_in, fan_out). على سبيل المثال، يستخدم gpt-2Conv1Dالذي يخزن الأوزان على شكل (fan_in, fan_out) وبالتالي يجب ضبط هذا علىTrue. - modules_to_save (
Optional[List[str]]) — قائمة بالوحدات، بخلاف طبقات (IA)³، التي يجب تعيينها قابلة للتدريب وحفظها في نقطة الفحص النهائية. - init_ia3_weights (
bool) — ما إذا كان سيتم تهيئة المتجهات في طبقات (IA)³، والافتراضي هوTrue. يُنصح بعدم تعيين هذا إلىFalse.
هذه هي فئة الإعدادات لتخزين إعدادات IA3Model.
IA3Model
فئة peft.IA3Model
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
المعاملات
- model (PreTrainedModel) — النموذج الذي سيتم تكييفه.
- config (IA3Config) — إعدادات نموذج (IA)^3.
- adapter_name (
str) — اسم المُكيّف، القيمة الافتراضية هي"default". - low_cpu_mem_usage (
bool,optional, defaults toFalse) — إنشاء أوزان مُكيّف فارغة على جهاز meta. مفيد لتسريع عملية التحميل.
يعيد
torch.nn.Module
نموذج (IA)^3.
ينشئ نموذج Infused Adapter by Inhibiting and Amplifying Inner Activations ((IA)^3) من نموذج transformers مُدرَّب مسبقًا. تم وصف الطريقة بالتفصيل في https://huggingface.co/papers/2205.05638
مثال:
>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import IA3Config, get_peft_model
>>> config = IA3Config(
... peft_type="IA3",
... task_type="SEQ_2_SEQ_LM",
... target_modules=["k", "v", "w0"],
... feedforward_modules=["w0"],
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = get_peft_model(model, config)الخصائص:
- model (PreTrainedModel) — النموذج الذي سيتم تكييفه.
- peft_config (IA3Config): إعدادات نموذج (IA)^3.
add_weighted_adapter
< source >( adapters: list[str]weights: list[float]adapter_name: str )
تضيف هذه الطريقة مُكيِّفًا جديدًا من خلال دمج المُكيِّفات المُعطاة مع الأوزان المُعطاة.