Perplexity는 언어 모델(LM)에 의해 텍스트가 얼마나 예측 가능한지를 측정하며, 텍스트의 유창성 또는 원형성을 평가하는 데 종종 사용됩니다(복잡성이 낮을수록 텍스트가 더 유창하거나 원형적입니다). LM-PPL은 모든 유형의 사전 훈련된 LM을 사용하여 텍스트의 난해함을 계산하는 Python 라이브러리입니다. 우리는 GPT3(Brown et al., 2020)과 같은 순환 LM에 대한 일반적인 혼란과 BART(Lewis et al., 2020) 또는 T5(Raffel et al., 2020)와 같은 인코더-디코더 LM에 대한 디코더의 혼란을 계산합니다. ), 마스크된 LM에 대한 의사 혼란성(Wang and Cho, 2018)을 계산합니다.
pip를 통해 설치합니다.
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 패키지 내에서 사용할 수 있는 인기 모델과 해당 모델 유형의 몇 가지 예입니다.
모델 | 포옹얼굴 ID | 모델 유형 |
---|---|---|
버트 | google-bert/bert-base-uncased | 마스크드LM |
로베르타 | 로버타-대형 | 마스크드LM |
GPT 2 | gpt2-xl | LM |
플랜-UL2 | 구글/플랜-ul2 | 인코더DecoderLM |
GPT-NeoX | EleutherAI/gpt-neox-20b | LM |
고르다 | 페이스북/opt-30b | LM |
믹스트랄 | 미스트랄라이/Mixtral-8x22B-v0.1 | LM |
라마 3 | 메타-라마/메타-라마-3-8B | LM |
최대 토큰 길이 : 각 LM에는 자체 최대 토큰 길이가 있습니다(순환/마스크된 LM의 경우 max_length
, 인코더-디코더 LM의 경우 max_length_encoder
및 max_length_decoder
). 최대 토큰을 제한하면 텍스트 처리 시간이 줄어들지만 당혹의 정확성에 영향을 미칠 수 있으므로 텍스트를 실험하고 최적의 토큰 길이를 결정하십시오.
배치 크기 : 배치 크기를 get_perplexity
함수에 전달할 수 있습니다(예: get_perplexity(text, batch_size=32)
). 기본적으로 모든 텍스트를 한 번 처리하므로 텍스트 수가 너무 많으면 메모리 오류가 발생할 수 있습니다.