基于共享潜在空间的贝叶斯优化:解决异构算法超参数联合选择难题
1. 项目概述与核心挑战
在机器学习项目的落地过程中,我们常常面临一个看似简单实则复杂的选择:面对一个具体的数据集,究竟该用哪个算法,以及这个算法的最佳超参数组合是什么?这个问题,在学术上被称为“联合算法选择与超参数优化”问题,简称CASH。它听起来像是一个选择题,但实际上是一个超高维、非凸、且评估成本极其昂贵的黑盒优化问题。想象一下,你手头有十几个候选算法,每个算法又有几个到几十个不等的超参数,组合起来就是一个天文数字。传统的网格搜索或随机搜索,在计算资源和时间面前,往往显得力不从心。
贝叶斯优化因其高效的“探索-利用”平衡能力,成为了解决这类黑盒优化问题的利器。它的核心思想是,用一个概率代理模型(通常是高斯过程)来模拟我们真正关心的目标函数(比如验证集准确率),然后基于这个模型的不确定性,智能地选择下一个最有“潜力”的点进行评估。然而,当我们将贝叶斯优化直接应用到CASH问题上时,会遇到一个结构性的难题:不同的机器学习算法,其超参数空间在定义、维度、类型和尺度上通常是异构的、互不相交的。例如,支持向量机的正则化参数C和核函数gamma,与随机森林的树数量n_estimators和最大深度max_depth,在数学上没有任何直接可比性。
传统的应对策略主要有两种。第一种是“独立建模”策略,即为每个候选算法单独训练一个高斯过程代理模型。这种方法简单直接,但最大的弊端在于“数据隔离”——评估随机森林得到的信息,完全无法用来帮助优化支持向量机。这导致我们需要为每个算法都积累足够多的评估样本,才能建立起有效的代理模型,总体评估成本高昂。第二种是“拼接空间”策略,即将所有算法的超参数空间强行拼接成一个巨大的联合空间,并为每个算法不存在的维度填充一个默认值。这种方法虽然实现了数据共享,但引入了大量无效维度,使得搜索空间维度爆炸,并且为不存在的参数设置默认值缺乏理论依据,可能导致模型学习到无意义的噪声。
正是在这样的背景下,一种基于“共享潜在空间”的思路应运而生。其核心洞见在于:尽管不同算法的超参数在原始空间里千差万别,但它们本质上都在控制模型的复杂度、拟合能力或正则化强度。如果我们能找到一个合适的非线性映射,将所有这些异构的超参数空间都投影到一个共同的、低维的潜在空间中,那么在这个潜在空间里,不同算法产生的观测数据就有可能产生关联。在这个共享的潜在空间上构建一个统一的多任务高斯过程模型,就可以实现跨算法的知识迁移——评估一次随机森林,其经验可能潜在地帮助优化逻辑回归或梯度提升树。这就像为来自不同国家、说不同语言(算法)的专家们(超参数配置)建立了一个通用的“思维空间”,让他们可以在此交流经验,从而极大地提升了优化效率。
2. 技术框架深度解析:从异构空间到统一表征
2.1 共享潜在空间的核心思想与数学建模
让我们深入这个框架的核心。假设我们有M个候选机器学习算法,记为集合 A = {A^(1), A^(2), ..., A^(M)}。第m个算法 A^(m) 拥有自己的超参数空间 Λ^(m),这个空间可能是连续、离散或混合的,维度也各不相同。我们的目标是在联合搜索空间 Ξ = {(A^(m), λ^(m)) | A^(m) ∈ A, λ^(m) ∈ Λ^(m)} 中,找到能使验证集性能指标 Acc(如准确率)最大化的最优算法与超参数对 (A*, λ*)。
传统独立高斯过程模型为每个算法单独建模:y^(m) = f^(m)(λ^(m)) + ε。而共享潜在空间方法引入了一个关键变换:一个由多层感知机实现的嵌入函数 φ^(m): Λ^(m) → U。这个函数将第m个算法的任意一个超参数配置 λ^(m) 映射到一个共享的、低维的潜在空间 U 中的一个点 u^(m) = φ^(m)(λ^(m))。
注意:这里嵌入函数 φ^(m) 是每个算法独有的。这意味着,虽然SVM的超参数向量和随机森林的超参数向量在原始空间里毫无关系,但它们通过各自专属的“翻译器”(MLP),被转换到了同一个“世界语”空间U中。设计上,这些MLP的结构可以相同,但权重参数独立学习。
在这个统一的潜在空间U中,我们不再为每个算法单独建模,而是构建一个多任务高斯过程。我们将每个算法视为一个“任务”。MTGP定义了一个在空间 U × A 上的高斯过程先验:f_A(u) ~ GP(μ_0(u), k((u, A), (u’, A’)))。这里,核函数 k 不仅要衡量两个潜在点 u 和 u’ 的相似性,还要衡量两个任务(算法)A 和 A’ 之间的相关性。我们采用了线性模型的核心化方法来构建这个核函数,它能通过一个低秩加对角线的协方差矩阵来捕获任务间的依赖关系。
这样一来,对于任何一个算法 A^(m) 的超参数配置 λ^(m),我们首先通过其专属的 φ^(m) 映射到潜在点 u^(m),然后通过MTGP来预测其性能 f_A^(m)(u^(m))。由于所有算法的观测数据 { (u_n, A_n, y_n) } 都用于训练同一个MTGP模型,评估算法A得到的信息会通过任务协方差矩阵影响对算法B的预测,从而实现了知识共享。
2.2 多任务高斯过程与深度核的协同
在这个框架中,嵌入函数 φ^(m) 并不是固定的,而是与MTGP的核参数一起进行端到端学习的。这构成了一个深度核结构:核函数的形式为 k( φ(λ), φ(λ’) ),其中非线性变换 φ 由神经网络参数化。在训练时,我们通过最大化给定所有观测数据 O 的边际似然来联合优化MTGP的超参数(如长度尺度、噪声方差)以及所有嵌入神经网络 φ^(m) 的参数 θ^(m)。
损失函数可以写为: L(Θ) = -log p(y | U, A) + α Σ_m R(θ^(m)) 其中第一项是MTGP的负对数边际似然,第二项是对神经网络参数的规则化项,用于防止过拟合,特别是在观测数据很少的BO早期迭代阶段。
实操心得:联合训练深度核是一个非凸优化问题,对初始化和学习率非常敏感。在实践中,我们通常采用分阶段训练策略:先固定MTGP的超参数,用较大的学习率预训练嵌入网络若干轮;然后以较小的学习率进行联合微调。使用AdamW优化器并配合学习率热身与余弦退火策略,通常能获得更稳定的训练效果。
这种设计的美妙之处在于,模型不仅学习如何为每个算法寻找好的超参数,还同时学习如何将这些异构的超参数“翻译”到一个具有可比性的公共空间中。在这个空间中,“好”的配置(即能产生高准确率的配置)应该聚集在某个区域附近。这为后续的贝叶斯优化搜索提供了极大的便利。
3. 预训练与对抗正则化:构建更优的潜在空间
3.1 预训练的必要性与二次曲面先验
在贝叶斯优化的初期,我们可能只有寥寥几个观测数据。在这种情况下,从头开始训练复杂的深度核MTGP模型是极其不稳定且容易过拟合的。这就引出了预训练的必要性。其核心思想是:利用历史上在其他数据集(源数据集)上积累的大量(算法,超参数,性能)三元组经验,预先学习一套高质量的嵌入函数 {φ^(m)}。
那么,预训练的目标是什么?我们希望学到的潜在空间具有一个良好的几何结构。一个直观且有效的假设是:在理想的潜在空间U中,一个配置的性能(准确率)可以近似表示为该配置到空间原点的负平方距离再加上一个基准值。即,对于源数据集上的观测值 y’^(m)_n,我们希望: y’^(m)_n ≈ -||u’^(m)_n||^2_2 + y’_best 其中 y’_best 是源数据集上观测到的最佳性能。这意味着,我们将潜在空间的原点定义为“性能最优点”,性能随着配置点远离原点而衰减,形成一个简单的二次曲面。
因此,对于第m个算法的嵌入网络 φ^(m),其预训练损失函数为: L^(Pre-train)_m = Σ_n (1/N’_m) * ( (y’_best - y’^(m)_n) - ||φ^(m)(λ’^(m)_n)||^2 )^2 通过最小化这个损失,我们迫使神经网络将高性能的超参数配置映射到潜在空间的原点附近,将低性能的配置映射到远离原点的位置,而不同算法的映射都遵循这同一个规律。
3.2 对抗正则化:强制空间共享与避免算法隔离
仅仅进行上述预训练还存在一个风险:每个算法的嵌入网络 φ^(m) 可能会各自为政,将本算法的所有配置都映射到原点附近的一个小簇里,但不同算法的小簇在潜在空间中彼此远离、互不重叠。如下图所示,虽然每个算法内部都满足了二次曲面的关系,但算法A的点和算法B的点分布在空间的不同区域。这种情况下,MTGP中不同任务(算法)之间的协方差会非常小,知识仍然无法有效共享。
为了避免这种“算法隔离”现象,我们需要在预训练中引入一个机制,来鼓励不同算法的超参数配置在潜在空间中混合在一起。这里借鉴了领域自适应中的对抗学习思想。
我们引入一个对抗性分类器网络 g_m,m’。它的任务是:给定一个从潜在空间U中采样点 u,判断这个点是由算法A^(m)的嵌入网络生成的,还是由算法A^(m’)的嵌入网络生成的。这是一个二分类问题。
在预训练嵌入网络 {φ^(m)} 时,我们不仅希望它们最小化二次曲面拟合损失 L^(Pre-train),还希望它们能够“欺骗”这个对抗分类器,使得分类器无法区分潜在点的来源。这通过一个极小极大博弈来实现: min_{Θ_MLP} Σ_m L^(Pre-train)m - β * Σ{m<m’} [ min_{ψ_m,m’} L^(CE)_m,m’ ] 其中,L^(CE)_m,m’ 是对抗分类器的交叉熵损失,β 是权衡系数。内层的 min 是优化分类器参数 ψ,使其能准确分类;外层的 min 是优化嵌入网络参数 Θ_MLP,在拟合性能曲面的同时,最大化分类器的误差(即减去分类损失)。
技术细节:为了实现“一对所有”的对抗,我们通常采用多个二分类器(每对算法一个),或者使用一个具有M个输出的多类别分类器。前者更灵活,后者更简洁。在计算资源允许的情况下,一对一的设置能更精细地控制所有算法对之间的混淆程度。
通过这种对抗正则化,嵌入网络被激励着将不同算法的配置投影到潜在空间中相互重叠的区域。最终,一个性能优异的SVM配置和一个性能优异的随机森林配置,在潜在空间中的位置可能非常接近,因为它们都代表着在各自算法范畴内“好”的配置。这为MTGP进行跨任务的知识迁移奠定了坚实的基础。
4. 基于元特征的预训练模型推荐系统
4.1 问题:如何为新的目标数据集选择最合适的“经验”?
我们已经有了一个强大的预训练框架,可以在许多源数据集上预先训练好多套嵌入模型(PTEMs)。当面对一个新的目标数据集时,一个很自然的问题是:我应该使用哪一套预训练模型来初始化我的BO过程?
不同的源数据集与目标数据集的相似度不同。例如,用一个图像分类数据集预训练的嵌入模型,去优化一个文本情感分析任务的超参数,效果可能不如用一个文本数据集预训练的模型。因此,我们需要一个能够根据目标数据集的特征,自动推荐最合适PTEM的机制。
4.2 构建排序模型:Learning to Rank 的应用
我们采用“学习排序”的方法来构建这个推荐系统。具体步骤如下:
元特征提取:为每个数据集(包括源数据集和目标数据集)计算一组元特征。这些特征是数据集的统计属性,例如:
- 样本数量、特征维度、类别数量(分类任务)。
- 稀疏度、缺失值比例。
- 统计矩:均值、方差、偏度、峰度的统计量。
- 信息论特征:类别熵、互信息估计。
- 模型基础特征:用简单模型(如决策树桩、线性模型)在数据上快速训练得到的性能,可以作为数据集复杂度的代理。
生成监督信号:我们利用已有的源数据集来模拟推荐过程,生成训练排序模型所需的“标准答案”。假设我们有S个源数据集 {D’_s}。
- 我们轮流将其中一个源数据集 D’_τ 当作“伪目标数据集”。
- 用剩下的 S-1 个源数据集作为预训练数据源,每个都训练出一个PTEM。
- 在伪目标数据集 D’_τ 上,分别使用这 S-1 个PTEM来运行我们提出的BO框架(例如,进行T=200轮优化,重复多次以平均随机性)。
- 对于每个PTEM(对应源数据集D’_s),我们计算其在D’_τ上的平均性能曲线,例如计算其在整个优化过程中平均的最佳性能值,作为一个得分 Score_τ(s)。
- 根据 Score_τ(s) 对所有 s ≠ τ 的源数据集进行降序排序,这个排序就是对于目标数据集 D’_τ 的“真实”推荐列表。
训练排序模型:排序模型 frank 的输入是目标数据集的元特征 x^meta_τ 和候选源数据集的元特征 x^meta_s。它的目标是预测候选源数据集D’_s对于目标数据集D’_τ的得分 frank(x^meta_τ, x^meta_s)。我们使用像LambdaMART这样的列表式排序算法来训练 frank。这类算法的损失函数(如基于NDCG的损失)关注的是排序的相对顺序是否正确,而不是绝对得分的精确值,这非常适合我们的场景。
在线推荐:当面对一个全新的目标数据集D时,我们计算其元特征 x^meta,然后将其与所有预训练好的PTEM对应的源数据集元特征 {x^meta_s} 输入到训练好的排序模型 frank 中。模型会为每个PTEM输出一个得分,我们选择得分最高的那个PTEM来初始化BO过程。
注意事项:元特征的选择和计算需要谨慎。它们应该是对数据集属性的有意义的、可泛化的摘要,并且计算成本要低。不相关或噪声大的元特征会降低排序模型的性能。通常需要进行特征选择或使用领域知识来构建有效的元特征集合。
5. 完整工作流程与工程实现要点
5.1 算法流程总览
结合以上所有组件,整个系统的完整工作流程如下:
离线阶段(预训练与模型准备):
- 收集大量源数据集 {D’_s},并在每个数据集上,为所有候选算法广泛采样超参数,评估其性能,构建庞大的观测数据库 {O’_s}。
- 对于每个源数据集 D’_s,使用其观测数据 O’_s,通过带有对抗正则化的预训练框架(公式13),训练得到一套嵌入网络 {φ^(m)}_s,即一个PTEM。
- 利用所有源数据集和它们的PTEM,按照4.2节所述方法,训练元特征排序模型 frank。
在线阶段(为目标数据集优化):
- 输入:新的目标数据集 D,候选算法集合 A,预训练的多个PTEM及其对应的���数据集元特征,以及训练好的排序模型 frank。
- 推荐预训练模型:计算目标数据集D的元特征 x^meta。使用排序模型 frank 对所有PTEM进行评分,选择得分最高的PTEM,记其对应的嵌入网络为 {φ^(m)}。
- 初始化:在目标数据集D上���为每个算法随机选择少量(如1-2个)超参数配置进行初始评估,形成初始观测集 O。
- 贝叶斯优化主循环: a.模型更新:将当前观测集 O 中的所有点 (A^(m), λ^(m)) 通过对应的嵌入网络 φ^(m) 映射到共享潜在空间,得到 {(u^(m), A^(m), y^(m))}。以此数据,优化MTGP的深度核模型(最小化公式5的损失)。这里,嵌入网络的参数通常被部分冻结(如只微调最后一层),以利用预训练知识并防止过拟合。 b.选择下一个评估点:基于训练好的MTGP后验,计算所有候选 (A^(m), λ^(m)) 的采集函数(如期望改进EI)值。通过优化算法(如针对混合空间的启发式局部搜索或DIRECT)为每个算法找到其最优超参数,然后全局选择采集函数值最大的 (A_next, λ_next)。 c.评估与更新:在目标数据集上运行算法 A_next 并使用超参数 λ_next,得到性能 y_next。将新观测 (A_next, λ_next, y_next) 加入观测集 O。 d. 重复步骤 a-c,直到达到预设的评估预算(如200次)。
- 输出:返回观测集中性能最好的算法与超参数对 (A*, λ*)。
5.2 关键工程实现细节与调参经验
潜在空间维度选择:这是一个重要的超参数。维度太低,可能不足以捕捉所有算法超参数空间的复杂结构;维度太高,会增加模型复杂度并可能引入过拟合。根据经验,对于包含十几种算法、每个算法超参数维度在10以内的场景,潜在空间维度设置在3到10之间是一个合理的起点。可以通过在保留的验证集(源数据集上)上观察重构误差或下游BO的代理性能来进行选择。
嵌入网络结构:MLP是常用的选择。结构不宜过于复杂,通常2-3个隐藏层,每层神经元数量在几十到上百个即可。激活函数推荐使用ReLU或Swish。在输入层,需要对不同类型的超参数(连续、离散、类别)进行适当的编码(如归一化、嵌入)。
MTGP核函数与优化:使用LMC构建多任务核时,核心化矩阵的秩是一个关键参数。低秩(如秩为1)假设任务间存在一个共同的潜在因子,计算更高效;更高秩能捕捉更复杂的任务关系,但需要更多数据。使用深度核时,联合优化神经网络的梯度可能不稳定,需要仔细调整学习率,并可能需要对GP的超参数和网络参数使用不同的优化器(如对GP参数用L-BFGS,对网络参数用Adam)。
采集函数优化:在混合(连续/离散/类别)且可能高维的原始超参数空间上优化采集函数是具有挑战性的。一种实用的方法是:对每个算法,使用其特定的优化器(如对连续空间用L-BFGS,对树结构空间用随机搜索),独立地寻找该算法空间内的最优配置,然后进行全局比较。也可以使用SMAC或Hyperopt等库提供的混合空间优化器。
计算资源与并行化:BO的每次迭代是顺序的,但单次评估(训练和验证一个ML模型)可以很耗时。因此,支持异步并行评估(即同时评估多个建议点)能极大加速进程。此外,预训练阶段和排序模型训练阶段虽然离线进行,但计算量巨大,需要分布式计算资源的支持。
6. 实验分析、对比与避坑指南
6.1 主流基线方法横向对比
为了验证共享潜在空间方法的有效性,我们将其与一系列主流和先进的CASH求解器进行对比:
- 随机搜索:作为最基础的基线,它不考虑任何历史信息。
- SMAC:基于随机森林代理模型,处理混合和条件空间的经典方法。它通过拼接空间和设置默认值来处理不同算法。
- Bandit BO:为每个算法独立运行一个高斯过程BO,然后根据每个GP的采集函数值来决定下一次评估哪个算法及其配置。这是“独立建模”策略的代表。
- Rising Bandit with SMAC:在Bandit BO思想基础上,动态淘汰表现不佳的算法,以集中资源。
- Pre-train BO:类似Bandit BO,但每个算法的GP代理模型使用在源数据集上预训练的均值函数和核函数进行初始化。
- AS-ML:先通过元学习模型(如基于元特征的排序)选择一个“最有希望”的算法,然后只对该算法进行超参数优化。
- AHS-ML:通过元学习直接生成一个(算法,超参数配置)的排序列表,然后按顺序评估。
6.2 结果解读与核心优势
在多个开源数据集上的实验表明,本文提出的共享潜在空间方法在绝大多数迭代次数下,平均排名均优于所有基线方法。
- 对独立建模的超越:显著优于Bandit BO和Pre-train BO。这直接证明了跨算法知识共享的有效性。Pre-train BO在初期有优势,说明预训练有效,但后期被Bandit BO反超,暗示独立的GP在数据充足后可能更灵活,但也凸显了其初期数据利用率低的缺点。
- 对拼接空间方法的超越:优于SMAC。这说明通过智能的嵌入来共享知识,比简单粗暴的拼接空间并填充默认值更为有效,避免了维度灾难和噪声引入。
- 对动态淘汰和纯元学习方法的超越:优于RB-SMAC、AS-ML和AHS-ML。RB-SMAC虽然通过淘汰机制提升了后期效率,但早期仍需为所有算法积累数据,且存在过早淘汰潜在最优算法的风险。而纯元学习方法(AS-ML, AHS-ML)缺乏在线自适应能力,一旦推荐列表不佳,后续无法修正,性能增长很快停滞。
核心优势总结:
- 高效数据利用:通过共享潜在空间和MTGP,实现了评估数据在不同算法间的最大化复用,特别适合评估预算有限的场景。
- 减少维度灾难:将异构的高维原始空间映射到统一的低维潜在空间,极大降低了搜索复杂度。
- 在线自适应与离线知识结合:既利用了离线预训练的历史经验(通过PTEM初始化),又在在线BO过程中根据目标数据集的反馈进行自适应调整,兼具了元学习的“冷启动”优势和BO的“持续学习”能力。
- 通用性强:框架不依赖于特定算法或超参数类型,通过可学习的嵌入函数适应各种情况。
6.3 实际应用中的常见问题与排查
预训练效果不佳:
- 现象:使用预训练模型后,BO初期性能反而比随机搜索还差。
- 排查:
- 源-目标域差异:检查源数据集和目标数据集是否属于完全不同的领域(如图像 vs. 时序)。元特征排序模型可能失效。考虑使用更广泛的源数据集,或增加领域自适应技术。
- 对抗正则化强度:β 参数可能过大或过小。过大导致嵌入空间完全混淆,丢失了算法特性;过小则无法促进共享。需要交叉验证调整。
- 二次曲面先验假设过强:对于性能曲面非常复杂的数据集,简单的二次函数假设可能不成立。可以尝试更灵活的先验均值函数,如另一个小神经网络,但这会增加预训练难度。
BO迭代陷入局部最优:
- 现象:优化过程很快找到一个还不错的解,之后很长时间没有进展。
- 排查:
- 采集函数问题:检查是否使用了纯粹的“利用”型采集函数(如概率提升PI),而“探索”不足。确保使用EI或UCB等平衡探索与利用的函数。
- MTGP拟合问题:观察MTGP预测的不确定性是否在未探索区域依然很高。如果不确定性普遍被低估,可能是核函数长度尺度太小或噪声估计不准。尝试在优化MTGP超参数时,增加其先验的约束。
- 潜在空间“坍塌”:检查所有映射后的潜在点是否聚集在一个非常小的区域内。这可能是嵌入网络训练出现问题或潜在空间维度太低。可视化潜在空间分布有助于诊断。
计算开销过大:
- 现象:每次BO迭代更新MTGP模型的时间过长。
- 排查:
- 观测数据量:MTGP的推断复杂度是 O(N^3),其中N是总观测数。当N很大时(如>1000),需要考虑稀疏近似或使用随机变分推断。
- 任务数(算法数)M:LMC核的复杂度与M^2有关。如果M很大(如>50),需要考虑更高效的多任务核结构。
- 嵌入网络深度:过深的网络会增加每次正向和反向传播的计算量。在效果满足要求的情况下,尽量使用浅层网络。
排序模型推荐不准:
- 现象:自动选择的PTEM效果不如手动选择某个PTEM。
- 排查:
- 元特征有效性:重新评估所使用的元特征集。尝试引入基于预训练模型本身的特征(如PTEM在某个简单验证集上的性能)。
- 排序模型训练数据:确保用于训练排序模型的“伪目标-源”对覆盖了足够多样的场景。可以采用留一法交叉验证来更稳健地评估排序模型性能。
- 冷启动问题:对于特征极其特殊、与所有源数据集都差异巨大的新目标数据集,任何PTEM可能都不理想。此时,可以fallback到不使用预训练(或使用一个通用PTEM),并依赖在线BO的自适应能力。
这个基于共享潜在空间的贝叶斯优化框架,为解决复杂的自动化机器学习配置问题提供了一个强大而灵活的范式。它将表示学习、多任务学习、元学习和贝叶斯优化巧妙地融合在一起,不仅在学术上具有启发性,也为工业界的AutoML系统设计提供了切实可行的技术路径。在实际部署时,建议从小规模候选算法集开始,逐步验证框架的各个环节,并根据具体业务数据的特性进行针对性的调整和优化。
