変分オートエンコーダーの概要

変分オートエンコーダーの概要' can be condensed as '変分オートエンコーダー概要

はじめに

変分オートエンコーダ(VAE)は、特定のデータセットの基になる確率分布を捉え、新たなサンプルを生成するために明示的に設計された生成モデルです。VAEはエンコーダ-デコーダ構造を持つアーキテクチャを使用します。エンコーダは入力データを潜在形式に変換し、デコーダはこの潜在表現に基づいて元のデータを再構成することを目指します。VAEは元のデータと再構成データの相違を最小化するようにプログラムされており、基になるデータ分布を理解し、同じ分布に従う新たなサンプルを生成することができます。

VAEの注目すべき利点の一つは、トレーニングデータに似た新しいデータサンプルを生成する能力です。VAEの潜在空間は連続的であるため、デコーダはトレーニングデータポイントの間を滑らかに補完する新しいデータ点を生成することができます。VAEは密度推定やテキスト生成など、さまざまなドメインで応用されています。

この記事はData Science Blogathonの一環として公開されました。

変分オートエンコーダのアーキテクチャ

VAEは通常、エンコーダ接続とデコーダ接続の2つの主要なコンポーネントから構成されています。エンコーダネットワークは入力データを低次元の「秘密のコード」と呼ばれる空間に変換します。

エンコーダネットワークの実装には、完全に接続されたネットワークや畳み込みニューラルネットワークなど、さまざまなニューラルネットワークのトポロジーが検討されることがあります。選択するアーキテクチャはデータの特性に基づいています。エンコーダネットワークは、サンプリングと潜在コードの生成に必要なガウス分布の平均値や分散などの重要なパラメータを生成します。

同様に、研究者はさまざまなタイプのニューラルネットワークを使用してデコーダネットワークを構築し、その目的は提供された潜在コードから元のデータを再構成することです。

VAEのアーキテクチャの例:fen

VAEは、入力データを潜在コードにマッピングするエンコーダネットワークと、潜在コードを再構成データに戻す逆操作を行うデコーダネットワークから構成されています。このトレーニングプロセスを経て、VAEはデータの基本的な特性を捉えた最適化された潜在表現を学習し、正確な再構成を可能にします。

正則化に関する直感

アーキテクチャの側面に加えて、研究者は潜在コードに正則化を適用し、VAEの重要な要素にします。この正則化により、トレーニングデータを単に記憶するのではなく、潜在コードのスムーズな分布を促進し、過学習を防ぎます。

正則化は、トレーニングデータポイント間を滑らかに補完する新しいデータサンプルの生成に役立つだけでなく、トレーニングデータに似た新しいデータを生成するVAEの能力にも貢献します。さらに、この正則化はデコーダネットワークが入力データを完璧に再構成することを防ぎ、多様なデータサンプルを生成するためのより一般的なデータ表現の学習を促進します。

数学的には、VAEでは正則化を損失関数にクロスエントロピー項を組み込むことで表現します。エンコーダネットワークは、ガウス分布のパラメータ(平均や対数分散など)を生成し、潜在コードのサンプリングに使用します。VAEの損失関数には、学習された潜在変数の分布と事前分布(正規分布)のKLダイバージェンスの計算が含まれます。研究者はKLダイバージェンス項を組み込んで、潜在変数が事前分布に類似した分布を持つように促します。

KLダイバージェンスの式は次の通りです:

KL(q(z∣x)∣∣p(z)) = E[log q(z∣x) − log p(z)]

まとめると、VAEに組み込まれた正則化は、トレーニングデータに過学習するリスクを緩和しながら、新しいデータサンプルを生成するモデルの能力を向上させる上で重要な役割を果たします。

VAEの数学的詳細

確率的フレームワークと仮定

VAEの確率的フレームワークは次のように概説できます:

潜在変数

これにより、観測された変数に関するより単純な(通常指数的な)条件付き分布を使用してモデル内でそれらを表現することができます。これは、確率分布として2つの変数を持つことで特徴付けられます:p(x, z)。変数xは考慮されるデータセットで可視性がありますが、変数zはありません。全体の確率分布はp(x, z) = p(x|z)p(z)と表されます。

観測変数

私たちは観測変数xを持っており、それは尤度分布p(x|z)(例えば、ベルヌーイ分布)に従うと仮定されています。

尤度分布

L(x, z)は2つの変数に依存する関数です。xの値を設定すると、尤度関数は特定のxに対するzの確率分布を表す分布として理解することができます。しかし、zの値を設定する場合、尤度関数はxの分布と見なすべきではありません。ほとんどの場合、それは1に合計されるというような分布の特性には従いません。それでも、尤度関数が形式的に分布基準を満たし、1に合計する要件を満たす場合もあります。

