SPARKNLP或BERT中的BERT嵌入,用于在拥抱面中进行令牌分类

问题描述

目前,我正在在Spark上生产NER模型。我目前有一个使用TokenClassification头的Huggingface disTILBERT的实现,但是由于性能有点慢且成本很高,所以我试图找到优化的方法

我已经检查了SPARKNLP的实现,该实现缺少预先训练的disTILBERT,并且我认为使用的方法不同,因此出现了一些问题:

  1. Huggingface使用整个BERT模型,并为令牌分类添加一个头。这与获得BERT嵌入并将其馈送到另一个NN一样吗?
  2. 我之所以这样问,是因为这是SPARKNLP方法,该类可帮助消除这些嵌入并将其用作另一个复杂NN的功能。这样会不会失去BERT内部的一些知识?
  3. SPARKNLP是否对SPARK进行了任何优化以帮助推断时间,或者仅仅是另一种BERT实现。

解决方法

要回答您的问题号。 1:

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...