如何加快超参数优化?

机器算法验证 机器学习 超参数 优化
2022-04-11 10:19:28

对于我的应用程序,我正在对传感器信号进行分类。我编写了一个“快速原型”脚本来快速构建机器学习模型并返回它们的交叉验证性能。

我的管道如下:特征计算、特征选择、训练模型、计算交叉验证分数。

到目前为止,可调超参数包括:分类器的参数、特征选择算法的参数(保留多少特征以及 kNN 浮雕算法的 k)和窗口长度(从中计算特征向量)。

总共我最多有 8 个超参数,因此参数组合的最大数量以为界。是超参数类型的最大可能参数数)。B8
B

主要问题是,建立一个模型需要 15 分钟。即使对于小来说,这也是慢下来的方式。 有什么方法可以加快这个过程吗?B

3个回答

以下是一些加速超参数优化的通用技术。

如果您有一个大型数据集,请使用简单的验证集而不是交叉验证。与 k 折交叉验证相比,这将使速度提高 ~k 倍。如果您没有足够的数据,这将无法正常工作。

在多台机器上并行处理问题。每台机器都可以拟合具有不同超参数选择的模型。这将使 m 台机器的速度提高 ~m 倍。

避免冗余计算。预先计算或缓存可重复用于后续模型拟合的计算结果(或迭代更新的工作量少于从头计算的工作量)。几个简单的例子:如果模型需要成对距离矩阵,请在开始时计算所有距离,而不是在每次拟合模型时重新计算它们。如果模型需要均值和协方差矩阵,则根据每个训练集中的点迭代更新它们,而不是从头开始计算。

如果使用网格搜索,请减少您愿意考虑的超参数值的数量(即使用较粗的网格)。这可能会带来很大的加速,因为组合的总数成倍增加。风险在于,如果网格变得太粗糙,您可能会错过最佳值。您可以通过执行初始粗略搜索,然后在最佳初始值附近执行更精细搜索来弥补这一点。这比第一种策略更安全,但仍然存在一些风险,即最初的粗略搜索可能最终会出现在更精细的搜索无法逃脱的次优邻域中。

使用随机搜索。Bergstra 和 Bengio (2012) 描述了这种策略,并表明与网格搜索相比,它可以提供很大的加速。原因是模型性能可能对某些超参数比其他超参数更敏感,而重要的超参数是先验未知的。网格搜索可以通过尝试许多不同的非影响超参数值来浪费迭代,同时保持有影响的超参数不变。随机搜索从一些简单的分布中采样随机超参数值,因此所有超参数在每次迭代时都会发生变化。更改无影响的超参数几乎没有效果(因此不会丢失任何内容),更改有影响的超参数会提供更多改进的机会。

无论是使用网格搜索还是随机搜索,请确保值之间的间距适合每个超参数(在网格搜索中,这是网格间距;在随机搜索中,它与超参数值的采样分布有关)。例如,为某些超参数尝试线性间隔值,为其他超参数尝试对数间隔值是有意义的。使用不适当的间距可能会导致覆盖差(增加错过最佳值的风险)或需要过度密集的覆盖来补偿(浪费计算时间)。

使用贝叶斯优化。这是一种更为复杂的方法,并且是一个活跃的研究课题。在超参数优化的上下文中,它尝试在超参数上学习损失函数的模型,并使用该模型自适应地选择下一个要尝试的超参数值。新超参数的损失函数值依次用于更新模型。

参考:

伯格斯特拉和本吉奥 (2012)随机搜索超参数优化。

主要方法是允许对数据的子集或有限次数的迭代或有限的时间执行评估(如果您的算法是随时算法)。然后,您可以通过支持多保真评估的超参数优化算法来利用它,即,可以利用低保真目标函数评估(例如,在数据的子集上或经过少量迭代后获得)来自适应地获得洞察力关于高保真目标函数评估,以大大加快搜索过程。

仅当您的函数评估预算远低于变量数量的 10 倍和/或您的问题非常嘈杂时,才使用随机搜索。否则,几乎可以肯定有更好的算法可用于您的案例。

看看dlib 内置的优化器。它使用的技术“在数学上 [证明] 在许多重要情况下比随机搜索更好”。