潜在変数と観測変数の結合分布は次のようになります:p(x,z) = p(x|z)p(z)。結合確率分布は複数の確率変数の確率分布を表します。

VAEの主な目的は、潜在変数の真の事後分布であるp(z|x)を理解することです。VAEは、エンコーダネットワークを使用して学習された近似q(z|x)で真の事後分布を近似することによってこれを達成します。

事後分布

ベイズ統計学では、事後確率は新しく獲得した情報に基づいてイベントが発生する確率の調整または更新された確率を指します。ベイズの定理を適用して事前確率を更新して事後確率を計算します。

VAEはエビデンス下限(ELBO)を最大化することによってモデルパラメータを学習します:

ELBO = E[log(p(x|z))] – KL(q(z|x)||p(z))

ELBOは2つの項から成ります。第1項は再構築項であり、VAEが入力データを正しく復元する能力を計算します。第2項であるKL分散は、推定事後分布(q(z|x))と事前分布(p(z))との間の違いを定義します。

確率的フレームワークを用いることで、VAEモデルは入力データが特定の確率分布上の潜在空間から生成されたものであると仮定します。目的は、入力データの尤度を最大化することで真の事後分布を学習することです。

変分推論の定式化

VAEにおける変分推論の定式化は次のようになります:

  • 近似事後分布:我々は事後分布の近似であるq(z|x)を持っています。
  • 真の事後分布:我々は真の事後分布p(z|x)を持っています。

目的は、KLダイバージェンス法を使用して真の分布(p(z|x))にできるだけ近い似た分布(q(z|x))を見つけることです。

VAEのトレーニング中、我々は証拠下限(ELBO)を増やすことによってKLダイバージェンスを最小化しようとします。ELBOは再構築項とKLダイバージェンスの組み合わせです。再構築項はモデルが入力データを再構築する能力を評価し、KLダイバージェンスは近似分布と実際の分布との違いを測定します。

モデル内のニューラルネットワーク

ニューラルネットワークは、エンコーダとデコーダの両方のコンポーネントをニューラルネットワークとして実装するためによく使用されるものです。トレーニングプロセス中、VAEはエンコーダとデコーダネットワークのパラメータを調整して再構築エラーと変分分布と真の事後分布とのKLダイバージェンスを最小化します。この最適化タスクは、確率的勾配降下法や他の適切な最適化アルゴリズムなどの技術を使用して実現されることがよくあります。

変分オートエンコーダの実行

変分オートエンコーダ(VAE)の構成に入る前に、まず基本的な概念を理解することが重要です。VAEの実装は複雑な場合がありますが、論理的かつ統一された構造に従って学習を簡素化することができます。

私たちのアプローチは、基本的な概念を段階的に導入し、実装の詳細に徐々に掘り下げていくことです。学習の過程全体で理解を深めるために、具体的な例を提供するためにハンズオンアプローチを採用します。

データの準備

提供されたコードには、機械学習とコンピュータビジョンのタスクに広く利用されるMNISTデータセットの読み込みが含まれています。このデータセットには、28×28ピクセルのサイズを持つ手書きの数字(0〜9)の60,000枚のグレースケール画像と、各画像に表示されている数字を示す対応するラベルが含まれています。これにより、画像とそれに対応するカテゴリや名前を関連付けることができます。入力データをトレーニングするために、コードではすべてのピクセル値を255で割ることによる正規化を適用しています。さらに、入力データをバッチ次元に組み込むために、入力データの形状を変更しています。この前処理のステップにより、データを適切にモデルのトレーニングにフォーマットすることができます。

import tensorflow as tf
import numpy as np

(x_train, y_train)
,(x_test, y_test) =
tf.keras.datasets.mnist.load_data()

# 入力データを正規化する
x_train = x_train / 255.
# 入力データの形状をバッチ次元を含めるように変更する
x_train = x_train.reshape((-1, 28*28))
x_test = x_test.reshape((-1, 28*28))

モデルの定義

VAEモデルでは、エンコーダとデコーダが連携して動作します。エンコーダは、入力画像をReLU活性化関数を使用した2つの全結合層を使って潜在空間にマッピングします。一方、デコーダは潜在ベクトルを入力として受け取り、2つの全結合層を使って元の画像を再構築します。

input_dim = 28*28
hidden_dim = 512
latent_dim = 128

エンコーダのアーキテクチャ

encoder_input = tf.keras.Input(shape=(input_dim,))
encoder_hidden = tf.keras.layers.Dense(hidden_dim, activation='relu')(encoder_input)
latent = tf.keras.layers.Dense(latent_dim)(encoder_hidden)
encoder = tf.keras.Model(encoder_input, latent)

デコーダのアーキテクチャ

