Path: blob/master/site/ja/tutorials/generative/cvae.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
畳み込み変分オートエンコーダ
設定
MNIST データセットを読み込む
それぞれの MNIST 画像は、もともと 784 個の整数値から成るベクトルで、各整数値は、ピクセルの強度を表す 0~255 の値です。各ピクセルをベルヌーイ分布を使ってモデル化し、データセットを統計的にバイナリ化します。
tf.data を使用して、データをバッチ化・シャッフルする
tf.keras.Sequential を使ってエンコーダとデコーダネットワークを定義する
この VAE の例では、エンコーダとデコーダのネットワークに 2 つの小さな ConvNets を使用しています。文献では、これらのネットワークはそれぞれ、推論/認識モデルおよび生成モデルとも呼ばれています。実装を簡略化するために tf.keras.Sequential
を使用しています。以降の説明では、観測と潜在変数をそれぞれ と で表記しています。
エンコーダネットワーク
これは、おおよその事後分布 を定義します。これは、観測を入力として受け取り、潜在表現 の条件付き分布を指定するための一連のパラメータを出力します。この例では、単純に対角ガウスとして分布をモデル化するため、ネットワークは、素因数分解されたガウスの平均と対数分散を出力します。数値的な安定性を得るために、直接分散を出力する代わりに対数分散を出力します。
デコーダネットワーク
これは、観測 の条件付き分布を定義します。これは入力として潜在サンプル を取り、観測の条件付き分布のパラメータを出力します。 前の潜在分布を単位ガウスとしてモデル化します。
パラメータ再設定のコツ
トレーニング中にデコーダのサンプル を生成するには、エンコーダが出力したパラメータによって定義される潜在分布から入力観測 を指定してサンプリングできます。ただし、このサンプリング演算では、バックプロパゲーションがランダムなノードを通過できないため、ボトルネックが発生します。
これを解消するために、パラメータ再設定のコツを使用します。この例では、次のように、デコーダパラメータともう 1 つの を使用して を近似化します。
上記の と は、それぞれガウス分布の平均と標準偏差を表します。これらは、デコーダ出力から得ることができます。 は、 の偶然性を維持するためのランダムノイズとして考えることができます。 は標準正規分布から生成します。
潜在変数 は、、、および の関数によって生成されるようになりました。これらによって、モデルがそれぞれ と を介してエンコーダの勾配をバックプロパゲートしながら、 を介して偶然性を維持できるようになります。
ネットワークアーキテクチャ
エンコーダネットワークの場合、2 つの畳み込みレイヤーを使用し、その後に全結合レイヤーが続きます。デコーダネットワークでは、3 つの畳み込み転置レイヤー(一部の文脈ではデコンボリューションレイヤーとも呼ばれる)が続く全結合レイヤーを使用することで、このアーキテクチャをミラーリングします。VAE をトレーニングする場合にはバッチの正規化を回避するのが一般的であることに注意してください。これは、ミニバッチを使用することで追加される偶然性によって、サンプリングの偶然性にさらに不安定性を加える可能性があるためです。
損失関数とオプティマイザを定義する
VAE は、限界対数尤度の証拠下限(ELBO)を最大化することでトレーニングします。
実際には、この期待値の単一サンプルのモンテカルロ推定を最適化します。
注意: KL 項を分析的に計算することもできますが、ここでは簡単にするために、3 つの項すべてをモンテカルロ Estimator に組み込んでいます。
トレーニング
データセットのイテレーションから始めます。
各イテレーションで、画像をエンコーダに渡して、おおよその事後分布 の一連の平均値と対数分散パラメータを取得します。
次に、 から得たサンプルにパラメータ再設定のコツを適用します。
最後に、パラメータを再設定したサンプルをデコーダに渡して、生成分布 のロジットを取得します。
注意: トレーニングセットに 60k のデータポイントとテストセットに 10k のデータポイント持つ Keras で読み込んだデータセットを使用しているため、テストセットの ELBO は、Larochelle の MNIST の動的なバイナリ化を使用する文献で報告された結果よりもわずかに高くなります。
画像の生成
トレーニングの後は、画像をいくつか生成します。
分布 前の単位ガウスから一連の潜在ベクトルをサンプリングすることから始めます。
すると、ジェネレータはその潜在サンプル を観測のロジットに変換し、分布 が得られます。
ここで、ベルヌーイ分布の確率を図に作成します。
最後のトレーニングエポックから生成された画像を表示する
保存したすべての画像のアニメーション GIF を表示する
潜在空間から数字の 2D 多様体を表示する
次のコードを実行すると、各数字が 2D 潜在空間で別の数字に変化する、さまざまな数字クラスの連続分布が表示されます。潜在空間の標準正規分布の生成には、TensorFlow Probability を使用します。
次のステップ
このチュートリアルでは、TensorFlow を使用して畳み込み変分オートエンコーダを実装する方法を実演しました。
次のステップとして、ネットワークサイズを増加し、モデル出力の改善を試みることができます。たとえば、Conv2D
と Conv2DTranspose
の各レイヤーの filter
パラメータを 512 に設定することができます。最終的な 2D 潜在画像プロットを生成するには、latent_dim
を 2 に維持することが必要であることに注意してください。また、ネットワークサイズが高まると、トレーニング時間も増大します。
また、CIFAR-10 などのほかのデータセットを使って VAE を実装してみるのもよいでしょう。
VAE は、さまざまなスタイルや複雑さの異なるスタイルで実装することができます。その他の実装については、次のリンクをご覧ください。
VAE をさらに詳しく学習するには、「An Introduction to Variational Autoencoders」をご覧ください。