【发布时间】:2021-01-20 20:22:53
【问题描述】:
使用 longformer API 返回有限层数的正确方法是什么?
与基本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,尺寸仍然看起来不对,我不清楚
如何将这些减少到向量大小的一维嵌入。这就是我的意思:
encoded_input = tokenizer(text, return_tensors="pt", max_length=4096, truncation=True)
output = model(**encoded_input, output_hidden_states=True)
好的,现在让我们看看输出[2],元组的第三项:
>>> len(output[2])
13
假设我们要查看 13 层中的最后 3 层:
>>> [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)
将这些平均在一起似乎不会给出有效的嵌入(用于余弦相似度等比较)。
【问题讨论】:
标签: word-embedding huggingface-transformers