使用 BERT 进行序列标记
Sequence Labelling with BERT
我正在使用由嵌入层和 LSTM 组成的模型在 pytorch + torchtext 中执行序列标记。我已经标记了句子。
如果我使用自训练或其他预训练的词嵌入向量,这很简单。
但是,如果我使用 Huggingface 转换器 BertTokenizer.from_pretrained
和 BertModel.from_pretrained
,则会在句子的开头和结尾分别添加一个 '[CLS]'
和 '[SEP]'
标记。所以模型的输出变成了一个比label/target序列长两个元素的序列。
我不确定的是:
BertModel
是否需要这两个标签来嵌入句子的每个标记 "correctly"?
- 如果需要的话,能不能在BERT嵌入层之后,输入到LSTM之前,把它们拿出来,这样输出的长度就正确了?
是的,BertModel
需要它们,因为如果不添加这些特殊符号,输出表示将会不同。然而,根据我的经验,如果你在没有添加 [CLS]
和 [SEP]
标记的情况下对标记任务进行 BertModel
微调,那么你可能看不到显着差异。如果你用BertModel
提取固定的词特征,那你最好加上那些特殊符号。
是的,你可以去掉那些特殊符号的嵌入。事实上,这是序列标注或标记任务的一般思路。
我建议您查看一些使用 BERT 进行序列标记或标记的示例,以便对您的建模决策充满信心。您可以找到使用 Huggingface 变换器 here.
的 NER 标记示例
我正在使用由嵌入层和 LSTM 组成的模型在 pytorch + torchtext 中执行序列标记。我已经标记了句子。
如果我使用自训练或其他预训练的词嵌入向量,这很简单。
但是,如果我使用 Huggingface 转换器 BertTokenizer.from_pretrained
和 BertModel.from_pretrained
,则会在句子的开头和结尾分别添加一个 '[CLS]'
和 '[SEP]'
标记。所以模型的输出变成了一个比label/target序列长两个元素的序列。
我不确定的是:
BertModel
是否需要这两个标签来嵌入句子的每个标记 "correctly"?- 如果需要的话,能不能在BERT嵌入层之后,输入到LSTM之前,把它们拿出来,这样输出的长度就正确了?
是的,
BertModel
需要它们,因为如果不添加这些特殊符号,输出表示将会不同。然而,根据我的经验,如果你在没有添加[CLS]
和[SEP]
标记的情况下对标记任务进行BertModel
微调,那么你可能看不到显着差异。如果你用BertModel
提取固定的词特征,那你最好加上那些特殊符号。是的,你可以去掉那些特殊符号的嵌入。事实上,这是序列标注或标记任务的一般思路。
我建议您查看一些使用 BERT 进行序列标记或标记的示例,以便对您的建模决策充满信心。您可以找到使用 Huggingface 变换器 here.
的 NER 标记示例