AnoGANの概要とアルゴリズム及び実装例

機械学習技術 自然言語技術 人工知能技術 デジタルトランスフォーメーション技術 画像処理技術 強化学習技術 確率的生成モデル 深層学習技術 Python 本ブログのナビ
AnoGANの概要

AnoGAN (Anomaly GAN) は、異常検知のために Generative Adversarial Network (GAN) を活用する手法であり、特に、医療画像や製造業の品質検査などでの異常検知に適用されるものとなる。

AnoGAN は、正常データのみを学習し、異常データの発見に利用する異常検知手法で、従来の GAN (Goodfellow et al., 2014) をベースに、Generator (G) と Discriminator (D) を訓練し、正常データの特徴を捉えた生成モデルを構築している。

動作原理は、以下のようになる。

  • GAN の学習: 正常データのみを用いて GAN を訓練し、Generator\(G\)は正常データの分布を学習。Discriminator\(D\)は本物のデータと生成データを区別するように学習。
  • 異常スコアの計算: 
    1. 入力画像\(x\)に対し、対応する潜在変数\(z*\)を最適化して求める(Latent Space Optimization)。
    2. 最適化した\(z*\)を用いて、Generator から画像を生成\(G(z*))\)。
    3. 入力画像\(x\)と生成画像\(G(z*)\)の違いを異常スコアとして評価。
    4. 異常スコアが高いほど、異常である可能性が高いと判断。

異常スコアは以下の2つの要素で構成されている。

  • 再構成誤差: \(||x-G(z*)||\)入力画像と再生成画像のピクセルレベルの差異。
  • Discriminator の特徴空間での誤差: \(||D(x)-D(G(z*))||\)Discriminator の内部特徴マップの差異。

