أصبحت نماذج لغة الرؤية (VLMs) أقوى، ولكن محاذاة لهم لتفضيلات الإنسان لا يزال يهم. في TRL، أظهرنا بالفعل كيفية تدريب VLMs بعد ذلك الضبط الدقيق الخاضع للإشراف (SFT) و تحسين التفضيل المباشر (DPO). هذه المرة، نحن نذهب أبعد من ذلك.
ليرة تركية ؛ د إليك الجديد في TRL:
- تحسين التفضيلات المختلطة (MPO)
- تحسين السياسة النسبية للمجموعة (GRPO)
- تحسين سياسة تسلسل المجموعة (GSPO) (البديل من GRPO)
تتجاوز هذه الأمور DPO الزوجية، حيث تستخرج إشارات أكثر ثراءً من بيانات التفضيلات وتتوسع بشكل أفضل باستخدام VLMs الحديثة.
لقد قمنا أيضًا بتوسيع الأساليب الحالية لدعم VLMs:
- تعزيز ترك واحد (RLOO)
- تحسين التفضيلات المباشرة عبر الإنترنت (DPO عبر الإنترنت)
وهذا يتيح محاذاة متعددة الوسائط أكثر كفاءة وقابلة للتطوير.
أخيراً:
- دعم الضبط الدقيق الخاضع للإشراف الأصلي لنماذج لغة الرؤية
- البرامج النصية للتدريب والدفاتر التجريبية لمساعدتك على البدء بسرعة
جدول المحتويات
محاذاة لنماذج لغة الرؤية
تقليديًا، يمكنك استخدام نموذج أساسي، وتطبيق SFT لاتباع التعليمات، ثم تطبيق DPO لمواءمته مع البيانات التفضيلية. في السابق، قمنا بتكييف هذا النهج مع نماذج لغة الرؤية (VLMs) وتحققنا من صحته على IDEFICS2، مما أظهر تحسنًا في استجابات النماذج.
يعمل DPO عن طريق تحسين التفضيلات بين أزواج استجابات النماذج باستخدام الخسارة المتباينة: لديك إجابة مختارة وإجابة مرفوضة وتقوم بتحسين تفضيلاتك بناءً على ما تريده وما لا تريده.
ولكن في العام الماضي، اكتسبت طرق المحاذاة متعددة الوسائط الجديدة شعبية، GRPO وMPO، والتي يمكنها دفع أداء VLM إلى أبعد من ذلك. في نهاية مشاركة المدونة، يمكنك العثور على جدول يوضح الاختلافات بين استجابات النماذج.
تحسين التفضيلات المختلطة (MPO)
إن محاذاة النماذج متعددة الوسائط مع SFT للقيام بمهام التفكير غير كافية بسبب تحول التوزيع. وفي الوقت نفسه، تفشل النماذج المتوافقة مع DPO في توليد مبررات منطقية متماسكة وقد تولد استجابات متكررة. لمعالجة هذه المشكلة، هناك تقنية جديدة تسمى تحسين التفضيلات المختلطة (MPO) المصممة خصيصًا للنماذج متعددة الوسائط. تعد هذه الطريقة في الأساس امتدادًا لـ DPO مع خسائر متعددة: فقدان التفضيل من DPO (السيني)، وفقدان الجودة من تحسين المصنف الثنائي (BCO)، وفقدان التوليد من SFT. وفقًا للورقة البحثية، فإن مجرد التحول إلى هذه الخسارة المجمعة يؤدي إلى تحسن بمقدار 6.2 نقطة في MathVista!
وبما أن هذا لا يؤدي إلا إلى تعديل الخسارة، فقد أضفنا دعم الخسارة المجمعة إلى TRL DPOTrainer فصل. لاستخدامه، يمكنك تهيئة DPOConfig على النحو التالي:
mpo_config = DPOConfig(
loss_type=["sigmoid", "bco_pair", "sft"],
loss_weights=[0.8, 0.2, 1.0],
)
ثم قم بتهيئة DPOTrainer:
mpo_trainer = DPOTrainer(
model=model_id,
args=mpo_config,
processing_class=tokenizer,
train_dataset=dataset,
)
mpo_trainer.train()
وهذا كل شيء! إذا كنت ترغب في استكشاف المزيد، يمكنك العثور على مثال كامل للدفتر هنا.
تحسين السياسة النسبية للمجموعة متعددة الوسائط (GRPO)
يعد تحسين السياسة النسبية للمجموعة (GRPO) طريقة محاذاة متطورة تم تقديمها في البداية في ورقة DeepSeek Math ثم تم دمجها لاحقًا في DeepSeek R1، وهو برنامج LLM الرائد. إنها إضافة إلى PPO حيث يتم إجراء تحديثات السياسة عبر مجموعات (دفعات من المسارات التي تمثل كيفية بدء الحوار). هذه الميزة تجعلها أكثر قوة لمكافأة الضوضاء، حيث أن متوسط الضوضاء يقع داخل المجموعات. نظرًا لأن النموذج يتعلم إحساسًا أوسع بالاستجابة الجيدة بدلاً من عينات المكافأة العالية الفردية، فإن هذه الطريقة أيضًا تجعل النموذج عالي الأداء.

