OM
Вот тут еще добавляют в начало токен <|endoftext|> и делают нормализацию по длине, чтобы длинные предложения не становились слишком маловероятными
Size: a a a
OM
DD
\n
до и после текста. Привт ммыр
токенизатор разбивает на 6 токенов, а Привет мир
- на 2, поэтому в случае с Привт ммыр
знаменатель большой, и перплексия относительно небольшая. Поэтому я предлагаю не нормализовать лосс на длину текста (т.е. фактически денормализовать его назад). Собственно, тогда мы получаем "вероятность предложения" в чистом виде: вероятность того, что GPT, если ему подать на вход \n
, сгенерирует твоё предложение, и потом сгенерирует \n
, обозначая конец предложения. def score(text):С более адекватными скорами
tokens_tensor = tokenizer.encode('\n' + text + '\n', add_special_tokens=False, return_tensors='pt')
loss=model(tokens_tensor, labels=tokens_tensor)[0]
n_tokens = tokens_tensor.shape[1] - 1
return loss.cpu().detach().numpy() * n_tokens
for text in ['Привет, мир!', 'Привт ммыр', 'Привет мир']:
print(score(text))
18.65758180618286
45.31049299240112
20.60703706741333
DD
AL
K
VF
A
K
K
EP
AM
🐙
SМ
SМ
SМ
🐙
SМ
SМ
A