我如何从拥抱脸的特征提取管道中获得整个句子的嵌入?
我了解如何获取每个标记的特征(如下),但我如何获得整个句子的整体特征?
feature_extraction = pipeline('feature-extraction', model="distilroberta-base", tokenizer="distilroberta-base")
features = feature_extraction("i am sentence")
我如何从拥抱脸的特征提取管道中获得整个句子的嵌入?
我了解如何获取每个标记的特征(如下),但我如何获得整个句子的整体特征?
feature_extraction = pipeline('feature-extraction', model="distilroberta-base", tokenizer="distilroberta-base")
features = feature_extraction("i am sentence")
为了更多地解释我在 stackoverflowuser2010 的回答下的评论,我将使用“准系统”模型,但行为与 pipeline
组件相同。
BERT 和派生模型(包括 DistilRoberta,这是您在管道中使用的模型)通常使用特殊标记(通常表示为第一个标记的 [CLS]
)表示句子的开头和结尾,这通常是最简单的方法在整个序列上进行预测/生成嵌入。社区中有关于哪种方法更好的讨论(另请参见 stackoverflowuser2010 here 的更详细答案),但是,如果您只是想要一个“快速”的解决方案,那么使用 [CLS]
令牌肯定是一个有效的策略。
现在,虽然 documentation 的 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]
如果您想获得有意义的整个句子嵌入,请使用sencencetransformers。合并在其中实现了很好,它还为微调模型提供了各种API,以在句子/文本锁定级别生成功能/嵌入
一旦安装了句子转换器,下面的代码可用于生成句子嵌入
有关句子变形金刚的更多信息,请访问官方 site 。