相当长一段时间以来,我一直在为MADE 1.0数据集使用BERT使用Google的HuggingFace的PyTorch实现。直到上次(2月11日),我一直在使用库,并通过微调模型为命名实体识别任务获得 0.81 F分数。但是这周,当我运行与先前编译并运行的完全相同的代码时,在执行以下语句时抛出了错误:

input_ids = pad_sequences([tokenizer.convert_tokens_to_ids(txt) for txt in tokenized_texts], maxlen=MAX_LEN, dtype="long", truncating="post", padding="post")



完整代码可在colab notebook中获得。

为了解决此错误,我通过采用任何序列的前512个 token 将上述语句修改为以下语句,并进行了必要的更改,以根据BERT的要求将[SEP]的索引添加到截断/填充序列的末尾。
input_ids = pad_sequences([tokenizer.convert_tokens_to_ids(txt[:512]) for txt in tokenized_texts], maxlen=MAX_LEN, dtype="long", truncating="post", padding="post")

结果应该没有改变,因为我只考虑序列中的前512个 token ,后来将其截断为75(MAX_LEN = 75),但是我的 F分数已降至 0.40 ,我的精度降至 0.27 ,而调用仍为(0.85)。我已经签署了保密条款,因此无法共享数据集,但是我可以确保完成BERT所需的所有预处理,并且所有扩展 token (如(Johanson-> Johan ## son))都已标记为X并替换了如BERT Paper中所述,在预测之后。

是否还有其他人遇到过类似的问题,或者能否详细说明PyTorch(拥抱面子)人们最近在其端头所做的事情或发生了哪些变化?

最佳答案

我找到了解决此问题的解决方案。
使用pytorch-pretrained-bert == 0.4.0运行相同的代码可以解决此问题,并且性能恢复正常。
新更新中的BERT Tokenizer或BERTForTokenClassification中的模型性能有些困惑,这会影响模型性能。
希望HuggingFace能够尽快解决此问题。 :)

pytorch-pretrained-bert == 0.4.0,测试F1-得分:0.82

pytorch-pretrained-bert == 0.6.1,测试F1-分数:0.41

谢谢。

10-01 20:29