Monitoring of a Dynamic System Based on Autoencoders

这篇论文主要解决的是工业设备的异常检测问题。工业设备的异常检测主要面临2个问题:一是,模型需要具有 实时性,能够适应工业设备和生产环境的突然变化;二是,模型需要能够适应工业设备的 长期演化

为了解决上述2个问题,该论文提出了基于自编码器(LSTM-Autoencoder)的二阶(two-level)模型,使用ISO-20816标准定义的阈值来诊断异常,损失函数中加入了正则化项以提高模型的泛化性,超参数使用了贝叶斯优化的方法进行了调优。

Introduction

在该论文中作者主要关注的是涡轮压缩机的振动控制问题,涡轮压缩机的振动控制(vibration control)一直以来都是一个难以解决的问题,转子不平衡、轴快速制动、机械故障(如叶片破裂)、转子永久变形是造成转子振动的4个主要原因,这些振动又会进一步加速转子的老化。下图是论文中所使用的涡轮压缩机示意图,10个传感器用来持续地监控涡轮压缩机的运动。

涡轮压缩机示意图
在ISO20816标准中,涡轮压缩机的振动分为4个等级,分别是Not allowed red Limit(18mm/S RMS 以上)、Threshold Limit(7.1至18mm/S RMS)、Average Threshold(2.8至7mm/S RMS)、Good Threshold(2.8mm/S RMS以下),这些阈值在本论文中作为异常检测的阈值。

Proposed Approach

设M个传感器被用来监控涡轮压缩机的实时状态,每个传感器 m i m_i mi生成一段时间序列 ( x 1 i , x 2 i …   ) (x^i_1, x^i_2 \dots) (x1i,x2i)。每个传感器 m i m_i mi都对应一个LSTM-Autoencoder模型 A E i AE_i AEi

编码器的结构是一个LSTM单元,它接受一批或者一段时间序列作为输入,然后更新隐状态,即 h t = L S T M ( h t − 1 , x t ) h_t = LSTM(h_{t - 1}, x_t) ht=LSTM(ht1,xt),在时间序列的最后一步(记为 t 2 t_2 t2),LSTM生成的细胞状态包含了之前序列的全部信息,即 c m i = L S T M ( h t 2 − 1 , x t 2 ) c_{m_i} = LSTM(h_{t_2 - 1}, x_{t_2}) cmi=LSTM(ht21,xt2),该隐状态在机器翻译里也被称作上下文向量(context vectors),解码器通过上下文向量来重构编码器的输入。

编码器
解码器和编码器一样,也是一个LSTM单元,但是,在解码的时候论文里采用了teacher-forcing模式,也就是每一步的输入是上一步的预测或者是上一步的标签,解码器更新隐状态可描述为 h t = L S T M ( h t − 1 , y t − 1 , c m i ) h_t = LSTM(h_{t - 1}, y_{t - 1}, c_{m_i}) ht=LSTM(ht1,yt1,cmi),记传感器 m i m_i mi生成的时间序列为 x i = ( x t 1 i , … , x t 2 i ) x_i=(x^i_{t_1}, \dots, x^i_{t_2}) xi=(xt1i,,xt2i),对应自编码器输出的预测时间序列为 y i = ( y t 1 i , … , y t 2 i ) y_i=(y^i_{t_1}, \dots, y^i_{t_2}) yi=(yt1i,,yt2i),那么损失函数定义为二者的MSE,即 M S E ( x i , y i ) = 1 t 2 − t 1 ∑ t = t 1 t 2 ( x t i − y t i ) 2 MSE(x_i, y_i) = \frac{1}{t_2 - t_1}\sum^{t_2}_{t=t_1}(x^i_t - y^i_t)^2 MSE(xi,yi)=t2t11t=t1t2(xtiyti)2

