关于“基于自编码器的异常检测算法”的一些想法

最近在看自编码器相关的文章,我对这种算法的原理产生了极大的疑惑,为什么选择loss作为判断异常的标准呢?

我想,原作者肯定是这么想的:

1)只输入正常数据,那么模型将只会学习到正常数据的分布。推理时,模型可以很好地重构正常信号,正常信号引起的loss值会很小。

2)模型没有学习到异常数据的分布,也不能够重构异常信号,异常信号引起的loss值会很大。

但实际上,正常数据和异常数据的分布是相近的,只输入正常数据,编码器也会学到异常数据的分布。

因此,我猜测:如果采用一些特定的网络学习一些特定的信号,只训练正常数据,也可以重构异常信号,异常信号和正常信号的loss没区别。此时,使用自编码器进行异常检测是必然失效的。

一、实验

恰好,我手头上有一些正常电机和故障电机的振动频谱数据,这个故障类型是未知的(我猜测可能是定转子或轴承故障),正好拿来做训练,以验证我们的想法。

首先,我搭建了一个全连接层网络,损失函数是mse,没有激活函数。如下所示,正常数据和异常数据的loss差距很明显。

然后,我搭建了一个全卷积层的网络,这个网络没有pool、BN,损失函数是mse。如此构建网络的原因很简单:1)pool层其实是一种滤波,会丢失一些细节,在后续的重构中,也许没办法恢复这些细节。事实上,使用pool层的网络的重构损失确实大于没有使用的。2)加入BN层重构损失也会变大,但为何变大尚不明确。总之,为了确保重构损失够小,这个全卷积网络,仅有卷积层和激活函数。

(a)

(b)

如上所述,可以看到a图的loss相当小,只能放大成b图,而b图的正常数据和异常数据的loss差距很模糊,不明显。

毫无疑问的:全卷积网络无需输入异常数据,也可重构异常信号。但是作为异常检测方法而言,使用全卷积网络是失效的,无法通过loss区别出正常信号与异常信号。

二、结论

那么为何全卷积网络能够重构异常信号?

1)正常信号与异常信号分布相近。学习正常信号分布的同时,也在学习异常信号的分布,所以可以重构异常信号。

2)全卷积网络只考虑局部特征,不考虑全局特征,只会根据邻近的局部特征构造信号。如下所示,如果我给定一个正常信号,比如[1,2,3,4,5...1000],让全卷积层输出一个排序颠倒的正常信号[1000,...,5,4,3,2,1],效果将会非常差,就好像生成颠倒信号的第100个特征时,只会根据正常信号的第110~90个特征来进行构造,而不考虑正常信号的第900、第800...个特征。但让全连接网络构造一个颠倒的信号是没有影响的,因为他考虑了全局特征,会从中选取合适的特征构造信号。因此只用局部特征直接构造信号,摒除了一些其他特征的影响,实际上是简化了任务,模型性能增强,强到异常信号都能重构。

全卷积:训练输入正常信号,输出颠倒的正常信号

全连接:训练输入正常信号,输出颠倒的正常信号

 总之,如果进行频谱信号的异常检测,不建议使用全卷积层,至少要有连接层。

 

 

 

 

 

 

posted @   澳大利亚树袋熊  阅读(229)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示