TRL documentation
مدرب KTO
مدرب KTO
نظرة عامة
يدعم TRL مُدرّب التحسين وفق نظرية الاحتمالات (KTO) لتدريب نماذج اللغة، كما هو موصوف في ورقة KTO: Model Alignment as Prospect Theoretic Optimization التي كتبها Kawin Ethayarajh، Winnie Xu، Niklas Muennighoff، Dan Jurafsky، Douwe Kiela.
المستخلص من الورقة البحثية هو كالتالي:
تخبرنا نظرية المنظور التي طوّرها كانيمان وتفرسكي أن البشر يدركون المتغيرات العشوائية بطريقة منحازة لكنها محددة بوضوح؛ فعلى سبيل المثال، يُعرف البشر بانحيازهم ضد الخسائر. نُظهر أن الأهداف المستخدمة لمواءمة نماذج اللغة الكبيرة مع ملاحظات البشر تتضمن ضمنياً العديد من هذه الانحيازات — ويمكن نسبُ نجاح هذه الأهداف (مثل DPO) على تقليل إنتروبيا التقاطع جزئياً إلى كونها دوال خسارة واعية بالبشر (HALOs). ومع ذلك، فإن دوال المنفعة التي تُسببها هذه الطرق إلى البشر لا تزال تختلف عن تلك الموجودة في أدبيات نظرية المنظور. باستخدام نموذج كانيمان-تفرسكي لمنفعة البشر، نقترح HALO يعظّم مباشرةً منفعة المخرجات بدلاً من تعظيم الاحتمال اللوغاريتمي للتفضيلات، كما تفعل الطرق الحالية. نسمّي هذا النهج تحسين كانيمان-تفرسكي (KTO)، وهو يطابق أداء الطرق القائمة على التفضيلات أو يتفوق عليه على نطاقات تتراوح من 1B إلى 30B. والأهم من ذلك، أن KTO لا يحتاج إلى تفضيلات — بل يكفي إشارة ثنائية حول ما إذا كان المخرج مرغوباً أم غير مرغوب لإدخال معين. وهذا يجعل استخدامه أسهل بكثير في العالم الحقيقي، حيث تكون بيانات التفضيلات شحيكة ومكلفة.
يمكن العثور على الكود الرسمي في ContextualAI/HALOs.
تمت مساهمة طريقة ما بعد التدريب هذه من قِبل Kashif Rasul وYounes Belkada وLewis Tunstall وPablo Vicente، ثم أعيدت هيكلتها لاحقاً بواسطة Albert Villanova del Moral.
البدء السريع
يُظهر هذا المثال كيفية تدريب نموذج باستخدام طريقة KTO. نستخدم نموذج Qwen 0.5B كنموذج أساسي. نستخدم بيانات التفضيل من KTO Mix 14k. يمكنك عرض البيانات في مجموعة البيانات هنا:
فيما يلي السكربت لتدريب النموذج:
# train_kto.py
from datasets import load_dataset
from trl import KTOConfig, KTOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
train_dataset = load_dataset("trl-lib/kto-mix-14k", split="train")
training_args = KTOConfig(output_dir="Qwen2-0.5B-KTO")
trainer = KTOTrainer(model=model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset)
trainer.train()نفّذ السكربت باستخدام الأمر التالي:
torchrun --nproc_per_node 8 train_kto.py
عند توزيع التدريب على 8 وحدات معالجة رسومية من نوع H100، يستغرق التدريب حوالي 30 دقيقة. يمكنك التحقق من تقدم التدريب عن طريق فحص مخطط المكافأة. يشير الاتجاه التصاعدي في هامش المكافأة إلى أن النموذج يتحسن ويولّد استجابات أفضل مع مرور الوقت.

