gpt4 book ai didi

bert-language-model - 来自转换器的 BERT 句子嵌入

转载 作者:行者123 更新时间:2023-12-03 18:36:19 26 4
gpt4 key购买 nike

我正在尝试从 BERT 模型中的隐藏状态中获取句子向量。看着拥抱脸 BertModel 说明 here ,其中说:

from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')
model = BertModel.from_pretrained("bert-base-multilingual-cased")
text = "Replace me by any text you'd like."
encoded_input = tokenizer(text, return_tensors='pt')
output = model(**encoded_input)
所以首先要注意,因为它在网站上,它/not/运行。你得到:
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'BertTokenizer' object is not callable
但它看起来像是一个小改动修复了它,因为您不直接调用标记器,而是要求它对输入进行编码:
encoded_input = tokenizer.encode(text, return_tensors="pt")
output = model(encoded_input)
好的,除此之外,我得到的张量的形状与我预期的不同:
>>> output[0].shape
torch.Size([1,11,768])
这是很多层。哪个是用于句子嵌入的正确层? [0] ? [-1] ?平均几个?我的目标是能够与这些进行余弦相似度,所以我需要一个适当的 1xN 向量而不是 NxK 张量。
我看流行 bert-as-a-service project似乎使用 [0]这样对吗?是否有关于每一层是什么的文档?

最佳答案

我认为没有单一的权威文档说明使用什么以及何时使用。您需要试验和衡量什么最适合您的任务。这篇论文很好地总结了最近对 BERT 的观察:https://arxiv.org/pdf/2002.12327.pdf .
我认为经验法则是:

  • 如果您要为特定任务微调模型,请使用最后一层。并尽可能进行微调,几百甚至几十个训练示例就足够了。
  • 如果您无法对模型进行微调,请使用一些中间层(第 7 层或第 8 层)。其背后的直觉是,各层首先对输入进行越来越抽象和通用的表示。在某些时候,表示开始更多地针对预训练任务。

  • Bert-as-services 默认使用最后一层(但它是可配置的)。在这里,它将是 [:, -1] .但是,它始终返回所有输入标记的向量列表。对应于第一个特殊(所谓的 [CLS])标记的向量被认为是句子嵌入。这哪里 [0]来自您所指的狙击手。

    关于bert-language-model - 来自转换器的 BERT 句子嵌入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63461262/

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