Вы можете посмотреть, как сценарий генерации работает с вероятностями.
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 .