揭示神经网络:用AutoEncoder进行异常检测

2024年12月06日 由 alex 发表 279 0

19


介绍

异常检测是各行各业中的一项关键任务,从金融领域的欺诈检测到制造业的故障检测均有所涉及。随着人工智能的进步,自动编码器神经网络已成为此目的的有力工具。这篇文章旨在揭开自动编码器的神秘面纱,并阐述其在异常检测中的应用,特别是使用Keras和MNIST数据集的示例。


什么是自动编码器?

自动编码器是一种用于无监督学习的神经网络类型。其主要功能是学习输入数据的压缩表示。自动编码器由两个主要部分组成:编码器和解码器。

  • 编码器:这部分网络将输入压缩成潜在空间表示。它将输入数据编码为降低维度后的编码(压缩)表示。
  • 解码器:解码器的目标是从编码表示中重建输入数据。它试图生成一个尽可能接近原始输入的输出。


关键思想是,自动编码器被训练以最小化重建误差,这使它们在学习输入数据分布方面非常高效。


自动编码器在异常检测中的应用

在异常检测的上下文中,自动编码器特别有用。它们被训练在正常数据上,以学习正常状态的表示。在推理过程中,如果输入与这种学习到的表示显著偏离,自动编码器可能会很差地重建它。这种糟糕的重建是异常的信号。


工作原理

  1. 训练:自动编码器仅在正常数据上进行训练。训练过程涉及调整权重以最小化重建误差。
  2. 推理:在推理过程中,我们将新数据输入到自动编码器中。如果数据是正常的,自动编码器将成功地以最小误差重建它。然而,如果数据是异常的,重建误差将显著更高。
  3. 阈值设定:我们为重建误差设定一个阈值。如果误差超过这个阈值,数据点就被标记为异常。


示例——使用MNIST数据集检测异常

以下是一个使用MNIST数据集进行异常检测的示例。在这个示例中,我们将所有10个数字(0-9)视为正常数据。对于异常数据,我们将创建一个不像数字的合成图像。


你可以按照以下步骤操作:

  • 加载并预处理MNIST数据:我们将所有数字视为正常数据。
  • 创建异常数据:生成一个不像数字的合成图像。这可以是随机噪声图像或具有任意形状的图像。
  • 构建并训练自动编码器:自动编码器将在正常的MNIST数据上进行训练。
  • 评估模型:我们将计算正常MNIST数据和合成异常图像的重建损失。预期结果是,异常图像的重建误差将显著高于正常数据。


import numpy as np
import matplotlib.pyplot as plt
import keras
from sklearn.model_selection import train_test_split
# Load the MNIST dataset
(x_train, _), (x_test, _) = keras.datasets.mnist.load_data()
# Normalize and reshape the data
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((-1, 28 * 28))
x_test = x_test.reshape((-1, 28 * 28))
# Create a synthetic anomalous image
anomalous_image = np.random.rand(28 * 28)
# Build the AutoEncoder model
model = keras.Sequential([
    # Encoder: Reduce dimensionality, learn the most important features
    keras.layers.Dense(128, activation='relu', input_shape=(x_train.shape[1],)), # Reducing dimension to 128
    keras.layers.Dense(64, activation='relu'), # Further reducing dimension to 64
    keras.layers.Dense(32, activation='relu'), # Further reducing to the most compact form (bottleneck layer)
    # Decoder: Reconstruct the image from the reduced representation
    keras.layers.Dense(64, activation='relu'), # Start expanding dimension
    keras.layers.Dense(128, activation='relu'), # Continue expanding dimension
    keras.layers.Dense(x_train.shape[1], activation='sigmoid') # Restore to original image size
])
model.compile(optimizer='adam', loss='mse')
# Train the model
history = model.fit(x_train, x_train, epochs=20, batch_size=256, validation_data=(x_test, x_test))
# Function to calculate reconstruction loss
def calculate_reconstruction_loss(data, model):
    reconstructions = model.predict(data)
    reconstruction_errors = np.mean(np.abs(data - reconstructions), axis=1)
    return reconstruction_errors
# Evaluate the model
reconstruction_loss_normal = calculate_reconstruction_loss(x_test, model)
reconstruction_loss_anomalous = calculate_reconstruction_loss(np.array([anomalous_image]), model)
# Print average reconstruction loss
print(f"Average Reconstruction Loss for Normal Data: {np.mean(reconstruction_loss_normal)}")
print(f"Reconstruction Loss for Anomalous Data: {reconstruction_loss_anomalous[0]}")
# Visualization of reconstruction error distribution
plt.figure(figsize=(6, 4))
plt.hist(reconstruction_loss_normal, bins=50, alpha=0.6, color='g', label='Normal')
plt.axvline(x=reconstruction_loss_anomalous[0], color='r', linestyle='dashed', linewidth=2, label='Anomalous')
plt.title('Reconstruction Error Distribution')
plt.xlabel('Reconstruction Error')
plt.ylabel('Frequency')
plt.legend()
plt.show()


输出:


Average Reconstruction Loss for Normal Data: 0.034472864121198654
Reconstruction Loss for Anomalous Data: 0.4479920103051486


20


为什么编码器和解码器中使用多层?

在自动编码器的编码器和解码器部分中使用多层,而不是每个部分只使用单层,具有多方面的优势,特别是在网络学习复杂数据表示的能力方面:

  1. 提高复杂性和非线性:多层允许网络学习更复杂和非线性的数据表示。每一层可以捕捉不同级别的抽象。单层,尤其是在处理像图像这样的高维数据时,可能过于简单,无法有效地捕捉底层结构。
  2. 层次化特征学习:在深层网络中,较低层通常学习识别简单模式,如图像中的边缘,而较深层则结合这些简单模式来识别更复杂的特征。这种层次化的学习过程更强大,并可能导致在重建等任务中表现更好,而重建是自动编码器的核心。
  3. 维度降低:逐步降低维度(而非一次性大幅降低)有助于在各层之间保留重要信息。在单层情况下,如果在一个步骤中过于激进地降低维度,可能会导致信息的大量丢失,使得解码器难以准确重建数据。
  4. 稳健的特征提取:多层可以帮助从数据中提取更稳健和具有区分性的特征。这在异常检测中尤为重要,因为模型需要学习代表正常数据的特征,以便通过更高的重建误差来检测不符合这些学习特征的异常。
  5. 灵活性和微调:多层架构在设计网络时提供了更多的灵活性。它允许通过调整层数和每层中的神经元数量来微调模型的容量。这样,模型可以更好地适应其训练数据集的特定性。


总之,自动编码器中的多层增强了其学习更复杂、层次化数据表示的能力,从而在异常检测等任务中表现更好。然而,平衡模型的复杂性与可用数据和计算资源也很重要,因为过于复杂的模型可能导致过拟合,尤其是在数据有限的情况下。


结论

自动编码器凭借其学习数据表示和重建输入的能力,非常适合用于异常检测任务。通过在正常数据上进行训练并使用重建误差作为信号,自动编码器可以有效地识别新数据中的异常。使用MNIST数据的Keras示例说明了如何在实际场景中实现这一概念。与任何机器学习模型一样,自动编码器在异常检测中的有效性取决于数据质量、模型架构以及正在检测的异常的具体性质等因素。

文章来源:https://medium.com/@weidagang/demystifying-anomaly-detection-with-autoencoder-neural-networks-1e235840d879
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消