机器学习中的随机搜索

2025年6月25日 | 阅读时长11分钟

机器学习超参数优化是一种通过运行随机搜索来为模型找到最佳超参数组合的技术。网格搜索系统地评估所有可能的超参数组合,而随机搜索则在定义的范围或分布内随机采样超参数。对采样集的组合根据模型在验证数据集上的性能进行评估,并选择性能最佳的组合。

这种方法特别适用于搜索空间非常大且详尽评估计算成本非常高的问题。

随机搜索的重要性

  • 高维空间: 随机搜索适用于高维超参数空间,在该空间中,网格搜索方法变得计算成本高昂。
  • 有助于提高搜索效率: 研究还表明,存在一个负责模型性能的超参数子集。
  • 易于实现: 由于随机搜索的简单性,它是一个很好的选择。只需定义超参数范围和迭代次数,即可轻松实现并集成到现有工作流中。
  • 跨模型的灵活性: 随机搜索通过随机选择机器学习模型的参数值来选择解决方案,因此与模型无关,因为它可以用于线性模型、深度学习贝叶斯回归以及任何其他可以用代码编写的算法。
  • 实际场景中的鲁棒性: 它特别有用,因为它在计算资源有限或超参数的确切影响未知的情况下,在实际场景中具有鲁棒性。

与其他超参数优化方法的比较

网格搜索

  • 系统地评估超参数的所有可能组合。
  • 它保证测试所有组合,因此覆盖了搜索空间的每个区域。
  • 计算成本高昂,尤其是在大型搜索空间中。由于它统一评估组合,即使空间中的某些区域不相关,这种方法也往往效率低下。
  • 在大型搜索空间中,随机搜索通常比高效搜索更快地发现最优或接近最优的解决方案,因为它进行随机采样而不是穷尽探索。
  • 这更适用于可以进行全面评估的小型低维搜索空间。

贝叶斯优化

  • 建立目标函数的概率模型,并用它来选择超参数以实现性能。
  • 它只需要利用以前的结果来指导搜索,因此在小搜索空间中效率极高。
  • 从计算角度来看,对于大型数据集或复杂模型来说,它非常耗时。它需要比随机搜索更复杂的设置和实现。
  • 随机搜索更易于实现,更适用于具有大(或者当然,不甚了解的)搜索空间的问题。
  • 在大多数情况下,如果计算资源可用且搜索空间可以很好地表示,则首选贝叶斯优化。

随机搜索的算法方法

超参数递减是一种超参数优化算法,当存在时,它只在每次迭代中减少每个超参数的值,直到超参数值达到最小值。它通过迭代采样每个采样超参数集,然后采样一个在验证集上模型性能最佳的采样超参数集,从而从一个到另一个。

算法方法中的步骤

超参数的随机抽样

  • 为每个超参数找到一个分布或范围。例如
  • 学习率在10−4到10−2之间均匀分布。
  • 隐藏层数量:介于1和10之间的整数值。
  • 批大小:从[16, 32, 64, 128]中选择的值
  • 生成随机超参数并组合它们。

评估验证集上的性能

  • 但是,此模型必须使用采样超参数在训练数据集上进行训练。
  • 可以使用准确度、F1分数或均方误差等指标在新验证数据集上对其进行评估,以查看其性能如何。
  • 生成每组超参数的性能指标并存储它们。

迭代搜索

  • 重复此过程固定次数的迭代(预算)或直到满足终止条件。
  • 可以存储以前表现最佳的超参数,因此每当发现更好的组合时都会更新。

实施随机搜索的关键步骤

定义问题和目标

  • 问题是找到模型以及要调整的超参数。
  • 确定要最小化的性能指标。

设置超参数范围

  • 此外,根据手头的问题和任何可用的领域知识,在超参数方面选择适当的范围或分布。

随机采样超参数

  • 获取更多随机超参数组合并进行评估。

训练和验证模型

  • 使用采样超参数在训练数据上训练模型。
  • 可以根据其在验证数据上的性能进行评估。

记录结果

  • 记录超参数值和性能指标。

迭代

  • 重复上述过程一定次数。
  • 然后分析获得的结果数据以选择适当的超参数集。

随机搜索的伪代码

输入

随机搜索的优点

参数空间的探索

  • 随机搜索对超参数空间的探索比网格搜索的系统方法更广泛(相比之下)。
  • 与其他算法的固定网格布局不同,随机采样器实际上避免了受限于特定的超参数排列子集,并提供了一些机会来识别否则可能错失的高性能配置。

高维空间中的效率

  • 网格搜索在高维超参数空间中执行的穷举搜索在计算上是不可行的,因为组合呈指数增长。另一方面,随机搜索采样固定数量的点,大大提高了效率。
  • 它将计算资源分配给计算更多配置,而不是在预定义网格上计算冗余评估。

易于实现和简单

  • 最重要的是,随机搜索非常简单。它不使用复杂的数学公式或复杂的算法。
  • Rand Search在大多数机器学习框架中都随时可用,例如Scikit-learn、TensorFlow等,并内置支持。

计算成本与网格搜索的比较

  • 虽然网格搜索涉及对给定预定义网格中超参数的每个组合进行穷举评估,但随着超参数数量的增加,计算成本呈指数增长。
  • 然而,随机搜索只评估超参数空间的随机子集,从而大大减少了达到特定预算所需的评估次数。

