TRL documentation
مدرب DPO
مدرب DPO
نظرة عامة
يدعم TRL مُدرّب تحسين التفضيلات المباشرة (DPO) لتدريب نماذج اللغة، كما هو موصوف في ورقة تحسين التفضيلات المباشرة: نموذج اللغة الخاص بك هو في الحقيقة نموذج مكافأة سرًّا من تأليف Rafael Rafailov، Archit Sharma، Eric Mitchell، Stefano Ermon، Christopher D. Manning، Chelsea Finn.
المستخلص من الورقة البحثية هو كالتالي:
في حين تتعلم نماذج اللغة غير المُشرَّفة واسعة النطاق (LMs) معرفةً عامةً عن العالم وبعض مهارات الاستدلال، فإن تحقيق تحكم دقيق في سلوكها أمرٌ صعب بسبب الطبيعة غير المُشرَّفة بالكامل لتدريبها. تجمع الأساليب الحالية لاكتساب هذه القابلية للتوجيه تسمياتٍ بشريةً لجودة المخرجات النسبية للنموذج، ثم تُعيد ضبط النموذج غير المُشرَّف (LM) ليتوافق مع هذه التفضيلات، وغالبًا باستخدام التعلم المعزز من التغذية الراجعة البشرية (RLHF). ومع ذلك، يُعد RLHF إجراءً معقدًا وغير مستقر في كثير من الأحيان، إذ يقوم أولًا بتهيئة نموذج مكافأة يعكس التفضيلات البشرية، ثم يُعيد ضبط النموذج غير المُشرَّف الكبير باستخدام التعلم المعزز لتعظيم هذه المكافأة المقدَّرة دون الابتعاد كثيرًا عن النموذج الأصلي. في هذه الورقة، نُقدّم ترميزًا جديدًا لنموذج المكافأة في RLHF يتيح استخراج السياسة المثلى المقابلة بشكلٍ مغلق، مما يسمح لنا بحل مشكلة RLHF القياسية باستخدام خسارة تصنيف بسيطة فقط. الخوارزمية الناتجة، التي نُسميها التحسين المباشر للتفضيلات (DPO)، مستقرة وفعالة وخفيفة الحساب، مما يلغي الحاجة إلى أخذ عينات من النموذج اللغوي (LM) أثناء إعادة الضبط أو إجراء ضبط كبير للمعاملات الفائقة. تُظهر تجاربنا أن DPO يمكنه إعادة ضبط نماذج اللغة (LMs) لتتوافق مع التفضيلات البشرية بقدر ما تفعله الأساليب الحالية أو بشكل أفضل. ومن اللافت للنظر أن إعادة الضبط باستخدام DPO يتفوق على RLHF القائم على PPO في القدرة على التحكم في المشاعر في المخرجات، ويتطابق مع جودة الردود أو يحسّنها في تلخيص النصوص والحوار أحادي الجولة، مع كونه أبسط بكثير من حيث التنفيذ والتدريب.
تمت مساهمة طريقة ما بعد التدريب هذه من قِبل Kashif Rasul ثم أعيدت هيكلتها لاحقاً من قِبل Quentin Gallouédec.
البدء السريع
يُظهر هذا المثال كيفية تدريب نموذج لغوي باستخدام DPOTrainer من TRL. نقوم بتدريب نموذج Qwen 3 0.6B على مجموعة بيانات UltraFeedback.
from trl import DPOTrainer
from datasets import load_dataset
trainer = DPOTrainer(
model="Qwen/Qwen3-0.6B",
train_dataset=load_dataset("trl-lib/ultrafeedback_binarized", split="train"),
)
trainer.train()نوع وتنسيق مجموعة البيانات المتوقع
يتطلب DPO مجموعة بيانات تفضيلات. يتوافق DPOTrainer مع كل من صيغ مجموعات البيانات المعيارية والمحادثة. عند تقديم مجموعة بيانات محادثة، سيطبّق المدرب قالب المحادثة على مجموعة البيانات تلقائيًا.
# Standard format
## Explicit prompt (recommended)
preference_example = {"prompt": "The sky is", "chosen": " blue.", "rejected": " green."}
# Implicit prompt
preference_example = {"chosen": "The sky is blue.", "rejected": "The sky is green."}
# Conversational format
## Explicit prompt (recommended)
preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
"chosen": [{"role": "assistant", "content": "It is blue."}],
"rejected": [{"role": "assistant", "content": "It is green."}]}
## Implicit prompt
preference_example = {"chosen": [{"role": "user", "content": "What color is the sky?"},
{"role": "assistant", "content": "It is blue."}],
"rejected": [{"role": "user", "content": "What color is the sky?"},
{"role": "assistant", "content": "It is green."}]}إذا لم يكن مجموعة بياناتك بأي من هذه الصيغ، يمكنك معالجتها مسبقًا لتحويلها إلى الصيغة المتوقعة. إليك مثال باستخدام مجموعة بيانات Vezora/Code-Preference-Pairs:
from datasets import load_dataset
dataset = load_dataset("Vezora/Code-Preference-Pairs")
def preprocess_function(example):
return {
"prompt": [{"role": "user", "content": example["input"]}],
"chosen": [{"role": "assistant", "content": example["accepted"]}],
"rejected": [{"role": "assistant", "content": example["rejected"]}],
}
dataset = dataset.map(preprocess_function, remove_columns=["instruction", "input", "accepted", "ID"])
print(next(iter(dataset["train"]))){
"prompt": [{"role": "user", "content": "Create a nested loop to print every combination of numbers [...]"}],
"chosen": [{"role": "assistant", "content": "Here is an example of a nested loop in Python [...]"}],
"rejected": [{"role": "assistant", "content": "Here is an example of a nested loop in Python [...]"}],
}النظر بعمق أكبر في طريقة DPO
تحسين التفضيلات المباشرة (DPO) هو أسلوب تدريب مصمم لمواءمة نموذج اللغة مع بيانات التفضيلات. بدلاً من أزواج المدخلات والمخرجات المُشرَّفة، يُدرَّب النموذج على أزواج من الإكمالات لنفس الموجه، حيث يُفضَّل أحد الإكمالات على الآخر. يهدف هذا الأسلوب إلى تحسين النموذج مباشرةً لتوسيع الهامش بين احتمالات السجل (log-likelihoods) للإكمالات المفضلة وغير المفضلة، مقارنةً بنموذج مرجعي، دون الحاجة إلى نموذج مكافأة صريح. عملياً، يُحقَّق ذلك عادةً عن طريق كبح احتمال الإكمالات غير المفضلة بدلاً من زيادة احتمال الإكمالات المفضلة.
تفصّل هذه القسم آلية عمل DPO عملياً، مع تغطية الخطوات الأساسية: المعالجة المسبقة وحساب الدالة الخاسرة.
المعالجة المسبقة والتجزئة
أثناء التدريب، يُتوقع أن يحتوي كل مثال على موجه (prompt) إلى جانب إكمال مفضل (chosen) وإكمال غير مفضل (rejected). لمزيد من التفاصيل حول الصيغ المتوقعة، راجع صيغ مجموعات البيانات.
يقوم DPOTrainer بتجزئة كل مدخل باستخدام مُجزّئ النموذج.
حساب الخسارة

