AI

VAE(変分オートエンコーダ)とは|仕組み・損失関数・GANや拡散モデルとの違いを実装まで解説

VAE(Variational Autoencoder、変分オートエンコーダ)は、データを確率分布として潜在空間に埋め込み、そこからサンプリングして新しいデータを生成する深層生成モデルです。2013年にKingmaとWellingが提案して以来、画像生成・異常検知・データ圧縮の基盤技術として使われ続けています。普通のオートエンコーダが潜在変数を「1点の数値ベクトル」として持つのに対し、VAEは潜在変数を「平均μと分散σ²を持つ確率分布」として扱う点が決定的な違いです。この記事では、VAEの数式(ELBO・再構成誤差・KLダイバージェンス・再パラメータ化トリック)、オートエンコーダ/GAN/拡散モデルとの違い、Stable Diffusionなど潜在拡散モデルでのVAEの役割、β-VAEやVQ-VAEといった派生、PyTorchでの実装までを整理します。

まとめ:VAEの要点と読みどころ

VAEは「確率分布として潜在空間を学習する生成モデル」です。本記事の結論を先に示します。

  • 仕組み:エンコーダが入力からμとσ²を出し、z = μ + σ⊙ε で潜在変数をサンプリングし、デコーダが再構成する。学習はELBO(変分下界)の最大化=「再構成誤差 + KLダイバージェンス」の最小化で行う。
  • 再パラメータ化トリック:サンプリングを z = μ + σ⊙ε(ε∼N(0,I))と書き換えることで、勾配がμとσを通り、誤差逆伝播が可能になる。VAEを深層学習で学習できるようにした核心技術。
  • 他モデルとの違い:オートエンコーダは点で表現するため生成に不向き、GANはシャープだが学習が不安定、拡散モデルは品質で上回るが計算が重い。VAEは学習が安定し潜在空間が解釈しやすい一方、出力がぼやけやすい。
  • 現在の立ち位置:単独の画像生成では拡散モデルに主役を譲ったが、Stable Diffusionなど潜在拡散モデルの「画像と潜在表現を変換する部品」としてVAEは現役。

以下、定義から実装まで順に掘り下げます。数式が必要な箇所はその場で式を示します。

VAEの定義と誕生の背景:確率分布で潜在空間を学習

VAEは「ブイエーイー」と読み、Variational Autoencoder(変分オートエンコーダ、変分自己符号化器とも訳す)の略です。確率的生成モデルとニューラルネットワークの潜在変数モデルを組み合わせた手法で、2013年にDiederik P. KingmaとMax Wellingが論文「Auto-Encoding Variational Bayes」(arXiv:1312.6114)で提案しました。

従来のオートエンコーダは、エンコーダで入力を潜在空間に圧縮し、デコーダで復元するだけのモデルでした。圧縮・特徴抽出には使えても、潜在空間の任意の点をデコーダに入れて意味のあるデータが出てくる保証がなく、新しいデータの生成には向きません。VAEは潜在変数を確率分布として扱い、その分布を標準正規分布N(0,I)に近づける制約をかけることで、潜在空間の任意の点から自然なデータを生成できるようにしました。

VAEの目標は「観測データxを、低次元の潜在変数zを介して生成する確率モデル p(x) を学習する」ことにあります。学習が進むと、z∼N(0,I)からサンプリングしてデコーダに通すだけで新しいデータが得られ、エンコーダ側を使えばデータの確率的な特徴表現が手に入ります。

VAEの仕組み:エンコーダ・潜在変数・損失関数

VAEの構造は2つのニューラルネットワークから成ります。読者が個別に検索する論点(エンコーダ/デコーダ、再パラメータ化トリック、ELBO、損失関数)が混在するため、h3で分けて説明します。

エンコーダとデコーダの役割と出力の中身

エンコーダ qφ(z|x) は、入力xから潜在変数zの近似事後分布を出力します。具体的には潜在変数の平均μ(x)と対数分散 log σ²(x) の2つを出力し、正規分布 N(μ, diag(σ²)) を仮定します。ここで重要なのは、エンコーダが返すのは1点のベクトルではなく「分布のパラメータ」だという点です。