在该论文中,模型既需要有足够的敏感度来恢复原始信号,也需要保证模型具有一定的泛化性,但实际上Autoencoder里的神经元大部分处于未激活状态,所以,为了探索更多的隐空间表征,作者加入了正则化项。具体而言,记输入 x ( i ) x^{(i)} x(i)经过隐含层单元以及激活函数后得到的值为 a j ( x ( i ) ) a_j(x^{(i)}) aj(x(i)),那么该隐含层单元的平均激活值为 ρ j ^ = 1 m ∑ i = 1 m [ a j ( x ( i ) ) ] \hat{\rho_j} = \frac{1}{m}\sum^m_{i=1}[a_j(x^{(i)})] ρj^=m1i=1m[aj(x(i))]。我们期望每个隐含层单元的激活值都接近于我们预设的稀疏参数 ρ \rho ρ,于是,我们可以借助KL散度来衡量偏离的程度,即 ∑ j = 1 n h u K L ( ρ ∣ ∣ ρ j ^ ) = ∑ j = 1 n h u ρ l o g ρ ρ j ^ + ( 1 − ρ ) l o g 1 − ρ 1 − ρ j ^ \sum^{n_{hu}}_{j=1}KL(\rho||\hat{\rho_j}) = \sum^{n_{hu}}_{j=1}\rho log\frac{\rho}{\hat{\rho_j}} + (1 - \rho) log\frac{1 - \rho}{1 - \hat{\rho_j}} j=1nhuKL(ρρj^)=j=1nhuρlogρj^ρ+(1ρ)log1ρj^1ρ它可以看作2个伯努利分布之间的KL散度。将正则化损失与重构损失结合,就得到了整体的损失函数 J s p a r s e = J + λ ∑ j = 1 n h u K L ( ρ ∣ ∣ ρ j ^ ) J_{sparse} = J + \lambda\sum^{n_{hu}}_{j=1}KL(\rho||\hat{\rho_j}) Jsparse=J+λj=1nhuKL(ρρj^)但是,我在作者开源的代码里并没有找到上文提到的稀疏正则化处理,损失函数也只是普通的MSE。

def train(model,
          dataset,
          temperature=0.2,
          weight_decay=0.1,
          learning_rate=0.1,
          sparsity=0.05,
          sparsity_penalty=0.5,
          n_epochs=1,
          test_dataset=None):
    criterion = torch.nn.MSELoss()
    optimizer = torch.optim.Adam(
        model.parameters(), lr=learning_rate, weight_decay=weight_decay)

    train_losses = []
    test_losses = []
    for i in range(n_epochs):
        print('I: [train]@epoch {:3}'.format(i))
        config.epoch_idx = i
        train_loss = train_epoch(model, dataset, criterion, optimizer)
        train_losses.append(train_loss)
        if test_dataset is not None:
            test_loss = test(model, test_dataset, criterion)
            test_losses.append(test_loss)
    return np.array(train_losses), np.array(test_losses)

利用Introduction里提到的阈值,将系统和模型之间的差距超过阈值的定义为异常。同时为了减少系统突变对模型告警的影响,该论文在原本的阈值上加入了一个容忍度 ϵ ( t ) \epsilon(t) ϵ(t),它是前2个采样点之间二阶差分的绝对值,即 ∣ x i ( t ) − y i ( t ) ∣ < θ + ϵ ( t ) ϵ ( t ) = α ∣ x i ( t ) + x i ( t − 2 ) − 2 x i ( t − 1 ) ∣ |x_i(t) - y_i(t)| < \theta + \epsilon(t) \\ \epsilon(t) = \alpha|x_i(t) + x_i(t - 2) -2x_i(t - 1)| xi(t)yi(t)<θ+ϵ(t)ϵ(t)=αxi(t)+xi(t2)2xi(t1)

最后,由于系统状态是持续变化的(例如,零件的老化),所以模型需要适应这种持续的演化,为此,该论文提出了一种二阶模型,其基本思路是:首先在标准数据上训练模型,然后用训练好的模型监控系统的状态,在监控过程中未超过阈值的数据被收集起来用作新的训练集,模型继续拟合新的训练数据,使用贝叶斯优化调整超参数。

持续学习

Experiment

该论文的实验设计部分,我认为还比较有意思,实验验证了摘要中提到的实时性和捕捉系统持续变化的能力。

论文使用的实验装置在Introduction中已经有介绍,数据来自10个传感器,每个传感器的采样频率是1Hz,对于每个传感器生成的时间序列,作者还按照固定的时间窗口进行切片,相邻的切片之间有一部分重叠。

下图(b)是使用t-SNE对隐空间表征进行降维后的结果,颜色的深浅表示时间的先后,从图中确实可以看出二阶的自编码器能够捕捉到系统的持续变化。

实验一
在摘要中作者提到,模型不仅要能够捕捉系统的演变,还需要具有实时性,下图的实验就是为了验证系统的实时性,从图中可以看出当系统发生突变时,模型能够在较短的延迟内跟进系统的突变,从而证明该模型具有实时性。实时性是由公式(7)中的阈值和容忍项所共同决定的。

实验二
最后一个实验,作者使用fANOVA对影响模型表现的超参数进行了比较,发现LSTM隐含层数以及teacher-forcing的随机参数对模型的影响较大。更进一步,作者发现隐含层维度超过输入数据的维度时能够取得更加好的重构效果。

实验三
参考文献:
[1] Osmani, A., Hamidi, M. and Bouhouche, S., 2019, August. Monitoring of a Dynamic System Based on Autoencoders. In IJCAI (pp. 1836-1843).
[2] Ng, A., 2011. Sparse autoencoder. CS294A Lecture notes, 72(2011), pp.1-19.

猜你喜欢

转载自blog.csdn.net/ReWeigh/article/details/109279319