تقيس الحيرة مدى إمكانية التنبؤ بالنص من خلال نموذج اللغة (LM)، وغالباً ما يتم استخدامه لتقييم الطلاقة أو النمطية الأولية للنص (تقل درجة الحيرة، ويكون النص أكثر طلاقة أو نموذجية). LM-PPL هي مكتبة بيثون لحساب درجة الحيرة في النص باستخدام أي نوع من أنواع LMs المدربة مسبقًا. نحن نحسب الحيرة العادية للوحدات LM المتكررة مثل GPT3 (Brown et al., 2020) وحيرة وحدة فك التشفير للوحدات LM الخاصة بجهاز التشفير وفك التشفير مثل BART (Lewis et al., 2020) أو T5 (Raffel et al., 2020) ) ، بينما نحسب الحيرة الزائفة (Wang and Cho، 2018) للمقنعين إل إم إس.
التثبيت عبر النقطة.
pip install lmppl
دعونا نحل تحليل المشاعر بالحيرة كمثال! تذكر أن النص الأقل درجة للحيرة هو الأفضل، لذلك قمنا بمقارنة نصين (إيجابي وسلبي) واختر النص الأقل درجة للحيرة كتنبؤ بالنموذج.
import lmppl
scorer = lmppl . LM ( 'gpt2' )
text = [
'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am happy.' ,
'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am sad.'
]
ppl = scorer . get_perplexity ( text )
print ( list ( zip ( text , ppl )))
>> > [
( 'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am happy.' , 136.64255272925908 ),
( 'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am sad.' , 139.2400838400971 )
]
print ( f"prediction: { text [ ppl . index ( min ( ppl ))] } " )
>> > "prediction: sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am happy."
import lmppl
scorer = lmppl . MaskedLM ( 'microsoft/deberta-v3-small' )
text = [
'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am happy.' ,
'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am sad.'
]
ppl = scorer . get_perplexity ( text )
print ( list ( zip ( text , ppl )))
>> > [
( 'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am happy.' , 1190212.1699246117 ),
( 'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am sad.' , 1152767.482071837 )
]
print ( f"prediction: { text [ ppl . index ( min ( ppl ))] } " )
>> > "prediction: sentiment classification: I dropped my laptop on my knee, and someone stole my coffee. I am sad."
import lmppl
scorer = lmppl . EncoderDecoderLM ( 'google/flan-t5-small' )
inputs = [
'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee.' ,
'sentiment classification: I dropped my laptop on my knee, and someone stole my coffee.'
]
outputs = [
'I am happy.' ,
'I am sad.'
]
ppl = scorer . get_perplexity ( input_texts = inputs , output_texts = outputs )
print ( list ( zip ( outputs , ppl )))
>> > [
( 'I am happy.' , 4138.748977714201 ),
( 'I am sad.' , 2991.629250051472 )
]
print ( f"prediction: { outputs [ ppl . index ( min ( ppl ))] } " )
>> > "prediction: I am sad."
فيما يلي بعض الأمثلة على النماذج الشائعة ونوع النموذج المقابل الذي سيتم استخدامه ضمن الحزمة lmppl.
نموذج | معانقة معرف الوجه | نوع النموذج |
---|---|---|
بيرت | google-bert/bert-base-uncased | ملثمLM |
روبرتا | روبرتا كبيرة | ملثمLM |
جي بي تي 2 | gpt2-xl | إل إم |
فلان ul2 | جوجل / فلان-ul2 | EncoderDecoderLM |
جي بي تي-نيوإكس | إليوثيرAI/gpt-neox-20b | إل إم |
الأراضي الفلسطينية المحتلة | الفيسبوك/opt-30b | إل إم |
ميكسترال | ميسترالاي/ميسترال-8x22B-v0.1 | إل إم |
اللاما 3 | ميتا اللاما/ميتا اللاما-3-8B | إل إم |
الحد الأقصى لطول الرمز المميز : كل LM له الحد الأقصى لطول الرمز المميز الخاص به ( max_length
لـ LMs المتكررة/المقنعة، و max_length_encoder
و max_length_decoder
لـ LMs التشفير ووحدة فك التشفير). سيؤدي تحديد الحد الأقصى من الرموز المميزة إلى تقليل الوقت اللازم لمعالجة النص، ولكنه قد يؤثر على دقة الحيرة، لذا يرجى تجربة النصوص الخاصة بك وتحديد الطول الأمثل للرموز المميزة.
حجم الدُفعة : يمكن تمرير حجم الدُفعة إلى الدالة get_perplexity
(على سبيل المثال. get_perplexity(text, batch_size=32)
). افتراضيًا، سيقوم بمعالجة النص بالكامل مرة واحدة، مما قد يتسبب في حدوث خطأ في الذاكرة إذا كان عدد النصوص كبيرًا جدًا.