La perplexité mesure dans quelle mesure un texte est prévisible par un modèle de langage (LM), et elle est souvent utilisée pour évaluer la fluidité ou la proto-typique du texte (plus la perplexité est faible, plus le texte est fluide ou proto-typique). LM-PPL est une bibliothèque Python permettant de calculer la perplexité sur un texte avec n'importe quel type de LM pré-entraînés. Nous calculons une perplexité ordinaire pour les LM récurrents tels que GPT3 (Brown et al., 2020) et la perplexité du décodeur pour les LM codeur-décodeur tels que BART (Lewis et al., 2020) ou T5 (Raffel et al., 2020). ), tandis que nous calculons la pseudo-perplexité (Wang et Cho, 2018) pour les LM masqués.
Installer via pip.
pip install lmppl
Résolvons l'analyse des sentiments avec la perplexité comme exemple ! N'oubliez pas que le texte avec une perplexité moindre est meilleur, nous comparons donc deux textes (positif et négatif) et choisissons celui avec une perplexité moindre comme prédiction du modèle.
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."
Vous trouverez ci-dessous quelques exemples de modèles populaires et le type de modèle correspondant à utiliser dans le package lmppl.
Modèle | CâlinsFace ID | Type de modèle |
---|---|---|
BERTE | google-bert/bert-base-uncased | MasquéLM |
Roberta | roberta-large | MasquéLM |
GPT 2 | gpt2-xl | ML |
flan-ul2 | google/flan-ul2 | EncodeurDécodeurLM |
GPT-NeoX | EleutherAI/gpt-neox-20b | ML |
OPTER | facebook/opt-30b | ML |
Mixtral | mistralai/Mixtral-8x22B-v0.1 | ML |
Lama 3 | méta-lama/méta-lama-3-8B | ML |
Longueur maximale du jeton : chaque LM a sa propre longueur maximale de jeton ( max_length
pour les LM récurrents/masqués, et max_length_encoder
et max_length_decoder
pour les LM encodeur-décodeur). Limiter ce nombre maximum de jetons réduira le temps de traitement du texte, mais cela peut affecter la précision de la perplexité, alors veuillez expérimenter vos textes et décider d'une longueur de jeton optimale.
Taille du lot : On peut transmettre la taille du lot à la fonction get_perplexity
(par exemple get_perplexity(text, batch_size=32)
). Par défaut, il traitera tout le texte une seule fois, ce qui peut provoquer une erreur de mémoire si le nombre de textes est trop grand.