La perplejidad mide qué tan predecible es un texto mediante un modelo de lenguaje (LM) y, a menudo, se usa para evaluar la fluidez o la prototipicidad del texto (cuanto menor es la perplejidad, más fluido o prototípico es el texto). LM-PPL es una biblioteca de Python para calcular la perplejidad en un texto con cualquier tipo de LM previamente entrenado. Calculamos una perplejidad ordinaria para LM recurrentes como GPT3 (Brown et al., 2020) y la perplejidad del decodificador para LM codificadores-decodificadores como BART (Lewis et al., 2020) o T5 (Raffel et al., 2020 ), mientras que calculamos la pseudoperplejidad (Wang y Cho, 2018) para LM enmascarados.
Instalar a través de pip.
pip install lmppl
¡Resolvamos el análisis de sentimientos con perplejidad como ejemplo! Recuerde que el texto con menor perplejidad es mejor, por lo que comparamos dos textos (positivo y negativo) y elegimos el que tiene menor perplejidad como predicción del modelo.
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."
A continuación se muestran algunos ejemplos de modelos populares y el tipo de modelo correspondiente para usar dentro del paquete lmppl.
Modelo | AbrazoFace ID | Tipo de modelo |
---|---|---|
BERT | google-bert/bert-base-sin funda | enmascaradolm |
roberta | roberta-grande | enmascaradolm |
GPT 2 | gpt2-xl | LM |
flan-ul2 | google/flan-ul2 | CodificadorDecodificadorLM |
GPT-NeoX | EleutherAI/gpt-neox-20b | LM |
OPTAR | facebook/opt-30b | LM |
Mixtral | mistralai/Mixtral-8x22B-v0.1 | LM |
Llama 3 | meta-llama/Meta-Llama-3-8B | LM |
Longitud máxima del token : cada LM tiene su propia longitud máxima del token ( max_length
para LM recurrentes/enmascarados, y max_length_encoder
y max_length_decoder
para LM codificadores-decodificadores). Limitar esos tokens máximos reducirá el tiempo para procesar el texto, pero puede afectar la precisión de la perplejidad, así que experimente con sus textos y decida una longitud de token óptima.
Tamaño de lote : se puede pasar el tamaño de lote a la función get_perplexity
(por ejemplo, get_perplexity(text, batch_size=32)
). De forma predeterminada, procesará todo el texto una vez, lo que puede causar un error de memoria si la cantidad de textos es demasiado grande.