decoder_input = tf.keras.Input(shape=(latent_dim,))
decoder_hidden = tf.keras.layers.Dense(hidden_dim, activation='relu')(decoder_input)
decoder_output = tf.keras.layers.Dense(input_dim)(decoder_hidden)
decoder = tf.keras.Model(decoder_input, decoder_output)

VAEのアーキテクチャ

inputs = tf.keras.Input(shape=(input_dim,))
latent = encoder(inputs)
outputs = decoder(latent)
vae = tf.keras.Model(inputs, outputs)

モデルのトレーニング

VAEのトレーニングでは、Adamオプティマイザーとバイナリクロスエントロピー損失関数を使用します。トレーニングはミニバッチで行われ、各画像ごとに損失が計算され、勾配がバックプロパゲーションされます。このプロセスを繰り返します。

loss_fn = tf.keras.losses.BinaryCrossentropy()
optimizer = tf.keras.optimizers.Adam()

num_epochs = 50
for epoch in range(num_epochs):
    for x in x_train:
     
        x = x[tf.newaxis, ...]
        
        with tf.GradientTape() as tape:
        
            reconstructed = vae(x)
            
           
            loss = loss_fn(x, reconstructed)
            
       
        grads = tape.gradient(loss, vae.trainable_variables)
        optimizer.apply_gradients(zip(grads, vae.trainable_variables))
        
    print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.numpy():.4f}')

出力:

Epoch 1: Loss - 0.3559
Epoch 2: Loss - 0.3550
.
.
.

サンプルの生成

この更新されたコードでは、latent_samples変数を(5, latent_dim)の形状で再定義し、10個ではなく5個のランダムなサンプルを生成できるようにしました。また、forループを5回繰り返すように変更し、10個ではなく5個の生成されたサンプルを表示するようにしました。さらに、subplot関数を調整して、生成されたサンプルを1行5列のグリッドに配置します。

# サンプルの生成
latent_samples = tf.random.normal(shape=(5, latent_dim))
generated_samples = decoder(latent_samples)

# 生成されたサンプルのプロット
import matplotlib.pyplot as plt

for i in range(5):
    plt.subplot(1, 5, i+1)
    plt.imshow(generated_samples[i].numpy().reshape(28, 28), cmap='gray')
    plt.axis('off')
    
plt.show()

出力:

このコードを実行すると、MNISTテストセットに似た5つの画像を含む図が生成されます。システムはこれらの写真を1行5列のグリッド形式で表示します。システムはこれらをグレースケールで表示し、軸は表示しません。

潜在空間の可視化

VAEの潜在空間を理解するために、以下の手順に従うことができます:

  1. VAEを使用してトレーニングデータポイントをエンコードし、それらを潜在空間に射影します。
  2. t-SNEのような次元削減手法を使用して、高次元の潜在空間を可視化に適した2D空間にマッピングします。
  3. 2D空間にデータポイントをプロットし、潜在空間を視覚的に探索します。

このプロセスに従うことで、VAEの潜在空間の潜在的な構造と分布を効果的に視覚化して理解することができます。

import tensorflow as tf
from sklearn.manifold import TSNE


latent_vectors = encoder(x_train).numpy()


latent_2d = TSNE(n_components=2).fit_transform(latent_vectors)

# 潜在空間のプロット
plt.scatter(latent_2d[:, 0], latent_2d[:, 1], c=y_train, cmap='viridis')
plt.colorbar()
plt.show()

出力:

変分オートエンコーダ(VAE)の潜在空間を可視化することで、トレーニングされたデータの構造と組織を理解する。この可視化技術は、データ内の潜在的なパターンと関係性を理解するための貴重な手段を提供する。

結論

変分オートエンコーダ(VAE)は、過学習を緩和し、効果的な生成プロセスのための潜在空間の望ましい特性を確保するための正則化手法を組み込んだオートエンコーダの強化形です。VAEは生成システムとして機能し、敵対的生成ネットワークと類似の目的を持ちます。通常のオートエンコーダと同様に、VAEはエンコーダとデコーダから構成されます。トレーニングの目標は、エンコード-デコードされたデータと元の入力との再構成エラーを最小化することです。

要点

  • 変分オートエンコーダ(VAE)は、提供されたデータセットからの再構築および新しいサンプルの生成を学習することができます。
  • 潜在空間を利用することで、VAEはデータを連続的かつ滑らかに表現し、滑らかな遷移を持つ入力データのバリエーションを生成することができます。
  • VAEのアーキテクチャは、入力データを潜在空間にマッピングするエンコーダネットワーク、潜在空間からデータを再構築するデコーダネットワーク、再構築損失と正則化項を組み合わせた損失関数から構成されます。
  • VAEは、画像生成、異常検出、半教師あり学習のタスクでの有用性が示されています。

よくある質問

この記事に表示されるメディアはAnalytics Vidhyaの所有ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more