首頁 > AI資訊 > 最新資訊 > 使用GAN進(jìn)行異常檢測

使用GAN進(jìn)行異常檢測

新火種    2023-12-19

自從基于Stable Diffusion的生成模型大火以后,基于GAN的研究越來越少了,但是這并不能說明他就沒有用了。異常檢測是多個研究領(lǐng)域面臨的重要問題,包括金融、醫(yī)療保健和網(wǎng)絡(luò)安全。檢測和正確分類未見的異常是一個具有挑戰(zhàn)性的問題,多年來已經(jīng)以許多不同的方式解決了這個問題。而今天我們要介紹一種基于GAN的異常檢測方法,GAN是一種深度學(xué)習(xí)模型,可以學(xué)習(xí)生成與給定數(shù)據(jù)集相似的真實(shí)數(shù)據(jù)樣本。GAN的這一特性表明它們可以成功地用于異常檢測,以前的基于GAN的生成模型都是使用GAN的生成器,而異常檢測則是需要使用GAN的鑒別器。

GAN簡介

生成對抗網(wǎng)絡(luò)(GANs)是一類用于無監(jiān)督機(jī)器學(xué)習(xí)的人工智能算法。它們是由Ian Goodfellow和他的同事在2014年推出的。GANs由生成器和鑒別器兩個神經(jīng)網(wǎng)絡(luò)組成,它們通過對抗性訓(xùn)練同時進(jìn)行訓(xùn)練。

生成器:GAN的這一部分負(fù)責(zé)生成新的數(shù)據(jù)實(shí)例。它將隨機(jī)噪聲作為輸入,并將其轉(zhuǎn)換成理想情況下與真實(shí)數(shù)據(jù)無法區(qū)分的數(shù)據(jù)。

鑒別器:GAN的這一部分充當(dāng)分類器。它被訓(xùn)練來區(qū)分真實(shí)數(shù)據(jù)和由生成器生成的合成數(shù)據(jù)。

生成器旨在生成合成數(shù)據(jù),這些數(shù)據(jù)非常令人信服,以至于判別器無法區(qū)分真實(shí)數(shù)據(jù)和生成數(shù)據(jù)。而鑒別器同時經(jīng)過訓(xùn)練,變得更善于區(qū)分真實(shí)數(shù)據(jù)和生成數(shù)據(jù)。

訓(xùn)練的目標(biāo)是生成器創(chuàng)建的數(shù)據(jù)越來越真實(shí),而鑒別器在區(qū)分差異方面變得更加熟練。這種對抗過程會一直持續(xù)下去,直到生成器生成的數(shù)據(jù)基本上與真實(shí)數(shù)據(jù)無法區(qū)分。

當(dāng)生成器生成高度真實(shí)的數(shù)據(jù),而鑒別器無法可靠地將其與真實(shí)數(shù)據(jù)區(qū)分開來時,平衡點(diǎn)代表GAN的成功訓(xùn)練。

將GAN用于異常檢測

生成對抗網(wǎng)絡(luò)(GANs)可以通過訓(xùn)練它們生成正常或典型的數(shù)據(jù)分布來用于異常檢測。

對于生成模型,我們一般使用GAN的方法是,使用GAN的生成器來學(xué)習(xí)普通數(shù)據(jù)的底層模式,并通過鑒別器來對其進(jìn)行強(qiáng)化訓(xùn)練,最后得到一個非常強(qiáng)大的生成器模型

而對于異常檢測來說,我們使用GAN的生成器組件來學(xué)習(xí)普通數(shù)據(jù)的底層模式,用來生成類似于正態(tài)分布的合成數(shù)據(jù)樣本,然后得到一個強(qiáng)大的鑒別器(分類模型),這個模型就可以作為我們異常檢測的模型來進(jìn)行使用。

以下是GAN用于異常檢測的步驟概述:

1、正常數(shù)據(jù)訓(xùn)練:

使用數(shù)據(jù)的正常或典型實(shí)例(例如,正常圖像,正常傳感器讀數(shù)等)的數(shù)據(jù)集來訓(xùn)練GAN。生成器學(xué)習(xí)生成模擬正常數(shù)據(jù)分布的合成樣本,鑒別器被訓(xùn)練以區(qū)分真實(shí)數(shù)據(jù)和合成數(shù)據(jù)。

2、合成數(shù)據(jù)的生成:

使用訓(xùn)練好的生成器生成一組合成數(shù)據(jù)樣本。這些合成樣本應(yīng)該與訓(xùn)練數(shù)據(jù)中的正常實(shí)例相似,但是我們不需要這個部分的模型。

3、異常檢測:

