A perplexidade mede o quão previsível um texto é por um modelo de linguagem (LM), e é frequentemente usada para avaliar a fluência ou prototipicidade do texto (quanto menor a perplexidade, mais fluente ou prototípico é o texto). LM-PPL é uma biblioteca python para calcular perplexidade em um texto com qualquer tipo de LMs pré-treinados. Calculamos uma perplexidade comum para LMs recorrentes como GPT3 (Brown et al., 2020) e a perplexidade do decodificador para LMs codificador-decodificador como BART (Lewis et al., 2020) ou T5 (Raffel et al., 2020 ), enquanto calculamos a pseudo-perplexidade (Wang e Cho, 2018) para mascarados LMs.
Instale via pip.
pip install lmppl
Vamos resolver a análise de sentimento tendo a perplexidade como exemplo! Lembre-se de que o texto com menor perplexidade é melhor, então comparamos dois textos (positivo e negativo) e escolhemos aquele com menor perplexidade como modelo de previsão.
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."
Abaixo estão alguns exemplos de modelos populares e o tipo de modelo correspondente para usar no pacote lmppl.
Modelo | AbraçandoFace ID | Tipo de modelo |
---|---|---|
BERTO | google-bert/bert-base-uncased | MascaradoLM |
Roberta | Roberta-grande | MascaradoLM |
GPT2 | gpt2-xl | LM |
flan-ul2 | google/flan-ul2 | EncoderDecoderLM |
GPT-NeoX | EleutherAI/gpt-neox-20b | LM |
OPTAR | facebook/opt-30b | LM |
Mixtral | mistralai/Mixtral-8x22B-v0.1 | LM |
Lhama 3 | metal-lhama/Meta-lhama-3-8B | LM |
Comprimento máximo do token : cada LM tem seu próprio comprimento máximo de token ( max_length
para LMs recorrentes/mascarados e max_length_encoder
e max_length_decoder
para LMs codificador-decodificador). Limitar esses tokens máximos reduzirá o tempo de processamento do texto, mas pode afetar a precisão da perplexidade, portanto, experimente seus textos e decida o comprimento ideal do token.
Tamanho do lote : pode-se passar o tamanho do lote para a função get_perplexity
(por exemplo, get_perplexity(text, batch_size=32)
). Por padrão, ele processará todo o texto uma vez, o que pode causar erro de memória se o número de textos for muito grande.