机器学习中随机搜索的局限性

低维空间中潜在的低效率

  • 随机搜索从预定义范围中随机采样其超参数。这很好,尽管在低维空间中它会变得效率低下。
  • 如果空间是低维的,则超参数可能组合的总数很小。随机采样可能会冗余地探测相同或非常相似的配置。

例如,假设一个模型有两个超参数,每个超参数可以取三个不同的值。随机搜索可以毫无纪律地多次测试相同的组合,从而降低探索效率,而网格搜索将测试每个组合3x3 = 9次。

缺乏系统方法来关注有希望的区域

  • 相比之下,随机搜索不根据一些观察到的结果优先考虑超参数空间的某些区域。在这种情况下,这种缺乏适应性可能导致无法识别最有希望的配置。
  • 它不考虑先验知识或来自先前评估的结果,这导致在超参数平面中采样区域时忽略先验专业知识。

例如,确定学习率的最优值可能介于0.001和0.01之间(例如),可能导致随机搜索浪费一些迭代来尝试明显超出范围的值(例如0.1或0.5)。

依赖迭代次数才能获得良好结果

  • 由于性能高度依赖于迭代次数,随机搜索是一种非常低效的方法;发现最优配置的概率随着更多样本而增加。
  • 随机搜索不能在有限的迭代次数内覆盖整个超参数空间。因此,由于预算有限,可能会产生次优结果。

例如,在具有100个可能的超参数组合的大型搜索空间中,仅进行10次迭代的随机搜索极不可能采样到最有效的配置集。

随机搜索的应用

调整机器学习模型中的超参数

通常使用随机搜索来优化各种机器学习算法的超参数。

  • 从一组定义的范围内选择超参数的随机组合。
  • 探索广泛值范围的能力使其更有可能找到最优或接近最优的配置。
  • 与网格搜索等穷举搜索方法相比,它有助于降低计算成本(此后称为降低成本)。

神经网络架构的优化

由于随机搜索对于优化神经网络架构很有效,因此可以通过集成来减少搜索时间。

  • 它允许它有效地探索可能的架构的广阔而非线性搜索空间。
  • 与结构化搜索方法不同,它引入了连接和配置多样性的灵活性。
  • 另一个优点是它允许实践者尝试可能带来更好性能的“非常规”参数值。

在大规模数据问题中的使用

  • 在计算预算有限的情况下,进行有限数量的评估是可行的。
  • 随机采样这方面使迭代次数所涵盖的区域在较少的迭代次数下保持良好覆盖。
  • 它为高维模型的优化提供了基础,这些模型否则无法通过穷举方法进行搜索。

与其他搜索方法的集成

其他技术可以与随机搜索相结合,以进一步优化过程。混合方法通常从随机搜索开始,以找到参数空间的合理区域,然后继续进行更高级的优化。

  • 网格搜索: 用于识别高性能区域并使用网格搜索围绕这些高性能区域进行重点哈希。
  • 贝叶斯优化: 参数性能关系的贝叶斯优化模型,用于指导搜索过程。
  • 局部搜索算法: 在更广泛的探索阶段之后微调参数。

随机搜索和精确方法相结合到此类集成中,它们可以找到鲁棒的优化结果。

流行框架中的实现

在Scikit-learn中使用随机搜索

Scikit-learn中有一个内置的RandomizedSearchCV类,它有助于执行随机搜索以进行超参数调整。它以随机方式在定义的空间中采样超参数,并交叉验证每组参数。

在Scikit-learn中实现的步骤

  • 定义一个机器学习模型。
  • 可以指定超参数字典和范围。
  • 然后,我们初始化RandomizedSearchCV,提及模型、参数网格和我们想要的迭代次数。
  • 在训练数据上训练模型并测试性能。

示例

输出

Best Parameters: {'n_estimators': 100, 'min_samples_split': 5, 'min_samples_leaf': 1, 'max_depth': 30}
Accuracy on Test Set: 0.92

与TensorFlow/Keras集成

为此,可以使用Keras Tuner库在TensorFlow/Keras中实现随机搜索,或者简单地采样随机超参数并训练模型。

在Keras Tuner中实现的步骤

  • 首先,定义一个HyperModel类或函数来封装模型构建逻辑。
  • itemList表示关键设置(如学习率、层数或单元)的超参数范围(等于或大于一个)。
  • 可以使用Keras Tuner的RandomSearch类找到最佳配置。

示例

输出

Best Hyperparameters: {'units': 64, 'learning_rate': 0.001}

与PyTorch集成

PyTorch中,可以使用Optuna等库或通过创建手动循环来迭代随机采样的超参数来实现随机搜索。

使用Optuna实现的步骤

  • 使用目标函数训练PyTorch模型并评估性能。
  • Optuna用于通过其Trial对象建议随机超参数值。
  • 然后我们可以使用study.optimize方法运行优化。

示例

输出

 
Best Trial: {'hidden_size': 128, 'learning_rate': 0.001012}

结果和性能指标的可视化

解释空超参数对性能的影响是可视化的问题。可以使用MatplotlibTensorBoard或任何内置工具。

Scikit-learn语法

TensorFlow/Keras示例

通过TensorBoard在训练期间可视化或有区别地绘制试验的验证准确度。

Optuna语法