將GAN生成的合成數(shù)據(jù)與原始正常數(shù)據(jù)相結(jié)合。使用傳統(tǒng)的異常檢測技術(shù)或簡單的閾值方法來識別明顯偏離預(yù)期分布的實(shí)例。與真實(shí)數(shù)據(jù)和合成數(shù)據(jù)都不相似的實(shí)例被認(rèn)為是潛在的異常。(這是一種簡單方法)

4、鑒別器作為異常檢測器:

鑒別器重新用作異常檢測器。在異常檢測階段將其應(yīng)用于真實(shí)數(shù)據(jù)和合成數(shù)據(jù)。鑒別器分類為真實(shí)的實(shí)例可能被認(rèn)為是正常的,而分類為合成的實(shí)例可能被標(biāo)記為潛在的異常。(這是單獨(dú)使用鑒別器進(jìn)行異常檢測的方法)

代碼示例

構(gòu)建一個完整的生成對抗網(wǎng)絡(luò)(GAN)包括幾個組成部分,包括定義生成器和鑒別器架構(gòu),指定損失函數(shù)和設(shè)置訓(xùn)練循環(huán)。下面是一個使用Pytorch進(jìn)行構(gòu)建的簡單實(shí)例

import torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils.data import DataLoader, TensorDatasetimport numpy as npimport matplotlib.pyplot as plt# Define the generator modelclass Generator(nn.Module):def __init__(self, latent_dim):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(latent_dim, 256),nn.ReLU(),nn.BatchNorm1d(256),nn.Linear(256, 512),nn.ReLU(),nn.BatchNorm1d(512),nn.Linear(512, 784),nn.Sigmoid(),nn.Unflatten(1, (28, 28, 1)))def forward(self, x):return self.model(x)# Define the discriminator modelclass Discriminator(nn.Module):def __init__(self, img_shape):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Flatten(),nn.Linear(np.prod(img_shape), 512),nn.ReLU(),nn.Linear(512, 256),nn.ReLU(),nn.Linear(256, 1),nn.Sigmoid())def forward(self, x):return self.model(x)# Define the GAN modelclass GAN(nn.Module):def __init__(self, generator, discriminator):super(GAN, self).__init__()self.generator = generatorself.discriminator = discriminatordef forward(self, x):x = self.generator(x)x = self.discriminator(x)return x# Function to compile modelsdef compile_models(generator, discriminator, gan, latent_dim):d_optimizer = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))g_optimizer = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))criterion = nn.BCELoss()discriminator.compile(optimizer=d_optimizer, loss=criterion)gan.compile(optimizer=g_optimizer, loss=criterion)# Function to generate random noise for the generatordef generate_latent_points(latent_dim, batch_size):return torch.randn(batch_size, latent_dim)# Function to train the GANdef train_gan(generator, discriminator, gan, dataset, latent_dim, epochs, batch_size):device = torch.device("cuda" if torch.cuda.is_available() else "cpu")generator.to(device)discriminator.to(device)gan.to(device)dataset = torch.tensor(dataset, dtype=torch.float32).to(device)dataloader = DataLoader(TensorDataset(dataset), batch_size=batch_size, shuffle=True)criterion = nn.BCELoss()for epoch in range(epochs):for batch_data in dataloader:real_data = batch_data[0].to(device)batch_size = real_data.size(0)noise = generate_latent_points(latent_dim, batch_size).to(device)generated_data = generator(noise)labels_real = torch.ones((batch_size, 1), dtype=torch.float32).to(device)labels_fake = torch.zeros((batch_size, 1), dtype=torch.float32).to(device)d_loss_real = criterion(discriminator(real_data), labels_real)d_loss_fake = criterion(discriminator(generated_data.detach()), labels_fake)d_loss = 0.5 * (d_loss_real + d_loss_fake)discriminator.zero_grad()d_loss.backward()discriminator_optimizer.step()noise = generate_latent_points(latent_dim, batch_size).to(device)labels_gan = torch.ones((batch_size, 1), dtype=torch.float32).to(device)g_loss = criterion(gan(noise), labels_gan)generator.zero_grad()g_loss.backward()generator_optimizer.step()print(f"Epoch {epoch + 1}/{epochs}, Batch {batch}/{len(dataloader)}, D Loss: {d_loss.item()}, G Loss: {g_loss.item()}")# Function to generate and plot synthetic datadef generate_and_plot(generator, latent_dim, examples=10):generator.eval()noise = generate_latent_points(latent_dim, examples)generated_data = generator(noise).detach().cpu().numpy()for i in range(examples):plt.subplot(2, 5, i + 1)plt.imshow(generated_data[i, 0, :, :], cmap='gray_r')plt.axis('off')plt.show()# Example usagelatent_dim = 100img_shape = (28, 28, 1)# Build and compile the modelsgenerator = Generator(latent_dim)discriminator = Discriminator(img_shape)gan = GAN(generator, discriminator)compile_models(generator, discriminator, gan, latent_dim)# Load and preprocess your dataset (e.g., MNIST)(train_images, _), (_, _) = tf.keras.datasets.mnist.load_data()train_images = train_images / 127.5 - 1.0 # Normalize images to the range [-1, 1]train_images = np.expand_dims(train_images, axis=-1)# Train the GANtrain_gan(generator, discriminator, gan, train_images, latent_dim, epochs=100, batch_size=64)# Generate and plot synthetic datagenerate_and_plot(generator, latent_dim)

