2

我如何从拥抱脸的特征提取管道中获得整个句子的嵌入?

我了解如何获取每个标记的特征(如下),但我如何获得整个句子的整体特征?

feature_extraction = pipeline('feature-extraction', model="distilroberta-base", tokenizer="distilroberta-base")
features = feature_extraction("i am sentence")
4

3 回答 3

3

为了更多地解释我在stackoverflowuser2010的回答下的评论,我将使用“准系统”模型,但pipeline组件的行为是相同的。

BERT 和派生模型(包括 DistilRoberta,这是您在管道中使用的模型)通常使用特殊标记(主要表示为[CLS]第一个标记)指示句子的开头和结尾,这通常是进行预测的最简单方法/在整个序列上生成嵌入。社区内有关于哪种方法更好的讨论(另请参见此处的 stackoverflowuser2010 的更详细答案),但是,如果您只是想要一个“快速”的解决方案,那么使用[CLS]令牌肯定是一种有效的策略。

现在,虽然文档不是FeatureExtractionPipeline很清楚,但在您的示例中,我们可以通过直接模型调用轻松比较输出,特别是它们的长度:

from transformers import pipeline, AutoTokenizer

# direct encoding of the sample sentence
tokenizer = AutoTokenizer.from_pretrained('distilroberta-base')
encoded_seq = tokenizer.encode("i am sentence")

# your approach
feature_extraction = pipeline('feature-extraction', model="distilroberta-base", tokenizer="distilroberta-base")
features = feature_extraction("i am sentence")

# Compare lengths of outputs
print(len(encoded_seq)) # 5
# Note that the output has a weird list output that requires to index with 0.
print(len(features[0])) # 5

在检查 的内容时encoded_seq,您会注意到第一个标记用 索引0,表示序列的开始标记(在我们的例子中,嵌入标记)。由于输出长度相同,因此您可以通过执行类似的操作来简单地访问初步的句子嵌入

sentence_embedding = features[0][0]

于 2020-11-06T11:57:17.287 回答
0

如果您有每个标记的嵌入,您可以通过汇集(汇总)它们来创建整体句子嵌入。请注意,如果您有 D 维令牌嵌入,您应该通过以下方法之一获得 D 维句子嵌入:

  1. 计算所有令牌嵌入的平均值。

  2. 计算所有令牌嵌入的每个 D 维的最大值。

于 2020-11-06T04:03:08.633 回答
0

如果您想获得有意义的整句嵌入,请使用 SentenceTransformers。池化在其中得到了很好的实现,它还为微调模型提供了各种 API,以在句子/文本块级别生成特征/嵌入

pip install sentence-transformers

安装句子转换器后,可以使用以下代码生成句子嵌入

from sentence_transformers import SentenceTransformer
model_st = SentenceTransformer('distilroberta-base')
embeddings = model_st.encode("I am a sentence')
print(embeddings)

有关句子转换器的更多信息,请访问官方网站

于 2022-01-22T11:59:25.820 回答