デコーダ pθ(x|z) は、潜在変数zから観測xを生成する条件付き分布を出力します。画像なら各ピクセルにBernoulli分布(0〜1の二値・確率)やガウス分布を仮定します。画像データではエンコーダに畳み込み層(CNN)、デコーダに転置畳み込み層を用いるのが一般的です。MNISTのような28×28グレースケール画像なら、潜在次元は10〜20程度がよく使われます。

確率分布としての潜在変数とサンプリング

VAEが「生成」できる理由は、潜在変数を確率分布として持つことにあります。各入力データは潜在空間上の「点」ではなく「ガウス分布の領域」に対応し、その領域内でサンプリングが起こります。これにより潜在空間が連続的になり、2つのデータの潜在ベクトルを線形補間すると、中間的で意味のあるデータ(例:ある手書き数字から別の数字へ徐々に変化する画像)が生成されます。固定点で表現する通常のオートエンコーダでは、この滑らかな補間は保証されません。

再パラメータ化トリック(Reparameterization Trick)

潜在変数zは分布 qφ(z|x) からサンプリングしますが、「サンプリング」という確率的操作は微分できず、そのままでは誤差逆伝播でエンコーダのパラメータを更新できません。これを解決するのが再パラメータ化トリックです。サンプリングを次のように書き換えます。

z = μ + σ ⊙ ε     (ε ∼ N(0, I))

ランダム性をパラメータに依存しないノイズε(標準正規分布)に追い出すことで、zはμとσの決定的な関数になります。これで勾配がμとσを通って伝わり、エンコーダを学習できます。VAEを実用的な深層学習モデルにした最重要の工夫であり、「vae 再パラメータ化トリック」で検索する読者が最初に押さえるべき箇所です。

ELBO(変分下界)と損失関数の構成

本当に最大化したいのは対数尤度 log pθ(x) ですが、これは直接計算できません。そこで代わりにELBO(Evidence Lower Bound、変分下界)を最大化します。ELBOは次の不等式で与えられます。

log pθ(x) ≥ E_{z∼qφ(z|x)}[ log pθ(x|z) ] − KL( qφ(z|x) || p(z) )

右辺の第1項は再構成項(潜在変数から入力をどれだけ復元できるか)、第2項はKLダイバージェンス(推論分布qφを事前分布 p(z)=N(0,I) にどれだけ近づけたか)です。学習ではこのELBOの符号を反転して損失として最小化するので、損失は実質的に次の形になります。

Loss = 再構成誤差 + KLダイバージェンス
     = −E_{qφ(z|x)}[ log pθ(x|z) ] + KL( qφ(z|x) || p(z) )

再構成誤差は、二値画像ならバイナリクロスエントロピー(BCE)、連続値の画素なら平均二乗誤差(MSE、ガウス仮定の負対数尤度)を使います。KL項は事前分布が標準正規分布のとき閉形式で計算でき、潜在次元ごとに次式で求まります。

KL = −0.5 × Σ ( 1 + log σ² − μ² − σ² )

この式は、μ=0・σ²=1(つまりN(0,1)そのもの)のときKL=0になります。再構成誤差は「入力を忠実に復元せよ」、KL項は「潜在分布を標準正規分布に寄せよ」という相反する力で、両者のバランスが生成品質を左右します。最適化にはAdamが広く使われ、学習初期はKL項の重みを小さくする「KLウォームアップ」で学習を安定させる手法もあります。

オートエンコーダ・GAN・拡散モデルとの違い

VAEは「オートエンコーダとの違い」「GANとの違い」「拡散モデルとの違い」がそれぞれ別クエリで検索されます。比較軸が異なるため分けて整理します。

モデル 潜在表現 生成能力 学習の安定性 出力品質
オートエンコーダ(AE) 固定点 低い 安定 圧縮・復元向け
VAE 確率分布 あり 安定 ぼやけやすい
GAN 潜在ベクトル 高い 不安定 シャープ
拡散モデル ノイズ除去過程 非常に高い 比較的安定 高品質・計算重い

