【发布时间】:2020-12-23 20:49:09
【问题描述】:
我正在使用 Huggingface Trainer class 对 文档文本二进制分类任务 上的 Longformer 进行微调,并且我正在使用 Tensorboard 监控一些检查点的措施。
即使 F1 分数和准确率相当高,我也对训练损失的波动感到困惑。
我在网上看到一个原因可能是:
- 学习率太高,但我尝试了 3 个值(1e-4、1e-5 和 1e-6),它们都取得了相同的效果
- 小批量。我正在使用具有 8xK80 GPU 的 Sagemaker notebook p2.8xlarge。我可以用来避免 CUDA 内存不足错误的每个 GPU 的批处理大小为 1。因此,总批处理大小为 8。我的直觉是 8 的 bs 对于包含 57K 示例(每个 epoch 7K 步)的数据集来说太小了。不幸的是,这是我可以使用的最高值。
这里我报告了F1、accuracy、loss和smoothed loss的趋势。灰线是1e-6的学习率,粉红色的是1e-5。
我重新了解了我培训的所有信息:
- 批量大小:1 x 8GPU = 8
- 学习率:1e-4、1e-5、1e-6(所有测试都没有改进损失)
- 型号:Longformer
-
数据集:
- 训练集:57K 示例
- 开发集:12K 示例
- 测试集:12K 示例
这可能是什么原因?尽管 F1 和准确度结果相当好,这是否可以被视为一个问题?
【问题讨论】:
-
这是由小批量造成的。
-
这可以被认为是模型预测的问题吗?你认为bs越高f1也可以提高吗?
-
F1 分数取决于广告召回率。如果增加batch_size,您可以获得平滑的
loss曲线。但 F1 分数取决于您的模型在所有类别上的表现。因此,每个类中的示例数量也会影响 f1 分数。 -
所以也许,保持固定 bs,减少训练集大小是一种改进吗?
-
减少训练集大小应该没有帮助。如果您的评估指标/结果看起来不错,这可能不是主要问题。你看到小批量的原因是你可以获得一个“简单”的批量,其中说 5/8 的例子很容易,而 3/8 的例子有点难。如果您想尝试增加批量大小,您可以尝试梯度累积和/或梯度检查点,这两种方法都可以让您在一个步骤中进行更多处理,但代价是速度较慢
标签: python machine-learning pytorch huggingface-transformers allennlp