言語モデルから驚きを計算しましょう!
surprisal
API を使用して OpenAI のGPT3
モデルだけでなく、Huggingface またはローカル チェックポイントのほとんどの因果言語モデル ( GPT2
およびGPTneo
のようなモデル) をサポートしています。 KenLM Python インターフェイスを使用したKenLM
N-gram ベースの言語モデルもサポートしています。
マスクされた言語モデル ( BERT
のようなモデル) はパイプラインにあり、将来サポートされる予定です (#9 を参照)。
以下のスニペットは、文のリストに対してトークンごとの驚きを計算します。
from surprisal import AutoHuggingFaceModel , KenLMModel
sentences = [
"The cat is on the mat" ,
"The cat is on the hat" ,
"The cat is on the pizza" ,
"The pizza is on the mat" ,
"I told you that the cat is on the mat" ,
"I told you the cat is on the mat" ,
]
m = AutoHuggingFaceModel . from_pretrained ( 'gpt2' )
m . to ( 'cuda' ) # optionally move your model to GPU!
k = KenLMModel ( model_path = './literature.arpa' )
for result in m . surprise ( sentences ):
print ( result )
for result in k . surprise ( sentences ):
print ( result )
そして、次のような出力が生成されます ( gpt2
)。
The Ġcat Ġis Ġon Ġthe Ġmat
3.276 9.222 2.463 4.145 0.961 7.237
The Ġcat Ġis Ġon Ġthe Ġhat
3.276 9.222 2.463 4.145 0.961 9.955
The Ġcat Ġis Ġon Ġthe Ġpizza
3.276 9.222 2.463 4.145 0.961 8.212
The Ġpizza Ġis Ġon Ġthe Ġmat
3.276 10.860 3.212 4.910 0.985 8.379
I Ġtold Ġyou Ġthat Ġthe Ġcat Ġis Ġon Ġthe Ġmat
3.998 6.856 0.619 2.443 2.711 7.955 2.596 4.804 1.139 6.946
I Ġtold Ġyou Ġthe Ġcat Ġis Ġon Ġthe Ġmat
3.998 6.856 0.619 4.115 7.612 3.031 4.817 1.233 7.033
サプライズ オブジェクトは、単語または文字の範囲に最もよく一致するトークンのサブセットにわたって集約できます。単語の境界はモデルの標準トークナイザーから継承され、モデル間で一貫していない可能性があるため、スライス時に文字スパンを使用することがデフォルトの推奨オプションです。サプライズはログ領域にあるため、集計中にトークンに追加されます。例えば:
>> > [ s ] = m . surprise ( "The cat is on the mat" )
>> > s [ 3 : 6 , "word" ]
12.343366384506226
Ġon Ġthe Ġmat
>> > s [ 3 : 6 , "char" ]
9.222099304199219
Ġcat
>> > s [ 3 : 6 ]
9.222099304199219
Ġcat
注: 最近、OpenAI はほとんどのモデルで対数確率を返さなくなりました。 #15 を参照してください。 OpenAI の API から GPT-3 モデルを使用するには、アカウントを使用して組織 ID とユーザー固有の API キーを取得する必要があります。次に、 OpenAIModel
Huggingface モデルと同じように使用します。
m = surprisal . OpenAIModel ( model_id = 'text-davinci-002' ,
openai_api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ,
openai_org = "org-xxxxxxxxxxxxxxxxxxxxxxxx" )
これらの値は、スクリプトを呼び出す前に、環境変数OPENAI_API_KEY
およびOPENAI_ORG
使用して渡すこともできます。
Surprisal.lineplot()
を呼び出して驚きを視覚化することもできます。
from matplotlib import pyplot as plt
f , a = None , None
for result in m . surprise ( sentences ):
f , a = result . lineplot ( f , a )
plt . show ()
surprisal
最小限の CLI もあります。
python - m surprisal - m distilgpt2 "I went to the train station today."
I Ġwent Ġto Ġthe Ġtrain Ġstation Ġtoday .
4.984 5.729 0.812 1.723 7.317 0.497 4.600 2.528
python - m surprisal - m distilgpt2 "I went to the space station today."
I Ġwent Ġto Ġthe Ġspace Ġstation Ġtoday .
4.984 5.729 0.812 1.723 8.425 0.707 5.182 2.574
surprisal
さまざまなコミュニティの人々によってさまざまな目的で使用されるため、デフォルトでは、言語モデリングに関連するコアの依存関係はオプションとしてマークされています。ユースケースに応じて、適切な追加機能を備えたsurprisal
インストールします。
pip install surprisal[optional]
のようなコマンドを使用し、 [optional]
必要なオプションのサポートに置き換えます。複数のオプションの追加の場合は、カンマ区切りのリストを使用します。
pip install surprisal[kenlm,transformers]
# the above is equivalent to
pip install surprisal[all]
可能なオプションには、 transformers
、 kenlm
、 openai
、 petals
が含まれます。
既存のプロジェクトにpoetry
使用する場合は、 -E
オプションを使用して、必要なオプションの依存関係とともにsurprisal
を追加します。
poetry add surprisal -E transformers -E kenlm
# the above is equivalent to
poetry add surprisal -E all
openai
とpetals
もインストールするには、次のようにします。
poetry add surprisal -E transformers -E kenlm -E openai -E petals
# the above is equivalent to
poetry add surprisal -E allplus
-e
フラグを使用すると編集可能なインストールが許可されるため、 surprisal
に変更を加えることができます。
git clone https://github.com/aalok-sathe/surprisal.git
pip install .[transformers] -e
現在は非アクティブになっているlm-scorer
からインスピレーションを得たものです。コメントと支援をくださった CPLlab と EvLab の方々に感謝します。
MITライセンス。 (C) 2022-23、寄稿者。