EN

DAMA-BAX 与 mpBAX

储存环六极铁的设计,每次模拟只跟踪一个粒子,达到同一超体积所需的跟踪模拟次数只有 NSGA-II 的四十分之一。

储存环的动力学孔径(Dynamic Aperture,DA)有多大,即使只在模拟里回答也很费计算:要在一组六极铁设置下发射几千个粒子,把每一个都跟踪几千圈,再数一数有多少存活下来,这才得到一个设置的孔径。遗传算法对每一个候选设置都要这样算一遍,因此一次设计研究通常算到 1,000 个左右的设计就停下了。多点 BAX(multipoint Bayesian Algorithm Execution)则每次模拟只跟踪一个粒子,粒子选在模型预测的稳定边界附近,设置选在模型预测的最优区域附近。整张存活图(每个出发点上粒子存活圈数的分布)由一个神经网络从这些单粒子的结果里学出来。我是这篇文章的第一作者,七位作者来自 SLAC,DESY,LBNL,USC 和 Jefferson Lab。文章已被 Physical Review Accelerators and Beams 作为 Letter 接收。

动力学孔径与动量接受度

动力学孔径是粒子偏离闭轨多远出发仍能留在环里的范围,它决定了注入的束流有多少能被接住。动量接受度(Momentum Aperture,MA)是粒子能承受多大的能量偏差,它决定了束流寿命。两个孔径都由六极铁塑造,把一个推大,另一个通常就会缩小,因此设计要找的是 DA 面积与 MA 面积之间的一条 Pareto 前沿。前沿上的每一个点都对应一组六极铁设置,而这一组设置的两个面积都要由两张跟踪出来的存活图各自归结得到。

贝叶斯优化(Bayesian Optimization,BO)试的设置更少(文章把 MG-GPO 也列在这类早期尝试里,那是 Xiaobiao Huang 的方法,我参与了它的开发),但每试一组设置仍要跟踪一整张图。多点 BAX 把建模的位置往下放了一层,学的是从设置和出发点到存活圈数的映射,再把设计算法放在这个模型上运行。这套方法不是我提出的。BAX 出自 Neiswanger,Wang 和 Ermon,多点 BAX 出自 Miskovich 等人(我的两位合作者 Neiswanger 和 Ratner 也在其中)。我们的文章把它用到了 DA 和 MA 上。

并排的两个循环。左边是贝叶斯优化:选一组设置,从这一组设置模拟全部 (x, y) 出发点,算出面积,更新从设置到面积的高斯过程模型。右边是多点 BAX:选一批(设置,x,y),从许多设置里各模拟一个 (x, y),更新从(设置,x,y)到存活圈数的神经网络模型,再由模型给出的图算面积。
贝叶斯优化对一组设置跟踪整张图,建模的是面积;多点 BAX 从许多设置里各跟踪一个粒子,建模的是整张图。

一轮循环

一次完整的运行有 2,000 轮循环,累积起来超过 100,000 个跟踪过的粒子,这个数据量对高斯过程(Gaussian Process,GP)来说太大了。因此模型用的是神经网络,输入是四个旋钮(knob)的值和一个出发位置,输出是粒子存活的圈数占跟踪总圈数的比例,DA 和 MA 各有一个网络。两个网络先在 3,000 次随机的单粒子跟踪上预训练。之后的每一轮循环,先在两个网络上运行 NSGA-II(第二代非支配排序遗传算法)得到预测的 Pareto 前沿,由于这一步不跟踪任何粒子,代价很小。然后用两个条件圈定可以跟踪的候选:设置必须是保留在预测前沿附近的那些,出发点必须是 DA 网络认为落在稳定边界附近一条带里的点;MA 网络也照此处理,只是那条带由它自己给出。这样剩下的候选大约有 2,500 个,从中随机抽 50 个交给 pyAT 跟踪,再用结果微调两个网络。

流程图。初始化数据集并预训练 DA 和 MA 网络,然后循环:在网络上运行遗传算法,选出 Pareto 前沿区域,在该区域里随机选边界点,用 Accelerator Toolbox 模拟 50 个点,更新训练集,微调网络,再运行遗传算法。从 Pareto 前沿区域引出一条分支通向最后的完整核验。
每一轮从网络上的遗传算法走到新跟踪的 50 个粒子,完整的存活图只在最后跟踪一次。

这个方法实际上比它的名字听起来的要粗糙。网络只有一个而且是确定性的,采集函数用的是贪心的 MeanBAX(Chitturi 等人提出),因此整个循环里没有任何量带着不确定性;每轮的 50 个点是随机抽的,用联合互信息来选会更合理;超参数我们也几乎没有调过。

SSRL-X

测试对象是 SSRL-X,一个低发射度的磁聚焦结构(lattice),也是将来升级 SSRL 的候选方案之一(由 Raimondi 等人设计)。按 Huang 和 Safranek 的做法,它的六个六极铁家族归并成四个不改变色品的旋钮。每一次调用模拟器都从 10 个误差种子(error seed)里随机取一个,最后的核验则用新的种子。

