NUBO, short for Newcastle University Bayesian Optimization, is a Bayesian optimization framework for optimizing expensive-to-evaluate black-box functions, such as physical experiments and computer simulators. Bayesian optimization is a cost-efficient optimization strategy that uses surrogate modeling via Gaussian processes to represent an objective function and acquisition functions to guide the selection of candidate points to approximate the global optimum of the objective function. NUBO focuses on transparency and user experience to make Bayesian optimization accessible to researchers from all disciplines. Clean and understandable code, precise references, and thorough documentation ensure transparency, while a modular and flexible design, easy-to-write syntax, and careful selection of Bayesian optimization algorithms ensure a good user experience. NUBO allows users to tailor Bayesian optimization to their problem by writing a custom optimization loop using the provided building blocks. It supports sequential single-point, parallel multi-point, and asynchronous optimization of bounded, constrained, and mixed (discrete and continuous) parameter input spaces. Only algorithms and methods extensively tested and validated to perform well are included in NUBO. This ensures that the package remains compact and does not overwhelm the user with an unnecessarily large number of options. The package is written in Python but does not require expert knowledge of Python to optimize simulators and experiments. NUBO is distributed as open-source software under the BSD 3-Clause license.
论文ID : 2305.06709标题 : NUBO: A Transparent Python Package for Bayesian Optimization作者 : Mike Diessner, Kevin Wilson, Richard D. Whalley (Newcastle University)分类 : cs.LG (Machine Learning), cs.MS (Mathematical Software), stat.ML (Statistics - Machine Learning)发表时间 : arXiv v2, 2024年6月3日论文链接 : https://arxiv.org/abs/2305.06709 开源地址 : www.nubopy.com 许可证 : BSD 3-ClauseNUBO(Newcastle University Bayesian Optimization)是一个专为优化昂贵黑盒函数设计的贝叶斯优化框架,适用于物理实验和计算机模拟器等场景。该框架通过高斯过程进行代理建模,使用采集函数指导候选点选择,以最少的函数评估次数逼近全局最优。NUBO强调透明性和用户体验,通过清晰的代码、精确的引用和详尽的文档确保透明性;通过模块化设计、易用语法和精选算法确保良好的用户体验。框架支持顺序单点、并行多点和异步优化,适用于有界、约束和混合(离散与连续)参数空间。仅包含经过充分测试和验证的算法,保持包的紧凑性,避免选择过载。
许多科学和工程领域都面临昂贵黑盒函数的优化问题 :
函数没有已知或可解析的数学表达式 每次函数评估成本高昂(材料成本、计算成本、时间成本) 无法获得导数信息 不适合大量函数评估 典型应用场景包括:
计算流体动力学中的参数优化 化学工程中的分子设计和药物发现 机器学习模型的超参数调优 神经网络架构搜索 传统优化算法(如Adam、L-BFGS-B、差分进化)依赖于:
导数信息(通常不可获得) 大量函数评估(对昂贵函数不可行) 贝叶斯优化提供了样本高效 的替代方案,但现有实现存在问题。
通过详细对比分析(表1),现有Python包存在以下问题:
包名 代码行数 并行优化 异步优化 主要问题 BoTorch 38,419 ✓ ✓ 代码库过于庞大(29倍于NUBO),难以理解 bayes_opt 1,241 ✗ ✗ 不支持并行和异步优化 SMAC3 11,217 ✗ ✗ 功能受限 pyGPGO 2,029 ✗ ✗ 功能受限 GPyOpt 4,605 ✓ ✗ 已停止维护 Spearmint 3,662 ✗ ✗ 非模块化设计,灵活性差
关键问题 :
复杂性vs透明性 :BoTorch功能强大但代码复杂(160个文件),非专家用户难以理解功能局限 :多数包不支持并行/异步优化选择过载 :提供大量选项,非专家用户难以决策为跨学科研究人员 (非统计学/计算机科学专家)提供:
透明 :简洁代码(仅1,322行,20个文件)易用 :模块化设计,直观语法高效 :支持并行/异步/约束/混合优化可靠 :仅包含经过验证的算法轻量级实现 :用1,322行代码实现完整的贝叶斯优化框架,代码量仅为BoTorch的3.4%,但提供相当的功能全面的优化策略支持 :顺序单点优化(sequential single-point) 并行多点优化(parallel multi-point) 异步优化(asynchronous) 约束优化(constrained) 混合参数优化(mixed discrete-continuous) 透明性设计理念 :清晰的代码结构 精确的学术引用 详尽的文档(论文+网站) 用户友好的模块化架构 :灵活的构建块设计 直观的Python语法 精选的高效算法 性能验证 :在基准测试中与主流包(BoTorch、SMAC3等)性能相当或更优,证明简洁性不以性能为代价开源生态系统 :基于PyTorch生态(Torch、GPyTorch),确保良好的可扩展性和GPU加速支持贝叶斯优化旨在解决d维最大化问题:
x ∗ = arg max x ∈ X f ( x ) x^* = \arg\max_{x \in X} f(x) x ∗ = arg max x ∈ X f ( x )
其中:
输入空间 X ∈ [ a , b ] d X \in [a,b]^d X ∈ [ a , b ] d :通常为超矩形有界连续空间目标函数 f ( x ) f(x) f ( x ) :昂贵的、无导数的黑盒函数观测 y i = f ( x i ) + ϵ y_i = f(x_i) + \epsilon y i = f ( x i ) + ϵ :带噪声 ϵ ∼ N ( 0 , σ 2 ) \epsilon \sim \mathcal{N}(0, \sigma^2) ϵ ∼ N ( 0 , σ 2 ) 训练数据 D n = { ( x i , y i ) } i = 1 n D_n = \{(x_i, y_i)\}_{i=1}^n D n = {( x i , y i ) } i = 1 n 扩展任务 (NUBO支持):
约束优化 :
subject to g i ( x ) = 0 , h j ( x ) ≥ 0 \text{subject to } g_i(x) = 0, \quad h_j(x) \geq 0 subject to g i ( x ) = 0 , h j ( x ) ≥ 0 混合参数 :部分维度为离散值输入:评估预算N,初始点数n₀,代理模型M,采集函数α
1. 通过空间填充设计采样n₀个初始点,获得观测
2. 设置训练数据D_n = {X₀, y₀}
3. While n ≤ N - n₀:
a. 用D_n训练代理模型M(高斯过程)
b. 最大化采集函数α找到候选点x*_n
c. 评估x*_n得到y*_n,加入D_n
d. n = n + 1
4. 返回最高观测值对应的点x*
先验分布 :
f ( X n ) ∼ N ( m ( X n ) , K ( X n , X n ) ) f(X_n) \sim \mathcal{N}(m(X_n), K(X_n, X_n)) f ( X n ) ∼ N ( m ( X n ) , K ( X n , X n ))
NUBO的配置选择 :
均值函数 :常数均值 μ constant ( x ) = c \mu_{\text{constant}}(x) = c μ constant ( x ) = c 协方差核 :Matérn 5/2 ARD核
Σ Mat e ˊ rn ( x , x ′ ) = σ f 2 ( 1 + 5 r l + 5 r 2 3 l 2 ) exp ( − 5 r l ) \Sigma_{\text{Matérn}}(x, x') = \sigma_f^2 \left(1 + \frac{\sqrt{5}r}{l} + \frac{5r^2}{3l^2}\right) \exp\left(-\frac{\sqrt{5}r}{l}\right) Σ Mat e ˊ rn ( x , x ′ ) = σ f 2 ( 1 + l 5 r + 3 l 2 5 r 2 ) exp ( − l 5 r )
其中 r = ∣ x − x ′ ∣ r = |x - x'| r = ∣ x − x ′ ∣ 自动相关性确定(ARD) :
每个输入维度有独立的长度尺度 l d l_d l d 大长度尺度 → 维度不重要 小长度尺度 → 维度重要 后验分布 :
f ( X ∗ ) ∣ D n , X ∗ ∼ N ( μ n ( X ∗ ) , σ n 2 ( X ∗ ) ) f(X^*) | D_n, X^* \sim \mathcal{N}(\mu_n(X^*), \sigma_n^2(X^*)) f ( X ∗ ) ∣ D n , X ∗ ∼ N ( μ n ( X ∗ ) , σ n 2 ( X ∗ ))
μ n ( X ∗ ) = K ( X ∗ , X n ) [ K ( X n , X n ) + σ y 2 I ] − 1 ( y − m ( X n ) ) + m ( X ∗ ) \mu_n(X^*) = K(X^*, X_n)[K(X_n, X_n) + \sigma_y^2 I]^{-1}(y - m(X_n)) + m(X^*) μ n ( X ∗ ) = K ( X ∗ , X n ) [ K ( X n , X n ) + σ y 2 I ] − 1 ( y − m ( X n )) + m ( X ∗ )
σ n 2 ( X ∗ ) = K ( X ∗ , X ∗ ) − K ( X ∗ , X n ) [ K ( X n , X n ) + σ y 2 I ] − 1 K ( X n , X ∗ ) \sigma_n^2(X^*) = K(X^*, X^*) - K(X^*, X_n)[K(X_n, X_n) + \sigma_y^2 I]^{-1}K(X_n, X^*) σ n 2 ( X ∗ ) = K ( X ∗ , X ∗ ) − K ( X ∗ , X n ) [ K ( X n , X n ) + σ y 2 I ] − 1 K ( X n , X ∗ )
超参数估计 :通过最大化对数边际似然(MLE):
log P ( y n ∣ X n ) = − 1 2 ( y n − m ( X n ) ) ⊤ [ K + σ y 2 I ] − 1 ( y n − m ( X n ) ) − 1 2 log ∣ K + σ y 2 I ∣ − n 2 log 2 π \log P(y_n | X_n) = -\frac{1}{2}(y_n - m(X_n))^\top[K + \sigma_y^2 I]^{-1}(y_n - m(X_n)) - \frac{1}{2}\log|K + \sigma_y^2 I| - \frac{n}{2}\log 2\pi log P ( y n ∣ X n ) = − 2 1 ( y n − m ( X n ) ) ⊤ [ K + σ y 2 I ] − 1 ( y n − m ( X n )) − 2 1 log ∣ K + σ y 2 I ∣ − 2 n log 2 π
期望改进(Expected Improvement, EI) :
α EI ( X ∗ ) = ( μ n ( X ∗ ) − y best ) Φ ( z ) + σ n ( X ∗ ) ϕ ( z ) \alpha_{\text{EI}}(X^*) = (\mu_n(X^*) - y_{\text{best}})\Phi(z) + \sigma_n(X^*)\phi(z) α EI ( X ∗ ) = ( μ n ( X ∗ ) − y best ) Φ ( z ) + σ n ( X ∗ ) ϕ ( z )
其中 z = μ n ( X ∗ ) − y best σ n ( X ∗ ) z = \frac{\mu_n(X^*) - y_{\text{best}}}{\sigma_n(X^*)} z = σ n ( X ∗ ) μ n ( X ∗ ) − y best
上置信界(Upper Confidence Bound, UCB) :
α UCB ( X ∗ ) = μ n ( X ∗ ) + β σ n ( X ∗ ) \alpha_{\text{UCB}}(X^*) = \mu_n(X^*) + \sqrt{\beta}\sigma_n(X^*) α UCB ( X ∗ ) = μ n ( X ∗ ) + β σ n ( X ∗ )
优化器 :L-BFGS-B(有界)或SLSQP(约束)
通过重参数化技巧近似:
α EI MC ( X ∗ ) = max ( ReLU ( μ n ( X ∗ ) + L z − y best ) ) \alpha_{\text{EI}}^{\text{MC}}(X^*) = \max(\text{ReLU}(\mu_n(X^*) + Lz - y_{\text{best}})) α EI MC ( X ∗ ) = max ( ReLU ( μ n ( X ∗ ) + L z − y best ))
α UCB MC ( X ∗ ) = max ( μ n ( X ∗ ) + β π 2 ∣ L z ∣ ) \alpha_{\text{UCB}}^{\text{MC}}(X^*) = \max\left(\mu_n(X^*) + \sqrt{\frac{\beta\pi}{2}}|Lz|\right) α UCB MC ( X ∗ ) = max ( μ n ( X ∗ ) + 2 β π ∣ L z ∣ )
其中:
L L L :协方差矩阵Cholesky分解的下三角矩阵 L L ⊤ = K LL^\top = K L L ⊤ = K z ∼ N ( 0 , I ) z \sim \mathcal{N}(0, I) z ∼ N ( 0 , I ) :标准正态样本批量优化策略 :
联合优化 (joint):同时优化所有批量点贪婪顺序 (sequential):逐点优化,固定之前的点(实证表现更好)优化器 :Adam(随机)或L-BFGS-B/SLSQP(固定基础样本)
代码量对比 :NUBO(1,322行)vs BoTorch(38,419行)文件数对比 :20个 vs 160个设计哲学 :避免过度抽象,保持函数和对象易于追踪用户可通过4步构建自定义优化循环:
# 1. 定义输入空间
bounds = torch.tensor([[0., 0., ...], [1., 1., ...]])
# 2. 训练高斯过程
gp = GaussianProcess(x_train, y_train, likelihood)
fit_gp(x_train, y_train, gp, likelihood)
# 3. 定义采集函数
acq = UpperConfidenceBound(gp=gp, beta=4)
# 4. 优化采集函数
x_new, _ = single(func=acq, method="L-BFGS-B", bounds=bounds)
策略 :枚举所有离散组合,对每个组合优化连续参数实现 :通过字典指定离散维度和可能值局限 :离散维度或值过多时计算昂贵(论文坦诚说明)场景 :评估时间不确定时继续优化实现 :将待评估点作为固定点传入 x_pending优势 :充分利用计算资源提供清晰的算法选择指南:
是否异步?→ 是否并行?→ 是否约束? 每个分支推荐具体的采集函数和优化器组合 使用两个标准基准函数(来自虚拟仿真实验库24 ):
2D Levy函数 :维度:2 特点:多峰,多个局部最优 全局最优:0.00 6D Hartmann函数 :维度:6 特点:多个局部极小值,一个全局极小值 全局最优:3.32237 输入空间:0,1 ⁶ 两个函数均被取负以转换为最大化问题。
最优观测值 :当前迭代的最佳输出(平均±标准误)收敛速度 :达到全局最优所需的评估次数每次迭代时间 :算法计算开销对比5个主流Python包:
BoTorch (v0.8.4):功能最全面bayes_opt (v1.4.3):轻量级SMAC3 (v2.0.0):中等复杂度pyGPGO (v0.5.0):轻量级NUBO (v1.0.3):本文方法统一配置 :
代理模型:高斯过程 采集函数:上置信界(UCB) 运行次数:10次重复实验 硬件:Apple Mac mini (M2, 16GB) 初始点:通过拉丁超立方采样生成 Levy:30次评估 Hartmann:60次评估 批量大小:4 Levy:30次评估(7.5批) Hartmann:100次评估(25批) 包名 2D Levy (顺序) 6D Hartmann (顺序) 2D Levy (并行) 6D Hartmann (并行) NUBO -0.04 (±0.06) 3.28 (±0.06) -0.04 (±0.04) 3.27 (±0.06) BoTorch -0.21 (±0.20) 3.27 (±0.07) -0.27 (±0.21) 3.26 (±0.06) SMAC3 -0.71 (±0.58) 2.70 (±0.38) - - bayes_opt -0.64 (±0.74) 3.20 (±0.13) - - pyGPGO -0.28 (±0.31) 2.64 (±1.05) - -
关键发现 :
NUBO在所有测试中最接近真实最优值 (Levy: 0.00, Hartmann: 3.32)方差最低 :结果稳定性最好轻量级包中表现最佳 :优于bayes_opt和pyGPGO与复杂包竞争力强 :与BoTorch和SMAC3相当包名 2D Levy (顺序) 6D Hartmann (顺序) 2D Levy (并行) 6D Hartmann (并行) NUBO 0.60s 1.88s 0.07s 2.20s BoTorch 0.09s 0.22s 0.00s 0.19s SMAC3 0.08s 0.25s - - bayes_opt 0.14s 0.24s - - pyGPGO 0.23s 0.65s - -
分析 :
NUBO每次迭代耗时较高(最多2.20s) 但对于昂贵黑盒函数,这可忽略不计 :
物理实验:可能需要小时/天 复杂仿真:可能需要分钟/小时 额外2秒相对于评估成本微不足道 A) 2D Levy顺序优化 :
NUBO快速收敛到全局最优 bayes_opt和pyGPGO波动较大 SMAC3表现较差 B) 6D Hartmann顺序优化 :
所有方法均收敛 NUBO和BoTorch最接近真实最优 SMAC3和pyGPGO方差大 C) 2D Levy并行优化 :
D) 6D Hartmann并行优化 :
NUBO略慢于BoTorch达到高值 但最终值更优且更稳定 任务 :6D Hartmann函数,第一维为离散参数(11个值)
设置 :
初始点:30(5×维度) 优化迭代:10次 批量大小:4 采集函数:MC-UCB (β=4, 128样本) 结果 :
第53次评估找到最优解 输入:0.4, 0.9136, 1.0, 0.5669, 0.0, 0.0802 输出:3.2133 (真实最优3.32237) 误差:仅3.3% 对比随机和LHS采样 (Figure 5):
NUBO显著优于随机采样和拉丁超立方采样 70次评估后最接近真实最优 简洁性不牺牲性能 :1,322行代码实现与38,419行的BoTorch相当的性能稳定性优势 :标准误最小,适合实际应用并行策略有效 :贪婪顺序策略在实际问题中表现良好混合优化可行 :成功处理离散-连续混合参数空间计算开销可接受 :对于昂贵黑盒函数,额外的秒级开销可忽略特性 NUBO BoTorch GPyOpt 其他 模块化 ✓ ✓ ✓ 部分 并行优化 ✓ ✓ ✓ ✗ 异步优化 ✓ ✓ ✗ ✗ 代码复杂度 低 高 中 低-中 维护状态 活跃 活跃 已归档 活跃
R语言 :
rBayesianOptimization:基础功能 ParBayesianOptimization:支持并行 超参数优化 :机器学习模型调优(Spearmint, SMAC3)神经架构搜索 :BANANAS等科学应用 :流体动力学、化学工程、材料设计目标用户 :跨学科研究人员(非ML专家)设计理念 :透明性 > 功能丰富性应用场景 :物理实验和仿真优化NUBO成功实现了透明性和性能的平衡 :用极少的代码(1,322行)实现完整功能 性能与复杂包(BoTorch)相当或更优 全面的功能支持 :顺序/并行/异步优化 约束和混合参数空间 易于定制的模块化设计 适合跨学科应用 :开源生态良好 :基于PyTorch生态 BSD 3-Clause许可 活跃维护 计算效率 :每次迭代比BoTorch慢约10倍 但对昂贵黑盒函数可忽略 混合优化的可扩展性 :枚举策略在离散维度/值过多时不可行 未提供更高效的替代方案 功能覆盖 :不支持多保真度优化(multi-fidelity) 不支持多目标优化(multi-objective) 不支持高维优化专用方法 算法选择有限 :仅包含两种采集函数(EI、UCB) 未包含其他流行方法(如知识梯度、熵搜索) 基准测试有限 :仅测试2个合成函数 缺少真实世界应用案例对比 未测试高维问题(>10维) 超参数敏感性 :β参数选择缺乏自动化指导 蒙特卡洛样本数的影响未充分分析 可扩展性验证不足 :论文明确提出的扩展计划:
多保真度优化 :利用不同精度的仿真加速优化多目标优化 :同时优化多个相互冲突的目标高维优化 :开发适用于高维空间的专用方法(如嵌入、随机嵌入等)非算法创新 :未提出新的贝叶斯优化算法工程创新 :在简洁性和功能性间找到优秀平衡点设计创新 :模块化架构降低使用门槛✓ 优点 :
与5个主流包横向对比 10次重复实验,提供统计显著性 包含顺序和并行两种场景 详细的案例研究 ✗ 不足 :
基准函数仅2个,维度较低 缺少真实应用对比 未测试极端场景(高维、大批量) 定量证据 :在所有测试中达到最优或接近最优稳定性 :标准误最小代码量对比 :客观量化简洁性优势诚实报告 :坦诚计算效率劣势结构清晰:背景→方法→实验→案例 公式详尽:完整的数学推导 代码示例丰富:每个功能都有代码片段 可视化有效:流程图、收敛曲线、对比图 开源代码和文档 详细的实验设置 提供复现材料 明确的版本信息 枚举策略的低效 :混合优化在离散维度多时不可行算法选择保守 :仅EI和UCB,未包含更现代的方法(如qKG、MES)缺少自适应策略 :β等超参数需手动调整无收敛性保证分析 无样本复杂度分析 未讨论贪婪策略的理论性质 工程贡献显著 :为跨学科用户降低门槛算法贡献有限 :未提出新方法教育价值高 :清晰的实现可作为学习材料适用场景 :
✓ 物理实验优化(评估昂贵) ✓ 工程仿真(中小规模参数) ✓ 教学和原型开发 ✓ 需要理解算法细节的研究 不适用场景 :
✗ 大规模超参数搜索(效率要求高) ✗ 高维优化(>20维) ✗ 需要最先进算法的竞争性研究 主要用户 :实验科学家、工程师次要用户 :ML研究人员(原型开发)教育用户 :学生和教师评估极其昂贵 :物理实验(小时/天级别) 高精度仿真(分钟/小时级别) 此时算法2秒开销可忽略 需要理解算法 :研究项目需要修改算法 教学和学习目的 需要调试和解释结果 中小规模问题 :参数维度 ≤ 10 并行批量 ≤ 10 离散参数 ≤ 3维 需要特定功能 :使用BoTorch :需要最先进算法 高维问题(>20维) 大规模并行 GPU加速关键 使用SMAC3 :使用bayes_opt :1 Frazier (2018): A tutorial on Bayesian optimization9 Jones et al. (1998): Efficient global optimization - EI的原始论文10 Snoek et al. (2012): Practical Bayesian optimization - 现代BO的奠基工作11 Shahriari et al. (2015): Taking the human out of the loop - 综述论文28 Gramacy (2020): Surrogates - 实用的GP教材30 Rasmussen & Williams (2006): Gaussian Processes for Machine Learning - 经典教材27 Wilson et al. (2018): Maximizing acquisition functions - 批量优化策略32 Srinivas et al. (2010): GP optimization in the bandit setting - UCB的理论基础22 BoTorch (Balandat et al., 2020): 主要竞争对手21 SMAC3 (Lindauer et al., 2022): 超参数优化35 GPyTorch (Gardner et al., 2018): NUBO的GP后端维度 评分 说明 创新性 3/5 工程创新强,算法创新弱 技术质量 4/5 实现可靠,但效率有待提升 实验充分性 3.5/5 对比全面,但基准有限 写作质量 5/5 清晰、详尽、可复现 实用价值 4/5 特定场景下非常有用 影响力潜力 3.5/5 填补细分市场,但非突破性
综合评价 :这是一篇优秀的工具论文 ,成功实现了其核心目标——为跨学科研究人员提供透明、易用的贝叶斯优化工具。虽然算法创新有限,但在工程设计和用户体验上做出了显著贡献。特别适合需要理解算法细节、优化昂贵黑盒函数的科学和工程应用。代码质量和文档的高标准值得其他开源项目学习。