贝叶斯超参数优化+交叉验证

机器算法验证 机器学习 神经网络 交叉验证 超参数 贝叶斯优化
2022-04-20 17:31:22

我想使用贝叶斯优化来搜索神经网络模型的超参数空间。我对这个优化的目标函数是验证集的准确性。

此外,我想执行交叉验证,以便在对整个训练集进行训练时,可以很好地估计测试集性能的最佳超参数。

考虑到这两个愿望,以及贝叶斯优化过程的搜索空间,我可以看到两个关于如何在高层次上进行实验的选项。

首先,我将训练集分成 N 折。然后对于每个折叠,我运行整个贝叶斯优化过程,这会为我的超参数生成 N 组值,每个折叠的最佳集合。我从 N 折中选择最好的一组,并在整个训练集上重新训练。这是经典环境中的交叉验证。

其次,在贝叶斯优化的目标函数的每次评估中,我执行交叉验证以找到最佳验证集精度。因此,我使用固定超参数训练模型,这些超参数是正在评估的搜索空间中的点。我对每个训练集折叠都这样做,并对每个相应的验证折叠进行评估。然后,在贝叶斯优化过程中为此评估返回的目标函数值是最佳验证集精度。

我的问题是:这两种方法是否等效?后者是对最佳参数的统计有效估计,还是完全其他的?无论哪种方式都有(不利)优势吗?鉴于我正在使用的贝叶斯优化框架 ( Optuna ) ,后者更容易实现。

1个回答

我的演示代码在这里检查出来,然后回到这里阅读/留下评论。如果你想编辑我的代码,让它在更多种类的机器上运行,那就太好了;只需提交一个拉取请求和/或自己分叉代码,并出于礼貌让我知道。

交叉验证是贝叶斯优化的近似值,因此不必将其与 Optuna 一起使用。但是,如果它有意义并且你有时间去做,它只会导致元优化。

我昨天在设置参数研究时意识到了这一点,并意识到这需要几个月,而不仅仅是几天才能完成。这是我最初设置的方式:

  1. 将 MNIST 训练和测试集组合成一个数据集,然后进行训练和验证n次(对于 MNIST 组合,n=70,000) 持有nv=65,697随机选择的样本在每个交叉验证复制中的每个训练时期进行验证。

  2. 使用以下方法训练每个复制品的模型nc=4,303没有为验证而保留的样本(每个时期结束时的损失是在保留时计算的nv样本)直到验证损失在指定数量的时期内停止减少(通过 Keras 的EarlyStopping带有耐心参数的回调)。向 Optuna 报告模型的性能,作为所有复制中最佳训练模型的平均验证损失。选择方法见下文nc=nnv(训练集大小)。

  3. 将步骤 1 和 2 组合成 Optuna 的目标函数,以最小化平均验证损失。执行研究,确保指定direction='minimize'.

我最终使用的是每次 Optuna 试验只需要几分钟(最多)的东西,而不是 70,000 倍:

  1. 分别加载 MNIST 训练和测试集并保持nv=nnc仅从训练集中随机选择的样本,用于在每个训练时期进行验证。

  2. 使用训练单个模型nc样本(对于 MNIST,这是 3,833),直到验证损失(根据保留计算nv=nnc样本)在几个时期内停止减少(如 Keras 的EarlyStopping带有耐心参数的回调)。通过推断测试数据集(不参与训练或验证)并计算任何相关后果所涉及的概率作为风险度量(如果可能),以评估具有最低验证损失的模型的性能。

  3. 将步骤 1 和 2 组合成 Optuna 的目标函数,以最小化或最大化(取决于风险/评估指标)。然后执行研究,确保指定优化方向(direction='maximize'direction='minimize'适当)。

注意: 在这种情况下nc=n3/4基于以下引用的文章;通常人们使用不到一半的数据进行验证,但在这种情况下,训练的数据总是不超过一半,而且通常要少得多。此外,至少重复训练和验证步骤n同一篇文章要求时间。即使我没有进行交叉验证,我仍然在训练期间进行验证,因此尽管缺乏这样做的理论基础,我仍然使用这种指数计算来计算训练集的大小。通常的做法是保留 1/5 的数据(或 K 折的 1/K)进行验证。在这种情况下,我坚持1n3/4验证数据的比例,最终总是超过整个数据集的 1/2。

作者:邵军

文章:通过交叉验证选择线性模型

出版信息:美国统计协会杂志;亚历山大卷。88,伊斯。422,(1993 年 6 月):486。

摘要:考虑在一类线性模型中选择具有最佳预测值的模型的问题。提供了使用 leave-nv-out 交叉验证方法的一些实际方面的动机、理由和讨论,并给出了模拟研究的结果。