はじめに
以前の記事にて、PyTorch実装の公開および定式化を示していたのだった.
VAEの潜在変数の一部をアフィン変換のパラメタとみなし、デコーダを「うまく」学習させておくことで、画像に含まれるアフィン変換的(スケール、回転、並進)な変動を正規化できるという主旨の内容だった.
いち生成モデルとして性能評価を考えた場合、アフィン変換に対応した潜在変数の明示的な操作によって、アフィン変換を制御した画像生成が可能かどうかは検証の余地があった.
そこで本記事では上記の簡易な検証実験を行い、画像生成を制御できた旨を報告するものである.実装も新たに公開する.
ちなみに生成された画像の例は図1の通りである.図の上段が-90度〜90度の回転,中段が0.5倍〜1.5倍の拡大縮小,下段が並進に対応している.
前回実装との差分
前回までの実装では、アフィン変換は次式に示す形を取った(斉次座標).
ただし はVAEの潜在変数, は適当なスケーリング値であり、実装では としていた.しかしこれでは拡大縮小・回転・並進がいわばミックスされた状態になってしまうので、画像生成を制御する際には扱いづらい.そこで、次式のようにアフィン変換を拡大縮小・回転・並進の形で明示的に分解し、現れる5つのパラメタ を潜在変数から取ってくる方式に変更した.
の正値性を確保するために,tanh のrangeを事前に制限する方式を採用した:
ここで は に対応する潜在変数である.周知の通り tanh のrangeは である.今回は訓練データにMNISTを想定し、大幅なスケーリングの変更は発生しないと考え、 訓練時におけるスケーリングの限界範囲を とすべく と設定した.正値性を確保するため,潜在変数に対して単純に指数関数を適用することもまた選択肢の一つではある.
実装
以下に置いた.Enjoy!
train_vae.py ... モデル訓練用スクリプト
experiment_vae.py ... 画像生成実験用スクリプト
使い方
- 訓練
$ python train_vae.py --use_affine
- 生成
$ python experiment_vae.py --use_affine
実験
データセットはMNISTを用いた.訓練に60,000枚を使っている.
拡大縮小,回転,並進の操作範囲は以下の通りである.
拡大縮小 : 0.5倍 〜 1.5倍を10段階
回転 :-90度 〜 90度を10段階
並進 :-0.5 〜 0.5を10段階
拡大縮小,並進は x 座標成分と y 座標成分で値を揃えた.また並進の範囲が上記になっている理由は,座標グリッドが ] × ] の範囲に限定されているからである.
実験結果
experiment_vae.py
を動かした結果として,記事冒頭に示した画像が得られた.他の生成例を図2に示す.図の上段が-90度〜90度の回転,中段が0.5倍〜1.5倍の拡大縮小,下段が並進に対応している.
生成モデルとして興味深いのは,学習データに含まれない回転角(±90度)や拡大縮小スケール(0.5倍や1.5倍)に対応した画像を生成できた点にある.以前の定式化の記事で述べた通り,アフィン変換は座標グリッドに対して適用され,変換後の座標グリッド情報と併せてデコーダに入力される.この意味でデコーダは座標グリッドで条件づけされている.訓練の過程で,潜在変数から座標グリッドの条件付けに至る関係性そのもの(アフィン変換の関数形)をデータ駆動で暗黙的に(間接的に)獲得していると考えると興味深い.潜在変数からアフィン変換を構成する操作自体をデコーダは知らないはずであり,あくまで変換済み座標グリッドの情報と残りの潜在変数しかデコーダには与えられていないのである.
おわりに
まだまだ他に実験すべきことはあるので,しばらく続く.