以下の内容はhttps://cysec148.hatenablog.com/entry/2025/04/07/154906より取得しました。


第22回:画像生成AIの基礎

Hello there, ('ω')ノ

🧠 はじめに:VAE(変分オートエンコーダー)とは?

VAE(Variational Autoencoder:変分オートエンコーダー) とは、
深層学習を用いた生成モデル で、
確率分布からサンプリングした潜在変数(Latent Variable) を使い、
新しいデータ(画像・文章など)を生成 する手法です。

VAEの特徴:
- データの潜在表現(潜在変数)を学習
- 確率分布(通常はガウス分布)に基づくサンプリング
- 高次元データ(画像・音声)の生成と再構築が可能

応用分野:
- 画像生成・修復・変換
- 異常検知(Anomaly Detection)
- データ拡張(Data Augmentation)


📚 1. VAEの基本概念と仕組み


🧩 ① VAEの基本構造

VAEは、エンコーダ(Encoder)デコーダ(Decoder) から構成される
オートエンコーダ(Autoencoder) の一種ですが、
従来のオートエンコーダとは異なり、
潜在変数に確率分布を導入して生成タスクを強化 しています。


🎯 【VAEの構造】

[入力データ] → [エンコーダ] → [潜在空間(確率分布)] → [デコーダ] → [再構成データ]

エンコーダ(Encoder):
- 入力データ(画像・テキスト)を
- 潜在空間(Latent Space) にマッピング
- 平均 μ(ミュー)分散 σ²(シグマ二乗) を推定

潜在変数(Latent Variable):
- ガウス分布(正規分布)から z をサンプリング
- z ~ N(μ, σ²) という確率分布に従う

デコーダ(Decoder):
- サンプリングした潜在変数 z
- 元のデータ空間に復元・再構成


🎨 【VAEのアーキテクチャ】

