Perplexität misst, wie vorhersehbar ein Text durch ein Sprachmodell (LM) ist, und wird oft verwendet, um die Fließfähigkeit oder Prototypizität des Textes zu bewerten (je niedriger die Ratlosigkeit, desto flüssiger oder prototypischer ist der Text). LM-PPL ist eine Python-Bibliothek zur Berechnung der Perplexität eines Textes mit beliebigen Arten von vorab trainierten LMs. Wir berechnen eine gewöhnliche Perplexität für wiederkehrende LMs wie GPT3 (Brown et al., 2020) und die Perplexität des Decoders für Encoder-Decoder-LMs wie BART (Lewis et al., 2020) oder T5 (Raffel et al., 2020). ), während wir Pseudo-Perplexität (Wang und Cho, 2018) für maskierte LMs berechnen.
Per Pip installieren.
pip install lmppl
Lassen Sie uns die Sentimentanalyse am Beispiel der Ratlosigkeit lösen! Denken Sie daran, dass der Text mit geringerer Ratlosigkeit besser ist. Deshalb vergleichen wir zwei Texte (positiv und negativ) und wählen den Text mit geringerer Ratlosigkeit als Modellvorhersage aus.
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."
Nachfolgend finden Sie einige Beispiele für beliebte Modelle und den entsprechenden Modelltyp zur Verwendung im lmppl-Paket.
Modell | HuggingFace ID | Modelltyp |
---|---|---|
BERT | google-bert/bert-base-uncased | MaskedLM |
Roberta | Roberta-groß | MaskedLM |
GPT 2 | gpt2-xl | LM |
flan-ul2 | google/flan-ul2 | EncoderDecoderLM |
GPT-NeoX | EleutherAI/gpt-neox-20b | LM |
OPT | facebook/opt-30b | LM |
Mixtral | mistralai/Mixtral-8x22B-v0.1 | LM |
Lama 3 | Meta-Lama/Meta-Lama-3-8B | LM |
Max. Token-Länge : Jeder LM hat seine eigene maximale Token-Länge ( max_length
für wiederkehrende/maskierte LMs und max_length_encoder
und max_length_decoder
für Encoder-Decoder-LMs). Durch die Begrenzung dieser maximalen Token verkürzt sich die Verarbeitungszeit des Texts, es kann sich jedoch auf die Genauigkeit der Perplexität auswirken. Experimentieren Sie daher bitte mit Ihren Texten und legen Sie die optimale Token-Länge fest.
Batch-Größe : Man kann die Batch-Größe an die Funktion get_perplexity
übergeben (z. B. get_perplexity(text, batch_size=32)
). Standardmäßig wird der gesamte Text einmal verarbeitet, was zu Speicherfehlern führen kann, wenn die Anzahl der Texte zu groß ist.