Kebingungan mengukur seberapa dapat diprediksi suatu teks dengan model bahasa (LM), dan sering kali digunakan untuk mengevaluasi kelancaran atau proto-tipikal teks (semakin rendah tingkat kebingungannya, semakin lancar atau proto-tipikal teks tersebut). LM-PPL adalah pustaka python untuk menghitung kebingungan pada teks dengan semua jenis LM terlatih. Kami menghitung kebingungan biasa untuk LM berulang seperti GPT3 (Brown et al., 2020) dan kebingungan decoder untuk LM encoder-decoder seperti BART (Lewis et al., 2020) atau T5 (Raffel et al., 2020 ), sementara kami menghitung kebingungan semu (Wang dan Cho, 2018) untuk LM bertopeng.
Instal melalui pip.
pip install lmppl
Mari selesaikan analisis sentimen dengan kebingungan sebagai contoh! Ingat teks dengan tingkat kebingungan lebih rendah lebih baik, jadi kami membandingkan dua teks (positif dan negatif) dan memilih teks dengan tingkat kebingungan lebih rendah sebagai model prediksi.
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."
Di bawah ini adalah beberapa contoh model populer dan tipe model yang sesuai untuk digunakan dalam paket lmppl.
Model | MemelukID Wajah | Tipe Model |
---|---|---|
BERT | google-bert/bert-base-tanpa casing | bertopengLM |
Roberta | roberta-besar | bertopengLM |
GPT 2 | gpt2-xl | LM |
flan-ul2 | google/flan-ul2 | EncoderDecoderLM |
GPT-NeoX | EleutherAI/gpt-neox-20b | LM |
MEMILIH | facebook/opt-30b | LM |
Campuran | mistralai/Mixtral-8x22B-v0.1 | LM |
Lama 3 | meta-llama/Meta-Llama-3-8B | LM |
Panjang Token Maks : Setiap LM memiliki panjang token maksimumnya sendiri ( max_length
untuk LM berulang/masked, dan max_length_encoder
serta max_length_decoder
untuk LM encoder-decoder). Membatasi max-token tersebut akan mengurangi waktu untuk memproses teks, namun hal ini dapat mempengaruhi keakuratan kebingungannya, jadi silakan bereksperimen pada teks Anda dan tentukan panjang token yang optimal.
Ukuran Batch : Seseorang dapat meneruskan ukuran batch ke fungsi get_perplexity
(mis. get_perplexity(text, batch_size=32)
). Secara default, ini akan memproses semua teks satu kali, yang dapat menyebabkan kesalahan memori jika jumlah teks terlalu banyak.