Запутанность языковых моделей

Nov 27 2022
Недоумение — это показатель оценки, который измеряет качество языковых моделей. В этом посте мы обсудим, что такое Perplexity и как он рассчитывается для популярной модели GPT2.

Недоумение — это показатель оценки, который измеряет качество языковых моделей. В этом посте мы обсудим, что такое perplexity и как он рассчитывается для популярной модели GPT2 .

Что такое языковая модель?

Возможно, вы уже слышали о больших языковых моделях (LLM), таких как BERT, GPT2 и т. д., которые изменили лицо обработки естественного языка. Существуют различные типы языковых моделей, такие как статистические языковые модели и нейронные языковые модели. SLM основаны на статистике в данном тексте, тогда как модели нейронного языка обучаются с использованием архитектур нейронных сетей.

По своей сути языковая модель (LM) представляет собой не что иное, как распределение вероятностей по набору слов, известное как словарный запас модели. Он говорит о вероятности появления определенного слова в словаре с учетом всех его предыдущих слов. Обычно любое слово, которое имеет максимальную вероятность, выбирается в качестве следующего предсказанного слова в последовательности.

Эта вероятность может быть рассчитана путем умножения последовательности условных вероятностей для каждого слова с учетом его предыдущих слов, что дает вероятность этой последовательности.

Например, совместная вероятность примерного предложения «Это прекрасный день» записывается, как показано ниже. Вычисление этой вероятности помогает нам предсказать следующие или отсутствующие слова в последовательности, и, таким образом, модель изучает нюансы языка — отсюда и термин «языковая модель».

P(It,is,a,beautiful,day) = P(day|beautiful, a, is, it) * 
                           P(beautiful|a, is, it) * P(a|is, it) * P(is|it)

В следующих разделах мы обсудим некоторые важные термины, которые используются для расчета Perplexity.

Энтропия

Энтропия — это мера, которая количественно определяет неопределенность и получается как обратная величина вероятности события. Чем выше вероятность, тем меньше неопределенность. Следовательно, целью языковой модели является минимизация энтропии генерации последовательности слов, подобных обучающим последовательностям. Формула для расчета энтропии приведена ниже, где P(x) — вероятность слова x.

Формула энтропии распределения вероятностей

Вот отличное видео, чтобы понять энтропию более подробно:https://youtube.com/watch?v=YtebGVx-Fxw

Перекрестная энтропия

Cross Entropy сравнивает два распределения вероятностей P(x) и Q(x). В контексте языковых моделей мы сравниваем прогнозируемое распределение вероятностей по словам с фактическим распределением вероятностей. Здесь P(x) — фактическое распределение вероятностей, а Q(x) — предсказанное моделью распределение. Затем вычисляется перекрестная энтропия, как показано ниже, которую можно использовать в качестве функции потерь для обучения языковых моделей.

Допустим, у нас есть языковая модель, обученная со словарным запасом всего из 5 слов «солнечно», «день», «красиво», «пейзаж», «облака». Теперь мы хотим рассчитать недоумение модели, когда она увидит фразу «красивый пейзаж».

Рассчитаем кросс-энтропию на простом примере в PyTorch.

# Get the needed libraries
import torch
from torch.nn import functional as F

Затем эти логиты передаются функции softmax , которая нормализует значения и преобразует их в распределение вероятностей. Это прогнозируемое распределение вероятностей.

tensor([[-0.7891,  1.3421,  0.4929,  0.0715, -0.0910],
        [ 0.9024, -0.8675,  0.8498, -1.0331,  0.5531]])

F.softmax(input, dim = -1)

Predicted:

tensor([[0.0575, 0.4841, 0.2071, 0.1359, 0.1155],
        [0.3369, 0.0574, 0.3196, 0.0486, 0.2375]])

Target/Actual: tensor([2, 3])

tensor([[0, 0, 1, 0, 0],
        [0, 0, 0, 1, 0]])

Loss for First Word:
(((- 0 * log(0.0575)) + (- 0 * log(0.4841)) + (- 1 * log(0.2071)) + 
  (- 0 * log(0.1359)) + (- 0 * log(0.1155))) = 1.5745535105805986

Loss for Second Word:
(((- 0 * log(0.3369)) + (- 0 * log(0.0574)) + (- 0* log(0.3196)) + 
  (- 1* log(0.0486)) + (- 0 * log(0.2375))) = 3.024131748075689

Loss = (1.5745535105805986 + 3.024131748075689)/2 = 2.299

loss = torch.nn.CrossEntropyLoss()

output = loss(input, target)
output

Loss: tensor(2.299)

Интуитивно недоумение означает удивление. Мы измеряем, насколько модель удивлена, увидев новые данные. Чем ниже недоумение, тем лучше тренировка.

Недоумение рассчитывается как экспонента потери, полученной из модели. В приведенном выше примере мы видим, что недоумение нашей примерной модели в отношении фразы «красивый пейзаж» составляет 9,97. Формула недоумения представляет собой показатель средней логарифмической вероятности всех слов во входной последовательности.

Формула недоумения от HuggingFace

Теперь давайте сравним запутанность двух предложений с GPT2 и посмотрим, насколько она запутана. Сначала мы загружаем токенизатор и каузальную голову для модели GPT2 от HuggingFace:

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
inputs = tokenizer("ABC is a startup based in New York City and Paris", return_tensors = "pt")
loss = model(input_ids = inputs["input_ids"], labels = inputs["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)

Output: 29.48

inputs_wiki_text = tokenizer("Generative Pretrained Transformer is an opensource artificial intelligence created by OpenAI in February 2019", return_tensors = "pt")
loss = model(input_ids = inputs_wiki_text["input_ids"], labels = inputs_wiki_text["input_ids"]).loss
ppl = torch.exp(loss)
print(ppl)

Output: 211.81

Недоумение обычно используется только для определения того, насколько хорошо модель усвоила тренировочный набор. Другие показатели, такие как BLEU , ROUGE и т. д ., используются в тестовом наборе для измерения производительности теста.

В этом посте мы обсудили и рассчитали перекрестную энтропию, недоумение языковой модели. В следующем посте мы поговорим о тесте GLUE, который измеряет общую способность понимания языка популярных языковых моделей.

использованная литература