在 LCLS 上最常出问题的部件是微波站(RF station),也就是给电子束加速的那些站。一个微波站的状态一变,电子能量就跟着变,X 射线的光子能量也随之改变,有时供光会就此中断。因此每当某个微波站出现异常,都需要知道它有没有传到束流上。组里在此之前已经为这个问题手工设计了检测器(PRAB 2022,我不是那篇文章的作者),它们是有效的,但设计和检查都要花大量人工,而且需要标签,带标签的故障样本又很少。符合学习异常检测(coincident learning for anomaly detection,CoAD)既不需要手工设计的检测器,也不需要标签。方法,证明和文章的写作都是 Ryan Humble 的(他当时在 Stanford)。我做的是把 CoAD 与其他方法做比较,把它用到 LCLS 的微波站与束流位置探测器(Beam Position Monitor,BPM)数据以及 MNIST 上,顺带整理了它的 API。因此我是这篇文章五位作者中的第二作者。
- 0.86LCLS 微波站故障上的 F1,两个检测器的训练不用标签
- 0.78合成数据上的 PR 曲线下面积,阈值不用标签选定,与用标签选定的结果相同
- 99.2%以上, 时 MNIST 每一类异常被检出的比例
两路输入的符合
假设对同一个事件有两组测量。在 LCLS 上,一组是微波站自己的信号(记作 ),另一组是能看到电子能量的 BPM 读数(记作 )。正常运行时这两路信号的起伏互不相关,而一次真正的故障会同时出现在两路里。于是给每一路输入各配一个检测器,只有两个检测器同时触发时才算一次事件。

联合事件里有一部分是误报,没有标签就无法直接数出来。能做的是取 检测器判为正常的那些事件,看 检测器在其中触发的频率有多高,再反过来做一次,两者相乘就得到下面的量。
其中 与 为两个检测器对每个事件的判定, 表示 检测器把该事件判为正常,方括号内取的是条件期望,即上一段所说的频率。
只要在已知事件是否为故障的条件下两路输入相互独立,并且两个检测器都不比随机猜测差,这个乘积 就只会高估误报的数目。把它放到通常的 F 分数里误报所在的位置,得到的评分就不需要标签,而且永远不会高于真实的分数。
其中 为两个检测器同时触发的事件所占的比例, 为数据中异常的占比, 为精确率与召回率之间的权重。
只以与 相乘的形式出现,因此异常占比猜错了,效果只相当于换了一个 。异常必须是少数类,训练时会把检测器约束在这个条件下。文章用这个评分做两件事:对于已有的两个检测器,用它选阈值;或者把它作为损失函数,从头训练两个小网络,每路输入各一个,同时由它决定何时停止训练以及保留哪一次运行。

一个微波站与七个 BPM
LCLS 的数据来自 2022 年那项工作。 输入是一个微波站的信号,信号相对变化超过 0.5% 就截出一个时间窗; 输入是机器上色散区(对能量敏感)里七个 BPM 的读数,取每次微波站事件结束前的最后几秒。两个小的一维卷积神经网络(Convolutional Neural Network,CNN)在这些数据上训练,一路输入一个。标签只用来定 ,也就是粗略的异常占比,大约五个事件里有一个。

按人工标签算 F1,各方法的结果如下。
| 方法 | 需要标签 | F1 |
|---|---|---|
| 手工设计的检测器(PRAB 2022) | 是 | 0.90 |
| 有监督网络(PRAB 2022) | 是 | 0.88 |
| OCSVM | 否 | 0.66 |
| DGHL | 否 | 0.64 |
| OmniAnomaly,训练集缩减 | 否 | 0.80 |
| 相关或协方差损失 | 否 | 0.82 |
| CoAD | 否 | 0.86 |
OmniAnomaly 的公开代码在训练时耗尽了 GPU 显存,因此只能用较少的数据训练。表中 CoAD 上面的一行是与它最接近的方法,用的是 CoAD 自己的网络和训练流程,只是把损失函数换成了 DCCA 和 DMCA 的。可以看出,CoAD 超过了其余所有的无监督方法,比手工设计的检测器略低,文章认为这点差距「在人工标签本身的预期误差范围之内」。
MNIST 与 β 的作用
MNIST 是我们知道答案的测试。每个样本是一对图像,一张给一个网络。正常样本是两个 0,异常样本是两个相同的数字,即两个 1,两个 2 或两个 3。标签噪声把一对里的一张图在该数字与 0 之间调换,各类的调换比例不同:1 从不调换,3 的调换比例是 2 的四倍(五张里换一张)。两个网络输出的乘积超过 0.5 时,这一对就判为异常。
是真正要选的那个量,它决定一类异常能带多少噪声而仍然被当作异常。 时只检出干净的 1(其中的 96.3%),没有任何误报; 提高到 1 时 2 也被检出,3 仍然留在正常一侧,0 里出现了 0.5% 的误报; 一直推到 时 3 也被检出,而误报并没有再增加。

铣削数据
文章还在 UC Berkeley 的一组公开数据上试了这个方法,数据是大约 170 次金属铣削。声学与振动传感器的信号送给一个网络,交流与直流电流送给另一个。标签由刀具磨损给出:每四分之一秒一段,后刀面磨损小于 0.2 mm 的段算健康,超过 0.7 mm 的段算失效。CoAD 的 F1 高于变分自编码器(VAE),DGHL 和 OmniAnomaly(它们都在 0.8 左右),而且把每一段失效的切削都找了出来。与 VAE 不同,它不需要只用健康的切削来训练。
这组数据违反了它的一个假设。数据里磨损的段数多于健康的段数,而 CoAD 要求异常是少数类,于是标签翻转了过来,它学到的就成了最健康的那些切削,把它们当作区别于其余的一类。
磨损那张图是我最喜欢的。网络从未见过磨损量和切削参数,然而在同一组切削参数下,评分从正常到异常的转变发生在很窄的一段磨损范围内,铸铁和钢转变的位置又不相同。把八组切削参数合在一起看,评分与磨损的关系就弱得多,这说明单凭磨损量定的标签太粗糙了。

局限与后续
这里的一切都是离线做的,用的是存档数据。在 LCLS 上只做了一个微波站,文章展望的是成千上万个子系统,但没有去试。方法还要求两路输入各自都能看到故障,并不是每个问题都能这样拆开。代码没有公开。组里后来把这个思路用到了 LCLS 的微波相位数据上(Liang 等,PRAB 2025),我是那篇文章十位作者中的一个。
数字和图都出自 Humble,Zhang,O'Shea,Darve 与 Ratner 的文章 "Coincident learning for unsupervised anomaly detection of scientific instruments",Mach. Learn.: Sci. Technol. 5, 035036(2024 年,CC BY 4.0 开放获取),它最早于 2023 年 1 月以 arXiv:2301.11368 发布。LCLS 数据集与两个有监督的对照方法出自 Humble 等,Phys. Rev. Accel. Beams 25, 122804(2022 年)。