想象你是一位勘探经验丰富的老矿工,接手了一片从未探明的荒原。地下可能藏着丰富的金矿,但你无法从地表看出任何苗头。每打一个钻孔要花十万元,而你的预算只够打三十个孔。你要做的,就是在这片荒原上,用最少的钻孔次数,找到含金量最高的那个点。这片荒原的地质结构就是“黑盒函数”——你只知道某个坐标挖下去的结果,却看不到全貌。贝叶斯优化,正是这位老矿工脑中的决策方法论:它用已有钻孔数据画出一张“经验地图”(高斯过程代理模型),再用一把“下钻决策尺”(采集函数)决定下一个钻孔打在哪里。EI、PI、UCB 是三种风格不同的决策尺,分别代表“算期望收益”“算成功概率”和“乐观估值”三种勘探哲学。这篇文章,我们就跟着老矿工一起,把这三把尺子逐一拆解,并学会用代码实现自己的“找矿系统”。
掌握采集函数设计,你就掌握了贝叶斯优化的核心决策引擎。无论是调大模型超参、设计新材料配方,还是筛选候选药物分子,这套方法都能帮你在评估代价高昂的优化任务中,用最少的试错找到最好的答案——这是 AI 工程落地中极具实用价值的核心技能。
目录
可视化演示
展示贝叶斯优化中采集函数如何平衡探索与利用,对比EI、PI和UCB三种策略的采样决策差异。
本节配有交互动效(进入视口后自动加载,约 3KB)。
期望改进 EI 综合考虑改进量和概率,平衡探索与利用 EI(x)=(μ-f*)Φ(z)+σφ(z) EI是最常用的采集函数,适合大多数优化场景
优化问题本质:看不见的矿脉
金叔站在荒原边缘,手里只有一张地形图,图上没有任何矿脉信息。他知道的是:这片荒原地下一定藏着含金量高的富矿,但位置未知。每打一个钻孔需要十万元,预算只够三十次。更麻烦的是,他没法从地表特征推断地下情况——这正是黑盒函数的写照:你输入一个坐标 x,得到该点的含金量 f(x),但函数内部机制完全不可见,没有梯度,没有解析式。
在机器学习里,很多调优问题同样如此。比如大语言模型的微调:一组超参数(学习率、批大小、层数)就是坐标 x,训练一次模型就是打一个钻孔,而验证集准确率就是含金量。一次训练动辄花费数万美元,相当于一个昂贵的钻孔。这类问题的共同特征是:评估一次 f(x) 代价极高,且函数形态未知,我们只能通过有限的采样来猜测全局最优在哪里。
于是,金叔的目标可以用一句数学语言表达:找到让含金量最高的那个坐标。
金叔的策略很朴素:先用几个钻孔摸清大致情况,再逐步加密。但问题来了——钻孔该打在哪儿?凭什么判断?这就引出了他的第二件装备:经验地图。
- x\*最优解,也就是荒原上矿脉最富的那个坐标点。
- arg max取最大值时的自变量,即“让后面这个函数值最大的那个 x”。
- f(x)目标函数,即地下含金量分布——黑盒,只能靠钻孔得知。
- 搜索空间 X可选坐标的范围,对应荒原的边界,所有钻孔必须落在这片区域内。
高斯过程代理:会发光的经验地图
金叔请来一位地质统计学家,帮他画一张“经验地图”。这张地图上不仅有每个位置预测的含金量(均值),还会用不同深浅的灰色标注“拿不准的程度”(方差)。已经钻过的地方,灰色很浅;离钻孔很远的地方,灰色浓得像雾。这张会随数据更新的经验地图,就是贝叶斯优化里的高斯过程代理模型。
高斯过程(GP)不直接回答“函数是多少”,而是回答“函数在每个点可能服从什么分布”。它给出的是对目标函数整体的概率描述:任何一个点 x 处的函数值 f(x),在给定观测数据 D 后,都服从一个正态分布。钻孔越多,地图上的雾就越淡,预测就越有底气。
有了这张经验地图,金叔每次看到地图,都能立刻知道“哪里大概富、哪里说不准”。但地图只会描述现状,不会告诉他下一钻该打哪儿。真正做决定的是采集函数。
- p(f(x) | D)给定钻孔数据 D 后,位置 x 处含金量的概率分布。
- N(……)正态分布,即“钟形曲线”,表示预测值集中在均值附近、以方差刻画不确定程度。
- μ(x)后验均值,经验地图上对位置 x 含金量的最佳猜测。
- σ²(x)后验方差,表示这个猜测的不确定程度——地图上的灰色雾区。
探索利用平衡:三台钻机的派兵布阵
金叔手里还有一张王牌:无论地图怎么画,最终决定钻孔位置的是一把“下钻决策尺”,也就是采集函数 α(x)。这把尺子给地图上每个候选位置打一个分数,分数最高的点就是下一个钻孔位。它必须回答一个两难问题:是去已知富矿附近加密钻孔(利用),还是去地图上灰雾最浓的未知区域碰运气(探索)?
如果纯利用,金叔会在第一个小富矿周围反复钻孔,永远错过远处可能更大的金矿——对应着陷入局部最优。如果纯探索,预算很快就会在毫无收获的荒地上耗尽——对应着评估次数浪费。采集函数的作用,就是把这两股力量拧成一股绳。
不同的采集函数,就是对“探索与利用怎么配比”给出了不同答案。接下来我们看金叔工具箱里最经典的三把尺子。
- x_next金叔下一个要打钻孔的坐标。
- α(x | D_t)采集函数值,即当前位置在当前经验地图下的“下钻优先级分数”。
- D_t到第 t 轮为止已经收集到的所有钻孔数据。
- arg max在搜索空间内找到使分数最大的那个位置,这就是决策规则。
EI采集函数:算期望收益的老派稳健派
金叔的第一把尺子叫 EI(Expected Improvement,期望提升)。它的思考方式很像一个精明的商人:对每个候选点,先问两件事——“这里比现在最富的矿脉能多出多少收益?”以及“多出这么多收益的概率有多大?”两者相乘,就是这个点的期望收益。
设当前已知的最优含金量为 f*。在某点 x 处,改进量 I(x) 定义为“超出 f* 的部分”,没超出就记 0。EI 就是对这个改进量求期望:考虑了均值 μ(x) 提供的收益预测,也考虑了方差 σ(x) 带来的翻盘可能——方差大的地方虽然均值不高,但万一挖到富矿呢?这正是探索性的来源。
EI 因此是风险中性的:它既奖励均值高的富矿带(利用),也奖励方差大的未知区(探索),但两者都要折算成“期望收益”。金叔用这把尺子时,心态最稳。
- μ(x) − f\* − ξ位置 x 的预测均值相对当前最优值的“预期超出量”,ξ 是额外加的一点探索余量。
- z将预期超出量除以标准差得到的标准化分数,表示“超出多少个 σ”。
- Φ(z)标准正态分布的累积分布函数(CDF),即“改进量大于 0 的概率”。
- φ(z)标准正态分布的概率密度函数(PDF),刻画改进量在临界点附近的密度,对应不确定性带来的潜在收益。
PI与UCB采集:概率派与乐观派的对决
金叔的第二把尺子叫 PI(Probability of Improvement,提升概率)。它的逻辑简单粗暴:只问一个问题——“这个点比当前最优值更好的概率有多大?”它不看提升多少,只看有没有概率。设定一个最小可接受阈值 ε 后,凡是超过当前最优值的概率越高,分数就越高。
1. f\* + ε:设定的目标门槛,只有超过它才算“成功”。
2. ε:阈值参数,调大它等于提高目标,间接鼓励去更有可能大幅提升的点。
3. Φ(……):正态累积分布函数,把标准化分数转换成概率值。
第三把尺子叫 UCB(Upper Confidence Bound,置信上界)。金叔说,这尺子像队伍里的乐观小伙子:永远盯着“最乐观的情形”。每个点的分数 = 均值的估计 + κ 倍的方差。κ 越大,越相信方差大的灰雾区里藏着惊喜。
1. μ(x):经验地图对该点含金量的预测值。
2. σ(x):该点的标准差,不确定性越大值越大。
3. κ:探索系数,κ=0 时只看均值(纯利用),κ 越大越偏向不确定性高的区域(纯探索)。
PI 简单、计算快,但对“提升幅度”不敏感——可能不断挑选只比当前好一点点但概率最高的点。UCB 则天生乐观,只需调节 κ 就能控制探索幅度。两位选手各有脾气,金叔把它们一起放进工具箱。
采集函数对比:三把尺子怎么选
金叔的箱子里现在有三把尺子:EI 稳重、PI 直接、UCB 乐观。面对一片新荒原,该用哪一把?其实三把尺子有一个统一的出身:它们都是在代理模型的后验分布上,对某个“效用函数”求期望。不同的效用函数,造就了不同的决策风格。
EI 用的效用是“改进量本身”,所以它权衡了概率和幅度,最均衡;PI 用的效用是“是否超过阈值”的 0/1 判断,所以它只关心概率、不关心幅度;UCB 用的效用是“均值加 κ 倍标准差”的乐观估计,所以它天然爱吃“不确定性红利”。
实操中,预算少且噪声大时,EI 最稳;想快速迭代且能接受偶尔“扑空”时,PI 够快;对探索需求强烈、且能调好 κ 时,UCB 很顺手。没有绝对的最好,只有匹配地形和预算的最佳选择。金叔的经验是:先用均匀的初始钻孔摸清地形,再选一把尺子持续用下去。
- α(x | D_t)采集函数得分,即决策尺子在 x 处的读数。
- E[·]期望运算,对所有可能情况按概率求平均。
- f ∼ p(f | D_t)从高斯过程后验中采样的函数。
- u(f(x))效用函数,核心差异所在——EI、PI、UCB 各自定义了不同的 u。
并行优化实战:三台钻机同时开工
荒原太大,时间紧迫,金叔不能每次只等一个钻孔结果再决定下一个。他有三台钻机,想同时打三个孔。但问题来了:采集函数是基于现有地图算出来的,如果三个孔都选分数最高的位置,它们会挤在同一个山头——这相当于三台钻机打同一个洞,白白浪费。
解决思路是什么?金叔的做法是“分批决策、用幻觉占位”:先选第一个点,然后假设它的结果已知(用地图均值当作临时结果填入),更新地图后再选第二个点,以此类推。同时,对已经选入本批的点施加“惩罚”,降低它们附近的采集分数,让三个孔自动分散到不同区域。
这种方法在贝叶斯优化库中叫 q-EI 或 q-UCB 的近似实现,配合核函数惩罚项,可以在一次并行评估中覆盖多个有潜力的区域。金叔有了三台钻机后,勘探速度直接翻倍,而每一钻依然花在刀刃上。
- x̂_j当前批次中第 j 个已推荐但还没评估的点。
- μ(x̂_j)高斯过程对它的均值预测,用来临时当真实值用。
- f̃(……)虚构的观测值(幻觉),用于更新中间过程的地图,防止下一个点重复选它。
AI 应用场景
大模型超参数调优
阶段:模型训练与调优阶段。
解决的问题:大模型微调时,学习率、批大小、LoRA 秩等超参数组合空间巨大,一次训练成本可能高达数万美元。传统网格搜索需要训练几十次,预算根本无法承受;贝叶斯优化用高斯过程建模“超参数 → 验证集指标”的黑盒关系,配合 EI 采集函数,通常十几轮就能逼近最优组合。
具体案例:某团队微调 70B 参数大模型,将贝叶斯优化应用于学习率与 LoRA 配置搜索,用 14 次训练替代了原本计划的 60 次网格搜索,节省约 70% 的训练成本,同时最终准确率反超人工调参结果。
材料配方设计
阶段:实验设计与快速迭代阶段。
解决的问题:新型电池电解液配方涉及多个组分比例,每做一次实验需要合成样品、装配电池、循环测试,耗时数周且材料昂贵。贝叶斯优化把配方参数当作荒原坐标,把电池寿命当作含金量,用 UCB 采集函数在探索新配方和利用已知优良配方之间动态调整,极大减少实验次数。
具体案例:某新材料实验室用贝叶斯优化搜索锂离子电池电解液添加剂配比,在 32 次实验内找到了比传统正交实验(需要 200+ 次实验)更优的循环寿命配方,研发周期缩短近三分之二。
药物分子候选筛选
阶段:湿实验验证前的候选排序阶段。
解决的问题:药物研发中,候选分子合成与生物活性测试成本极高。贝叶斯优化以分子描述符为输入、以预测活性或结合亲和力为输出,通过 EI 采集函数动态选择“最值得合成验证”的分子——既避免沉迷于已知活性分子的微小改进,又不盲目探索完全陌生的化学空间。
具体案例:一家 AI 制药公司对某靶点的候选分子库进行贝叶斯优化筛选,用 80 次湿实验验证从一万个分子中锁定了苗头化合物,相比随机筛选节省约 90% 的实验成本,且命中率提升 5 倍。
Python 演示
import numpy as npfrom sklearn.gaussian_process import GaussianProcessRegressorfrom sklearn.gaussian_process.kernels import ConstantKernel, RBFfrom scipy.stats import norm def target(x): return np.sin(3.0 * x) + 0.5 * x x_obs = np.array([-1.8, -0.9, 0.3, 1.2]).reshape(-1, 1)y_obs = target(x_obs)kernel = ConstantKernel(1.0) * RBF(length_scale=1.0)gp = GaussianProcessRegressor(kernel=kernel, alpha=1e-4, normalize_y=True) def acq_ei(x, xi=0.01): mu, sigma = gp.predict(x, return_std=True) y_best = np.max(y_obs) diff = mu - y_best - xi with np.errstate(divide='ignore'): z = diff / sigma return diff * norm.cdf(z) + sigma * norm.pdf(z) def acq_ucb(x, beta=1.5): mu, sigma = gp.predict(x, return_std=True) return mu + beta * sigma for step in range(8): gp.fit(x_obs, y_obs) x_cand = np.linspace(-2.0, 2.0, 401).reshape(-1, 1) score = acq_ei(x_cand) # 换成 acq_ucb(x_cand) 可对比 UCB 策略 x_next = x_cand[np.argmax(score)] y_next = target(x_next) print("step=%d | x_next=%.3f | y_next=%.3f | best=%.3f" % (step, x_next[0], y_next, np.max(y_obs))) x_obs = np.vstack([x_obs, x_next]) y_obs = np.append(y_obs, y_next)
gp = GaussianProcessRegressor(kernel=kernel, alpha=1e-4, normalize_y=True)创建高斯过程代理模型,相当于金叔那张会更新的经验地图。def acq_ei(x, xi=0.01):定义 EI 采集函数,xi 控制探索余量。mu, sigma = gp.predict(x, return_std=True)从代理模型获取每个候选点的均值与标准差,同时读取地图上的预测和雾区浓度。diff = mu - y_best - xi计算相对当前最优的预期超出量。return diff * norm.cdf(z) + sigma * norm.pdf(z)完整的 EI 公式:概率与幅度的乘积之和。gp.fit(x_obs, y_obs)用全部钻孔数据更新经验地图。score = acq_ei(x_cand) # 换成 acq_ucb(x_cand) 可对比 UCB 策略对 401 个候选点逐一打分。把这一行替换成acq_ucb,就能体验乐观派的勘探风格。x_next = x_cand[np.argmax(score)]取分数最高的坐标作为下一次评估点,即金叔的下一钻。x_obs = np.vstack([x_obs, x_next])把新钻孔加入历史数据,地图将在下一轮更新。
常见误区
误区“采集函数值大的点,说明目标函数在这里的值也大。我想知道最优值是多少,直接看采集函数最高的位置对应的预测均值不就行了吗?”
正解采集函数不是对目标函数值的估计,而是对“下一个评估点价值”的评分。它把均值收益和不确定性收益加在一起,专门回答“下一步该在哪里钻孔”,而不是“这里到底有多富”。就像金叔的决策尺量的是“该不该打”的优先级,而不是直接报出含金量。要估计含金量,应该看高斯过程的预测均值或方差。
为何常见:采集函数曲线和目标函数曲线形状有时相似(均值部分主导时),初学者容易把两者混为一谈;实际上当方差很大时,采集函数会指向均值并不高的区域。
误区“EI 每次都选期望提升最大的点,那这个点应该就是全局最优点吧?直接去那里猛挖就行,为什么还要迭代?”
正解EI 选出的点是“在当前信息下最值得评估的点”,它是基于不完全的地图做出的决策,结果可能离真正的最优很远。贝叶斯优化是一个逐步逼近的过程:每钻一个孔,地图就更新一次,EI 的推荐也会随之改变。早期钻孔往往落在不确定性大的区域,后期才收敛到最优附近。把 EI 当“预言机”是对它的最大误解——它是“决策尺”,不是“探宝仪”。
为何常见:目标函数的真实形态是未知的,初始数据极少,任何基于少量数据的判断都有巨大误差;但小白的直觉会下意识把“算法选出的点”等同于“算法认为的最优点”。
误区“UCB 是均值加 β 倍方差,那 β 设大一点,探索得多一点,不是更容易发现全局最优吗?干脆设成 100,把每个角落都探一遍。”
正解β 过大意味着采集函数几乎完全由方差主导,每个点都像是“值得探索的新大陆”,结果退化为纯随机探索,把宝贵的评估次数浪费在明显贫瘠的区域。β 过小则退化为贪心利用,容易陷入局部最优。UCB 的价值恰恰在“两者兼顾”,需要根据预算和地形权衡 β——金叔会提醒你:探索不是漫无目的地乱挖,而是有方向地向着“可能富”的灰雾区迈进。
为何常见:人们容易把“更激进”理解为“更努力”;但贝叶斯优化的核心是“用最少的评估次数”,盲目增大 β 与这个目标背道而驰。
误区“并行贝叶斯优化很简单,开三个进程,每个进程独立跑一个贝叶斯优化,最后合并结果不就行了?”
正解独立跑多个贝叶斯优化会导致重复评估同一片有希望的区域——三台钻机全挤在同一座小山上。真正的并行(批量)贝叶斯优化需要在一次决策中同时考虑 q 个点,使用 q-EI、幻觉占位或核惩罚等手段,让这批点在空间上分散又有针对性。金叔的三台钻机之所以效率高,是因为它们各自被派往不同山头,而不是都去挖同一个洞。
为何常见:独立运行多个优化进程是工程上最容易想到的做法,但忽略了采集函数重复推荐相同区域的问题;人们往往只考虑并行带来的计算加速,而忽略了样本多样性对信息增益的贡献。
面试题
Q1. 下列哪类问题最适合用贝叶斯优化解决?
- A.梯度可求且评估极快的凸优化
- B.评估代价高昂的黑盒函数优化← 正确答案
- C.需要穷举所有组合的网格搜索
- D.无噪声且存在解析解的线性问题
答案:B。贝叶斯优化的设计初衷就是“少量评估找最优”:黑盒、评估贵、无梯度,这三者缺一不可。A 用传统梯度法更快,C 是穷举思路,D 不需要黑盒优化。好比金叔面对的是没有地形图、钻探又贵的荒原,而不是地质资料齐全的矿区。
Q2. 高斯过程作为代理模型时,输出形式是什么?
- A.目标函数在每个点的点估计值
- B.每个点一个均值和一个方差← 正确答案
- C.目标函数在离散网格上的排序
- D.当前最优点的精确函数值
答案:B。高斯过程为每个点给出一个正态分布,即均值加方差,既预测又给不确定性。这正是“经验地图 + 灰雾区”的来源。只输出点估计是普通回归模型,无法支持采集函数计算探索收益。
Q3. 在贝叶斯优化中,采集函数的主要作用是什么?
- A.平衡探索与利用的关系← 正确答案
- B.提升单次评估的数值精度
- C.减少目标函数的固有噪声
- D.替代高斯过程完成拟合
答案:A。采集函数把“均值高(利用)”和“方差大(探索)”综合成一个分数,指导下一轮评估点选择。它不提升精度、不去噪,也不替代代理模型。它只是金叔手里那把下钻决策尺。
Q4. 在 EI 采集函数中,Φ(z) 和 φ(z) 分别代表什么?
- A.正态分布的累积分布函数和概率密度函数← 正确答案
- B.正态分布的概率密度和累积分布函数
- C.目标函数的均值和标准差
- D.改进量的期望和方差
答案:A。Φ(z) 是标准正态 CDF,对应“改进量大于 0 的概率”;φ(z) 是 PDF,对应不确定性带来的边际收益。两者结合才构成期望提升。B 把顺序记反了,C 和 D 都是干扰项。
Q5. 在 UCB 采集函数中增大 κ 会带来什么效果?
- A.更偏向利用已知最优区域
- B.更偏向探索不确定区域← 正确答案
- C.完全忽略高斯过程输出
- D.直接跳出搜索空间边界
答案:B。UCB = μ + κσ,κ 越大,方差项权重越高,采集函数越倾向于选择后验不确定性大的灰雾区,也就是更探索。κ=0 时只剩均值,变成纯利用。注意 C 的错误在于 UCB 仍依赖 GP 输出,只是权重变了。
Q6. PI(提升概率)采集函数的主要缺点是什么?
- A.计算复杂度远高于其他采集函数
- B.忽视提升幅度、只关注提升概率← 正确答案
- C.无法利用高斯过程的预测结果
- D.只适用于离散搜索空间
答案:B。PI 计算的是“超过当前最优的概率”,如果某个点有 90% 概率只提升 0.001,而另一个点有 50% 概率提升 10,PI 会选前者,因为它不管幅度。这正是它容易被局部区域“高频小幅提升”困住的原因。
Q7. 下列哪些属于贝叶斯优化中常见的采集函数?
- A.EI(期望提升)← 正确答案
- B.PI(提升概率)← 正确答案
- C.UCB(置信上界)← 正确答案
- D.RBF(径向基函数)
答案:ABC。EI、PI、UCB 是三种经典采集函数,分别代表期望收益、成功概率和乐观上界三种策略。RBF 是核函数,属于高斯过程代理模型的组件,不是采集函数。好比金叔工具箱里的尺子只有三把,RBF 是画地图用的画笔之一。
Q8. 贝叶斯优化单轮迭代的正确顺序是什么?
- A.拟合代理模型、最大化采集函数、评估目标函数← 正确答案
- B.评估目标函数、最大化采集函数、拟合代理模型
- C.随机采样多个点并行评估、取平均作为结果
- D.先微分目标函数、再做梯度下降更新参数
答案:A。标准流程是:先用历史数据拟合/更新 GP,然后在搜索空间上最大化采集函数得到下一个评估点,再调用真实目标函数评估。B 顺序颠倒,C 是随机搜索思路,D 是梯度优化思路,都不属于贝叶斯优化的迭代逻辑。
Q9. 在并行贝叶斯优化中,批量评估点需要处理哪些挑战?
- A.阻止多个点选到重复位置← 正确答案
- B.对未完成点做占位修正← 正确答案
- C.保证批量点空间上分散← 正确答案
- D.不再需要代理模型参与
答案:ABC。并行批量评估的核心挑战是“避免重复选址”和“在未知结果时继续决策”。常用手段包括幻觉占位(用均值代替未完成结果)、核惩罚、q-EI 等方法,让批量点分散到不同有潜力的区域。D 错误,代理模型不但需要,而且是并行决策的基础。
Q10. 贝叶斯优化相比随机搜索或网格搜索的主要优势是什么?
- A.用代理模型记忆历史并智能选点← 正确答案
- B.代理模型的计算速度必然更快
- C.它不需要任何先验或假设
- D.它能严格证明找到全局最优
答案:A。贝叶斯优化的核心优势是“越搜越聪明”:代理模型从历史评估中学习函数形态,采集函数据此选择最有价值的点,大幅减少评估次数。B 不一定成立(GP 拟合也有开销),C 错误(核函数等先验是必需的),D 错误(它只是逼近全局最优,不保证证明)。