تم تطوير هذا الحل لمسابقة LMSYS - Chatbot Arena Human Preference Predictions على Kaggle، حيث تم تحدي المشاركين للتنبؤ بتفضيلات المستخدم في المحادثات المباشرة بين روبوتات الدردشة المدعومة بنماذج لغوية كبيرة (LLMs). تضمنت المهمة استخدام مجموعة بيانات من Chatbot Arena ، حيث يتفاعل المستخدمون مع اثنين من الحاصلين على ماجستير إدارة أعمال مجهولين ويختارون استجابتهم المفضلة. من خلال إنشاء نموذج للتعلم الآلي يتنبأ بدقة بهذه التفضيلات، كنا نهدف إلى المساهمة في تحسين مواءمة استجابات روبوتات الدردشة مع التفضيلات البشرية.
نجح فريقنا في احتلال المركز الرابع من بين 1849 فريقًا ، وحصل على الميدالية الذهبية للحل الذي قدمناه وجائزة قدرها 20,000 دولار أمريكي! ؟
أولاً، استخدمنا مجموعة البيانات الرسمية (55 ألفًا) بالإضافة إلى 33 ألفًا من البيانات المكررة، باستخدام التحقق المتبادل 20 ضعفًا (n_splits=20)، ولكننا تدربنا فقط على طية واحدة لزيادة كمية بيانات التدريب إلى الحد الأقصى. بالإضافة إلى ذلك، قمنا بإنشاء تسميات زائفة لـ 30000 إدخال من مجموعة بيانات Ultrafeedback لتكملة مجموعة البيانات بشكل أكبر.
لقد صممنا موجهًا فريدًا، وهو أمر مفيد لأنه عندما يتجاوز طول الحوار الحد الأقصى لطول الرمز المميز ( max_length
)، فإنه يسمح باقتطاع معقول للجولة الأخيرة من المحادثة. وهذا يضمن إمكانية عرض الموجه والاستجابة أ والاستجابة ب بشكل مناسب، مما يؤدي إلى تجنب المواقف التي يتم فيها اقتطاع الموجه أو الاستجابة أ فقط. إذا كان عدد الرموز المتبقية في الجولة النهائية أقل من 80، فسيتم تجاهل جولة المحادثة بأكملها (والجولات اللاحقة). تم تحديد هذه العتبات والنسب من خلال ملاحظة مجموعة التدريب.
def tokenize_cls_p3 ( example , tokenizer , max_length , is_train ):
input_ids = []
attention_mask = []
dot_tokens = tokenizer ( "......" , add_special_tokens = False )[ "input_ids" ]
final_p_tokens = tokenizer ( " n n --- n Which response is better? [A or B or tie] n Answer: " , add_special_tokens = False )[ "input_ids" ]
for ps , ras , rbs in zip ( example [ 'prompt' ], example [ 'response_a' ], example [ 'response_b' ]):
one_input_ids = [ tokenizer . bos_token_id ]
prev_tokens_num = 2 + len ( final_p_tokens ) # 2 for bos_token and eos_token
for idx , ( p , ra , rb ) in enumerate ( zip ( ps , ras , rbs )):
r_tokens = tokenizer ( f' n n ## Round { idx + 1 } :' if idx else f'## Round { idx + 1 } :' , add_special_tokens = False )[ "input_ids" ]
p_tokens = tokenizer ( f' n ### Prompt: n { p } ' , add_special_tokens = False )[ "input_ids" ]
ra_tokens = tokenizer ( f' n n ### Response A: n { ra } ' , add_special_tokens = False )[ "input_ids" ]
rb_tokens = tokenizer ( f' n n ### Response B: n { rb } ' , add_special_tokens = False )[ "input_ids" ]
all_tokens_num = prev_tokens_num + len ( r_tokens ) + len ( p_tokens ) + len ( ra_tokens ) + len ( rb_tokens
if all_tokens_num > max_length :
remain_tokens_num = max_length - prev_tokens_num - len ( r_tokens ) - 3 * len ( dot_tokens )
if remain_tokens_num >= 80 :
p_tokens = p_tokens [: int ( remain_tokens_num * 0.2 )] + dot_tokens if len ( p_tokens ) > int ( remain_tokens_num * 0.2 ) else p_tokens
ra_tokens = ra_tokens [: int ( remain_tokens_num * 0.4 )] + dot_tokens if len ( ra_tokens ) > int ( remain_tokens_num * 0.4 ) else ra_tokens
rb_tokens = rb_tokens [: int ( remain_tokens_num * 0.4 )] + dot_tokens if len ( rb_tokens ) > int ( remain_tokens_num * 0.4 ) else rb_tokens
one_input_ids += r_tokens + p_tokens + ra_tokens + rb_tokens
break
else :
prev_tokens_num = all_tokens_num
one_input_ids += r_tokens + p_tokens + ra_tokens + rb_tokens
one_input_ids += final_p_tokens + [ tokenizer . eos_token_id ]
one_attention_mask = [ 1 ] * len ( one_input_ids )
input_ids . append ( one_input_ids )
attention_mask . append ( one_attention_mask )
if is_train :
labels = [ 0 if a_win else 1 if b_win else 2 for a_win , b_win , tie in zip ( example [ 'winner_model_a' ], example [ 'winner_model_b' ], example [ 'winner_tie' ])]
return {
"input_ids" : input_ids ,
"attention_mask" : attention_mask ,
"labels" : labels ,
}
else :
return {
"input_ids" : input_ids ,
"attention_mask" : attention_mask ,
}
لقد اخترنا Gemma-2-9b-it كنموذج البداية، والذي يتفوق بشكل كبير على النماذج الأخرى مثل Llama3 8b و Llama3.1 8b . استخدمنا Gemma2ForSequenceClassification لمهمة تصنيف من ثلاث فئات، وقمنا بضبط النموذج بدقة باستخدام lora بدقة bf16 . تم تحقيق أفضل النتائج التجريبية على أربع وحدات معالجة رسوميات A100.
استغرقت كل تجربة حوالي 10 ساعات للمرحلة الأولى و15 ساعة للمرحلة الثانية على نظام مزود بـ 4 وحدات معالجة رسوميات A100 (40 جيجا).
تستخدم مرحلة الاستدلال بنية تعليمات برمجية مشابهة لمرحلة التدريب، مع بعض الاختلافات الرئيسية: يتم زيادة max_length
إلى 3072، ويتم تبديل Response_a و response_b كجزء من استراتيجية زيادة وقت الاختبار (TTA). والنتيجة النهائية هي متوسط الناتج لكليهما.
تم تطبيق المعالجة اللاحقة لسيناريوهين محددين (قد يتداخلان):
df2 = pd . read_csv ( '/kaggle/input/lmsys-chatbot-arena/test.csv' )
df2 [ 'id' ] = df2 [ 'id' ]. astype ( str )
a_null_df = df2 [( df2 [ "response_a" ] == '[null]' ) | ( df2 [ "response_a" ] == '[]' ) | ( df2 [ "response_a" ] == '[ ]' ) | ( df2 [ "response_a" ] == '[ ]' ) | ( df2 [ "response_a" ] == '[""]' ) | ( df2 [ "response_a" ] == '["",""]' )]
a_null_id_list = a_null_df [ "id" ]. tolist ()
submission_df . loc [ submission_df [ 'id' ]. isin ( a_null_id_list ), [ 'winner_model_a' , 'winner_model_b' , 'winner_tie' ]] = [ 0.04 , 0.88 , 0.08 ]
b_null_df = df2 [( df2 [ "response_b" ] == '[null]' ) | ( df2 [ "response_b" ] == '[]' ) | ( df2 [ "response_b" ] == '[ ]' ) | ( df2 [ "response_b" ] == '[ ]' ) | ( df2 [ "response_b" ] == '[""]' ) | ( df2 [ "response_b" ] == '["",""]' )]
b_null_id_list = b_null_df [ "id" ]. tolist ()
submission_df . loc [ submission_df [ 'id' ]. isin ( b_null_id_list ), [ 'winner_model_a' , 'winner_model_b' , 'winner_tie' ]] = [ 0.88 , 0.04 , 0.08 ]
same_a_b_df2 = df2 [( df2 [ "response_a" ] == df2 [ "response_b" ])]
same_a_b_id_list = same_a_b_df2 [ "id" ]. tolist ()
submission_df . loc [ submission_df [ 'id' ]. isin ( same_a_b_id_list ), [ 'winner_model_a' , 'winner_model_b' , 'winner_tie' ]] = [ 0.06 , 0.06 , 0.88 ]
نظرة عامة : تم تطوير وتحسين نموذج التنبؤ بالتفضيلات البشرية لأنظمة الحوار استنادًا إلى نموذج Gemma-2-9b-it، مما يحسن دقة التنبؤ باستجابات تفضيلات المستخدم في نظام الحوار.
التقنيات الرئيسية :
Daoyuan Li - ملف تعريف Kaggle
إذا كانت لديك أية أسئلة، برجاء الاتصال بـ Daoyuan Li على عنوان البريد الإلكتروني [email protected].