Как получить немедленную вероятность следующего слова с помощью модели GPT2? - PullRequest
6 голосов
/ 11 июля 2020

Пробовал модель gpt2 с обнимающим лицом. Я видел run_generation.py скрипт , который генерирует последовательность токенов на основе приглашения. Я знаю, что мы можем использовать GPT2 для NLG.

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

Например, учитывая подсказку: «Как дела», оно должно давать распределение вероятностей, в котором «вы» или «они» имеют несколько высоких значений с плавающей запятой и другие слова словаря имеют очень низкие плавающие значения.

Как это сделать с помощью трансформаторов объятия лица? Если это невозможно в объятиях лица, есть ли другая модель трансформатора, которая делает это?

1 Ответ

3 голосов
/ 15 июля 2020

Вы можете посмотреть, как сценарий генерации работает с вероятностями.

GPT2LMHeadModel (а также другие модели "MLHead") возвращает тензор, содержащий для каждый ввод ненормализованной вероятности того, каким может быть следующий токен. То есть, последний вывод модели - это нормализованная вероятность следующего токена (при условии, что input_ids - тензор с индексами токенов из токенизатора):

outputs = model(input_ids)
next_token_logits = outputs[0][:, -1, :]

Вы получаете распределение, нормализовав логиты с помощью softmax. Индексы в первом измерении next_token_logits соответствуют индексам в словаре, который вы получаете от объекта токенизатора.

Выбор последних логитов становится сложным, когда вы используете размер пакета больше 1 и последовательности разных длины. В этом случае вам нужно будет указать attention_mask в вызове модели, чтобы замаскировать маркеры заполнения, а затем выбрать последние логиты, используя torch.index_select. Намного проще использовать пакет размером 1 или пакет из одинаково длинных последовательностей.

Вы можете использовать любую авторегрессионную модель в Transformers: есть distilGPT-2 (дистиллированная версия GPT-2), CTRL (которая это в основном GPT-2, обученный с некоторыми дополнительными «командами»), исходный GPT (под именем openai-gpt), X LNet (предназначен для контекстного встраивания, но может использоваться для генерации в произвольном порядке). Там наверно больше, можно Hugging Face Model Hub .

...