之前的章节直接处理模型参数的优化,通常使用梯度方法。机器学习中另一个重要的优化难题是超参数调优。例如学习率、正则化强度或神经网络中的层数。评估一组超参数可能非常耗费资源,因为它涉及训练和验证一个可能复杂的模型。此外,超参数与模型性能之间的关系通常是一个“黑盒”,这意味着我们没有明确的解析形式,更不用说梯度了。像网格搜索这样的暴力方法,其计算成本随超参数数量呈指数级增长,而随机搜索虽然通常更好,但效率可能不高。在这种情况下,贝叶斯优化(BO)提供了一种更节省样本的方法。它特别适合优化那些评估成本高昂的黑盒函数——这正是我们在超参数调优中遇到的情况。核心思想:概率模型与智能采样贝叶斯优化不盲目评估超参数组合,而是建立目标函数(例如,作为超参数函数的验证准确率)的概率模型。这个模型,通常称为代理模型,试图根据迄今已评估的点来掌握我们对不同超参数设置如何影响性能的现有理解。重要地,该模型还量化了其对超参数空间中未评估区域函数行为的不确定性。BO接着使用一个采集函数,它源自代理模型,来决定接下来评估哪组超参数。采集函数平衡了两个相互竞争的目标:利用: 在代理模型预测性能高的区域(接近已知良好点)进行采样。试探: 在模型高度不确定的区域进行采样,以期发现可能更好的未知区域。通过智能地平衡试探与利用,BO旨在以比网格搜索或随机搜索少得多的评估次数找到最佳超参数。贝叶斯优化的组成部分让我们分解这两个主要组成部分:1. 概率代理模型代理模型最常见的选择是高斯过程(GP)。GP是一种功能强大的非参数模型,它定义了函数上的分布。GP不是拟合单个函数,而是通过其均值函数和协方差函数(也称为核函数)定义了对函数属性(如平滑度)的先验信念。给定一组观测数据点 $(X, y)$,其中 $X$ 表示已评估的超参数集,$y$ 表示相应的性能得分,GP可以使用贝叶斯定理进行更新,以形成后验分布。这个后验分布提供:在任何新的超参数点 $x$ 处的性能均值预测 $\mu(x)$。表示该预测不确定性的方差 $\sigma^2(x)$(或标准差 $\sigma(x)$)。不确定性通常在观测数据点附近较低,而在远离任何观测的区域较高。核函数(例如,RBF,Matérn)的选择编码了对所建模函数的假设,并影响GP的行为。{ "data": [ { "x": [1, 3, 5, 7], "y": [0.8, 0.1, -0.8, -0.5], "mode": "markers", "type": "scatter", "name": "已评估点", "marker": {"color": "#495057", "size": 8} }, { "x": [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8], "y": [0, 0.4, 0.8, 0.95, 0.9, 0.6, 0.1, -0.3, -0.6, -0.8, -0.8, -0.7, -0.6, -0.5, -0.5, -0.4, -0.3], "mode": "lines", "type": "scatter", "name": "GP均值预测", "line": {"color": "#228be6"} }, { "x": [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8, 7.5, 7, 6.5, 6, 5.5, 5, 4.5, 4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5, 0], "y": [-0.5, 0.0, 0.6, 0.85, 0.85, 0.55, 0.05, -0.4, -0.75, -0.9, -0.85, -0.75, -0.65, -0.55, -0.55, -0.5, -0.5, -0.1, -0.3, -0.45, -0.45, -0.55, -0.65, -0.75, -0.7, -0.45, -0.2, 0.15, 0.65, 0.95, 1.05, 1.0, 0.8, 0.5], "mode": "lines", "type": "scatter", "name": "GP不确定性 (95%)", "line": {"width": 0}, "fill": "tozerox", "fillcolor": "rgba(34, 139, 230, 0.2)" } ], "layout": { "title": "贝叶斯优化:代理模型 (GP)", "xaxis": {"title": "超参数值"}, "yaxis": {"title": "目标函数(例如,验证准确率)"}, "showlegend": true, "legend": {"x": 0.01, "y": 0.01, "bgcolor": "rgba(255,255,255,0.6)"}, "margin": {"l": 60, "r": 20, "t": 50, "b": 40}, "hovermode": "closest" } }对四个观测到的超参数评估点进行拟合的高斯过程。蓝色曲线显示了目标函数的均值预测,蓝色阴影区域表示不确定性(例如,95%置信区间)。不确定性在观测点(黑色标记)附近较低。2. 采集函数采集函数利用GP的预测($\mu(x)$)和不确定性($\sigma(x)$)来量化接下来评估给定点 $x$ 的“可取性”。找到使采集函数最大化的点 $x$,就能得到在实际开销大的目标函数上评估的下一个候选超参数。优化采集函数本身通常比评估目标函数便宜得多。常见的采集函数包括:预期改进(EI): 这可能是最受欢迎的选择。它计算迄今为止找到的最佳性能 $f(x^+)$ 之上的预期改进量。设 $y = f(x)$ 为点 $x$ 处的性能。EI定义为: $$ EI(x) = E[\max(0, f(x) - f(x^+))] $$ 使用GP后验 $f(x) \sim \mathcal{N}(\mu(x), \sigma^2(x))$,这个期望通常可以解析计算。EI自然地平衡了利用($\mu(x)$ 高的点)和试探($\sigma(x)$ 高的点)。有时会添加一个小的正值 $\xi$,即 $EI(x) = E[\max(0, f(x) - f(x^+) - \xi)]$,以鼓励更多的试探。改进概率(PI): 此函数计算点 $x$ 产生优于当前最佳性能 $f(x^+)$(加上一个小的裕度 $\xi$)的概率: $$ PI(x) = P(f(x) \ge f(x^+) + \xi) = \Phi\left(\frac{\mu(x) - f(x^+) - \xi}{\sigma(x)}\right) $$ 其中 $\Phi$ 是标准正态CDF。PI倾向于比EI更偏向利用。上限置信度(UCB): 此函数使用权衡参数 $\kappa$ 直接平衡均值预测和不确定性: $$ UCB(x) = \mu(x) + \kappa \sigma(x) $$ 较高的 $\kappa$ 值有利于试探,而较低的值有利于利用。在某些条件下,UCB通常存在理论保证。采集函数的选择会影响搜索策略和BO的整体性能。贝叶斯优化循环该过程迭代进行:初始化: 选择一组初始超参数点(例如,使用随机采样或拉丁超立方设计),并评估这些点处的真实目标函数。拟合代理模型: 将高斯过程(或其他代理模型)拟合到迄今为止所有已评估点 $(X, y)$。优化采集函数: 在搜索空间中找到使所选采集函数最大化的超参数 $x_{next}$:$x_{next} = \arg\max_x \alpha(x)$,其中 $\alpha$ 是采集函数(例如,EI,UCB)。此步骤通常涉及对(成本低的)采集函数进行标准数值优化器操作。评估目标: 评估真实、开销大的目标函数 $f(x_{next})$(例如,使用超参数 $x_{next}$ 训练和验证ML模型)以获得性能 $y_{next}$。扩充数据: 将新的对 $(x_{next}, y_{next})$ 添加到观测数据集中。重复: 返回步骤2,直到满足停止条件(例如,评估预算耗尽、收敛)。最终推荐的超参数通常是搜索期间获得最佳观测性能 $f(x)$ 的点 $x$。优势与注意事项优势:样本效率: 通常比网格搜索或随机搜索用少得多的评估次数找到好的超参数,从而节省大量时间和计算资源。合理权衡: 提供了一种有数学依据的方法来处理试探与利用的困境。通用性: 适用于各种黑盒优化问题。注意事项:代理模型成本: 拟合GP和优化采集函数会产生计算成本。标准GP拟合的计算复杂度与评估点数 $n$ 呈立方关系($O(n^3)$),如果评估数量非常大(数千个),这可能成为瓶颈,但对于超参数调优(数十到数百次评估)通常是可控的。对于更大的 $n$ 存在近似方法。维度: BO在低到中等维度空间(例如,最多约10-20个超参数)中表现最佳。在非常高维度中,其有效性可能降低(“维度灾难”)。核函数选择: 基于GP的BO的性能取决于选择合适的核函数及其参数。分类/条件超参数: 标准BO最适用于连续参数。处理分类或条件超参数需要专门的技术或编码。并行性: 基本BO是顺序的。存在并行变体,但需要修改采集策略以同时选择多个点。实际实现您无需从头开始实现BO。Python中有一些优秀的库可用:Scikit-optimize (skopt): 为BO (gp_minimize) 和其他优化算法提供了用户友好的界面。Hyperopt: 提供BO(使用树状Parzen估计器TPE,它是GP的替代品)和随机搜索。Optuna: 一个专门为超参数优化设计的框架,支持BO(GP和TPE)以及各种剪枝/并行化功能。GPyOpt: 基于用于高斯过程的GPy库构建,提供了灵活的基于GP的BO。BoTorch: 一个基于PyTorch构建的现代库,为高级BO研究和应用提供了显著的灵活性,包括批处理优化和约束。集成这些库通常涉及定义您的目标函数(它接受超参数并返回一个要最大化/最小化的分数)以及超参数的搜索空间。然后,库会在内部处理BO循环。贝叶斯优化代表了比简单超参数搜索策略的显著提升,在评估成本高昂时,它提供了一个强大的工具,可有效调优复杂的机器学习模型。