入力データ(x) → Encoder → μ, σ² → サンプリング(z) → Decoder → 再構成データ(x')

🎯 ② VAEの損失関数(Loss Function)

VAEの学習では、2つの損失関数 を組み合わせて最適化します。


1. 再構成誤差(Reconstruction Loss)

  • 元の入力データ x と、
  • 再構成されたデータ x' との誤差を最小化
  • 通常は MSE(平均二乗誤差) を使用

2. KLダイバージェンス(KL Divergence)

  • 推定した潜在変数の分布 q(z|x) と、
  • 事前分布 p(z)(通常は標準正規分布) との乖離を最小化

📚 【VAEの最終損失関数】

[ L(x, x') = \text{Reconstruction Loss} + \text{KL Divergence} ]

[ L(x, x') = \frac{1}{N} \sum{i=1}^{N} \left( | x_i - x'i |^2 \right) + D_{KL}(q(z|x) || p(z)) ]


🔥 ③ VAEと通常のオートエンコーダの違い

特性 通常のオートエンコーダ VAE(変分オートエンコーダ)
潜在空間 固定ベクトル 確率分布(N(μ, σ²))
生成能力 データ再構成のみ 新しいデータ生成が可能
サンプリング なし 潜在変数からのサンプリング
出力の多様性 固定的 多様なサンプル生成

🤖 2. VAEの具体的な仕組みと数式


📚 ① エンコーダ(Encoder)

エンコーダは、入力データ x
潜在空間(Latent Space) にマッピングし、
平均 μ(ミュー)分散 σ²(シグマ二乗) を推定します。


📚 【エンコーダの数式】

[ \mu = f\mu(x), \quad \log \sigma2 = f\sigma(x) ]

  • f_μ(x): 平均 μ を求めるニューラルネット
  • f_σ(x): 対数分散(log σ²)を求めるニューラルネット

📚 ② サンプリング(Reparameterization Trick)

VAEでは、潜在変数 z
ガウス分布 N(μ, σ²) からサンプリングします。

しかし、サンプリングは微分不可能なため、
Reparameterization Trick(再パラメータ化トリック) を使用して
μとσ²からzを計算 します。


📚 【再パラメータ化の数式】

[ z = \mu + \sigma \cdot \epsilon, \quad \epsilon \sim \mathcal{N}(0, 1) ]

  • μ: 平均
  • σ: 標準偏差
  • ε: 標準正規分布からのノイズ

📚 ③ デコーダ(Decoder)

デコーダは、サンプリングされた潜在変数 z
元のデータ空間に 再構成(Reconstruction) します。


📚 【デコーダの数式】

[ x' = g(z), \quad z \sim \mathcal{N}(\mu, \sigma2) ]

  • g(z): デコーダのニューラルネット
  • x': 再構成されたデータ

🎨 3. VAEの実装方法(PyTorchで画像生成)


📚 ① 必要なライブラリのインストール

pip install torch torchvision matplotlib numpy

📚 ② VAEのモデル構築(PyTorch)

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

# エンコーダ(Encoder)定義
class Encoder(nn.Module):
    def __init__(self, input_dim, latent_dim):
        super(Encoder, self).__init__()
        self.fc1 = nn.Linear(input_dim, 512)
        self.fc_mu = nn.Linear(512, latent_dim)  # μ
        self.fc_logvar = nn.Linear(512, latent_dim)  # log σ²

    def forward(self, x):
        h = torch.relu(self.fc1(x))
        mu = self.fc_mu(h)
        logvar = self.fc_logvar(h)
        return mu, logvar

# デコーダ(Decoder)定義
class Decoder(nn.Module):
    def __init__(self, latent_dim, output_dim):
        super(Decoder, self).__init__()
        self.fc1 = nn.Linear(latent_dim, 512)
        self.fc2 = nn.Linear(512, output_dim)

    def forward(self, z):
        h = torch.relu(self.fc1(z))
        x_reconstructed = torch.sigmoid(self.fc2(h))
        return x_reconstructed

# VAEモデルの定義
class VAE(nn.Module):
    def __init__(self, input_dim, latent_dim):
        super(VAE, self).__init__()
        self.encoder = Encoder(input_dim, latent_dim)
        self.decoder = Decoder(latent_dim, input_dim)

    def reparameterize(self, mu, logvar):
        std = torch.exp(0.5 * logvar)
        eps = torch.randn_like(std)
        return mu + eps * std

    def forward(self, x):
        mu, logvar = self.encoder(x)
        z = self.reparameterize(mu, logvar)
        x_reconstructed = self.decoder(z)
        return x_reconstructed, mu, logvar

📚 ③ VAEの損失関数の定義

# VAEの損失関数(再構成誤差 + KLダイバージェンス)
def vae_loss(x, x_reconstructed, mu, logvar):
    # 再構成誤差(MSE)
    reconstruction_loss = nn.functional.binary_cross_entropy(x_reconstructed, x, reduction='sum')
    # KLダイバージェンス
    kl_divergence = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
    return reconstruction_loss + kl_divergence

📚 ④ モデルの学習

# ハイパーパラメータ
input_dim = 784  # MNISTの28x28画像
latent_dim = 2  # 潜在変数の次元
lr = 1e-3
batch_size = 128
epochs = 10

# データセットの読み込み
transform = transforms.ToTensor()
train_dataset = datasets.MNIST(root="./data", train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

# モデルと最適化
model = VAE(input_dim, latent_dim)
optimizer = optim.Adam(model.parameters(), lr=lr)

# モデルの学習
for epoch in range(epochs):
    model.train()
    train_loss = 0
    for batch_idx, (data, _) in enumerate(train_loader):
        data = data.view(-1, 28 * 28)
        optimizer.zero_grad()
        x_reconstructed, mu, logvar = model(data)
        loss = vae_loss(data, x_reconstructed, mu, logvar)
        loss.backward()
        train_loss += loss.item()
        optimizer.step()
    print(f"Epoch [{epoch+1}/{epochs}], Loss: {train_loss/len(train_loader.dataset):.4f}")

🎨 ⑤ 新しい画像の生成

import matplotlib.pyplot as plt

# サンプル生成(ランダム潜在変数)
with torch.no_grad():
    z = torch.randn(64, latent_dim)
    generated_images = model.decoder(z).view(-1, 1, 28, 28)

# 生成画像の表示
def show_images(images, nrow=8):
    grid = torchvision.utils.make_grid(images, nrow=nrow)
    plt.figure(figsize=(8, 8))
    plt.imshow(grid.permute(1, 2, 0).cpu().numpy(), cmap="gray")
    plt.axis("off")
    plt.show()

show_images(generated_images)

生成画像の表示: VAEでサンプリングした潜在変数から新しい画像を生成
MNISTデータセットに基づく数字画像の生成が成功!


📚 4. VAEの応用とユースケース


🎯 ① 画像生成・変換

応用:
- 新しい画像の生成(GANと併用して高品質生成)
- スタイル変換・画像補間 に応用

ユースケース:
- アバター生成、3Dモデル生成、アート作品制作


📚 ② 異常検知(Anomaly Detection)

応用:
- 正常データの再構成誤差を基準に異常検出
- 医療・金融・セキュリティ分野での異常検知

ユースケース:
- 不正取引検出、機械故障の予測、医療画像診断


📊 ③ データ拡張(Data Augmentation)

応用:
- ラベル付きデータの増強・多様化
- 低リソース環境での精度向上

ユースケース:
- 医療画像、音声データ、NLPデータの増強


🎁 まとめ:VAEで画像生成の基本を理解しよう!

VAEは、エンコーダとデコーダで潜在変数の分布を学習し、データ生成を可能にする確率モデル。
確率分布からのサンプリングにより、異常検知、画像生成、データ拡張などに応用できる。
GAN(敵対的生成ネットワーク)との併用で、より高品質な生成モデルへの発展が可能。
PyTorchでのVAEの実装を通じて、画像生成・変換技術の基礎をマスターしよう!

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/04/07/154906より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14