在 SPEAR3 储存环上测一次注入效率大约要 17 s。遗传算法或粒子群这类优化算法每一代要测三十个个体,合起来约八分半钟的束流时间,其中相当一部分花在了本来就不会好的设定上。MG-GPO 在候选解的繁殖与机器测量之间插入一个高斯过程(Gaussian Process,GP),多数不佳的候选解在上机前就被筛除。这个方法由 Xiaobiao Huang 提出,第一版 Matlab 代码也出自他手;Minghao Song 与我一同参与开发,环上的实验由我牵头,MLST 2020 那篇文章中 Minghao 与我是共同第一作者。
- 300 到 1,200每一代在环上繁殖出的候选解数目,其中只有三十个被测量
- −1.66 mA/minMG-GPO 达到的束损率目标值,接近这个环在近年研究中达到的最好值
- 0.9 kV第二轮注入实验之后,踢掉一半储存束流所需的冲击磁铁电压
一代的流程
MG-GPO 的种群里有三十个个体,每一代先从这三十个个体繁殖出几百个候选解,繁殖的算子借自粒子群优化(Particle Swarm Optimization,PSO)和 NSGA-II(第二代非支配排序遗传算法)。然后为每个目标函数各建一个 GP,用置信下界(Lower Confidence Bound,LCB)给每个候选解打分。
其中 为 GP 对候选解的预测值, 为这个预测的不确定度, 为不确定度的权重,它决定不确定度在多大程度上算作候选解的优势;所有目标函数都写成越小越好的形式。
之后非支配排序(non-dominated sorting)从中留下三十个送上机器。 每一代乘以一个固定的因子而逐渐减小,因此算法在早期更敢尝试不确定的区域,后期则更相信模型。
通常的贝叶斯优化(Bayesian Optimization,BO)每走一步都要在一个起伏很大的采集函数(acquisition function)上做搜索。MG-GPO 省掉了这一步,GP 只给繁殖出来的候选解排序,在环上这一步通常不到 8 s 就完成了。
每个 GP 对全部旋钮(knob)只用一个长度尺度(length scale),因此要拟合的超参数只有三个。我们当时没有找到合适的 Matlab GP 库,于是拟合由 Python 里的 GPy 完成,经我当时正在写的 Teeport 调用,其余部分都留在 Matlab 里。
测试问题
机器之外的比较取自 Xiaobiao 的方法论文(arXiv:1907.00250,Minghao 与我为共同作者),论文在 30 维 ZDT 问题上比较了 MG-GPO、NSGA-II 与三种粒子群类方法。在 ZDT2 上 MG-GPO 约 1,000 次评估即到达 Pareto 前沿,而次优者需 4,000 次;它并非处处占优,在 ZDT6 上耗费了 3,000 次。

ZDT 函数没有噪声,储存环却有。因此 MLST 文章又在带噪声的 4 维 Rosenbrock 函数上比较了 MG-GPO 与 PSO:MG-GPO 约 600 次评估即接近零,而 PSO 到 1,020 次仍未收敛,把噪声放大十倍对两者均无明显影响。在 SPEAR3 垂直发射度的模拟问题上 MG-GPO 同样更快,只是十次运行的散布比 PSO 略大。
环上的两个评估器
注入效率的评估器(evaluator)先写入十个六极铁家族的设定值,读一次储存流强,注入约 10 s 后再读一次。这段时间内流强每分钟的增量除以增强器送来的电荷量即为得分,单位为任意单位(增强器无束流时除数很大,该点得分很差)。
束损率的评估器大部分时间在等待:若恒流注入(top-off)尚未结束,它轮询至注入停止,再多等几秒,然后间隔一段设定时间读两次储存流强。我们要的是更高的束损率,初看像是反的:高流强下束流损失以 Touschek 散射为主,束流在垂直方向越细,散射损失越重;SPEAR3 只在一处测束团尺寸,而束损率反映整个环。
两个评估器也都在 Teeport 上注册,因此留在控制室里,优化器可在别处运行。我也用 Python 重写了这些测量程序,即 spear3-opt-pkg,它在移动任何六极铁之前先关掉注入。
十三块斜四极铁
垂直发射度的实验在约 500 mA 下移动十三块通电的斜四极铁。MG-GPO 几乎从一开始就领先,一直保持到约 480 次评估;同样条件下的 PSO 改进得更慢,停在了 −1.48 mA/min。

两轮注入实验
动力学孔径(Dynamic Aperture,DA)是指一个粒子离储存束流多远出发仍能在环里转下去。注入束从一侧进来,刚好越过切割磁铁(septum)的切割板,因此孔径越大,被俘获的注入束就越多,而决定孔径的是六极铁。

在那次模拟里 MG-GPO 把孔径从 11.8 mm 开到了 16.5 mm;由于得分在接近全部俘获时就饱和了,PSO 后来也追了上来。
在环上我们调的是注入效率,用它来代表孔径。八个旋钮把六极铁家族混在一起,使色品在一阶上保持不变,且每个家族相较拉平设置(全部聚焦六极铁相等,全部散焦六极铁也相等)偏离不超过 20 A。第一轮从拉平的六极铁出发,此设置下注入很差,因此注入凸轨(kicker bump)保持标准强度。五代之后 MG-GPO 接近 −2.9,同起点的 PSO 到 −2.2(注入效率取负值送入优化器,故越负越好)。

接着我们把问题变难:注入凸轨降到标准的 80%,孔径的作用就更大了,第二轮从第一轮的最优解附近出发。机时不够,因此第二轮只跑了 MG-GPO。凸轨变小后目标值升到了约 −0.5,这一轮又把它拉回到约 −1.4。
我们也直接测了孔径:储存少量束流,逐步加大冲击磁铁(kicker)的电压,记下丢掉一半束流时的电压。拉平的六极铁在 0.76 kV 丢掉一半,第一轮的最优解在 0.8 kV,第二轮的还要更高一些。

几天之后
环上的实验是对该方法的检验,当天的数字很好,但没有维持住。几天之后这些解不再成立,没有一个进入 SPEAR3 的日常运行。解的失效引出了我的下一个方法 RCDS-S:我们怀疑环在漂移,因此新方法必须能应付漂移与噪声,以小步调机,每步都对照事先划好的一条线来检查。
数字出自 Zhang,Song 和 Huang 的 MLST 文章(Mach. Learn.: Sci. Technol. 2, 015014,2020 年 12 月在线发表),Huang,Song 和 Zhang 的 arXiv:1907.00250,以及我们 2021 年给 SSRL 的项目报告。评估器的步骤出自我们的 Matlab 评估器代码。