في TRL، نقدم الآن دعم GRPO لنماذج لغة الرؤية. لن نقدم مثالاً لبرنامج نصي تدريبي كامل، حيث يمكنك العثور عليه في دفتر الملاحظات. وبدلاً من ذلك، سنركز على تسليط الضوء على المكونات والمفاهيم الأساسية.
لكي يعمل البرنامج النصي التدريبي بفعالية، نحتاج إلى التحقق من صحة تنسيق الإجابة وأن الحل نفسه قريب من الأجزاء المكتملة، لذلك نكتب وظيفتين للمكافأة. من أجل رؤية التحسينات حقًا في المكافأة الأخيرة، ستحتاج إلى إعداد متطرف إلى حد ما، حيث يكون لديك نماذج أكبر نسبيًا، والكثير من الأجيال، ومجموعة بيانات متنوعة وعالية الجودة.
import re
from math_verify import LatexExtractionConfig, parse, verify
def format_reward(completions, **kwargs):
"""Reward function that checks if the completion has a specific format."""
pattern = r"^<think>.*?</think>\s*<answer>.*?</answer>$"
matches = [re.match(pattern, content) for content in completions]
rewards_list = [1.0 if match else 0.0 for match in matches]
rewards = [1.0 if match else 0.0 for match in matches]
print(completions)
print(rewards)
return rewards
def accuracy_reward(completions, **kwargs):
"""Reward function that checks if the completion is the same as the ground truth."""
solutions = kwargs['solution']
completion_contents = [completion[0]["content"] for completion in completions]
rewards = []
for content, solution in zip(completion_contents, solutions):
gold_parsed = parse(solution, extraction_mode="first_match", extraction_config=[LatexExtractionConfig()])
answer_parsed = parse(content, extraction_mode="first_match", extraction_config=[LatexExtractionConfig()])
if len(gold_parsed) != 0:
try:
rewards.append(float(verify(answer_parsed, gold_parsed)))
except Exception:
rewards.append(0.0)
else:
rewards.append(1.0)
return rewards
بعد ذلك، يمكنك تهيئة GRPOConfig وGRPOtrainer، وتمرير وظائف المكافأة التي حددناها أعلاه واستدعاء Train() لبدء التدريب.
from trl import GRPOConfig, GRPOTrainer
training_args = GRPOConfig(
learning_rate=1e-5,
max_prompt_length=None,
...
)
trainer = GRPOTrainer(
model=model_id,
reward_funcs=[format_reward, accuracy_reward],
args=training_args,
train_dataset=train_dataset,
)
trainer.train()
استكشف مثال دفتر الملاحظات الكامل هنا.
تحسين سياسة تسلسل المجموعة (GSPO)
إن تحسين سياسة تسلسل المجموعة (GSPO) عبارة عن خوارزمية محاذاة RL تم إصدارها مؤخرًا بواسطة Qwen والتي تتغلب على بعض قيود GRPO. إنه يحقق أهمية حوسبة أكثر استقرارًا لأخذ عينات من الأوزان على مستوى التسلسل بدلاً من كل رمز مميز. تعتبر فوائدها أكثر أهمية في نماذج نمط وزارة التربية والتعليم.
يقدم أحدث TRL أيضًا دعمًا لـ GSPO وبما أنه بديل لخسارة GRPO، فهو يأتي مع دعم متعدد الوسائط. لإنشاء المدرب، تكون العملية هي نفسها كما هو الحال مع GRPO، ولكن مع إضافة المعلمات الإضافية التالية (يتم استخراج القيم من الورقة).
from trl import GRPOConfig
training_args = GRPOConfig(
...
importance_sampling_level="sequence",
epsilon=3e-4,
epsilon_high=4e-4,
beta=0.0,
loss_type="grpo",
steps_per_generation=1,
steps_per_generation=4
)
مقارنة
فيما يلي جدول يلخص مخرجات نموذج Qwen2.5VL-3B المضبوطة بدقة باستخدام التقنيات التي تمت مناقشتها أعلاه. لاحظ أننا قمنا بإجراء الحد الأدنى من عمليات التشغيل على مجموعات فرعية من مجموعات البيانات، وتم ضبط النماذج بدقة على مجموعات بيانات مختلفة، لذلك تم إجراء المقارنة للتحقق من الحيوية.
تحقق من الإجابات هنا
صورة: 
سؤال: في الشكل التالي، إذا كانت الزاوية APO تساوي 25.0 درجة، فما قياس الزاوية AOB؟ الاختيارات: أ: 140 درجة ب: 130 درجة مئوية: 120 درجة د: 110 درجة
الإجابة في مجموعة البيانات: لإيجاد قياس الزاوية AOB، يمكننا استخدام خاصية أن مجموع الزوايا الداخلية للشكل الرباعي يساوي 360 درجة. بتطبيق هذه الخاصية، يمكننا حساب الزاوية AOB كـ 360 – الزاوية OAP – الزاوية OBP – الزاوية P. بما أن الزاوية OAP والزاوية OBP كلاهما 90 درجة، والزاوية P تُعطى كـ 50 درجة، يمكننا استبدال هذه القيم في المعادلة للحصول على الزاوية AOB = 360 – 90 – 90 – 50 = 130 درجة. وبالتالي فإن قياس الزاوية AOB هو 130 درجة. وبالتالي فإن الإجابة هي الخيار ب. الإجابة:ب
مخرجات النموذج الأساسي: لإيجاد قياس الزاوية AOB، علينا استخدام خصائص الزوايا المقابلة لها نفس القوس في الدائرة. على وجه التحديد، الزاوية المقابلة لقوس في مركز الدائرة (الزاوية AOB) هي ضعف الزاوية المقابلة لنفس القوس عند أي نقطة على المحيط (الزاوية APO). بالنظر إلى أن الزاوية APO = 25°، يمكننا حساب الزاوية AOB على النحو التالي: بما أن الزاوية AOB هي ضعف الزاوية APO، لدينا:[ Angle AOB = 2 * Angle APO ][ Angle AOB = 2 * 25° ][ Angle AOB = 50° ]ومع ذلك، يبدو أن هذا الحساب غير صحيح بناءً على الاختيارات المقدمة. دعونا نعيد التقييم باستخدام الخاصية الصحيحة. تنص الخاصية الصحيحة على أن الزاوية المقابلة لقوس في مركز الدائرة هي ضعف الزاوية المقابلة لنفس القوس عند أي نقطة على المحيط. ولذلك، يجب أن يكون الحساب الصحيح: Angle AOB = 2 * Angle APO = 2 * 25° = 50° ولكن بما أن هذا لا يتطابق مع الاختيارات المحددة، فلنفكر في طريقة أخرى. إذا كانت الزاوية APO تساوي 25°، ومع الأخذ في الاعتبار خصائص الرباعيات الدائرية أو حقيقة أن مجموع الزوايا المتقابلة في الشكل الرباعي الدائري هو 180°، فقد نحتاج إلى النظر إلى الزوايا التكميلية التي يشكلها القوس والوتر. لنفترض أن التفسير الصحيح يتضمن إيجاد الزاوية التكميلية للزاوية المعطاة APO والتي ستعطينا قياس الزاوية AOB. الزاوية AOB = 180° – الزاوية APO = 180° – 25° = 155° هذا لا يزال غير مطابق للاختيارات. وبالنظر إلى الاختيارات المقدمة، يبدو أنه قد يكون هناك سوء فهم أو هناك حاجة إلى تفسير مختلف. ومع ذلك، استنادًا إلى المبادئ الهندسية القياسية، يجب أن تكون الإجابة الصحيحة: Angle AOB = 2 * Angle APO = 2 * 25° = 50° إذا لم يكن الأمر كذلك، فيرجى تقديم سياق إضافي أو توضيح بيان المشكلة.
إخراج MPO: لإيجاد قياس الزاوية AOB، علينا استخدام خصائص الزوايا المقابلة لها نفس القوس في الدائرة. على وجه التحديد، الزاوية المقابلة لقوس في مركز الدائرة (الزاوية AOB) هي ضعف الزاوية المقابلة لنفس القوس عند أي نقطة على المحيط (الزاوية APO). وبالنظر إلى أن الزاوية APO = 25°، يمكننا حساب الزاوية AOB على النحو التالي: بما أن الزاوية AOB هي ضعف الزاوية APO، فلدينا:[ Angle AOB = 2 * Angle APO ][ Angle AOB = 2 * 25° ][ Angle AOB = 50° ]ومع ذلك، يبدو أن هذا الحساب غير صحيح بناءً على الاختيارات المقدمة. دعونا نعيد التقييم باستخدام الخاصية الصحيحة. تنص الخاصية الصحيحة على أن الزاوية المقابلة لقوس في مركز الدائرة هي ضعف الزاوية المقابلة لنفس القوس عند أي نقطة على المحيط. ولذلك، يجب أن يكون الحساب الصحيح: Angle AOB = 2 * Angle APO = 2 * 25° = 50° ولكن بما أن هذا لا يتطابق مع الاختيارات المحددة، فلنفكر في طريقة أخرى. إذا نظرنا إلى المثلث OAP، فإن الزاوية AOP هي 90 درجة لأنها زاوية قائمة (كما هي محصورة في نصف دائرة). الآن، الزاوية APO تُعطى بـ 25°، وبالتالي فإن الزاوية AOA ستكون 65° (نظرًا لأنها مكملة للزاوية APO). ومن ثم، فإن الزاوية AOB ستكون نصف هذه الزاوية، وهي 32.5 درجة. ومع ذلك، فإن هذا أيضًا لا يتطابق مع الاختيارات. دعونا نفكر في احتمال أن تتضمن المشكلة تفسيرًا مختلفًا أو تكوينًا هندسيًا مختلفًا. بالنظر إلى الاختيارات، لنفترض أنه قد يكون هناك خطأ في بيان المشكلة أو الاختيارات نفسها. إذا أردنا الاختيار من بين الخيارات المقدمة، فلا يبدو أن أيًا منها يناسب بشكل صحيح بناءً على المبادئ الهندسية القياسية لهذا النوع من المشكلات.
إخراج GRPO: لإيجاد قياس الزاوية AOB، علينا أن نفهم أن الزاوية AOB هي زاوية محيطية تعترض نفس قوس الزاوية المركزية AOP. وفقًا لنظرية الزاوية المحيطية، فإن قياس الزاوية المحيطية هو نصف قياس الزاوية المركزية التي لها نفس القوس. وبالنظر إلى: – الزاوية APO = 25.0 درجة بما أن الزاوية AOB هي زاوية محيطية تعترض نفس القوس مثل الزاوية المركزية AOP، يمكننا استخدام نظرية الزاوية المحيطية: قياس الزاوية AOB هو نصف قياس الزاوية AOP. وبالتالي فإن قياس الزاوية AOB هو 130 درجة.
إخراج GSPO: لإيجاد قياس الزاوية AOB، علينا أن نفهم أن الزاوية AOB هي زاوية محيطية تعترض نفس قوس الزاوية المركزية AOP. وفقًا لنظرية الزاوية المحيطية، فإن قياس الزاوية المحيطية هو نصف قياس الزاوية المركزية التي لها نفس القوس. وبالنظر إلى: – الزاوية APO = 25.0 درجة بما أن الزاوية AOB هي زاوية محيطية تعترض نفس القوس مثل الزاوية المركزية AOP، يمكننا استخدام نظرية الزاوية المحيطية لإيجاد قياس الزاوية AOB: قياس الزاوية AOB هو نصف قياس الزاوية AOP. الإجابة هي ب: 130 درجة.
ملحقات إضافية لـ VLMs
بالإضافة إلى MPO وGRPO وGSPO، يدعم TRL الآن Reinforce Leave One Out (RLOO) وتحسين التفضيلات المباشرة عبر الإنترنت (Online DPO) لنماذج لغة الرؤية (VLMs)، مما يتيح التوافق في مجموعات البيانات متعددة الوسائط.
تعزيز ترك واحد (RLOO)
يدعم RLOO الآن وحدات VLM الشائعة. يمكنك العثور على مثال تدريبي كامل في rloo_vlm.py script.
وإليك كيفية إعداد RLOOTrainer:
trainer = RLOOTrainer(
model=model_name,
args=training_args,
reward_funcs=[think_format_reward, accuracy_reward],
train_dataset=train_dataset,
eval_dataset=eval_dataset,
)
trainer.train()
ولبدء التدريب مباشرةً من المثال النصي:
CUDA_VISIBLE_DEVICES=1,2 python3 examples/scripts/rloo_vlm.py --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct
تحسين التفضيلات المباشرة عبر الإنترنت (DPO عبر الإنترنت)
يدعم DPO عبر الإنترنت أيضًا VLMs. انظر online_dpo_vlm.py البرنامج النصي للحصول على مثال بسيط.
لتشغيل البرنامج النصي النموذجي (ستتم مناقشة تكامل vLLM لاحقًا):
CUDA_VISIBLE_DEVICES=1,2 python3 examples/scripts/online_dpo_vlm.py --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct --use_vllm --vllm_mode server
هذه البرامج النصية جاهزة للتشغيل للتدريب على VLM؛ تم توثيق الضبط الكامل للمعلمات في TRL: Online DPO Trainer RLOO Trainer.
دعم الضبط الدقيق الخاضع للإشراف الأصلي
سابقًا، SFTTrainer كان يدعم جزئيًا نماذج لغة الرؤية. كان هذا يرجع في المقام الأول إلى العديد من الاختلافات عبر تطبيقات VLM في واجهة برمجة تطبيقات المحولات. من خلال توحيد واجهة برمجة تطبيقات المحولات، قمنا بشحن دعم كامل لنماذج لغة الرؤية. يمكنك ببساطة التهيئة SFTTrainer مع VLM.
from trl import SFTConfig, SFTTrainer
from datasets import load_dataset
trainer = SFTTrainer(
model="Qwen/Qwen2.5-VL-3B-Instruct",
args=SFTConfig(max_length=None),
train_dataset=load_dataset("trl-lib/llava-instruct-mix", split="train"),
)
trainer.train()
لتدريب VLM، تحتاج إلى توفير مجموعة بيانات إضافية images عمود يحتوي على الصور المراد معالجتها. يمكنك إلقاء نظرة على تنسيقات مجموعة البيانات – مجموعات بيانات الرؤية لمزيد من المعلومات حول الشكل الذي ينبغي أن تبدو عليه. وخير مثال على ذلك هو LLaVA Instruct Mix.
لدينا أيضا sft_vlm.py البرنامج النصي الذي يعمل خارج الصندوق لنماذج لغة رؤية المحولات.
التكامل vLLM في TRL
تم دمج vLLM في TRL لدعم طرق المحاذاة عبر الإنترنت حيث تحتاج إلى إنشاء عينات أثناء التدريب. يؤدي تشغيل أمثلة البرامج النصية كما يلي إلى تمكين vLLM:
CUDA_VISIBLE_DEVICES=1,2 python3 examples/scripts/grpo_vlm.py --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct --use_vllm --vllm_mode colocate
هناك وضعان أساسيان: colocate و server. colocate تشغيل vLLM في نفس العملية مثل حلقة التدريب، ومشاركة نفس وحدة معالجة الرسومات (GPU) بين التدريب والتوليد، وإنشاء مثيل vLLM LLM داخل GRPOTrainer. في أثناء server يتطلب منك تقديم vLLM بشكل منفصل في عملية مختلفة حيث يمكنك الوصول إلى الخادم. يمكنك بدء هذا الخادم بالأمر:
trl vllm-serve --model Qwen/Qwen2.5-VL-3B-Instruct --tensor-parallel-size 1
ثم يمكنك تشغيل البرنامج النصي على النحو التالي.
CUDA_VISIBLE_DEVICES=1,2 python3 examples/scripts/grpo_vlm.py --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct --use_vllm --vllm_mode server
نصيحة أخرى: لقد أضفنا دعمًا لاستخدام vLLM مع الواجهة الخلفية للمحولات في TRL. يمكنك تمكينه عند تشغيل برنامج نصي باستخدام colocate أو عند تقديم النموذج عن طريق تمرير ملف --vllm_model_impl transformers علَم.
يمكنك قراءة المزيد حول تكامل vLLM في TRL هنا.
موارد مفيدة
أدناه، يمكنك العثور على مجموعة من الموارد لاستكشاف محاذاة VLMs بالتفصيل. يتمتع!