オートエンコーダとの違い:点か分布か

通常のオートエンコーダ(AE)は潜在変数を固定された数値ベクトルとして学習し、ノイズ除去や次元削減、異常検知に使われます。学習データの再構成はできても、潜在空間に「穴」があるため未知の点からの生成には向きません。VAEは潜在変数を確率分布にし、潜在空間全体をN(0,I)に整える制約を入れることで、空間を埋めて任意の点から生成できるようにした点が本質的な違いです。圧縮だけが目的ならAEで十分で、生成や滑らかな補間が必要ならVAEを選びます。

GANとの違い:安定性とシャープさのトレードオフ

GAN(敵対的生成ネットワーク、2014年Goodfellowら提案)は、生成器と識別器を競わせて学習する生成モデルです。生成画像のシャープさではVAEを上回りますが、学習が不安定でモード崩壊を起こしやすい弱点があります。VAEは確率分布を直接近似するため学習が安定し、対数尤度という明確な指標で評価できる一方、ピクセル単位の平均的な損失により出力がぼやけがちです。両者の長所を組み合わせたVAE-GAN(VAEのデコーダ出力をGANの識別器で評価)も提案されています。「シャープな画像が欲しいならGAN、安定学習と解釈しやすい潜在空間が欲しいならVAE」が実務上の使い分けの目安です。

拡散モデルとの違い:現在の主役との関係

拡散モデル(Diffusion Model)は、データに段階的にノイズを加え、その逆過程を学習してノイズから生成する手法です。2020年のDDPM、2022年のStable Diffusion公開で一気に普及し、画像生成の品質では現在VAEやGANを大きく上回ります。ただし拡散モデルは多数のステップを踏むため計算が重く、VAEのような一発の潜在表現は持ちません。重要なのは、両者は単純な競合ではなく、後述のとおりStable Diffusionの内部でVAEが「画像と潜在表現の変換器」として組み込まれている点です。

潜在拡散モデルでのVAEの役割:Stable Diffusion・SDXL・ComfyUIでの実体

「拡散モデルが主流になった今、VAEはもう古いのでは」と思われがちですが、実際にはStable Diffusionをはじめとする潜在拡散モデル(Latent Diffusion Model)の中核部品としてVAEは現役で動いています。この観点は定義だけを説明する競合記事が手薄な領域で、「stable diffusion vae」「sdxl vae」「comfyui vaeとは」「潜在拡散モデル」といった実利用クエリに直接答える章です。

なぜ拡散モデルにVAEが必要か:計算量の圧縮

拡散モデルをピクセル空間で直接動かすと、512×512×3という高次元データに対して反復ノイズ除去を行うため計算コストが膨大になります。Stable Diffusion v1は、VAEのエンコーダで画像を8分の1にダウンサンプリング(f=8)し、512×512ピクセルの画像を64×64・4チャネルの潜在表現に圧縮します。これにより約48倍メモリ効率が上がり、拡散過程を低次元の潜在空間で実行できるため、一般的なGPUでも画像生成が回せるようになりました。生成の最後にVAEのデコーダが潜在表現を512×512の画像へ復元します。

ComfyUIやSDXLで「VAE」を選ぶ意味

ComfyUIやStable Diffusion WebUIで「VAE」という設定項目が出てくるのは、この潜在表現を画像に戻すデコーダ部分を指しています。VAEを差し替えると、プロンプトだけでは制御できない最終画像の色味・彩度・鮮明さが変わります。標準VAEで出力がくすむ場合に、別途配布されたVAE(例:SDXL専用VAEや微調整済みVAE)を読み込んで彩度や細部の再現性を改善する、という使い方が一般的です。SDXLはSD v1とは別構造のVAEを使うため、モデルとVAEの組み合わせを合わせる必要があります。

動画生成モデルでは、空間方向に加えて時間方向も圧縮する3D VAE(Wan VAEなど)が使われ、フレーム間の連続性を保ちながら潜在空間で拡散過程を回します。VAEは「生成そのもの」の主役からは退きましたが、生成モデルのデータ圧縮インフラとして用途を広げています。Stable Diffusion本体の詳細は世界最高峰の画像生成AI「Stable Diffusion 3 8B+」の詳細とその実力を探るで扱っています。