AnoGANの問題点と改善手法は以下のようなものとなる

  • 問題点
    • 最適な\(z*\)を見つけるための最適化に時間がかかる(推論が遅い)。
    • 完全な異常データを適切に捉えられない場合がある。
  • 改善手法:f-AnoGAN (Fast AnoGAN)
    • 事前に Encoder\(E\)を訓練し、直接\(z*\)を求めることで推論時間を短縮。
    • GAN の学習後に Encoder\(E\)を追加学習し、入力画像から直接潜在ベクトルを推定する。

      AnoGAN のアイデアは、近年の 異常検知×深層学習 の分野において、多くの発展をもたらした重要な手法の一つとなっている。

      実装例

      以下に、AnoGAN のシンプルな実装例(PyTorch ベース)を示す。このコードは、MNIST データセットを使って異常検知を行うシンプルな AnoGAN の実装例となっている。

      1. 必要なライブラリのインストール

      pip install torch torchvision matplotlib numpy tqdm

      2. AnoGAN の実装

      import torch
      import torch.nn as nn
      import torch.optim as optim
      import torchvision
      import torchvision.transforms as transforms
      import numpy as np
      import matplotlib.pyplot as plt
      
      # デバイス設定
      device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
      
      # ハイパーパラメータ
      latent_dim = 100
      image_size = 28*28
      batch_size = 64
      epochs = 50
      lr = 0.0002
      
      # データセット (正常データ: MNIST の「0」のみ使用)
      transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
      mnist = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
      
      normal_data = [data for data in mnist if data[1] == 0]  # 数字「0」のみを抽出
      train_loader = torch.utils.data.DataLoader(normal_data, batch_size=batch_size, shuffle=True)
      
      # **(1) GAN のモデル定義**
      class Generator(nn.Module):
          def __init__(self):
              super(Generator, self).__init__()
              self.model = nn.Sequential(
                  nn.Linear(latent_dim, 128),
                  nn.ReLU(),
                  nn.Linear(128, 256),
                  nn.ReLU(),
                  nn.Linear(256, 512),
                  nn.ReLU(),
                  nn.Linear(512, image_size),
                  nn.Tanh()
              )
      
          def forward(self, z):
              return self.model(z).view(-1, 1, 28, 28)
      
      class Discriminator(nn.Module):
          def __init__(self):
              super(Discriminator, self).__init__()
              self.model = nn.Sequential(
                  nn.Linear(image_size, 512),
                  nn.LeakyReLU(0.2),
                  nn.Linear(512, 256),
                  nn.LeakyReLU(0.2),
                  nn.Linear(256, 128),
                  nn.LeakyReLU(0.2),
                  nn.Linear(128, 1),
                  nn.Sigmoid()
              )
      
          def forward(self, x):
              return self.model(x.view(-1, image_size))
      
      # **(2) モデルの初期化**
      G = Generator().to(device)
      D = Discriminator().to(device)
      
      # **(3) 損失関数と最適化**
      criterion = nn.BCELoss()
      optimizer_G = optim.Adam(G.parameters(), lr=lr, betas=(0.5, 0.999))
      optimizer_D = optim.Adam(D.parameters(), lr=lr, betas=(0.5, 0.999))
      
      # **(4) GAN の学習**
      for epoch in range(epochs):
          for i, (images, _) in enumerate(train_loader):
              images = images.view(-1, image_size).to(device)
              batch_size = images.size(0)
      
              # ラベル
              real_labels = torch.ones(batch_size, 1).to(device)
              fake_labels = torch.zeros(batch_size, 1).to(device)
      
              # **Discriminator の学習**
              z = torch.randn(batch_size, latent_dim).to(device)
              fake_images = G(z).detach()
              loss_D = criterion(D(images), real_labels) + criterion(D(fake_images), fake_labels)
      
              optimizer_D.zero_grad()
              loss_D.backward()
              optimizer_D.step()
      
              # **Generator の学習**
              z = torch.randn(batch_size, latent_dim).to(device)
              fake_images = G(z)
              loss_G = criterion(D(fake_images), real_labels)  # Generator の目的は本物らしい画像を生成すること
      
              optimizer_G.zero_grad()
              loss_G.backward()
              optimizer_G.step()
      
          print(f"Epoch [{epoch+1}/{epochs}] Loss_D: {loss_D.item():.4f} Loss_G: {loss_G.item():.4f}")
      
      print("Training Finished!")
      
      # **(5) 異常スコアの計算**
      def anomaly_score(x, G, z_dim=100, steps=500, lr=0.1):
          z = torch.randn(1, z_dim, requires_grad=True, device=device)
          optimizer = torch.optim.Adam([z], lr=lr)
      
          for _ in range(steps):
              fake_x = G(z)
              loss = torch.mean((fake_x - x) ** 2)
              optimizer.zero_grad()
              loss.backward()
              optimizer.step()
      
          return loss.item()
      
      # **(6) 異常データの検出**
      test_data = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)
      test_loader = torch.utils.data.DataLoader(test_data, batch_size=1, shuffle=True)
      
      G.eval()
      anomaly_scores = []
      
      for i, (img, label) in enumerate(test_loader):
          img = img.to(device)
          score = anomaly_score(img, G)
          anomaly_scores.append((score, label.item()))
      
          if i >= 100:
              break
      
      # **(7) 結果の可視化**
      scores, labels = zip(*anomaly_scores)
      plt.hist(scores, bins=30, alpha=0.7, label="Anomaly Score")
      plt.xlabel("Anomaly Score")
      plt.ylabel("Frequency")
      plt.legend()
      plt.show()

      解説

      1. データ準備: MNIST データセットを使用し、正常データとして「0」のみを学習。学習後、異常データとして「0」以外を評価。
      2. GAN の学習: Generator と Discriminator を訓練し、正常データの特徴を学習。
      3. 異常スコアの計算: 画像\(x\)に対し、潜在ベクトル\z*\)を最適化し、生成画像と比較。再構成誤差を異常スコアとして使用。
      4. 異常検知: 正常データに対しては異常スコアが低く、異常データ(「0」以外)に対してはスコアが高くなる。

      改良ポイントとしては、以下のようなものがある。

      • f-AnoGAN による高速化: 潜在空間の最適化を Encoder で代替し、推論速度を改善。
      • CNN ベースの Generator / Discriminator: 上記の MLP ではなく畳み込みニューラルネットワーク(CNN)を用いることで、画像の特徴をより適切に捉える。
      適用事例

      AnoGAN(Anomaly GAN)は、医療画像診断、製造業の異常検知、サイバーセキュリティ、金融取引監視など幅広い分野で応用されている。以下に具体的な適用事例について述べる。

      1. 医療画像診断

      適用分野: MRI・CT スキャン、X線、眼底画像など
      目的: 疾患の早期発見(腫瘍・異常部位の検出)

      適用例:脳 MRI の異常検出

        • データ: 正常な脳のMRI画像のみを学習
        • プロセス:
          1. 正常な脳画像からGANで学習
          2. 異常な脳画像を入力し、GANが再構成
          3. 再構成誤差が高い箇所を異常部位と判断
        • 成果:
          • 正常部位は低い誤差で再構成される
          • 腫瘍や病変があると、GANが再構成できず誤差が大きくなる

      メリット

        • 教師なし学習 なので異常データのラベル付け不要
        • 診断支援 で医師の負担軽減
        • 早期発見 に貢献(小さな異常も検出)

      参考: f-AnoGAN(高速版 AnoGAN)が 医療診断 に利用されている。

      論文: “Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery” (Schlegl et al., 2017)

      2. 製造業の異常検知

      適用分野: 自動車・半導体・食品・衣料品などの品質検査
      目的: 外観検査の自動化(傷・欠陥・異常パターンの検出)

      適用例:半導体ウェハーの欠陥検出

        • データ: 正常なウェハー画像のみを学習
        • プロセス:
          1. 正常なパターンを学習し、生成モデルを構築
          2. 実際のウェハー画像と比較
          3. 異常部分を特定
        • 成果:
          • 人の目では気づきにくい微細な傷・汚れを自動検出
          • 検査精度向上・コスト削減・作業効率向上

      メリット

        • リアルタイム異常検知 に対応可能
        • 品質保証の自動化(人手による検査を削減)
        • 外観検査の高速化(複雑な製品でも対応)

      参考: Siemens や Sony などが 製造ラインでの異常検知に GAN を活用

      3. サイバーセキュリティ

      適用分野: ネットワーク異常検知、マルウェア検出、不正アクセス監視
      目的: 通常トラフィックと異常トラフィックを分類

      適用例:DDoS 攻撃の検出

        • データ: 正常な通信ログを学習
        • プロセス:
          1. 正常なネットワークパターンを学習
          2. 新しいトラフィックデータをGANで評価
          3. 異常スコアが高い場合、攻撃の可能性があると判断
        • 成果:
          • ゼロデイ攻撃(未知の攻撃)の検出
          • 異常なアクセスやボットによる不審な動きを可視化

      メリット

        • リアルタイム監視可能(ネットワークトラフィックの異常を即検知)
        • 既存の IDS(侵入検知システム)との組み合わせが可能

      参考: Google や Cloudflare が 異常検知モデルの一部に GAN を応用

      4. 金融取引の異常検知

      適用分野: 不正取引の検出(クレジットカード詐欺、インサイダー取引)
      目的: 通常の取引パターンと異常取引を識別

      適用例:クレジットカードの不正使用検出

        • データ: 通常の取引履歴を学習
        • プロセス:
          1. 正常な取引パターンを学習
          2. 新しい取引データの異常スコアを算出
          3. スコアが高い取引は 詐欺の可能性がある とフラグ
        • 成果:
          • 従来のルールベース検知 より 高精度
          • 異常なパターンリアルタイム で検出

      メリット

        • 従来の手法より精度が高い(新しい詐欺手法にも対応)
        • False Positive(誤検知)を減らせる
        • リアルタイムの監視が可能

      参考: PayPal や VISA が GAN を使った不正検知を研究

      5. スマートシティの異常検知

      適用分野: 監視カメラの異常検出、交通事故予測
      目的: 都市の安全監視・異常行動の検出

      適用例:防犯カメラの異常行動検出

        • データ: 通常の歩行者・車両の映像を学習
        • プロセス:
          1. 正常な動きを学習
          2. 不審な行動(転倒、喧嘩、急な動き)を異常として検出
        • 成果:
          • 事件・事故の未然防止 に貢献
          • 監視業務の効率化(人手を減らせる)

      メリット

        • 事故・犯罪の早期検知
        • 行動解析による都市安全性向上

      参考: イギリスのロンドン市が AI を活用した防犯カメラ監視を導入

      参考図書

      AnoGAN や異常検知に関連する参考図書を以下に述べる。

      1. 深層学習と異常検知の基礎

      異常検知と変化検知

      • 異常検知の基本概念、統計的手法、機械学習による異常検知手法を解説。
      • GANベースの異常検知手法の前提知識として有用。

      Pythonで学ぶ異常検知 ―理論から実装まで

      • 異常検知の基礎から応用までを Python で実装しながら学べる。
      • GAN、VAE、オートエンコーダ などの深層学習手法を用いた異常検知の説明もある。

      2. GAN(敵対的生成ネットワーク)の基礎

      GANs in Action: Deep learning with Generative Adversarial Networks
      2019年
      著者: Jakub Langr, Vladimir Bok

      [ISBN: 978-1617295560]
      • GANの基本概念から応用までを解説。
      • AnoGAN の基礎となる DCGAN、WGAN などの知識を習得できる。

      Deep Reinforcement Learning Hands-On: A practical and easy-to-follow guide to RL from Q-learning and DQNs to PPO and RLHF

        3. 異常検知に応用される GAN

        Beginning Anomaly Detection Using Python-Based Deep Learning: Implement Anomaly Detection Applications with Keras and PyTorch

        • AnoGAN, f-AnoGAN, VAE-GAN などの異常検知手法を詳しく解説。
        • 具体的な 医療・製造業の異常検知事例 も紹介。

        Deep Learning for Anomaly Detection: A Survey
        2022年
        著者: Raghavendra Chalapathy, Sanjay Chawla
        [ISBN: 978-3031019516]

        • 深層学習を用いた異常検知技術の包括的な解説。
        • GAN、オートエンコーダ、VAE などを異常検知に応用する手法を解説。

        Anomaly Detection with Machine Learning

        • GAN 以外にも LSTM, Transformer を用いた異常検知手法も解説。
        • 実際の 産業応用(金融、不正検知、医療など)を学べる。

        コメント

        タイトルとURLをコピーしました