Ошибка индекса трансформаторов Longformer: индекс вне диапазона в self

#python #deep-learning #pytorch

Вопрос:

Из библиотеки, которую я использую (все они используют ). LongformerModel, LongformerTokenizerFast, LongformerConfig from_pretrained("allenai/longformer-base-4096")

Когда я это сделаю

 longformer(input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
 

Я получаю такую ошибку:

 ~/tfproject/tfenv/lib/python3.7/site-packages/transformers/modeling_longformer.py in forward(self, input_ids, token_type_ids, position_ids, inputs_embeds)
    177         if inputs_embeds is None:
    178             inputs_embeds = self.word_embeddings(input_ids)
--> 179         position_embeddings = self.position_embeddings(position_ids)
    180         token_type_embeddings = self.token_type_embeddings(token_type_ids)
    181 

~/tfproject/tfenv/lib/python3.7/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    548             result = self._slow_forward(*input, **kwargs)
    549         else:
--> 550             result = self.forward(*input, **kwargs)
    551         for hook in self._forward_hooks.values():
    552             hook_result = hook(self, input, result)

~/tfproject/tfenv/lib/python3.7/site-packages/torch/nn/modules/sparse.py in forward(self, input)
    112         return F.embedding(
    113             input, self.weight, self.padding_idx, self.max_norm,
--> 114             self.norm_type, self.scale_grad_by_freq, self.sparse)
    115 
    116     def extra_repr(self):

~/tfproject/tfenv/lib/python3.7/site-packages/torch/nn/functional.py in embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)
   1722         # remove once script supports set_grad_enabled
   1723         _no_grad_embedding_renorm_(weight, input, max_norm, norm_type)
-> 1724     return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
   1725 
   1726 

IndexError: index out of range in self
 

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

Но я проверил, и все входные данные содержат ровно 4098 токенов (что соответствует максимальной длине модели входного размера) (было применено заполнение). Маркировщик имеет тот же размер vocab, что и модель.

Я понятия не имею, что случилось.

Комментарии:

1. Может быть, один из ваших position_ids больше, чем num_embeddings в position_embeddings слое. В этом случае вам придется переиндексировать свой position_ids . Просто предположение.

2. У вас token_type_ids может быть только 4098 уникальных значений, но вы столкнетесь с этой ошибкой, если какое-либо из token_type_ids них превышает 4098.

3. @NihalSangeeth, привет, спасибо за ответ, мне уже удалось это исправить. Вы правы, мне пришлось переиндексировать свой position_ids . Это не token_type_ids было проблемой, потому что я вручную настроил их на проверку.

Ответ №1:

Мне удалось исправить это, переиндексировав мой position_ids .

Когда PyTorch создавал этот тензор, по какой-то причине некоторое значение в position_ids было больше 4098.

Я использовал:

 position_ids = torch.stack([torch.arange(config.max_position_embeddings) for a in range(val_dataloader.batch_size)]).to(device)
 

для создания position_ids всего пакета.

Имейте в виду, что это может быть не лучшим решением. Проблема может потребовать дополнительной отладки. Но для быстрого исправления это работает.