使用 BERT 进行序列标记

Sequence Labelling with BERT

我正在使用由嵌入层和 LSTM 组成的模型在 pytorch + torchtext 中执行序列标记。我已经标记了句子。

如果我使用自训练或其他预训练的词嵌入向量,这很简单。

但是,如果我使用 Huggingface 转换器 BertTokenizer.from_pretrainedBertModel.from_pretrained,则会在句子的开头和结尾分别添加一个 '[CLS]''[SEP]' 标记。所以模型的输出变成了一个比label/target序列长两个元素的序列。

我不确定的是:

  1. BertModel 是否需要这两个标签来嵌入句子的每个标记 "correctly"?
  2. 如果需要的话,能不能在BERT嵌入层之后,输入到LSTM之前,把它们拿出来,这样输出的长度就正确了?
  1. 是的,BertModel 需要它们,因为如果不添加这些特殊符号,输出表示将会不同。然而,根据我的经验,如果你在没有添加 [CLS][SEP] 标记的情况下对标记任务进行 BertModel 微调,那么你可能看不到显着差异。如果你用BertModel提取固定的词特征,那你最好加上那些特殊符号。

  2. 是的,你可以去掉那些特殊符号的嵌入。事实上,这是序列标注或标记任务的一般思路。

我建议您查看一些使用 BERT 进行序列标记或标记的示例,以便对您的建模决策充满信心。您可以找到使用 Huggingface 变换器 here.

的 NER 标记示例