Transformer-XL: ввод и метки для языкового моделирования - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь настроить предварительно обученную модель Transformer-XL transfo-xl-wt103 для задачи языкового моделирования. Поэтому я использую класс модели TransfoXLLMHeadModel.

Для перебора моего набора данных я использую LMOrderedIterator из файла tokenization_transfo_xl.py , который дает тензор с data и его target для каждой партии (и длины последовательности).

Предположим, что следующие данные с batch_size = 1 и bptt = 8:

data = tensor([[1,2,3,4,5,6,7,8]])
target = tensor([[2,3,4,5,6,7,8,9]])
mems # from the previous output

Мой вопрос: В настоящее время я передаю эти данные в модель следующим образом:

output = model(input_ids=data, labels=target, mems=mems)

Это правильно?

Мне интересно, потому что в документации для параметра labels указано:

метки (: obj: torch.LongTensor of shape: obj: (batch_size, sequence_length), optional, по умолчанию: obj: None): метки для языкового моделирования. Обратите внимание, что метки смещены внутри модели, т.е. вы можете установить lm_labels = input_ids

Итак, что это за параметр lm_labels? Я вижу только labels, определенный в методе forward.

И когда метки «смещаются» внутри модели, означает ли это, что я должен передать data дважды (дополнительно вместо targets ) потому что его сдвинули внутрь? Но как тогда модель узнает, какой следующий токен предсказать?

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

Заранее благодарим за помощь!

Редактировать : Ссылка на выпуск на Github

1 Ответ

2 голосов
/ 02 июня 2020

Это действительно похоже на опечатку из соглашения другой модели. Вам нужно передать данные дважды: один раз в input_ids и один раз в labels (в вашем случае [1, ... , 8] для обоих). Затем модель попытается предсказать [2, ... , 8] из [1, ... , 7]). Я не уверен, что добавление чего-либо в начале целевого тензора сработает, так как это, вероятно, вызовет несоответствие размеров позже по строке.

Двойной проход - это способ по умолчанию сделать это в трансформаторах; до вышеупомянутого PR, TransfoXL не менял метки внутри, и вам приходилось менять метки самостоятельно. PR изменил его, чтобы он соответствовал библиотеке и документации, где вы должны передавать одни и те же данные дважды.

...