以上實(shí)例基于MNIST數(shù)據(jù)集

基于GAN異常檢測的研究進(jìn)展

雖然GAN在生成領(lǐng)域沒有那么大放異彩,但是在其他領(lǐng)域還是有很多人在研究

https://www.sciencedirect.com/science/article/abs/pii/S0925231221019482

綜述了gan在異常檢測中的應(yīng)用。作者討論了gan在異常檢測中的優(yōu)點(diǎn)和局限性,并對該領(lǐng)域的最新研究進(jìn)行了概述。他們還指出了該領(lǐng)域研究的挑戰(zhàn)和未來方向。

https://www.researchgate.net/publication/362320139_Anomaly_detection_methods_based_on_GAN_a_survey

這個調(diào)查

https://asp-eurasipjournals.springeropen.com/articles/10.1186/s13634-022-00943-7

這篇論文提出了一種結(jié)合USAD生成對抗訓(xùn)練架構(gòu)和卷積自編碼器(CAE)的檢測模型,通過生成對抗訓(xùn)練的正態(tài)數(shù)據(jù)分布和提高從數(shù)據(jù)中提取特征的能力來增強(qiáng)對抗訓(xùn)練過程中的穩(wěn)定性。作者在幾個基準(zhǔn)數(shù)據(jù)集上證明了他們提出的模型優(yōu)于現(xiàn)有方法。

https://arxiv.org/pdf/2310.00335.pdf

將gan應(yīng)用于發(fā)電廠的異常檢測。作者使用不同的增強(qiáng)技術(shù),如自編碼器和主成分分析來提高gan在異常檢測方面的性能。

https://www.mdpi.com/1424-8220/23/1/355

提出了一種新的基于注意力特征融合的編碼器-解碼器GAN模塊,用于GAN工業(yè)圖像的異常檢測。作者在幾個基準(zhǔn)數(shù)據(jù)集上證明了他們提出的方法優(yōu)于現(xiàn)有方法。

https://ieeexplore.ieee.org/document/10043696

探討了在生物醫(yī)學(xué)成像中使用gan進(jìn)行異常檢測。作者介紹了使用gan進(jìn)行異常檢測的概述,并研究了最先進(jìn)的基于gan的生物醫(yī)學(xué)成像異常檢測方法。他們證明了基于gan的方法在幾個基準(zhǔn)數(shù)據(jù)集上優(yōu)于傳統(tǒng)方法。

總結(jié)

可以看到GAN的研究還在繼續(xù),并且GAN的問題也還存在:

確保生成器和鑒別器之間的良好平衡是至關(guān)重要的。如果生成器太弱,它可能無法準(zhǔn)確捕獲正態(tài)數(shù)據(jù)分布。如果它太強(qiáng),它可能無法產(chǎn)生不同的合成樣本。

將GAN應(yīng)用于異常檢測可能是一種強(qiáng)大的方法,特別是在標(biāo)記異常數(shù)據(jù)稀缺的情況下,因?yàn)镚AN可以學(xué)習(xí)表示正態(tài)數(shù)據(jù)分布,而無需顯式標(biāo)記異常。但是訓(xùn)練階段必須仔細(xì)進(jìn)行,訓(xùn)練數(shù)據(jù)質(zhì)量對結(jié)果至關(guān)重要,GAN已經(jīng)在各種數(shù)據(jù)上表現(xiàn)出優(yōu)于傳統(tǒng)的異常檢測的表現(xiàn),我們期待他有更好的發(fā)展吧。

Tags:
相關(guān)推薦
免責(zé)聲明
本文所包含的觀點(diǎn)僅代表作者個人看法,不代表新火種的觀點(diǎn)。在新火種上獲取的所有信息均不應(yīng)被視為投資建議。新火種對本文可能提及或鏈接的任何項(xiàng)目不表示認(rèn)可。 交易和投資涉及高風(fēng)險,讀者在采取與本文內(nèi)容相關(guān)的任何行動之前,請務(wù)必進(jìn)行充分的盡職調(diào)查。最終的決策應(yīng)該基于您自己的獨(dú)立判斷。新火種不對因依賴本文觀點(diǎn)而產(chǎn)生的任何金錢損失負(fù)任何責(zé)任。

熱門文章