لرؤية أداء النموذج المدرَّب، يمكنك استخدام Transformers Chat CLI.
$ transformers chat trl-lib/Qwen2-0.5B-KTO
<quentin_gallouedec>:
What is the best programming language?
<trl-lib/Qwen2-0.5B-KTO>:
The best programming language can vary depending on individual preferences, industry-specific requirements, technical skills, and familiarity with the specific use case or task. Here are some widely-used programming languages that have been noted as popular and widely used:
Here are some other factors to consider when choosing a programming language for a project:
1 JavaScript: JavaScript is at the heart of the web and can be used for building web applications, APIs, and interactive front-end applications like frameworks like React and Angular. It's similar to C, C++, and F# in syntax structure and is accessible and easy to learn, making it a popular choice for beginners and professionals alike.
2 Java: Known for its object-oriented programming (OOP) and support for Java 8 and .NET, Java is used for developing enterprise-level software applications, high-performance games, as well as mobile apps, game development, and desktop applications.
3 C++: Known for its flexibility and scalability, C++ offers comprehensive object-oriented programming and is a popular choice for high-performance computing and other technical fields. It's a powerful platform for building real-world applications and games at scale.
4 Python: Developed by Guido van Rossum in 1991, Python is a high-level, interpreted, and dynamically typed language known for its simplicity, readability, and versatility.
نوع وتنسيق مجموعة البيانات المتوقع
يتطلب KTO مجموعة بيانات تفضيلات غير مُزاوجة. أو يمكنك تقديم مجموعة بيانات تفضيلات مُزاوجة (المعروفة ببساطة باسم مجموعة بيانات التفضيلات). في هذه الحالة، سيقوم المدرب تلقائيًا بتحويلها إلى صيغة غير مُزاوجة عن طريق فصل الاستجابات المختارة والمستبعدة، مع إسناد label = True إلى الإكمالات المختارة وlabel = False إلى المستبعدة.
يتوافق KTOTrainer مع كلا من صيغ مجموعات البيانات المعيارية والمحادثة. عند تزويده بمجموعة بيانات محادثة، سيطبّق المدرب قالب المحادثة على مجموعة البيانات تلقائيًا.
# Standard format
unpaired_preference_example = {"prompt": "The sky is", "completion": " blue.", "label": True}
# Conversational format
unpaired_preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
"completion": [{"role": "assistant", "content": "It is blue."}],
"label": True}نظريًا، يجب أن يحتوي مجموعة البيانات على إكمال واحد على الأقل مقبول وإكمال واحد مرفوض. ومع ذلك، نجح بعض المستخدمين في تشغيل KTO باستخدام بيانات مقبولة فقط أو بيانات مرفوضة فقط. عند استخدام بيانات مرفوضة فقط، يُنصح بتبني معدل تعلم محافظ.
النظر بعمق أكبر في طريقة KTO
تُعدّ تحسين كانيمان-تفرسكي (KTO) طريقة تدريب مصممة لمواءمة نموذج لغوي باستخدام إشارة ثنائية فقط تشير إلى ما إذا كان المخرج مُفضَّلًا أو غير مُفضَّل لإدخال معيّن، بدلاً من أزواج من الإكمالات المفضّلة وغير المفضّلة. مستندةً إلى نظرية المنظور لكاهنيمان وتفرسكي، تُعرّف دالة خسارة واعية بالبشر (HALO) التي تعظّم مباشرةً فائدة المخرجات المولّدة، مع وزن الأمثلة المفضّلة وغير المفضّلة بشكل غير متماثل لتعكس ميول البشر لتجنّب الخسائر.
تفصّل هذه القسم كيفية عمل KTO عملياً، مع تغطية الخطوات الرئيسية: المعالجة المسبقة وحساب الدالة الخاسرة.
المعالجة المسبقة والتجزئة
أثناء التدريب، يُتوقع أن يحتوي كل مثال على موجه، وcompletion، وقيمة منطقية label تشير إلى ما إذا كان الإكمال مرغوبًا (True) أو غير مرغوب (False). لمزيد من التفاصيل حول الصيغ المتوقعة، راجع صيغ مجموعات البيانات.
يقوم KTOTrainer بتجزئة كل مدخل باستخدام مجزئة النموذج.
حساب الخسارة
يُقدَّر حد تباعد كولباك-ليبلر المستخدم في دالة خسارة KTO عن طريق إقران كل موجه (prompt) مع إكمال غير متطابق مستخرج من مكان آخر في الدفعة (batch). ولأسباب تتعلق بذلك، تتطلب أنواع الخسارة التي تُقدّر حد KL (جميعها باستثناء apo_zero_unpaired) حجم دفعة تدريب لكل جهاز أكبر من 1 واستراتيجية أخذ عينات تسلسلية، بحيث تكون الأزواج غير المتطابقة مستقرة عبر الدفعة.
الدالة الخاسرة المستخدمة في KTO (المعادلة 7 من الورقة) ) معرّفة على النحو التالي:
حيث القيمة هي
هنا هو الأمر التوجيهي، هو الإكمال، هو نموذج السياسة قيد التدريب، هو النموذج المرجعي، هو دالة سيجمويد، يتحكم في الانحراف عن النموذج المرجعي، و هو حد تباعد KL المقدر. الوزن هو desirable_weight لإكمالات مرغوبة و undesirable_weight لإكمالات غير مرغوبة، ويُستخدم لمعالجة عدم التوازن بين عدد الأمثلة المرغوبة وغير المرغوبة.
أنواع الدالة
loss_type= | الوصف |
|---|---|
"kto" (افتراضي) | خسارة KTO من ورقة KTO. وهي خسارة واعية بالبشر (HALO) تستند إلى نظرية المنظور لكاهنمان-تفرسكي، وتهدف إلى تعظيم المنفعة للإكمالات المرغوبة وتقليلها للإكمالات غير المرغوبة، مع استخدام حد تباعد KL المقدر كنقطة مرجعية. |
"apo_zero_unpaired" | النوع غير المزدوج لخسارة APO-zero من ورقة APO. يزيد هذا الخسارة من احتمال الاكتمالات المرغوبة ويقلل من احتمال الاكتمالات غير المرغوبة دون تقدير حد تباعد KL. استخدم هذه الخسارة عندما تعتقد أن الاكتمالات المرغوبة أفضل من المخرجات الافتراضية للنموذج. |
المقاييس المسجّلة
أثناء التدريب والتقييم، نسجّل المقاييس التالية:
global_step: إجمالي عدد خطوات المُحسِّن التي تم اتخاذها حتى الآن.epoch: رقم الحقبة الحالية، بناءً على تكرار مجموعة البيانات.num_tokens: إجمالي عدد الرموز التي تمت معالجتها حتى الآن.loss: متوسط خسارة KTO خلال فترة التسجيل الحالية.entropy: متوسط إنتروبيا توزيع الرموز المتوقعة من النموذج على الرموز غير المقنّعة.aux_loss: خسارة التوازن على الأحمال المساعدة لنموذج مزيج الخبراء، قبل أن تُضرب فيrouter_aux_loss_coefوتُضاف إلى الخسارة. تُسجَّل فقط عندما يكون النموذج من نوع MoE وrouter_aux_loss_coefغير صفري.kl: متوسط تباعد كوهلن-ليبلر (KL) المقدر بين نموذج السياسة ونموذج المرجع، ويُستخدم كنقطة مرجعية في دالة خسارة KTO.learning_rate: معدل التعلم الحالي، والذي قد يتغير ديناميكيًا إذا تم استخدام مُجدوِل.grad_norm: معيار L2 للتدرجات، يُحسب قبل اقتطاع التدرجات.logits/chosen: متوسط قيم اللوغيت التي يخصصها النموذج للرموز في الإكمال المختار (المُفضَّل).logits/rejected: متوسط قيم اللوغيت التي يخصصها النموذج للرموز في الإكمال المرفوض (غير المرغوب فيه).logps/chosen: متوسط الاحتمال اللوغاريتمي الذي يسنده النموذج للرموز في الإكمال المختار (المُفضَّل).logps/rejected: متوسط الاحتمال اللوغاريتمي الذي يسنده النموذج للرموز في الإكمال المرفوض (غير المرغوب فيه).rewards/chosen: متوسط المكافأة الضمنية المحسوبة للإكمال المختار (المطلوب)، ويُحسب على النحو التالي .rewards/rejected: متوسط المكافأة الضمنية المحسوبة للإكمال المرفوض (غير المرغوب فيه)، حيث يُحسب على النحو التالي .rewards/margins: متوسط هامش المكافأة الضمني بين الإكمالات المختارة والمرفوضة.
التخصيص
التوافق والقيود
بعض تركيبات المعاملات مقيدة عمداً في تطبيق KTOTrainer الحالي:
- لا يتم دعم محولات PEFT المستهدفة
lm_head(استخدمmodules_to_save=["lm_head"]بدلاً من ذلك). sync_ref_model=Trueغير مدعوم عند التدريب باستخدام نماذج PEFT التي لا تحتفظ بنموذج مرجعي مستقلref_model.- لا يمكن الجمع بين
sync_ref_model=Trueوprecompute_ref_log_probs=True. precompute_ref_log_probs=Trueغير مدعوم معIterableDataset(سواء للتدريب أو التقييم) أو مع مجموعات بيانات الرؤية.- تتطلب أنواع الخسارة التي تُقدّر حد تباعد كولباك-ليبلر (جميعها باستثناء
"apo_zero_unpaired") استخدامtrain_sampling_strategy="sequential"وحجم دفعة تدريب لكل جهاز أكبر من 1.
تهيئة النموذج
يمكنك تمرير معاملات from_pretrained() مباشرة إلى KTOConfig. على سبيل المثال، إذا كنت ترغب في تحميل نموذج بدقة مختلفة، على غرار
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct", dtype=torch.bfloat16)يمكنك القيام بذلك عن طريق تمرير الحجة model_init_kwargs={"dtype": torch.bfloat16} إلى KTOConfig.
from trl import KTOConfig
training_args = KTOConfig(
model_init_kwargs={"dtype": torch.bfloat16},
)لاحظ أن جميع معاملات الكلمات المفتاحية لـ from_pretrained() مدعومة.
تدريب المحوِّلات باستخدام PEFT
ندعم التكامل الوثيق مع مكتبة 🤗 PEFT، مما يتيح لأي مستخدم تدريب المحوِّلات (adapters) ومشاركتها على Hub بسهولة، بدلاً من تدريب النموذج بأكمله.
from datasets import load_dataset
from trl import KTOTrainer
from peft import LoraConfig
dataset = load_dataset("trl-lib/kto-mix-14k", split="train")
trainer = KTOTrainer(
"Qwen/Qwen2-0.5B-Instruct",
train_dataset=dataset,
peft_config=LoraConfig(),
)
trainer.train()يمكنك أيضًا مواصلة تدريب PeftModel. لذلك، قم أولًا بتحميل PeftModel خارج KTOTrainer ثم مرره مباشرةً إلى المدرب دون تمرير معامل peft_config.
عند تدريب المُكيِّفات (adapters)، تستخدم عادةً معدل تعلّم أعلى من الضبط الدقيق الكامل، لأن المعلمات الجديدة فقط هي التي يتم تعلّمها.
استدعاء الأدوات مع KTO
يدعم KTOTrainer بشكل كامل ضبط نماذج تحتوي على قدرات tool calling. في هذه الحالة، يجب أن يتضمن كل مثال في مجموعة البيانات:
- رسائل المحادثة (الموجّه والاستكمال)، بما في ذلك أي استدعاءات للأدوات (
tool_calls) وردود الأدوات (رسائل الدورtool) - قائمة الأدوات المتاحة في عمود
tools، والتي تُقدَّم عادةً كمخططات JSON
لمزيد من التفاصيل حول بنية مجموعة البيانات المتوقعة، راجع قسم Dataset Format — Tool Calling.
تدريب نماذج اللغة البصرية
يدعم KTOTrainer بشكل كامل تدريب نماذج الرؤية واللغة (VLMs). لتدريب نموذج VLM، قدّم مجموعة بيانات تحتوي إما على عمود image (صورة واحدة لكل عينة) أو عمود images (قائمة من الصور لكل عينة). لمزيد من المعلومات حول بنية مجموعة البيانات المتوقعة، راجع قسم Dataset Format — Vision Dataset.
from trl import KTOConfig, KTOTrainer
from datasets import load_dataset
trainer = KTOTrainer(
model="Qwen/Qwen2.5-VL-3B-Instruct",
args=KTOConfig(max_length=None),
train_dataset=load_dataset("trl-internal-testing/zen-image", "conversational_unpaired_preference", split="train"),
)
trainer.train()بالنسبة لنماذج الرؤية-اللغة (VLMs)، قد يؤدي التقصير إلى إزالة رموز الصور، مما يسبب أخطاء أثناء التدريب. لتجنب ذلك، اضبط
max_length=Noneفي KTOConfig. هذا يتيح للنموذج معالجة طول التسلسل الكامل دون تقصير رموز الصور.KTOConfig(max_length=None, ...)استخدم
max_lengthفقط بعد أن تتأكد من أن القصّ لن يُزيل رموز الصور في كامل مجموعة البيانات.
مثال على السكربت
نوفر سكربتًا مثالًا لتدريب نموذج باستخدام طريقة KTO. السكربت متاح في trl/scripts/kto.py
لاختبار سكريبت KTO مع نموذج Qwen2 0.5B على مجموعة بيانات UltraFeedback، نفّذ الأمر التالي:
torchrun --nproc_per_node 8 trl/scripts/kto.py \
--model_name_or_path Qwen/Qwen2-0.5B-Instruct \
--dataset_name trl-lib/kto-mix-14k \
--num_train_epochs 1 \
--output_dir Qwen2-0.5B-KTOنصائح للاستخدام
لنماذج مزيج الخبراء: تفعيل الخسارة المساعدة
تكون نماذج MOE الأكثر كفاءة عندما يكون الحمل موزّعاً بالتساوي تقريباً بين الخبراء.
ولضمان تدريب نماذج MOE بشكل مشابه أثناء ضبط التفضيلات، من المفيد إضافة الخسارة المساعدة من موازن الحمل إلى الخسارة النهائية.
تُفعَّل هذه الخيارات من خلال تعيين output_router_logits=True في إعدادات النموذج (مثل MixtralConfig).
ولتحديد مقدار مساهمة الخسارة المساعدة في الخسارة الإجمالية، استخدم معامل الضبط router_aux_loss_coef=... (الافتراضي: 0.001) في إعدادات النموذج.
توصيات حجم الدفعة
استخدم حجم دفعة لكل خطوة لا يقل عن 4، وحجم دفعة فعّال يتراوح بين 16 و128. حتى لو كان حجم الدفعة الفعّال لديك كبيراً، فإن حجم الدفعة لكل خطوة الضعيف سيؤدي إلى تقدير ضعيف لـ KL في KTO.
توصيات معدل التعلم
لكل اختيار لـ beta حد أقصى لمعدل التعلم يمكن تحمّله قبل أن تتدهور أداء التعلم. بالنسبة للإعداد الافتراضي beta = 0.1، يجب ألا يتجاوز معدل التعلم عادةً 1e-6 لمعظم النماذج. ومع انخفاض قيمة beta، ينبغي خفض معدل التعلم بشكل متناسب. بشكل عام، نوصي بشدة بإبقاء معدل التعلم بين 5e-7 و5e-6. حتى مع مجموعات البيانات الصغيرة، نوصي بعدم استخدام معدل تعلم خارج هذا النطاق. وبدلاً من ذلك، اختر عددًا أكبر من الفترات (epochs) لتحقيق نتائج أفضل.
بيانات غير متوازنة
المتغيران desirable_weight و undesirable_weight في KTOConfig يشيران إلى الأوزان المخصصة لخسائر الأمثلة المرغوبة/الإيجابية وغير المرغوبة/السلبية.
افتراضيًا، كلاهما يساوي 1. ومع ذلك، إذا كان لديك عدد أكبر من أحد النوعين، فيجب عليك زيادة وزن النوع الأقل شيوعًا بحيث يكون نسبة (desirable_weight عدد الإيجابيات) إلى (undesirable_weight عدد السلبيات) ضمن النطاق من 1:1 إلى 4:3.
KTOTrainer
فئة trl.KTOTrainer
< source >( model: str | PreTrainedModel | PeftModelref_model: transformers.modeling_utils.PreTrainedModel | None = Noneargs: trl.trainer.kto_config.KTOConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | datasets.dataset_dict.DatasetDict | datasets.dataset_dict.IterableDatasetDict | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)quantization_config: BitsAndBytesConfig | None = Nonepeft_config: PeftConfig | None = None )
المعاملات
- model (
strأو PreTrainedModel أو PeftModel) — النموذج المراد تدريبه. يمكن أن يكون أحد ما يلي:- سلسلة نصية، تكون معرف النموذج لنموذج مُدرَّب مسبقًا مستضاف داخل مستودع نماذج على huggingface.co، أو مسارًا إلى مجلد يحتوي على أوزان النموذج المحفوظة باستخدام save_pretrained، مثل
'./my_model_directory/'. يتم تحميل النموذج باستخدام<ModelArchitecture>.from_pretrained(حيث يُشتق<ModelArchitecture>من إعدادات النموذج) مع الحُجج المُسمّاة الموجودة فيargs.model_init_kwargs. إذا لم يُحددdtypeفيargs.model_init_kwargs، فإن القيمة الافتراضية هيfloat32. وهذا يختلف عن from_pretrained، حيث (منذ Transformers v5) يُستنتج نوع البيانات من إعدادات النموذج. - كائن PreTrainedModel. يتم دعم نماذج اللغة السببية فقط.
- كائن PeftModel. يتم دعم نماذج اللغة السببية فقط.
- سلسلة نصية، تكون معرف النموذج لنموذج مُدرَّب مسبقًا مستضاف داخل مستودع نماذج على huggingface.co، أو مسارًا إلى مجلد يحتوي على أوزان النموذج المحفوظة باستخدام save_pretrained، مثل
- ref_model (PreTrainedModel, اختياري) —
نموذج مرجعي يُستخدم لحساب الاحتمالات اللوغاريتمية المرجعية. إذا تم توفيره، يُستخدم هذا النموذج مباشرةً كسياسة مرجعية. لا يمكن أن يكون PeftModel. إذا كان None، فسيستخدم المدرب تلقائيًا السياسة الأولية المقابلة لـ model، أي حالة النموذج قبل بدء تدريب KTO.
- إذا تم توفيره، يُستخدم هذا النموذج مباشرةً كسياسة مرجعية. لا يمكن أن يكون PeftModel.
- إذا كانت
None، فسيستخدم المدرب تلقائيًا السياسة الأولية المقابلة لـmodel، أي حالة النموذج قبل بدء تدريب KTO.
- args (KTOConfig، اختياري) —
إعدادات لهذا المدرب. إذا كانت
None، يتم استخدام إعداد افتراضي. - data_collator (
DataCollator، اختياري) — الدالة المستخدمة لتشكيل دفعة (batch) من قائمة عناصر مجموعة البياناتtrain_datasetأوeval_datasetبعد المعالجة. سيتم افتراضDataCollatorForUnpairedPreferenceإذا كان النموذج نموذج لغة، وDataCollatorForVisionUnpairedPreferenceإذا كان النموذج نموذج لغة-رؤية. يجب على مُجمِّعات (collators) مخصصة أن تقصّ التسلسلات قبل إضافة الحشو (padding)؛ إذ لا يطبّق المدرب أيّ تقصٍّ بعد التجميع. - train_dataset (Dataset أو IterableDataset) —
مجموعة البيانات المستخدمة للتدريب. يدعم هذا المدرب التفضيلات غير المزدوجة النوع. يمكن أن يكون تنسيق العينات إما:
عندما يكون
train_datasetمن نوع IterableDataset (مثل مجموعة بيانات التدفق)، يجب تعيينmax_stepsفي حُجج التدريب، لأن طولها لا يمكن استنتاجه، ويُطلب تحديد إجمالي عدد خطوات التدريب لتحديد نطاق حلقة التدريب وإعداد مجدول معدل التعلم. - eval_dataset (Dataset أو IterableDataset أو DatasetDict أو IterableDatasetDict أو
dict[str, Dataset | IterableDataset]) — مجموعة البيانات المستخدمة للتقييم. يجب أن تستوفي نفس المتطلبات التي تستوفيهاtrain_dataset. - processing_class (PreTrainedTokenizerBase أو ProcessorMixin، اختياري) —
فئة المعالجة المستخدمة لمعالجة البيانات. يجب ضبط جانب الحشو على “يسار”. إذا كانت
None، يتم تحميل فئة المعالجة من اسم النموذج باستخدام from_pretrained. يجب ضبط رمز الحشو،tokenizer.pad_token. إذا لم تضبط فئة المعالجة رمز الحشو، سيتم استخدامtokenizer.eos_tokenكقيمة افتراضية. - compute_metrics (
Callable[[EvalPrediction], dict]، اختياري) — الدالة التي ستُستخدم لحساب المقاييس أثناء التقييم. يجب أن تستقبل EvalPrediction وتعيد قاموسًا من السلاسل النصية إلى قيم المقاييس. عند تمرير SFTConfig مع ضبطbatch_eval_metricsعلىTrue، يجب أن تستقبل دالةcompute_metricsالخاصة بك معاملًا من نوعcompute_resultمن النوع المنطقي. سيُستدعى هذا بعد آخر دفعة تقييم للإشارة إلى أن الدالة بحاجة إلى حساب وإحصاءات الملخص العامة وإعادتها بدلاً من تراكم إحصاءات مستوى الدفعة. القيم اللوجستية التي تستقبلها تُعاد حسابها عبر تمريرة أمامية إضافية. هذا الأمر غير مدعوم وسيُزال في الإصدار v2.0.0. - callbacks (قائمة من TrainerCallback, اختياري) —
قائمة من استدعاءات المراجعة (callbacks) لتخصيص حلقة التدريب. ستُضاف هذه الاستدعاءات إلى قائمة استدعاءات المراجعة الافتراضية المفصّلة هنا.
إذا كنت ترغب في إزالة أحد المراجعات الافتراضية المستخدمة، فاستخدم طريقة remove_callback.
- optimizers (
tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None]، اختياري، القيمة الافتراضية(None, None)) — مجموعة (tuple) تحتوي على المُحسِّن (optimizer) والمُجدوِل (scheduler) المطلوبين للاستخدام. ستكون القيمة الافتراضية هي نسخة منAdamWعلى النموذج الخاص بك، مع مُجدوِل يُحدده get_linear_schedule_with_warmup ويُتحكم به عبرargs. - quantization_config (BitsAndBytesConfig، اختياري) —
إعدادات التكميم المستخدمة عند تحميل النموذج من معرّف النموذج. ادمجها مع
peft_configلتدريب QLoRA. يتم تجاهلها إذا كان النموذج مُنشأً بالفعل. - peft_config (PeftConfig، اختياري) —
إعدادات PEFT المستخدمة لتغليف النموذج. إذا كانت
None، فلن يتم تغليف النموذج.
مدرب لطريقة التحسين وفق نظرية كاهنمان-تفرسكي (KTO). تم اقتراح هذا الخوارزمية في الأصل في ورقة KTO: Model Alignment as Prospect Theoretic Optimization. هذه الفئة هي غلاف حول فئة Trainer وتورث جميع خصائصها وطرقها.
مثال:
>>> from trl import KTOTrainer
>>> from datasets import load_dataset
>>> dataset = load_dataset("trl-lib/kto-mix-14k", split="train")
>>> trainer = KTOTrainer(
... model="Qwen/Qwen2.5-0.5B-Instruct",
... train_dataset=dataset,
... )
>>> trainer.train()تدريب
< source >( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput
المعاملات
- resume_from_checkpoint (
strأوbool، اختياري) — إذا كانstr، فهو المسار المحلي لنقطة تفتيش محفوظة بواسطة نسخة سابقة منTrainer. وإذا كانboolويساويTrue، يتم تحميل آخر نقطة تفتيش في args.output_dir كما حفظتها نسخة سابقة منTrainer. إذا كانت موجودة، فسيستأنف التدريب من حالات النموذج/المُحسِّن/المُجدوِل المحمَّلة هنا. - trial (
optuna.Trialأوdict[str, Any]، اختياري) — التجربة أو قاموس المعاملات الفائقة للبحث في المعاملات الفائقة. - ignore_keys_for_eval (
list[str]، اختياري) — قائمة بالمفاتيح في مخرجات النموذج الخاص بك (إذا كان قاموسًا) التي يجب تجاهلها عند جمع التوقعات للتقييم أثناء التدريب.
يعيد
~trainer_utils.TrainOutput
كائن يحتوي على عدد الخطوات العالمية، وخسارة التدريب، والمقاييس.
نقطة الدخول الرئيسية للتدريب.
سيحفظ النموذج، بحيث يمكنك إعادة تحميله باستخدام from_pretrained().
سيتم الحفظ من العملية الرئيسية فقط.
push_to_hub
< source >( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = None**kwargs )
المعاملات
- commit_message (
str، اختياري، الافتراضي"End of training") — الرسالة التي تُرسل عند الدفع. - blocking (
bool، اختياري، الافتراضيTrue) — ما إذا كان ينبغي للدالة أن تُرجع فقط بعد اكتمالgit push. - token (
str، اختياري، القيمة الافتراضيةNone) — رمز (Token) يملك صلاحية الكتابة لتجاوز الحجج الأصلية الخاصة بـ Trainer. - revision (
str، اختياري) — مراجعة git التي سيتم الالتزام منها. الافتراضي هو رأس فرع “main”. - kwargs (
dict[str, Any]، اختياري) — معلمات إضافية تُمرَّر إلى~Trainer.create_model_card.
ارفع self.model وself.processing_class إلى مركز النماذج 🤗 في المستودع self.args.hub_model_id.
KTOConfig
فئة trl.KTOConfig
< source >( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 10logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Falserestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool = Truelabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'sequential'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonedisable_dropout: bool = Truedataset_num_proc: int | None = Nonemax_length: int | None = 1024pad_to_multiple_of: int | str | None = 'auto'precompute_ref_log_probs: bool = Falseprecompute_ref_batch_size: int | None = Noneloss_type: str = 'kto'beta: float = 0.1desirable_weight: float = 1.0undesirable_weight: float = 1.0activation_offloading: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512 )
المعاملات التي تتحكم في النموذج
- model_init_kwargs (
dict[str, Any]، اختياري) — حجج الكلمات المفتاحية لـ from_pretrained، تُستخدم عندما يُقدَّم معاملmodelالخاص بـ KTOTrainer كنص. كما يُستخدم قيمةrevisionعند تحميل فئة المعالجة. - trust_remote_code (
bool, optional, defaults toFalse) — Whether to allow loading models and tokenizers that ship custom Python code from the Hub. Forwarded to from_pretrained and from_pretrained. - router_aux_loss_coef (
float, اختياري) — معامل خسارة التوازن على الأحمال المساعدة لنماذج مزيج الخبراء (MoE)، تُضاف إلى خسارة التدريب بهذا الوزن. عند عدم تعيينه، يُستخدم القيمة المُعلنة في إعدادات النموذج. عيّن0.0لتعطيله. يفشل عند استخدامه مع نموذج غير MoE. - disable_dropout (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان سيتم تعطيل إسقاط العينة (dropout) في النموذج ونموذج المرجع.
المعاملات التي تتحكم في معالجة البيانات المسبقة
- dataset_num_proc (
int، اختياري) — عدد العمليات المستخدمة لمعالجة مجموعة البيانات. - max_length (
intأوNone، اختياري، القيمة الافتراضية1024) — الحد الأقصى لطول التسلسل المُرمَّز. يتم اقتطاع التسلسلات الأطول منmax_lengthمن اليمين. إذا كانتNone، فلا يُطبَّق أي اقتطاع. - pad_to_multiple_of (
intأوstr، اختياري، القيمة الافتراضية"auto") — إذا تم ضبطه، فسيتم ملء التسلسلات حتى تكون مضاعفاً لهذه القيمة."auto"يملأ حتى مضاعف 128 على Neuron (AWS Trainium)، الذي يُجمَّع مرة واحدة لكل شكل إدخال، ولا يملأ في أي مكان آخر. - precompute_ref_log_probs (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب حساب احتمالات السجل (log probabilities) لنموذج المرجع مسبقًا لمجموعة بيانات التدريب بأكملها قبل بدء التدريب. يتيح ذلك توفير الذاكرة أثناء التدريب، حيث لا حاجة إلى إبقاء نموذج المرجع في الذاكرة. - precompute_ref_batch_size (
int, اختياري) — حجم الدفعة المستخدمة عند حساب احتمالات السجل النموذج المرجعي مسبقًا. يمكن ضبط هذا الحجم ليكون أعلى من حجم دفعة التدريب لتسريع المعالجة المسبقة. إذا كانNone، فإن القيمة الافتراضية هيper_device_train_batch_sizeللتدريب وper_device_eval_batch_sizeللتقييم.
المعاملات التي تتحكم في التدريب
- loss_type (
str, اختياري, الافتراضي هو"kto") — نوع الدالة الخاسرة (loss) المستخدمة. القيم الممكنة هي: - beta (
float، اختياري، القيمة الافتراضية0.1) — معامل يتحكم في مقدار الانحراف عن النموذج المرجعي. كلما زادت قيمة β، قلّ الانحراف عن النموذج المرجعي. - desirable_weight (
float، اختياري، القيمة الافتراضية1.0) — تُوزَّن الخسائر المرغوبة بهذا العامل لموازنة عدم تساوي عدد الأزواج المرغوبة وغير المرغوبة. - undesirable_weight (
float، اختياري، القيمة الافتراضية1.0) — تُوزن الخسائر غير المرغوبة بهذا العامل لموازنة عدم تساوي عدد الأزواج المرغوبة وغير المرغوبة. - activation_offloading (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم نقل التفعيلات إلى وحدة المعالجة المركزية (CPU). - sync_ref_model (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم مزامنة النموذج المرجعي مع النموذج النشط كلref_model_sync_stepsخطوات، باستخدام المعاملref_model_mixup_alpha. تنبع هذه المزامنة من ورقة TR-DPO. لا يتوافقsync_ref_model=Trueبعد مع PEFT أوprecompute_ref_log_probs=True. - ref_model_mixup_alpha (
float، اختياري، القيمة الافتراضية0.6) — معامل α من ورقة TR-DPO، والذي يتحكم في المزج بين السياسة الحالية والسياسة المرجعية السابقة أثناء التحديثات. يتم تحديث السياسة المرجعية وفقًا للمعادلة:π_ref = α * π_θ + (1 - α) * π_ref_prev. لاستخدام هذا المعامل، يجب عليك تعيينsync_ref_model=True. - ref_model_sync_steps (
int، اختياري، القيمة الافتراضية512) — معامل τ من ورقة TR-DPO، والذي يحدد مدى تكرار مزامنة السياسة الحالية مع السياسة المرجعية. لاستخدام هذا المعامل، يجب إعدادsync_ref_model=True.
فئة التهيئة الخاصة بـ KTOTrainer.
تتضمن هذه الفئة فقط المعلمات الخاصة بتدريب KTO. للحصول على قائمة كاملة بحجج التدريب، يرجى الرجوع إلى توثيق TrainingArguments. لاحظ أن القيم الافتراضية في هذه الفئة قد تختلف عن تلك الموجودة في TrainingArguments.
باستخدام HfArgumentParser يمكننا تحويل هذه الفئة إلى حُجج argparse يمكن تحديدها على سطر الأوامر.
تتميز هذه المعلمات بقيم افتراضية مختلفة عن TrainingArguments:
logging_steps: القيمة الافتراضية هي10بدلاً من500.gradient_checkpointing: القيمة الافتراضية هيTrueبدلاً منFalse.bf16: القيمة الافتراضية هيTrueإذا لم يتم تعيينfp16، بدلاً منFalse.learning_rate: القيمة الافتراضية هي1e-6بدلاً من5e-5.train_sampling_strategy: القيمة الافتراضية هي"sequential"بدلاً من"random". أنواع الخسارة التي تقدر حد تباعد كولينبو-ليفنبرغ (جميعها باستثناء"apo_zero_unpaired") تتطلب أخذ عينات تسلسلي لأن إكمال تباعد كولينبو-ليفنبرغ لكل مثال محسوب مسبقاً مقابل جيرانه في دفعة بترتيب ثابت؛ أي استراتيجية أخرى تكسر هذا الاقتران.