TRL documentation

مدرب KTO

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

مدرب KTO

All_models-KTO-blue

نظرة عامة

يدعم 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 دقيقة. يمكنك التحقق من تقدم التدريب عن طريق فحص مخطط المكافأة. يشير الاتجاه التصاعدي في هامش المكافأة إلى أن النموذج يتحسن ويولّد استجابات أفضل مع مرور الوقت.

kto qwen2 reward margin

لرؤية أداء النموذج المدرَّب، يمكنك استخدام 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 من الورقة) ) معرّفة على النحو التالي: LKTO(θ)=E(x,y) ⁣[w(y)(1−v(x,y))] \mathcal{L}_{\mathrm{KTO}}(\theta) = \mathbb{E}_{(x,y)}\!\left[ w(y)\Big(1 - v(x, y)\Big) \right]

حيث القيمة v(x,y) v(x, y) هي v(x,y)={σ ⁣(β(log⁡πθ(y∣x)πref(y∣x)−KL))if y is desirableσ ⁣(β(KL−log⁡πθ(y∣x)πref(y∣x)))if y is undesirable v(x, y) = \begin{cases} \sigma\!\left(\beta\big(\log\frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} - \mathrm{KL}\big)\right) & \text{if } y \text{ is desirable} \\ \sigma\!\left(\beta\big(\mathrm{KL} - \log\frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}\big)\right) & \text{if } y \text{ is undesirable} \end{cases}

هنا x x هو الأمر التوجيهي، y y هو الإكمال، πθ \pi_{\theta} هو نموذج السياسة قيد التدريب، πref \pi_{\mathrm{ref}} هو النموذج المرجعي، σ \sigma هو دالة سيجمويد، β>0 \beta > 0 يتحكم في الانحراف عن النموذج المرجعي، و KL \mathrm{KL} هو حد تباعد KL المقدر. الوزن w(y) w(y) هو 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: متوسط المكافأة الضمنية المحسوبة للإكمال المختار (المطلوب)، ويُحسب على النحو التالي βlog⁡πθ(y∣x)πref(y∣x) \beta \log \frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} .
  • rewards/rejected: متوسط المكافأة الضمنية المحسوبة للإكمال المرفوض (غير المرغوب فيه)، حيث يُحسب على النحو التالي βlog⁡πθ(y∣x)πref(y∣x) \beta \log \frac{\pi_{\theta}(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} .
  • 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 ×\times عدد الإيجابيات) إلى (undesirable_weight ×\times عدد السلبيات) ضمن النطاق من 1:1 إلى 4:3.

KTOTrainer

فئة trl.KTOTrainer

< >

( 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. يتم دعم نماذج اللغة السببية فقط.
  • 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()

تدريب

< >

( 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

كائن يحتوي على عدد الخطوات العالمية، وخسارة التدريب، والمقاييس.

نقطة الدخول الرئيسية للتدريب.

save_model

< >

( output_dir: str | None = None_internal_call: bool = False )

سيحفظ النموذج، بحيث يمكنك إعادة تحميله باستخدام from_pretrained().

سيتم الحفظ من العملية الرئيسية فقط.

push_to_hub

< >

( 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

< >

( 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 to False) — 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) المستخدمة. القيم الممكنة هي:
    • "kto": دالة خسارة KTO من ورقة KTO.
    • "apo_zero_unpaired": النسخة غير المزدوجة من خسارة APO-zero من ورقة APO.
  • 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") تتطلب أخذ عينات تسلسلي لأن إكمال تباعد كولينبو-ليفنبرغ لكل مثال محسوب مسبقاً مقابل جيرانه في دفعة بترتيب ثابت؛ أي استراتيجية أخرى تكسر هذا الاقتران.
Update on GitHub