Недоумение измеряет, насколько предсказуем текст с помощью языковой модели (LM), и его часто используют для оценки беглости или прототипичности текста (чем меньше недоумение, тем более беглым или прототипичным является текст). LM-PPL — это библиотека Python для расчета недоумения в тексте с помощью любых типов предварительно обученных LM. Мы вычисляем обычную недоумение для повторяющихся LM, таких как GPT3 (Brown et al., 2020), и недоумение декодера для LM кодер-декодер, таких как BART (Lewis et al., 2020) или T5 (Raffel et al., 2020). ), а мы вычисляем псевдо-недоумение (Ванг и Чо, 2018) для замаскированных LM.
Установить через пип.
pip install lmppl
Давайте решим анализ настроений на примере недоумения! Помните, что текст с меньшим недоумением лучше, поэтому мы сравниваем два текста (положительный и отрицательный) и выбираем тот, у которого меньше недоумения, в качестве прогноза модели.
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."
Ниже приведены некоторые примеры популярных моделей и соответствующие типы моделей для использования в пакете lmppl.
Модель | ОбъятияFace ID | Тип модели |
---|---|---|
БЕРТ | google-bert/bert-base-без корпуса | МаскированныйLM |
Роберта | Роберта-большая | МаскированныйLM |
GPT 2 | gpt2-xl | ЛМ |
флан-ul2 | гугл/флан-ul2 | КодерДекодерLM |
GPT-NeoX | ЭлеутерАИ/gpt-neox-20b | ЛМ |
ОПТ | Facebook/opt-30b | ЛМ |
Микстрал | мистралай/Mixtral-8x22B-v0.1 | ЛМ |
Лама 3 | мета-лама/Мета-лама-3-8B | ЛМ |
Максимальная длина токена : каждый LM имеет свою собственную максимальную длину токена ( max_length
для повторяющихся/маскированных LM и max_length_encoder
и max_length_decoder
для LM кодировщика-декодера). Ограничение этих максимальных токенов сократит время обработки текста, но может повлиять на точность недоумения, поэтому поэкспериментируйте со своими текстами и определите оптимальную длину токенов.
Размер пакета : можно передать размер пакета в функцию get_perplexity
(например, get_perplexity(text, batch_size=32)
). По умолчанию он обрабатывает весь текст один раз, что может привести к ошибке памяти, если количество текстов слишком велико.