与 NSGA-II 的比较

对照的基准是 NSGA-II,也就是 BAX 在网络上运行的那个优化器,两种方法各跑了两次。运行过程中看不到真实的超体积(Hypervolume,HV),因此 BAX 的停止判据看的是网络本身:当预测前沿相对 50 轮之前不再漂移时就停下。对 BAX 来说这一点出现在大约 25,000 次模拟处。我们之后继续跑了下去,事后看这个停止点与真实超体积走平的位置是一致的。NSGA-II 达到同一超体积用了大约 1,100 万次模拟。

超体积随模拟次数(千次,对数坐标)的变化。蓝色实线的 BAX 曲线升到平台,星号在 25k 处。蓝色虚线加上了 20 组设置的最后核验,直接跳到同一水平,星号在 265k 处。橙色的 NSGA-II 曲线缓慢爬升,在 11M 处的星号到达同一条点线水平。每种方法两条细线是两次运行,粗线是平均。
超体积随跟踪模拟次数的变化(对数坐标),蓝色为 BAX(虚线计入了最后的核验),橙色为 NSGA-II,每种方法两次运行为细线,平均为粗线。

页首两个倍数之间的差距就是最后的核验。BAX 的模拟只有十分之一发生在循环内部,其余都花在跟踪选中设置的完整存活图上,部分原因是四个旋钮的搜索本身太容易。若问题更难,核验所占的份额就会缩小。

网络学到了什么

两行各三张 DA 图,x 对 y,每张是一扇由出发点组成的射线,按存活圈数着色,橙色为边界。上排是 Pareto 前沿上的一组设置:初始预测的边界很小,最终预测大得多且接近真实图。下排是远离前沿的一组差设置:初始与最终预测几乎一样,真实图与两者都不同。
前沿上的一组设置(上)与远离前沿的一组差设置(下),网络在预训练后和结束时给出的 DA 图,以及跟踪出来的真实图。

对于前沿上的设置,网络最初给出的边界小了很多,到结束时形状已经与真实图相当接近。对于差的设置,网络几乎没有变化,这是由于模型一旦判定某个区域没有希望,BAX 就不再往那里采样。运行结束后网络本身也保留了下来:它能画出任意一组六极铁设置的 DA 图和 MA 图,可以手动转动旋钮,看孔径怎样变化。

mpBAX

后来我把这类循环整理成了一个通用的软件包 mpBAX。一次完整的实验由一份配置描述,可以是一个 Python 字典或一个 YAML 文件,每个目标各有自己的 oracle(即真正的模拟器)和模型。每一轮循环都存断点,因此一次运行可以从断点继续,也可以回退。它的核心只依赖 NumPy 和 PyYAML。

让智能体来改优化器

2026 年我们让大语言模型(Large Language Model,LLM)智能体(agent)直接修改这个优化器。用的框架是 LBNL 的 autoresearch-commissioning(由文章的合作者之一 T. Hellert 写成),我们组是 LBNL 之外第一个用它的组。每一次实验里,一个智能体对训练脚本提出一处改动,另一个独立的审查智能体读它的 diff。改动在固定的跟踪预算下运行,只有当留出的误差种子上跟踪出的真实超体积上升时才会合并。我们用这种方式做了几百次实验。

最能说明问题的一次测试用的是一个更严格的基准:哪些设置被打分,由一个智能体碰不到的搜索决定。代理模型一开始被削成只有一个线性层,得分接近零,而一个验证过的三层多层感知机(MLP)可以回到 10.80。第一次试运行里,第 1 个实验就发现了欠拟合,重建了三层 MLP,得分正好落在这个数上,之后的 39 个实验没有一个超过它。第二次试运行在第 7 个实验就越过了这个数,达到 11.40。起作用的改动是一个由粗到细的掩码(mask):代理模型还不准确时掩码放宽,之后再收紧。

更严格的基准上第二次试运行中每个实验的超体积。起点为零,此时代理模型被削成一个线性层。四个被采纳的实验把迄今最好值逐步推到 7.10,9.28,9.87,并在第 7 个实验推到 11.40,高于验证过的三层 MLP 的 10.80。八个被拒绝的实验得分在 6 到 10 之间,第 4 个实验失败。 0510 1713实验序号 超体积 三层 MLP,10.80 起点:一个线性层 11.40
第二次试运行里的每一次实验,采纳的用强调色标出,迄今最好的值画成阶梯线。

这些超体积来自另一个基准,它的预算更小,打分方式也不同,因此不能与文章里的图相比较。这个严格版本到目前为止只做过两次试运行。

文章已被 Physical Review Accelerators and Beams 作为 Letter 接收(2026 年),doi:10.1103/4t6l-7jmg,arXiv:2511.17850。数字与图出自文章及其补充材料,autoresearch 的数字出自我们内部的实验回顾。