You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何多次运行以下贝叶斯优化代码无法得到相同全局最大值?

为什么多次运行贝叶斯优化代码得不到相同的全局最大值?

这是个很常见的问题,贝叶斯优化的随机性本身就是它的核心特性之一,但也正是这种随机性导致了你每次运行结果不一致。咱们来拆解下具体原因,再说说怎么固定结果:

核心原因:贝叶斯优化中的随机性来源

1. 初始采样的随机性

贝叶斯优化的第一步是随机选取一批初始点来训练代理模型(比如你用的bayes_opt里默认的高斯过程)。每次运行时,这些初始点都是随机生成的:

  • 如果某次初始点刚好落在全局最大值((8,0)附近)的周边,模型会更快往这个方向收敛;
  • 如果初始点偏向次优峰((-8,0)附近)或者其他区域,后续的优化轨迹就会跟着偏离,最终可能收敛到次优解,或者同一个峰的不同位置。

2. 获取函数的随机选择逻辑

为了避免过早陷入局部最优,bayes_opt里的获取函数(比如默认的Expected Improvement)在选择下一个要评估的点时,通常会加入随机扰动,或者在多个候选点中做随机选择。这种设计是为了平衡“探索未知区域”和“利用已知最优区域”,但也导致了每次运行的优化路径不一样。

3. 代理模型的不确定性

高斯过程作为贝叶斯优化的核心代理模型,本身就带有不确定性——尤其是在未被采样过的区域。初始采样点的不同会让模型的拟合结果产生差异,进而影响后续推荐的评估点,最终导致结果波动。

结合你的目标函数来看:你的函数有两个峰值,全局最大值在(8,0)附近,次优峰在(-8,0)附近,两者的数值差距不算特别大。这种情况下,随机性很容易让优化过程偏向其中一个峰,或者在同一个峰的不同位置停止。

如何固定运行结果?

如果你希望每次运行都得到相同的结果,可以通过以下方法消除随机性:

  • 设置全局随机种子:在代码开头加入固定随机种子的代码,覆盖numpy和库内部的随机生成器:

    import numpy as np
    np.random.seed(42)  # 固定numpy的随机种子
    

    同时在调用maximize方法时指定random_state参数:

    bo.maximize(n_iter=50, random_state=42)
    
  • 固定初始采样点:用你已经写的bo.explore方法,手动指定一批初始点,代替默认的随机初始点。这样每次运行的初始模型都是基于相同的点训练的,后续优化轨迹也会一致。

  • 增加初始采样数量:如果不想手动指定初始点,可以调大init_points参数(比如bo.maximize(init_points=20, n_iter=30)),更多的初始点能让代理模型更准确,减少随机性带来的结果波动。

内容的提问来源于stack exchange,提问作者Potato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:04:56