论文标题丨Practical Approach to Asynchronous Multivariate Time Series Anomaly Detection and Localization
论文来源丨KDD 2021
论文链接丨https://dl.acm.org/doi/10.1145/3447548.3467174
源码链接丨https://github.com/eBay/RANSynCoders

TL;DR

基于 eBay SREs 观测到的异步时间序列场景,论文中提出一种生产环境可用的多变量时间序列异常检测和定位模型 RANSynCoders。主要想法是:首先利用 AutoEncoder 对原始异步时间序列提取特征,然后对序列特征进行傅里叶变换分析,学习到相位差来对齐异步时间序列获得同步的时间序列表示,最后选择同步时间序列的子集序列来训练 AutoEncoder 重构误差来推断和定位异常(majority vote)。实验部分不仅在公开数据集和 eBay 自家数据验证了 RANSynCoders 模型的有效性,还提出了一种更加真实的评价方法。

Algorithm/Model

论文中提到的模型如下所示

模型架构

主要包括以下内容:

  • 原始序列潜在谱密度估计
  • 异步时间序列转为同步表示
  • 时序异常检测和定位

谱密度估计

主要是利用 autoencoder 来提取原始时间序列的特征,对应的重构损失函数为minLq=0.5(Y^,Y)\min \mathscr{L}_{q=0.5}(\hat{Y}, Y) [50th quantile loss]。

然后对于每个单变量序列特征应用 FFT 来得到大小为SS 的频率向量WW ,可以通过对应的正弦波近似表示原始多变量序列YY

异步时间序列对齐

对于II 个特征和TT 个观测点(对应时间戳T~\tilde{T})的多维时间序列,其傅里叶变换后的表达形式如下

yi,ti=[s=0Sαs,isin(ωs(ti+βs,i))]+γi+ϵi,tiy_{i, t_{i}}=\left[\sum_{s=0}^{S} \alpha_{s, i} \sin \left(\omega_{s}\left(t_{i}+\beta_{s, i}\right)\right)\right]+\gamma_{i}+\epsilon_{i, t_{i}}

其中iI,tiT~i\in I, t_{i} \in \tilde{T} 分别表示特征维度索引及其对应的时间戳,yYy\in YωW\omega\in WωW\omega \in W 为对应的频率;α,β,γ\alpha, \beta, \gamma 表示振幅、相位和基;ϵ\epsilon 表示对应的特征噪声。

对于噪声的定义如下

ϵi,ti=αϵ,i,tisin(ω0(ti+βϵ,i,ti))\epsilon_{i, t_{i}}=\alpha_{\epsilon, i, t_{i}} \sin \left(\omega_{0}\left(t_{i}+\beta_{\epsilon, i, t_{i}}\right)\right)

其中ω0\omega_0 表示WW 最大的值,对于原始异步序列

βϵ,i,titi+v04\beta_{\epsilon, i, t_{i}} \approx-t_{i}+\frac{v_{0}}{4}

举🌰说明上述傅里叶变换的结果如下所示

序列示例

需要上述异步时间序列进行对齐,例如参考时间点tˉ\bar{t} 及其异步的相位差βs,i\beta_{s,i}βϵ,i,ti\beta_{\epsilon, i,t_i} ,计算公式如下

βˉi=β0,i+(titˉ)\bar{\beta}_{i}=\beta_{0, i}+\left(t_{i}-\bar{t}\right)

yi,tˉ=[s=0Sαs,isin(ωs(ti+βs,iβˉi))]+γi+ϵi,tˉy_{i, \bar{t}}=\left[\sum_{s=0}^{S} \alpha_{s, i} \sin \left(\omega_{s}\left(t_{i}+\beta_{s, i}-\bar{\beta}_{i}\right)\right)\right]+\gamma_{i}+\epsilon_{i, \bar{t}}

对应的噪声为

ϵi,tˉ=ϵi,tisin(ω0(v04βˉi))\epsilon_{i, \bar{t}}=\epsilon_{i, t_{i}} \sin \left(\omega_{0}\left(\frac{v_{0}}{4}-\bar{\beta}_{i}\right)\right)

举🌰说明对齐后的时间序列结果如下图所示,可以将不同时刻的时间序列同步到一个时间点。此部分不求甚解暂不细述。

同步时间序列

RANCoders

主要是利用 autoencoder 来进行异常检测,但其模型设计上基于两种假设:

  • 输入较小的时间序列子集可以容纳足够的信息,以足够的质量重建整个序列。
  • 对于异常检测,在训练和推理方面,重建输入信号的阈值边界更有效,而不是尝试重建输入,然后进行不可靠的阈值选择过程以进行异常推理。

因此论文中采样时间序列来训练两种类型的 autoencoder:AEnUBA E_{n}^{U B}AEnLBA E_{n}^{L B}(upper bound + lower bound)。

例如对于下界 autoencoder 的损失函数如下

Lq=δ=i=0Imax[δ(y^i,tˉ,nLByi,tˉ),(δ1)(y^i,tˉ,nLByi,tˉ)],nN\mathscr{L}_{q=\delta}=\sum_{i=0}^{I} \max \left[\delta\left(\hat{y}_{i, \bar{t}, n}^{L B}-y_{i, \bar{t}}\right),(\delta-1)\left(\hat{y}_{i, \bar{t}, n}^{L B}-y_{i, \bar{t}}\right)\right], \forall n \in N

其中δ\delta 表示分位数,通常q=1δq=1-\delta

异常检测与定位

对于单变量时间序列的异常检测,逻辑非常简单,即超出基带上下界即为异常:

P(in){0 if y^i,tˉ,nLB<yi,tˉ<y^i,tˉ,nUB,iI,nN1 otherwise P\left(i_{n}\right) \begin{cases}0 & \text { if } \hat{y}_{i, \bar{t}, n}^{L B}<y_{i, \bar{t}}<\hat{y}_{i, \bar{t}, n}^{U B}, \forall i \in I, n \in N \\ 1 & \text { otherwise }\end{cases}

整体判断异常论文中使用的还是 majority voting。

对于异常定位,论文中提到了两种计算方法:

  • Term frequency (TF) analysis,即取每个维度元属性 attr 的对整体的贡献。

    loc( attr )=inP(in attr i)ni attr i\operatorname{loc}(\text { attr })=\frac{\sum_{i} \sum_{n} P\left(i_{n} \mid \text { attr }_{i}\right)}{n \sum_{i} \text { attr }_{i}}

    这种方法类似于多维定位中的想法。

  • 对于元属性未知的情况,直接计算特征维度异常分数。

    loc(i)=inP(in)n\operatorname{loc}(i)=\frac{\sum_{i} \sum_{n} P\left(i_{n}\right)}{n}

    根据异常指标占比排序。

Experiments

实验部分采用了 4 个 baselines 和 4 个 datasets 进行对比。

注:其中F1F1^* 为论文中提出的评价指标,主要是考虑了阈值对算法性能的影响,非完全可靠。

实验结果如下所示:

实验结果

Thoughts

  • 论文整体思路描述的非常清楚,解决了实际中存在的时间序列异步问题。吐槽下符号描述 😣
  • 主要解决的还是异步时间序列对齐的问题,而且方法仅适用于周期性的指标,否则相位检测的对齐方法用处不大。
  • 关注的异常指标定位模块较为简单,主要思路是基于多维属性异常数量贡献分数,貌似缺少故障传播关系。


联系作者