パープレキシティは、テキストが言語モデル (LM) によってどの程度予測可能であるかを測定し、テキストの流暢性または原型性を評価するためによく使用されます (パープレキシティが低いほど、テキストはより流暢または原型的になります)。 LM-PPL は、あらゆる種類の事前トレーニング済み LM を使用してテキストのパープレキシティを計算する Python ライブラリです。 GPT3 (Brown et al., 2020) などのリカレント LM の通常のパープレキシティと、BART (Lewis et al., 2020) や T5 (Raffel et al., 2020) などのエンコーダ-デコーダ LM のデコーダのパープレキシティを計算します。 )、擬似混乱を計算します (Wang と Cho、 2018) マスクされた LM 用。
pip経由でインストールします。
pip install lmppl
困惑を例として感情分析を解いてみましょう!パープレキシティが低いテキストの方が優れていることに注意してください。そのため、2 つのテキスト (ポジティブとネガティブ) を比較し、パープレキシティが低い方をモデル予測として選択します。
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 | MaskedLM |
ロベルタ | ロバータ・ラージ | MaskedLM |
GPT2 | gpt2-xl | LM |
フラン-ul2 | google/flan-ul2 | エンコーダデコーダLM |
GPT-NeoX | EleutherAI/gpt-neox-20b | LM |
オプト | フェイスブック/オプト-30b | LM |
ミストラル | ミストラライ/Mixtral-8x22B-v0.1 | LM |
ラマ 3 | メタラマ/メタラマ-3-8B | LM |
Max Token Length : 各 LM には独自の最大トークン長があります (リカレント/マスクされた LM の場合はmax_length
、エンコーダ/デコーダ LM の場合はmax_length_encoder
およびmax_length_decoder
)。これらの最大トークンを制限すると、テキストの処理時間が短縮されますが、複雑さの精度に影響する可能性があるため、テキストを試して最適なトークン長を決定してください。
バッチ サイズ: 関数get_perplexity
にバッチ サイズを渡すことができます (例: get_perplexity(text, batch_size=32)
)。デフォルトでは、すべてのテキストが一度に処理されるため、テキストの数が多すぎるとメモリ エラーが発生する可能性があります。