训练有素的 BERT 模型在测试集上的表现不可预测

数据挖掘 nlp 伯特 变压器
2021-10-10 05:20:50

我们正在为具有六个标签的序列标记任务训练一个 BERT 模型(使用 Huggingface 库):五个标签表示一个标记属于我们感兴趣的类别,一个标签表示该标记不属于任何类别.

一般来说,这很有效:损失随着每个时期而减少,我们得到了足够好的结果。但是,如果我们在测试集上的每个 epoch 之后计算精度、召回率和 f-score,我们会发现它们波动很大。我们训练了 1000 个 epoch。在 100 个 epoch 之后,性能似乎已经趋于平稳。在过去的 900 个 epoch 中,精度不断跃升至 0.677 到 0.709 之间看似随机的值;召回在 0.729 和 0.798 之间。该模型似乎并没有稳定下来。为了缓解这个问题,我们已经尝试了以下方法:

  • 我们增加了测试数据集的大小。
  • 我们尝试了不同的学习率和批量大小。
  • 我们使用了 Huggingface 库中的不同变压器模型,例如 RoBERTa、GPT-2 等。这些都没有帮助。

有人对我们可以在这里做什么有任何建议吗?我们如何选择“最佳模型”?目前,我们选择在测试集上表现最好的那个,但我们不确定这种方法。

1个回答

BERT 风格的微调以其不稳定性而闻名。遇到此类问题时要考虑的一些方面是:

  • 通常用于微调 BERT 模型的 epoch 数通常在 3 左右。
  • 不稳定的主要来源是原始 BERT 文章的作者建议使用 Adam 优化器但禁用偏差补偿(这种变体被称为“BertAdam”)。
  • 目前,从业者已经从 Adam 转向AdamW作为优化器。
  • 通常会进行多次“重新启动”,即多次训练模型并在验证数据上选择表现最好的模型。
  • 模型检查点通常在每个 epoch 之后保存。我们选择的模型是在我们尝试的每次重启的所有 epoch 中具有最佳验证损失的检查点。

有两篇主要文章研究了可能对您有用的类似 BERT 的微调不稳定性。他们详细描述了我之前提到的大部分方面: