假设我已将数据集拆分为训练集、验证集和测试集。
现在我已经训练了一个网络,然后对验证集进行了一组超参数调优。我在验证集上取得了不错的成绩。
然后最后你在测试集上运行它,它给你带来了相当大的准确性下降。
下一步你要怎么做?当然,您无法进一步调整模型。
您是否使用全新的初始化/拆分/洗牌数据集重新运行模型并重新进行实验?但是你也从之前实验的测试数据中学到了一些东西,这意味着你在下一轮重新训练模型时会出现偏差(例如,你更有可能尝试与上次,甚至可能使用相同的参数)。我的观察正确吗?
假设我已将数据集拆分为训练集、验证集和测试集。
现在我已经训练了一个网络,然后对验证集进行了一组超参数调优。我在验证集上取得了不错的成绩。
然后最后你在测试集上运行它,它给你带来了相当大的准确性下降。
下一步你要怎么做?当然,您无法进一步调整模型。
您是否使用全新的初始化/拆分/洗牌数据集重新运行模型并重新进行实验?但是你也从之前实验的测试数据中学到了一些东西,这意味着你在下一轮重新训练模型时会出现偏差(例如,你更有可能尝试与上次,甚至可能使用相同的参数)。我的观察正确吗?
一般来说,这不应该是这种情况,并且很可能是一个实现错误。验证性能应该非常接近测试性能。如果不是这种情况,则:
A) [最有可能]代码存在以下错误之一:
可能性 1:测试集的预处理不正确。例如,对训练集和验证集应用某种预处理(零意义、规范化等),而不是测试集。
可能性2:在模式下测试模型train。某些层(例如批量归一化)在训练和推理时的表现不同。
可能性 3:其他一些与实现相关的错误。
B)验证集和测试集来自非常不同的分布。
C)数据集很小,验证集更小。
你已经过拟合了训练集。使用更多数据或某种形式的正则化(可能包括添加的噪声)再试一次。
这可能是由于您的开发集和测试集的分布不同。
对此进行测试的一种方法是训练一个能够区分训练/开发与测试集的分类器。
如果您的数据集很小,您绝对应该检查开发/测试指标的下降是否在拆分之间保持一致。如果下降变化,您应该进行嵌套交叉验证。这样,您可以对拆分进行平均(这是随机的)并获得对真实性能的更好估计。