VAEの派生モデル:β-VAE・VQ-VAE・CVAE

VAEの弱点(出力のぼやけ、潜在表現の制御性)を補うため、多くの派生が提案されています。GSCでも「β-vae」「vq-vae vae 違い」「vae-gan」が実際に検索されています。重要なものから挙げます。

  • β-VAE(Higginsら, 2017):ELBOのKL項に重みβを掛け、β>1で潜在因子の独立性・解釈性を高める。潜在次元が「顔の向き」「明るさ」など個別の意味に対応しやすくなる(教師なしの特徴分離)。
  • VQ-VAE(van den Oordら, 2017):潜在変数を連続のガウス分布ではなく離散的なコードブックで表現する。これが通常のVAEとの最大の違いで、離散化によりぼやけを抑えて鮮明な生成ができ、後段にPixelCNNやTransformerを載せやすい。画像・音声の高品質生成や、近年のトークナイザとして使われる。
  • CVAE(条件付きVAE):ラベルyを条件として与え、「数字の7を生成」のように条件を指定した生成を可能にする。
  • VAE-GAN:VAEのデコーダ出力をGANの識別器で評価し、安定学習とシャープさを両立させる。

「VQ-VAEとVAEの違いは何か」という問いには、潜在表現が離散か連続かが一言の答えになります。ぼやけが許容できないタスクや、自己回帰モデルと組み合わせたい場合はVQ-VAEを、解釈性や特徴分離を重視するならβ-VAEを選ぶ、という判断になります。

VAEの応用例:異常検知・画像生成・データ圧縮

VAEは教師なし学習として機能し、ラベルが少ない場面で強みを発揮します。応用ごとに使い方が異なるため分けて述べます。

異常検知:再構成誤差で外れ値を見つける

VAEの代表的な実務応用が異常検知です。仕組みはシンプルで、正常データだけでVAEを学習させると、正常パターンはうまく再構成できる一方、未知の異常データは再構成誤差が大きくなります。この誤差にしきい値を設けて異常を判定します。製造業のセンサーデータでの設備故障の予兆検知、医療画像(MRI・X線)での正常範囲からの逸脱検出などで使われます。「vae 異常検知」「vae 医療」で検索する読者が求めるのはこの再構成誤差ベースの判定ロジックで、正常データのみで学習できる点がラベル取得の難しい現場に向いています。

画像生成と潜在空間の操作

MNISTの手書き数字やCelebA(有名人の顔画像データセット)でVAEを学習すると、潜在空間からサンプリングして新しい画像を生成できます。CelebAの顔生成では潜在次元を128程度に設定する実装がよく知られ、2つの顔の潜在ベクトルを線形補間すると、片方の顔からもう片方へ少しずつ変化する中間画像が連続的に得られます。さらに潜在ベクトルを操作すれば、「笑顔の度合い」「髪の長さ」といった属性を連続的に変える編集も可能です。単独の写実的画像生成では拡散モデルに劣りますが、潜在空間が滑らかで操作しやすい性質は、属性操作や補間の研究で今も使われています。

データ圧縮・ノイズ除去・特徴抽出

VAEはデータを低次元の潜在空間に圧縮するため、次元削減やノイズ除去にも使えます。ノイズを含む画像を入力して学習させると、デコーダがノイズの少ない画像を復元します。抽出した潜在表現を分類器の入力にする半教師あり学習や、分子設計で潜在空間を探索して新しい化合物候補を生成する使い方もあります。

VAEの実装:PyTorchでのMNIST向け最小コード

VAEの実装は「エンコーダ→再パラメータ化→デコーダ→損失計算」の流れで構成します。以下はMNIST(784次元入力、潜在20次元)向けのPyTorch最小実装です。前述の数式(z = μ + σ⊙ε、損失 = BCE + KL)がそのままコードに対応します。

import torch
import torch.nn as nn
import torch.nn.functional as F

