Calcule a surpresa dos modelos de linguagem!
surprisal
suporta a maioria dos modelos de linguagem causal (modelos semelhantes a GPT2
e GPTneo
) do Huggingface ou ponto de verificação local, bem como modelos GPT3
da OpenAI usando sua API! Também oferecemos suporte a modelos de linguagem KenLM
baseados em N-gram usando a interface KenLM Python.
Modelos de linguagem mascarada (modelos semelhantes BERT
) estão em desenvolvimento e serão suportados no futuro (ver #9).
O trecho abaixo calcula surpresas por token para uma lista de sentenças
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 )
e produz uma saída deste tipo ( 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
Um objeto surpresa pode ser agregado em um subconjunto de tokens que melhor corresponda a um conjunto de palavras ou caracteres. Os limites das palavras são herdados do tokenizer padrão do modelo e podem não ser consistentes entre os modelos, portanto, usar intervalos de caracteres ao fatiar é a opção padrão e recomendada. As surpresas estão no espaço de log e, portanto, são adicionadas aos tokens durante a agregação. Por exemplo:
>> > [ 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
NOTA: OpenAI não retorna mais probabilidades de log na maioria de seus modelos recentemente. Consulte o nº 15. Para usar um modelo GPT-3 da API da OpenAI, você precisará obter o ID da sua organização e a chave API específica do usuário usando sua conta. Em seguida, use o OpenAIModel
da mesma forma que um modelo Huggingface.
m = surprisal . OpenAIModel ( model_id = 'text-davinci-002' ,
openai_api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ,
openai_org = "org-xxxxxxxxxxxxxxxxxxxxxxxx" )
Esses valores também podem ser passados usando variáveis de ambiente, OPENAI_API_KEY
e OPENAI_ORG
antes de chamar um script.
Você também pode chamar Surprisal.lineplot()
para visualizar as surpresas:
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
também tem uma CLI mínima:
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
Como surprisal
é usada por pessoas de comunidades diferentes para finalidades diferentes, por padrão, as dependências principais relacionadas à modelagem de linguagem são marcadas como opcionais. Dependendo do seu caso de uso, instale surprisal
com os extras apropriados.
Use um comando como pip install surprisal[optional]
, substituindo [optional]
por qualquer suporte opcional necessário. Para vários extras opcionais, use uma lista separada por vírgulas:
pip install surprisal[kenlm,transformers]
# the above is equivalent to
pip install surprisal[all]
As opções possíveis incluem: transformers
, kenlm
, openai
, petals
Se você usa poetry
para seu projeto existente, use a opção -E
para adicionar surprisal
junto com as dependências opcionais desejadas:
poetry add surprisal -E transformers -E kenlm
# the above is equivalent to
poetry add surprisal -E all
Para instalar também openai
e petals
, você pode fazer
poetry add surprisal -E transformers -E kenlm -E openai -E petals
# the above is equivalent to
poetry add surprisal -E allplus
O sinalizador -e
permite uma instalação editável, para que você possa fazer alterações no surprisal
.
git clone https://github.com/aalok-sathe/surprisal.git
pip install .[transformers] -e
Inspirado no agora inativo lm-scorer
; obrigado ao pessoal do CPLlab e EvLab pelos comentários e ajuda.
Licença MIT. (C) 2022-23, contribuintes.