gpt4 book ai didi

word-embedding - longformer 的最后一层用于文档嵌入

转载 作者:行者123 更新时间:2023-12-04 03:52:45 36 4
gpt4 key购买 nike

使用 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,因为它对应于我的 token 数:

>>> np.mean(np.stack([pair[0].detach().numpy() for pair in output[2][-3:]]), axis=0).shape
(4096, 768)

将它们平均在一起似乎不会给出有效的嵌入(对于余弦相似度之类的比较)。

最佳答案

output 是一个由两个元素组成的元组:

  1. sequence_output(即最后一个编码器 block )
  2. 合并输出

为了获得所有隐藏层,需要将参数output_hidden_​​states设置为true:

output = model(**encoded_input, output_hidden_states=True)

输出现在有 3 个元素,第三个元素包含嵌入层和每个编码层的输出。

关于word-embedding - longformer 的最后一层用于文档嵌入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64217601/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com