2

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

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

  1. Huggingface 使用了整个 BERT 模型,并为 token 分类添加了一个 head。这与获取 BERT 嵌入并将它们馈送到另一个 NN 是否相同?
  2. 我问这个是因为这是 SPARKNLP 方法,一个有助于获取这些嵌入并将其用作另一个复杂 NN 的特征的类。这不会丢失BERT内部的一些知识吗?
  3. SPARKNLP 是否对 SPARK 进行了任何优化以帮助缩短推理时间,或者它只是另一种 BERT 实现。
4

1 回答 1

1

回答你的问题没有。1:

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

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

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

于 2020-10-30T12:18:25.990 回答