如何将现有的huggingface-transformers模型用于spacy?

9
我在这里想问大家,是否可以将现有的huggingface-transformers训练模型与spacy一起使用。
我的第一个天真尝试是通过spacy.load('bert-base-uncased')加载它,但由于spacy要求特定的结构,因此它无法正常工作,这是可以理解的。
现在我正在尝试弄清楚如何使用spacy-transformers库加载模型,创建spacy结构,并从那一点开始将其用作正常的spacy感知模型。
我不知道它是否可能,因为我找不到任何有关该主题的信息。我已经尝试阅读文档,但我发现所有指南、示例和帖子都是从类似spacy/en_core_web_sm的spacy结构化模型开始的,但是该模型最初是如何创建的呢?我相信有人需要再次使用spacy进行训练。
我可以从你这里得到一些帮助吗?
谢谢。
1个回答

7
您需要在管道中添加一个Transformer组件,并将您的HuggingFace模型名称作为参数传递给它。这在文档中有所涵盖,尽管人们可能会有找不到的问题。重要的是要理解Transformer只是spaCy管道的一部分,并且您应该了解它如何配合使用。
从文档中提取,以下是如何在配置文件中指定自定义模型的方法:
[components.transformer.model]
@architectures = "spacy-transformers.TransformerModel.v3"
# XXX You can change the model name here
name = "bert-base-cased"
tokenizer_config = {"use_fast": true}

回到为什么需要了解spaCy的结构,理解在spaCy中,Transformers只是特征的来源非常重要。如果您的HuggingFace模型有一个NER头或其他它将不起作用。因此,如果您使用自定义模型,则需要在其上训练其他组件,例如NER。

另请注意,spaCy具有各种内置模型,这些模型不是Transformers。这些模型的训练速度非常快,在许多情况下,性能与Transformers相当;即使它们不够准确,您也可以使用内置模型来配置管道,然后只需切换到Transformer。

我找到的所有指南、示例和文章都从类似于spacy/en_core_web_sm的spaCy结构化模型开始,但是该模型最初是如何创建的?

您看过quickstart了吗?预训练模型是使用类似于您从其中获得的配置创建的。


你好 @pom23。非常感谢你的帮助。我将接受你所写的所有答案,尤其是“如果你的HuggingFace模型有一个NER头部或其他什么,它将无法工作。”这正是我想做的。我相信这需要太多的努力,而我无法承担。关于文档,它们非常好,但它们都从一些spacy预训练模型(如en_core_web_sm)开始,这就是我感到困惑的原因。但现在已经清楚了。谢谢。 - rdemorais
1
如果您想使用带有预训练头的模型,可以将其包装在一个小的自定义组件中,并使用输出来设置 Doc 对象上的注释。但是,如果这样做,您只使用了 spaCy 的一小部分功能,因此通常不值得。而且,spaCy 很难支持任意输出头,因为与基本张量相比,它们的表示方式变化更大。 - polm23
我理解您的观点。感谢您的时间。现在我知道该怎么做了。最好的问候。 - rdemorais
2
现在已经有一个官方的常见问题解答主题了。https://github.com/explosion/spaCy/discussions/10327 - polm23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接