SPARKNLP 中的 BERT 嵌入或 BERT 用于 huggingface 中的标记分类

BERT embeddings in SPARKNLP or BERT for token classification in huggingface

目前我正致力于在 Spark 上生产 NER 模型。我目前有一个使用 Huggingface DISTILBERT 和 TokenClassification 头的实现,但由于性能有点慢且成本高,我正在尝试寻找优化方法。

我已经检查了 SPARKNLP 实现,它缺少预训练的 DISTILBERT,我认为有不同的方法,因此出现了一些与此相关的问题:

  1. Huggingface 使用了整个 BERT 模型并添加了一个用于令牌 classification 的头部。这与获取 BERT 嵌入并将它们提供给另一个 NN 一样吗?
  2. 我问这个是因为这是 SPARKNLP 方法,一种 class 有助于获得这些嵌入并将其用作另一个复杂 NN 的特征。这样是不是丢失了一些BERT内部的知识?
  3. SPARKNLP 是否对 SPARK 进行了任何优化以帮助缩短推理时间,或者它只是另一个 BERT 实现。

回答你的问题。 1:

Hugging face针对不同的任务使用不同的head,这与BERT的作者对他们的模型所做的几乎相同。他们在现有模型之上添加了 task-specific 层到 fine-tune 用于特定任务。这里必须注意的一件事是,当您添加任务特定层(一个新层)时,您共同学习新层并更新 BERT 模型的现有学习权重。所以,基本上你的 BERT 模型是梯度更新的一部分。这与获取嵌入然后将其用作神经网络的输入完全不同。

问题二: 当您获得嵌入并将其用于另一个复杂模型时,我不确定如何根据丢失的信息进行量化,因为您仍在使用通过 BERT 从您的数据中获得的信息来构建另一个模型。因此,我们不能归因于丢失信息,但与在 BERT 之上(以及 BERT)学习另一个模型相比,性能不一定是最好的。

通常,由于资源限制,人们会获得嵌入,然后将其作为另一个分类器的输入,在这种情况下训练或 fine-tune BERT 可能不可行。