EN

CoAD

不用标签的异常检测方法,只认两路输入同时触发的符合事件,在 LCLS 的微波站故障上 F1 达到 0.86。

在 LCLS 上最常出问题的部件是微波站(RF station),也就是给电子束加速的那些站。一个微波站的状态一变,电子能量就跟着变,X 射线的光子能量也随之改变,有时供光会就此中断。因此每当某个微波站出现异常,都需要知道它有没有传到束流上。组里在此之前已经为这个问题手工设计了检测器(PRAB 2022,我不是那篇文章的作者),它们是有效的,但设计和检查都要花大量人工,而且需要标签,带标签的故障样本又很少。符合学习异常检测(coincident learning for anomaly detection,CoAD)既不需要手工设计的检测器,也不需要标签。方法,证明和文章的写作都是 Ryan Humble 的(他当时在 Stanford)。我做的是把 CoAD 与其他方法做比较,把它用到 LCLS 的微波站与束流位置探测器(Beam Position Monitor,BPM)数据以及 MNIST 上,顺带整理了它的 API。因此我是这篇文章五位作者中的第二作者。

两路输入的符合

假设对同一个事件有两组测量。在 LCLS 上,一组是微波站自己的信号(记作 s),另一组是能看到电子能量的 BPM 读数(记作 q)。正常运行时这两路信号的起伏互不相关,而一次真正的故障会同时出现在两路里。于是给每一路输入各配一个检测器,只有两个检测器同时触发时才算一次事件。

两张散点图,横轴为 0 到 30 的事件编号,纵轴为数据值,一张是输入 s,一张是输入 q,各有一条蓝色虚线阈值。大多数点在阈值之下。四个事件在两张图里都越过阈值,画成红星;三个事件只在一张图里越过阈值,画成黑星。
只在一路里越过阈值的事件(黑星)不计,两路都越过阈值的事件(红星)才是联合事件。

联合事件里有一部分是误报,没有标签就无法直接数出来。能做的是取 q 检测器判为正常的那些事件,看 s 检测器在其中触发的频率有多高,再反过来做一次,两者相乘就得到下面的量。

D=𝔼[ps|¬pq]𝔼[pq|¬ps]

其中 ps 与 pq 为两个检测器对每个事件的判定,¬pq 表示 q 检测器把该事件判为正常,方括号内取的是条件期望,即上一段所说的频率。

只要在已知事件是否为故障的条件下两路输入相互独立,并且两个检测器都不比随机猜测差,这个乘积 D 就只会高估误报的数目。把它放到通常的 F 分数里误报所在的位置,得到的评分就不需要标签,而且永远不会高于真实的分数。

Fˆβ=(1+β2)(J−D)J+αβ2

其中 J 为两个检测器同时触发的事件所占的比例,α 为数据中异常的占比,β 为精确率与召回率之间的权重。

α 只以与 β2 相乘的形式出现,因此异常占比猜错了,效果只相当于换了一个 β。异常必须是少数类,训练时会把检测器约束在这个条件下。文章用这个评分做两件事:对于已有的两个检测器,用它选阈值;或者把它作为损失函数,从头训练两个小网络,每路输入各一个,同时由它决定何时停止训练以及保留哪一次运行。

合成数据上的精确率对召回率曲线。三条曲线:带叉的绿色虚线是不用标签的估计,AUC 0.65,在其余两条之下,终止在召回率 0.87 附近;带点的绿色实线是不用标签选阈值再用标签打分的结果,AUC 0.78;灰色点划线是全监督的结果,AUC 0.78,几乎与绿色实线重合。
在一组按假设构造的合成数据上,不用标签选阈值再用标签打分的曲线(绿色实线)与全监督的曲线(灰色)重合,不用标签的估计(绿色虚线)在它们下方。

一个微波站与七个 BPM

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

LCLS 的十二幅时间序列面板,分两块。上面一块是正常样本:左边三条微波站的信号,取最后 50 秒,大体平直;右边是对应的七个 BPM 读数,取最后 8 秒;第三个样本里 BPM 读数在负 7 秒附近跳变,而微波站信号只在负 5 秒附近有一个小的下陷。下面一块是异常样本:每条微波站信号在末尾向下出现台阶,BPM 读数在最后几秒剧烈摆动。
上面三个是没有触发的事件,下面三个是触发的事件,左边为微波站信号,右边为七个 BPM;上面第三个事件里 BPM 先于微波站变化,时间上太早,不会是这个站造成的。

按人工标签算 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 时,这一对就判为异常。

β 是真正要选的那个量,它决定一类异常能带多少噪声而仍然被当作异常。β=0.05 时只检出干净的 1(其中的 96.3%),没有任何误报;β 提高到 1 时 2 也被检出,3 仍然留在正常一侧,0 里出现了 0.5% 的误报;β 一直推到 ∞ 时 3 也被检出,而误报并没有再增加。

并排三张小提琴图,分别对应 β 等于 0.05,1 和无穷大。每张按数字 0 到 3 分行,左边绿色为正常区,右边粉色为异常区,中间一条红色虚线。0.05 时只有数字 1 在异常一侧;1 时数字 1 和 2 在异常一侧,3 仍在正常一侧;无穷大时 1,2,3 都在异常一侧,而数字 0 在三张图里都保持正常。
β=0.05,1 和 ∞ 时两个网络输出的乘积按数字分组的分布,红线右侧为判为异常的部分。

铣削数据

文章还在 UC Berkeley 的一组公开数据上试了这个方法,数据是大约 170 次金属铣削。声学与振动传感器的信号送给一个网络,交流与直流电流送给另一个。标签由刀具磨损给出:每四分之一秒一段,后刀面磨损小于 0.2 mm 的段算健康,超过 0.7 mm 的段算失效。CoAD 的 F1 高于变分自编码器(VAE),DGHL 和 OmniAnomaly(它们都在 0.8 左右),而且把每一段失效的切削都找了出来。与 VAE 不同,它不需要只用健康的切削来训练。

这组数据违反了它的一个假设。数据里磨损的段数多于健康的段数,而 CoAD 要求异常是少数类,于是标签翻转了过来,它学到的就成了最健康的那些切削,把它们当作区别于其余的一类。

磨损那张图是我最喜欢的。网络从未见过磨损量和切削参数,然而在同一组切削参数下,评分从正常到异常的转变发生在很窄的一段磨损范围内,铸铁和钢转变的位置又不相同。把八组切削参数合在一起看,评分与磨损的关系就弱得多,这说明单凭磨损量定的标签太粗糙了。

CoAD 的异常评分(0 到 1)随后刀面磨损(0 到约 1.5 mm)变化的散点图,蓝色为铸铁,红色为钢,各带一条 sigmoid 拟合的虚线。铸铁的点在磨损 0.3 mm 附近从 0 升到 1,钢在 0.5 mm 附近;0.6 mm 以上全部为 1。
同一组切削参数下 CoAD 的评分随后刀面磨损(mm)的变化,蓝色为铸铁,红色为钢,虚线为 sigmoid 拟合。

局限与后续

这里的一切都是离线做的,用的是存档数据。在 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 年)。