Как правильно вернуть ограниченное количество слоев с помощью API longformer?
В отличие от этого случая в базовом BERT мне не ясно из возвращаемого типа, как получить только последние N слоев.
Итак, я запускаю это:
from transformers import LongformerTokenizer, LongformerModel
text = "word " * 4096 # long document!
tokenizer = LongformerTokenizer.from_pretrained('allenai/longformer-base-4096')
model = LongformerModel.from_pretrained("allenai/longformer-base-4096")
encoded_input = tokenizer(text, return_tensors="pt", max_length=4096, truncation=True)
output = model(**encoded_input)
А по возвращении получаю такие размеры:
>>> output[0].shape
torch.Size([1, 4096, 768])
>>> output[1].shape
torch.Size([1, 768])
Вы можете видеть, что форма [0] любопытно похожа на мое количество жетонов. Я считаю, что нарезка этого просто дала бы мне меньше токенов, а не только последние N слоев.
Обновление из ответа ниже
Даже при запросе output_hidden_states
размеры все равно выглядят нечеткими, и мне не ясно, как уменьшить их до векторного размера, 1-мерного встраивания. Вот что я имею в виду:
encoded_input = tokenizer(text, return_tensors="pt", max_length=4096, truncation=True)
output = model(**encoded_input, output_hidden_states=True)
Хорошо, теперь давайте посмотрим на output [2], третий элемент кортежа:
>>> len(output[2])
13
Предположим, мы хотим увидеть последние 3 из 13 слоев:
>>> [pair[0].shape for pair in output[2][-3:]]
[torch.Size([4096, 768]), torch.Size([4096, 768]), torch.Size([4096, 768])]
Итак, мы видим, что каждый из 13 слоев имеет форму (4096 x 768), и они выглядят так:
>>> [pair[0] for pair in output[2][-3:]]
[tensor([[-0.1494, 0.0190, 0.0389, ..., -0.0470, 0.0259, 0.0609],
У нас все еще есть размер 4096, поскольку он соответствует моему количеству токенов:
>>> np.mean(np.stack([pair[0].detach().numpy() for pair in output[2][-3:]]), axis=0).shape
(4096, 768)
Усреднение их вместе, похоже, не дало бы действительного вложения (для сравнений, таких как косинусное сходство).