TensorflowおよびPytorchの変分自動エンコーダーの参照実装。
Pytorchバージョンをお勧めします。これには、より表現力豊かな変異ファミリー、逆自己回帰流の例が含まれています。
変動推論は、モデルを二装形の手書きの数字画像に適合させるために使用されます。推論ネットワーク(エンコーダ)を使用して、データポイント全体の推論と共有パラメーターを償却します。尤度は、生成ネットワーク(デコーダー)によってパラメーター化されます。
ブログ投稿:https://jaan.io/what-is-variational-autoencoder-vae-tutorial/
(アナコンダ環境はenvironment-jax.yml )
重要性サンプリングは、Hugo LarochelleのバイナリMnistデータセットの限界的な尤度を推定するために使用されます。テストセットの最終的な限界的な可能性は-97.10 NATが公開された数字に匹敵します。
$ python train_variational_autoencoder_pytorch.py --variational mean-field --use_gpu --data_dir $DAT --max_iterations 30000 --log_interval 10000
Step 0 Train ELBO estimate: -558.027 Validation ELBO estimate: -384.432 Validation log p(x) estimate: -355.430 Speed: 2.72e+06 examples/s
Step 10000 Train ELBO estimate: -111.323 Validation ELBO estimate: -109.048 Validation log p(x) estimate: -103.746 Speed: 2.64e+04 examples/s
Step 20000 Train ELBO estimate: -103.013 Validation ELBO estimate: -107.655 Validation log p(x) estimate: -101.275 Speed: 2.63e+04 examples/s
Step 29999 Test ELBO estimate: -106.642 Test log p(x) estimate: -100.309
Total time: 2.49 minutes
非平均フィールド、より表現力のある変異後の後方近似(逆自己回帰流、https://arxiv.org/abs/1606.04934)を使用して、テストの限界的なlogの雌馬術は-95.33 Natsに改善します。
$ python train_variational_autoencoder_pytorch.py --variational flow
step: 0 train elbo: -578.35
step: 0 valid elbo: -407.06 valid log p(x): -367.88
step: 10000 train elbo: -106.63
step: 10000 valid elbo: -110.12 valid log p(x): -104.00
step: 20000 train elbo: -101.51
step: 20000 valid elbo: -105.02 valid log p(x): -99.11
step: 30000 train elbo: -98.70
step: 30000 valid elbo: -103.76 valid log p(x): -97.71
Jax(Anaconda Environmentはenvironment-jax.yml )を使用して、Pytorchで3倍のスピードアップを取得します。
$ python train_variational_autoencoder_jax.py --variational mean-field
Step 0 Train ELBO estimate: -566.059 Validation ELBO estimate: -565.755 Validation log p(x) estimate: -557.914 Speed: 2.56e+11 examples/s
Step 10000 Train ELBO estimate: -98.560 Validation ELBO estimate: -105.725 Validation log p(x) estimate: -98.973 Speed: 7.03e+04 examples/s
Step 20000 Train ELBO estimate: -109.794 Validation ELBO estimate: -105.756 Validation log p(x) estimate: -97.914 Speed: 4.26e+04 examples/s
Step 29999 Test ELBO estimate: -104.867 Test log p(x) estimate: -96.716
Total time: 0.810 minutes
JAXの逆自己回帰流:
$ python train_variational_autoencoder_jax.py --variational flow
Step 0 Train ELBO estimate: -727.404 Validation ELBO estimate: -726.977 Validation log p(x) estimate: -713.389 Speed: 2.56e+11 examples/s
Step 10000 Train ELBO estimate: -100.093 Validation ELBO estimate: -106.985 Validation log p(x) estimate: -99.565 Speed: 2.57e+04 examples/s
Step 20000 Train ELBO estimate: -113.073 Validation ELBO estimate: -108.057 Validation log p(x) estimate: -98.841 Speed: 3.37e+04 examples/s
Step 29999 Test ELBO estimate: -106.803 Test log p(x) estimate: -97.620
Total time: 2.350 minutes
(平均場と逆自己回帰流の違いは、いくつかの要因によるものである可能性があり、主なものは実装の畳み込みの欠如です。https://arxiv.org/pdf/1606.04934.pdfでエルボを-80 natsに近づけるために残留ブロックは使用されます。)
python train_variational_autoencoder_tensorflow.pyを実行しますconvert -delay 20 -loop 0 *.jpg latent-space.gifを生成します