class VAE(nn.Module):
    def __init__(self, x_dim=784, h_dim=400, z_dim=20):
        super().__init__()
        self.fc1 = nn.Linear(x_dim, h_dim)
        self.fc_mu = nn.Linear(h_dim, z_dim)
        self.fc_logvar = nn.Linear(h_dim, z_dim)
        self.fc2 = nn.Linear(z_dim, h_dim)
        self.fc3 = nn.Linear(h_dim, x_dim)

    def encode(self, x):
        h = F.relu(self.fc1(x))
        return self.fc_mu(h), self.fc_logvar(h)

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

    def decode(self, z):
        h = F.relu(self.fc2(z))
        return torch.sigmoid(self.fc3(h))

    def forward(self, x):
        mu, logvar = self.encode(x)
        z = self.reparameterize(mu, logvar)
        return self.decode(z), mu, logvar

def loss_function(recon_x, x, mu, logvar):
    bce = F.binary_cross_entropy(recon_x, x, reduction='sum')
    kld = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
    return bce + kld

reparameterize が再パラメータ化トリック、loss_function 内の bce が再構成誤差、kld が前掲のKL閉形式 −0.5Σ(1+logσ²−μ²−σ²) に対応します。実装では入力画素を0〜1に正規化し、デコーダ出力にsigmoidを使ってBCEと整合させる点に注意してください。TensorFlow/Kerasでも構造は同じで、model.fit で学習ループを書ける分だけ簡潔になります。フレームワークの選定基準はPyTorchとTensorFlowの違いと選び方を参照してください。学習済みVAEを別データに適応させる場合はファインチューニングとは?AIモデルを適応させる技術の概要と目的も併せて確認すると流れがつかめます。

よくある質問(FAQ)

VAEとオートエンコーダの違いは何ですか?

最大の違いは潜在変数の表現方法です。オートエンコーダは潜在変数を固定された1点のベクトルとして学習しますが、VAEは平均μと分散σ²を持つ確率分布として学習し、その分布を標準正規分布に近づける制約をかけます。これにより潜在空間が連続的に埋まり、任意の点から自然なデータを生成できます。圧縮・特徴抽出だけならオートエンコーダ、生成や滑らかな補間が必要ならVAEを使います。

VAEは異常検知にどのように活用できますか?

正常データのみでVAEを学習させ、入力の再構成誤差を異常スコアとして使います。学習済みの正常パターンは小さな誤差で再構成されますが、未知の異常データは再構成がうまくいかず誤差が大きくなるため、しきい値を超えたものを異常と判定します。ラベル付き異常データを集めにくい製造設備の故障予兆や医療画像の逸脱検出で有効です。

再パラメータ化トリックはなぜ必要なのですか?

潜在変数zを確率分布からサンプリングする操作は微分できず、そのままでは誤差逆伝播でエンコーダを学習できません。z = μ + σ⊙ε(ε∼N(0,I))と書き換え、ランダム性をパラメータに依存しないノイズεへ追い出すことで、zがμとσの決定的な関数になり、勾配が伝わるようになります。これがVAEを深層学習で学習可能にした核心の技術です。

VAEとGAN・拡散モデルはどう使い分けますか?

学習の安定性と潜在空間の解釈しやすさを重視するならVAE、シャープな画像品質を最優先するならGAN、最高品質の画像生成なら拡散モデルが基準です。ただし拡散モデルのStable Diffusionでは、画像と潜在表現を変換する部品としてVAEが内部で使われており、完全な競合ではありません。用途と計算資源に応じて組み合わせるのが現実的です。

VQ-VAEと通常のVAEの違いは何ですか?

潜在表現が連続か離散かが違いです。通常のVAEは潜在変数を連続的なガウス分布で表しますが、VQ-VAEは離散的なコードブック(ベクトル量子化)で表現します。離散化により出力のぼやけを抑えて鮮明な生成ができ、後段にTransformerなどの自己回帰モデルを組み合わせやすくなります。高品質な画像・音声生成やトークナイザ用途ではVQ-VAEが選ばれます。

関連記事

資料請求

RELATED POSTS 関連記事