يُعرَّف الدالة الخسارة المستخدمة في DPO على النحو التالي:
حيث هو الاستعلام، هو الإكمال المفضل و هو الإكمال غير المفضل. هو نموذج السياسة قيد التدريب، هو النموذج المرجعي، هو دالة سيجمويد، و هو معامل فائق يتحكم في قوة إشارة التفضيل.
أنواع الدالة
قُدِّمَت عدة صيغ للدالة الهدف في الأدبيات. في البداية، عُرِّفت دالة الهدف لـ DPO كما هو مبيَّن أعلاه.
loss_type= | الوصف |
|---|---|
"sigmoid" (الافتراضي) | بناءً على بيانات التفضيل، يمكننا ملاءمة مُصنِّف ثنائي وفقاً لنموذج برادلي-تيري، ويقترح مؤلفو DPO في الواقع استخدام خسارة سيجمويد على الاحتمال المعياري عبر logsigmoid لملاءمة انحدار لوجستي. |
"hinge" | يقترح مؤلفو RSO استخدام خسارة المفصلة (hinge loss) على الاحتمالية المعيارية من ورقة SLiC. في هذه الحالة، يكون beta هو مقلوب الهامش. |
"ipo" | يُجادل مؤلفو IPO بأن تحويل اللوغيت قد يؤدي إلى الإفراط في التخصيص، ويقترحون تحويل الهوية لتحسين التفضيلات مباشرةً؛ وتُتيح TRL ذلك عبر loss_type="ipo". |
"exo_pair" | يقترح مؤلفو EXO تحسين التفضيلات باستخدام KL العكسي. يجب أن يكون label_smoothing أكبر بصرامة من 0.0؛ والقيمة الموصى بها هي 1e-3 (انظر المعادلة 16 للمتغير الزوجي المبسّط). يستخدم المنهج الكامل K>2 من إكمالات SFT، ويقترب من PPO كلما زاد K. |
"nca_pair" | يُظهر مؤلفو NCA أن NCA يحسّن الاحتمالية المطلقة لكل استجابة بدلاً من الاحتمالية النسبية. |
"robust" | يقترح مؤلفو Robust DPO خسارة DPO غير منحازة في ظل تفضيلات ضجيجية. استخدم label_smoothing في DPOConfig لنمذجة احتمال قلب التسمية؛ القيم الصالحة تقع في المدى [0.0, 0.5). |
"bco_pair" | يدرّب مؤلفو BCO مصنفًا ثنائيًا تُستخدم قيمته اللوجستية (logit) كمكافأة، بحيث يُخضع المصنف أزواج {الموجّه، الإكمال المختار} إلى القيمة 1 وأزواج {الموجّه، الإكمال المرفوض} إلى القيمة 0. |
"sppo_hard" | يدّعي مؤلفو SPPO أن SPPO قادر على حل توازن ناش بشكل تكراري من خلال دفع المكافآت المختارة لتكون كبيرة قدر الإمكان حتى 1/2 والمكافآت المرفوضة لتكون صغيرة قدر الإمكان حتى -1/2، ويمكنه التخفيف من مشاكل ندرة البيانات. تقرب هذه الخوارزمية في التنفيذ من خلال استخدام احتمالات التسميات الصلبة، حيث تُسند القيمة 1 للفائز و0 للخاسر. |
"aot" أو loss_type="aot_unpaired" | يقترح مؤلفو AOT محاذاة التفضيلات التوزيعية عبر النقل الأمثل. يُستخدم loss_type="aot" للبيانات المزدوجة، بينما يُستخدم loss_type="aot_unpaired" للبيانات غير المزدوجة. كلاهما يفرض الهيمنة العشوائية عبر الكمات المرتبة، ويساهم حجم الدفعة الأكبر لكل وحدة معالجة رسومية في تحسين الأداء. |
"apo_zero" أو loss_type="apo_down" | تُقدّم طريقة APO هدفًا مُثبَّتًا. يعزّز apo_zero الفائزين ويقلّل وزن الخاسرين (مفيد عندما يكون أداء النموذج أقل من أداء الفائزين). يقلّل apo_down وزن كلاهما، مع ضغط أقوى على الخاسرين (مفيد عندما يتفوق النموذج بالفعل على الفائزين). |
"discopop" | يستخدم ورق DiscoPOP نماذج اللغة الكبيرة (LLMs) لاكتشاف خسائر تحسين التفضيلات غير المتصلة (offline) أكثر كفاءة. في الورقة، تفوقت خسارة DiscoPOP المقترحة (وهي خسارة مُعدَّلة بنسبة لوغاريتمية) على خسائر التحسين الأخرى في مهام مختلفة (توليد نصوص إيجابية من IMDb، وتلخيص TLDR من Reddit، وAlpaca Eval 2.0). |
"sft" | خسارة SFT (Supervised Fine-Tuning) هي خسارة الاحتمالية السالبة (negative log likelihood)، وتُستخدم لتدريب النموذج على توليد الردود المفضلة. |
"sigmoid_norm" | يعالج مؤلفو SimPO انحياز الطول في دالة الخسارة الأصلية من نوع سيجمويد من خلال التطبيع على عدد الرموز غير المقنّعة؛ وتتيح TRL ذلك عبر loss_type="sigmoid_norm". |
"udpo" | يقترح مؤلفو UDPO خسارة DPO غير منحازة في ظل تفضيلات ضجيجية، على عكس "robust"، حيث تبقى غير منحازة عندما يُقدَّر احتمال الانقلاب بشكل مفرط. استخدم label_smoothing في DPOConfig لضبط احتمال الانقلاب ε؛ والقيم الصالحة تقع ضمن المدى [0.0, 0.5). |
المقاييس المسجّلة
أثناء التدريب والتقييم، نسجّل المقاييس التالية:
global_step: إجمالي عدد خطوات المُحسِّن التي تم اتخاذها حتى الآن.epoch: رقم الحقبة الحالية، بناءً على تكرار مجموعة البيانات.num_tokens: إجمالي عدد الرموز التي تمت معالجتها حتى الآن.loss: متوسط خسارة DPO خلال فترة التسجيل الحالية.entropy: متوسط إنتروبيا توزيع الرموز المتوقعة من النموذج على الرموز غير المقنّعة.aux_loss: خسارة التوازن على الأحمال المساعدة لنموذج مزيج الخبراء، قبل أن تُضرب فيrouter_aux_loss_coefوتُضاف إلى الخسارة. تُسجَّل فقط عندما يكون النموذج من نوع MoE وrouter_aux_loss_coefغير صفري.mean_token_accuracy: نسبة الرموز غير المقنّعة التي تتطابق فيها التنبؤ الأول (top-1) للنموذج مع الرمز من الإكمال المختار.learning_rate: معدل التعلم الحالي، والذي قد يتغير ديناميكيًا إذا تم استخدام مُجدوِل.grad_norm: معيار L2 للتدرجات، يُحسب قبل اقتطاع التدرجات.logits/chosen: متوسط قيم اللوغيت التي يخصصها النموذج للرموز في الإكمال المختار.logits/rejected: متوسط قيم اللوغيت التي يخصصها النموذج للرموز في الإكمال المرفوض.logps/chosen: متوسط الاحتمال اللوغاريتمي الذي يسنده النموذج للرموز في الإكمال المختار.logps/rejected: متوسط الاحتمال اللوغاريتمي الذي يسنده النموذج للرموز في الإكمال المرفوض.rewards/chosen: متوسط المكافأة الضمنية المحسوبة للإكمال المختار، حيث يُحسب على النحو التالي .rewards/rejected: متوسط المكافأة الضمنية المحسوبة للإكمال المرفوض، حيث يُحسب على النحو التالي .rewards/margins: متوسط هامش المكافأة الضمني بين الإكمالات المختارة والمرفوضة.rewards/accuracies: نسبة الأمثلة التي يكون فيها المكافأة الضمنية للإكمال المختار أعلى من تلك الخاصة بالإكمال المرفوض.
التخصيص
التوافق والقيود
بعض تركيبات المعاملات مقيدة عمداً في تطبيق DPOTrainer الحالي:
use_weighting=Trueغير مدعوم معloss_type="aot"أوloss_type="aot_unpaired".- لا يتم دعم محولات 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(سواء للتدريب أو التقييم).
توليفات الخسارة المتعددة
يدعم مُدرّب DPO دمج دوال خسارة متعددة بأوزان مختلفة، مما يتيح استراتيجيات تحسين أكثر تعقيدًا. وهذا مفيد بشكل خاص لتنفيذ خوارزميات مثل MPO (تحسين التفضيل المختلط). يُعد MPO نهجًا للتدريب يجمع بين أهداف تحسين متعددة، كما هو موضح في ورقة Enhancing the Reasoning Ability of Multimodal Large Language Models via Mixed Preference Optimization.
لدمج عدة دوال خسارة، حدد أنواع الخسارة والأوزان المقابلة لها كقوائم:
# MPO: Combines DPO (sigmoid) for preference and BCO (bco_pair) for quality
training_args = DPOConfig(
loss_type=["sigmoid", "bco_pair", "sft"], # loss types to combine
loss_weights=[0.8, 0.2, 1.0] # corresponding weights, as used in the MPO paper
)تهيئة النموذج
يمكنك تمرير معاملات from_pretrained() مباشرة إلى DPOConfig. على سبيل المثال، إذا كنت ترغب في تحميل نموذج بدقة مختلفة، على غرار
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", dtype=torch.bfloat16)يمكنك القيام بذلك عن طريق تمرير الحجة model_init_kwargs={"dtype": torch.bfloat16} إلى DPOConfig.
from trl import DPOConfig
training_args = DPOConfig(
model_init_kwargs={"dtype": torch.bfloat16},
)لاحظ أن جميع معاملات الكلمات المفتاحية لـ from_pretrained() مدعومة.
تدريب المحوِّلات باستخدام PEFT
ندعم التكامل الوثيق مع مكتبة 🤗 PEFT، مما يتيح لأي مستخدم تدريب المحوِّلات (adapters) ومشاركتها على Hub بسهولة، بدلاً من تدريب النموذج بأكمله.
from datasets import load_dataset
from trl import DPOTrainer
from peft import LoraConfig
dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")
trainer = DPOTrainer(
"Qwen/Qwen3-0.6B",
train_dataset=dataset,
peft_config=LoraConfig(),
)
trainer.train()يمكنك أيضًا مواصلة تدريب PeftModel. لذلك، قم أولًا بتحميل PeftModel خارج DPOTrainer ثم مرّره مباشرةً إلى المدرب دون تمرير معامل peft_config.
from datasets import load_dataset
from trl import DPOTrainer
from peft import AutoPeftModelForCausalLM
model = AutoPeftModelForCausalLM.from_pretrained("trl-lib/Qwen3-4B-LoRA", is_trainable=True)
dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")
trainer = DPOTrainer(
model=model,
train_dataset=dataset,
)
trainer.train()عند تدريب المُكيِّفات (adapters)، تستخدم عادةً معدل تعلّم أعلى (≈1e‑5) مقارنةً بالتحسين الكامل (full fine-tuning)، لأن المعلمات الجديدة فقط هي التي يتم تعلّمها.
DPOConfig(learning_rate=1e-5, ...)
التجارب السريعة لـ DPO
RapidFire AI هو محرك تجارب مفتوح المصدر يعمل فوق TRL ويتيح لك إطلاق عدة تكوينات DPO في وقت واحد، حتى على وحدة معالجة رسومية واحدة. بدلاً من تجربة التكوينات بشكل تسلسلي، يتيح لك RapidFire رؤية منحنيات التعلم الخاصة بها جميعاً في وقت أبكر، وإيقاف التشغيلات ذات الأداء الضعيف، ونسخ الواعدة منها بإعدادات جديدة أثناء التنفيذ دون إعادة التشغيل. لمزيد من المعلومات، راجع تكامل RapidFire AI.
التدريب باستخدام Unsloth
يُعدّ Unsloth إطار عمل مفتوح المصدر للضبط الدقيق والتعلم المعزز، يدرّب نماذج اللغة الكبيرة (مثل Llama وMistral وGemma وDeepSeek وغيرها) بسرعة تصل إلى ضعف السرعة مع تقليل ذاكرة VRAM بنسبة تصل إلى 70%، مع توفير سير عمل مبسّط ومتوافق مع Hugging Face للتدريب والتقييم والنشر. لمزيد من المعلومات، راجع تكامل Unsloth.
استدعاء الأدوات مع DPO
يدعم DPOTrainer بشكل كامل ضبط نماذج تحتوي على قدرات tool calling. في هذه الحالة، يجب أن يتضمن كل مثال في مجموعة البيانات:
- رسائل المحادثة (الموجّه، والمختار، والمرفوض)، بما في ذلك أي استدعاءات للأدوات (
tool_calls) وردود الأدوات (رسائل الدورtool) - قائمة الأدوات المتاحة في عمود
tools، والتي تُقدَّم عادةً كمخططات JSON
لمزيد من التفاصيل حول بنية مجموعة البيانات المتوقعة، راجع قسم Dataset Format — Tool Calling.
تدريب نماذج اللغة البصرية
يدعم DPOTrainer بشكل كامل تدريب نماذج الرؤية واللغة (VLMs). لتدريب نموذج VLM، قدّم مجموعة بيانات تحتوي إما على عمود image (صورة واحدة لكل عينة) أو عمود images (قائمة من الصور لكل عينة). لمزيد من المعلومات حول بنية مجموعة البيانات المتوقعة، راجع قسم Dataset Format — Vision Dataset.
مثال على مثل هذه المجموعة هو مجموعة RLAIF-V Dataset.
from trl import DPOConfig, DPOTrainer
from datasets import load_dataset
trainer = DPOTrainer(
model="Qwen/Qwen2.5-VL-3B-Instruct",
args=DPOConfig(max_length=None),
train_dataset=load_dataset("HuggingFaceH4/rlaif-v_formatted", split="train"),
)
trainer.train()بالنسبة لنماذج الرؤية-اللغة (VLMs)، قد يؤدي التقصير إلى إزالة رموز الصور، مما يسبب أخطاء أثناء التدريب. لتجنب ذلك، اضبط
max_length=Noneفي DPOConfig. هذا يتيح للنموذج معالجة طول التسلسل الكامل دون تقصير رموز الصور.DPOConfig(max_length=None, ...)استخدم
max_lengthفقط بعد أن تتأكد من أن القصّ لن يُزيل رموز الصور في كامل مجموعة البيانات.
DPOTrainer
فئة trl.DPOTrainer
< source >( model: str | PreTrainedModel | PeftModelref_model: transformers.modeling_utils.PreTrainedModel | None = Noneargs: trl.trainer.dpo_config.DPOConfig | 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، أي حالة النموذج قبل بدء تدريب DPO.
- إذا تم توفيره، يُستخدم هذا النموذج مباشرةً كسياسة مرجعية. لا يمكن أن يكون
PeftModel. - إذا كانت
None، فسيستخدم المدرب تلقائيًا السياسة الأولية المقابلة لـmodel، أي حالة النموذج قبل بدء تدريب DPO.
- إذا تم توفيره، يُستخدم هذا النموذج مباشرةً كسياسة مرجعية. لا يمكن أن يكون
- args (DPOConfig، اختياري) —
إعدادات لهذا المدرب. إذا كانت
None، يتم استخدام إعداد افتراضي. - data_collator (
DataCollator، اختياري) — الدالة المستخدمة لتشكيل دفعة (batch) من قائمة عناصر مجموعة البياناتtrain_datasetأوeval_datasetبعد المعالجة. سيتم افتراضياً استخدامDataCollatorForPreferenceإذا كان النموذج نموذج لغة، وDataCollatorForVisionPreferenceإذا كان النموذج نموذج لغة-رؤية. يجب على دوال التجميع المخصصة تقصير التسلسلات قبل إضافة الحشو (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، فلن يتم تغليف النموذج.
Trainer for Direct Preference Optimization (DPO) method. This algorithm was initially proposed in the paper Direct Preference Optimization: Your Language Model is Secretly a Reward Model. This class is a wrapper around the Trainer class and inherits all of its attributes and methods.
مثال:
>>> from trl import DPOTrainer
>>> from datasets import load_dataset
>>> dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")
>>> trainer = DPOTrainer(
... 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 = Noneprivate: bool | None = None**kwargs )
المعاملات
- commit_message (
str، اختياري، الافتراضي"End of training") — الرسالة التي تُرسل عند الدفع. - blocking (
bool، اختياري، الافتراضيTrue) — ما إذا كان ينبغي للدالة أن تُرجع فقط بعد اكتمالgit push. - token (
str، اختياري، القيمة الافتراضيةNone) — رمز (Token) يملك صلاحية الكتابة لتجاوز الحجج الأصلية الخاصة بـ Trainer. - revision (
str، اختياري) — مراجعة git التي سيتم الالتزام منها. الافتراضي هو رأس فرع “main”. - private (
bool، اختياري) — ما إذا كان يجب جعل المستودع خاصًا عند إنشائه. القيمة الافتراضية هيargs.hub_private_repo. لا يكون له أي تأثير إذا كان المستودع موجودًا مسبقًا. - kwargs (
dict[str, Any]، اختياري) — معلمات إضافية تُمرَّر إلى~Trainer.create_model_card.
ارفع self.model وself.processing_class إلى مركز النماذج 🤗 في المستودع self.args.hub_model_id.
DPOConfig
فئة trl.DPOConfig
< 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 = Noneactivation_checkpointing: bool | None = Noneactivation_checkpointing_kwargs: dict[str, typing.Any] | str | 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 = 'random'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 = 1024truncation_mode: str = 'keep_start'padding_free: bool = Falsepad_to_multiple_of: int | str | None = 'auto'precompute_ref_log_probs: bool = Falseprecompute_ref_batch_size: int | None = Noneloss_type: list[str] = <factory>loss_weights: list[float] | None = Noneld_alpha: float | None = Nonef_divergence_type: str = 'reverse_kl'f_alpha_divergence_coef: float = 0.5label_smoothing: float = 0.0beta: float = 0.1use_weighting: bool = Falsediscopop_tau: float = 0.05activation_offloading: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512pad_token: str | None = None )
المعاملات التي تتحكم في النموذج
- model_init_kwargs (
dict[str, Any]، اختياري) — حجج الكلمات المفتاحية لـ from_pretrained، تُستخدم عندما يُقدَّم معاملmodelالخاص بـ DPOTrainer كنص. كما يُستخدم قيمة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من اليسار أو من اليمين اعتماداً علىtruncation_mode. إذا كانتNone، فلا يُطبَّق أي اقتطاع. - truncation_mode (
str، اختياري، القيمة الافتراضية"keep_start") — وضع الاقتطاع المستخدم عندما تتجاوز التسلسلmax_length. القيمة المدعومة الوحيدة هي"keep_start". قيمة"keep_end"لم تعد مدعومة وسيتم إزالتها في الإصدار v2.0.0. - padding_free (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم تنفيذ عمليات الأمامية (forward passes) دون حشو (padding) عن طريق تسطيح جميع التسلسلات في الدفعة (batch) إلى تسلسل مستمر واحد. يقلل هذا من استهلاك الذاكرة من خلال إزالة عبء الحشو. حاليًا، يتم دعم هذا فقط مع FlashAttention 2 أو 3، والتي يمكنها التعامل بكفاءة مع بنية الدفعة المسطحة. غير متاح مؤقتًا: منذ إعادة هيكلة DPO، يؤدي تعيينه إلىTrueإلى إصدار تحذير والعودة إلى الحشو القياسي. من المخطط عودته في تحديث مستقبلي. - 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 (
list[str]، اختياري، القيمة الافتراضية["sigmoid"]) — نوع الدالة الخاسرة (Loss) المستخدمة. القيم الممكنة هي:'sigmoid'،'hinge'،'ipo'،'exo_pair'،'nca_pair'،'robust'،'bco_pair'،'sppo_hard'،'aot'،'aot_unpaired'،'apo_zero'،'apo_down'،'discopop'،'sft'،'sigmoid_norm'،'udpo'. إذا تم تقديم أنواع خسارة متعددة، فسيتم دمجها باستخدام الأوزان المحددة فيloss_weights. - loss_weights (
list[float]، اختياري) — قائمة بأوزان الدالة الخاسرة (loss) للتراكيب متعددة الخسائر. يُستخدم عند دمج أنواع متعددة من الخسائر. مثال:[0.8, 0.2, 1.0]لـ MPO. إذا لم يُقدَّم، فإن القيمة الافتراضية هي أوزان متساوية (1.0) لجميع أنواع الخسائر. - ld_alpha (
float, اختياري) — معامل α من ورقة LD-DPO، والذي يتحكم في وزن احتمالات تسجيل الرموز المفصّلة في الردود. إذا كانNone، فلا يُطبَّق أي وزن على الجزء المفصّل، وتصبح الخسارة مكافئة لخسارة DPO القياسية. يجب أن يكون ضمن [0.0, 1.0]:ld_alpha=1.0لا يطبّق أي وزن، بينماld_alpha=0.0يخفي الرموز التي تتجاوز الأطوال المشتركة. - f_divergence_type (
str، اختياري، القيمة الافتراضية"reverse_kl") — منظّم f-divergence بين السياسة والمرجع (ورقة f-DPO). القيم الممكنة هي:reverse_kl(الافتراضي)،forward_kl،js_divergence،alpha_divergence. تدعم أنواع الخسارة المبنية على فرق المكافأة بين الاختيار المفضل وغير المفضل فقط قيمة غير افتراضية:'sigmoid'،'sigmoid_norm'،'hinge'،'ipo'،'exo_pair'،'robust'،'discopop'،'sft'،'udpo'. لا توجد تعميمات f-divergence صالحة لأنواع الخسارة الأخرى، ويتم رفضها عند استخدام قيمة غير افتراضية. - f_alpha_divergence_coef (
float، اختياري، القيمة الافتراضية0.5) — معامل α لمُنعّم α-divergence u^-α، يُستخدم فقط عندما يكونf_divergence_type='alpha_divergence'. - label_smoothing (
float, اختياري، القيمة الافتراضية0.0) — معامل تنعيم التسميات المستخدم في Robust DPO وUDPO وEXO. في Robust DPO وUDPO، يُفسَّر على أنه الاحتمال ε لأن يُقلب تسمية التفضيل، ويجب أن يقع في المجال [0.0, 0.5)؛ القيمة النموذجية الموصى بها في ورقة Robust DPO هي 0.1. يستخدم UDPO هذا المعامل لضبط a = ε / (1 - ε)، وتوصي ورقة UDPO بقيمة a = 0.8، أي ε = 4/9. في EXO، يتوافق هذا المعامل مع معامل تنعيم التسميات ε، وتوصي الورقة بقيمة نموذجية تبلغ 1e-3. - beta (
float، اختياري، القيمة الافتراضية0.1) — معامل يتحكم في مقدار الانحراف عن النموذج المرجعي. كلما زادت قيمة β قلّ الانحراف عن النموذج المرجعي. فيما يتعلق بخسارة IPO (loss_type='ipo')، فإن هذه القيمة هي معامل التنظيم المُشار إليه بـ τ في الورقة البحثية. - use_weighting (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم تطبيق وزن على شكل WPO لأزواج التفضيل باستخدام احتمالات التسلسل المعيارية حسب الطول للسياسة. - discopop_tau (
float، اختياري، القيمة الافتراضية0.05) — معامل τ/درجة الحرارة من ورقة DiscoPOP، والذي يتحكم في شكل خسارة نسبة اللوغاريتم المُعدَّلة عند استخدامloss_type='discopop'. توصي الورقة بالقيمة الافتراضيةdiscopop_tau=0.05. - 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.
معاملات غير مستخدمة
فئة التهيئة الخاصة بـ DPOTrainer.
تتضمن هذه الفئة فقط المعلمات الخاصة بتدريب DPO. للحصول على قائمة كاملة بحجج التدريب، يرجى الرجوع إلى توثيق TrainingArguments. لاحظ أن القيم الافتراضية في هذه الفئة قد تختلف عن تلك الموجودة في TrainingArguments.
باستخدام HfArgumentParser يمكننا تحويل هذه الفئة إلى حُجج argparse يمكن تحديدها على سطر الأوامر.
تتميز هذه المعلمات بقيم افتراضية مختلفة عن TrainingArguments:
logging_steps: القيمة الافتراضية هي10بدلاً من500.gradient_checkpointing: القيمة الافتراضية هيTrueبدلاً منFalse.bf16: القيمة الافتراضية هيTrueإذا لم يتم تعيينfp16، بدلاً منFalse.learning_rate: القيمة الافتراضية هي1e-6بدلاً من5e-5.