โซลูชันนี้ได้รับการพัฒนาสำหรับ LMSYS - การแข่งขัน Chatbot Arena Human Preference Predictions บน Kaggle ซึ่งผู้เข้าร่วมถูกท้าทายให้คาดการณ์การตั้งค่าของผู้ใช้ในการสนทนาแบบตัวต่อตัวระหว่างแชทบอทที่ขับเคลื่อนโดยโมเดลภาษาขนาดใหญ่ (LLM) งานเกี่ยวข้องกับการใช้ชุดข้อมูลจาก Chatbot Arena ซึ่งผู้ใช้โต้ตอบกับ LLM ที่ไม่ระบุชื่อสองตัว และเลือกคำตอบที่ต้องการ ด้วยการสร้างแบบจำลองแมชชีนเลิร์นนิงที่คาดการณ์การตั้งค่าเหล่านี้ได้อย่างแม่นยำ เรามุ่งหวังที่จะสนับสนุนการปรับปรุงการจัดแนวการตอบสนองของแชทบอทกับการตั้งค่าของมนุษย์
ทีมของเราประสบความสำเร็จใน อันดับที่ 4 จากทั้งหมด 1849 ทีม โดยได้รับเหรียญทองจากโซลูชันของเราและเงินรางวัล $20,000! -
อันดับแรก เราใช้ชุดข้อมูลอย่างเป็นทางการ (55,000) ร่วมกับข้อมูลที่ซ้ำกัน 33,000 รายการ โดยใช้การตรวจสอบความถูกต้องข้าม 20 เท่า (n_splits=20) แต่ได้รับการฝึกฝนเพียงครั้งเดียวเท่านั้นเพื่อเพิ่มปริมาณข้อมูลการฝึกอบรมให้สูงสุด นอกจากนี้ เรายังสร้างป้ายกำกับหลอกสำหรับรายการ 30,000 รายการจากชุดข้อมูล ultrafeedback เพื่อเสริมชุดข้อมูลเพิ่มเติม
เราได้ออกแบบพรอมต์ที่ไม่ซ้ำใคร ซึ่งเป็นประโยชน์เพราะเมื่อความยาวของบทสนทนาเกินความยาวโทเค็นสูงสุด ( max_length
) จะทำให้มีการตัดบทสนทนารอบสุดท้ายอย่างสมเหตุสมผล เพื่อให้แน่ใจว่าพรอมต์ การตอบสนอง A และการตอบสนอง B ทั้งหมดสามารถแสดงได้อย่างเพียงพอ หลีกเลี่ยงสถานการณ์ที่เฉพาะพรอมต์หรือการตอบสนอง A เท่านั้นที่ถูกตัดทอน หากจำนวนโทเค็นที่เหลืออยู่ในรอบสุดท้ายน้อยกว่า 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 GPU สี่ตัว
การทดลองแต่ละครั้งใช้เวลาประมาณ 10 ชั่วโมงสำหรับเฟสแรก และ 15 ชั่วโมงสำหรับเฟสที่สองบนระบบที่มี A100 GPU 4 ตัว (40G)
ขั้นตอนการอนุมานใช้โครงสร้างโค้ดที่คล้ายกันกับระยะการฝึกอบรม โดยมีข้อแตกต่างที่สำคัญบางประการ: max_length
จะเพิ่มขึ้นเป็น 3072 และ การตอบสนอง_a และ การตอบสนอง_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]