『今更ながらVAEって(以下略)』における幾何学的変動の正規化は普通のAEでも概ね実現できたという話

はじめに

最近VAEに関する記事を書いた。

tam5917.hatenablog.com

潜在変数の一部をアフィン変換のパラメタとして分離する話は、生成モデルではない普通のAE(オートエンコーダ)でも通用する。元記事の元記事を読めば、コンセプト自体はVAEに特有の道具を使っているわけではないので、AEで動くのは「それはそう」なのである。

qiita.com

本記事では自分の手元で実装して確かめたので、その報告である。

実装

以下に置いた。Enjoy!

$ python sample_ae.py --use_affine


  • 再構成誤差の計算にBCElossを使う場合
$ python sample_ae.py --use_bce --use_affine

実装上の工夫

VAEのときにはアフィン変換のパラメタは標準正規分布を事前分布に持っていた。よってオートエンコーダにおけるencoder部も、0を中心に適当な範囲でスケーリングしておけば、期待通りに動くだろうということである(楽観的)。以下、encoder部の実装を示す。tanhのrangeが[-1, 1]であるので、適当にスケーリングしている。scaleのデフォルト値が3.5になっているが、強いこだわりはない。3.0や4.0でも動く。あまり大きな値になると、ドアップのような生成結果になった(気がする)。

def encode(self, inputs: Tensor, scale: float = 3.5) -> Tensor:
    """Encode input image.

    Args:
        inputs (torch.Tensor): input image
        scale (float): scaling factor

    Returns:
        latent (torch.Tensor): bottleneck features in latent space
    """
    hidden = self.encoder(inputs)
    latent: Tensor = scale * torch.tanh(hidden)
    return latent

実験結果

モデル訓練後、アフィン変換を外して再構成した画像たちを図1に示す。比較のため,入力画像と再構成画像のペアを2カラムずつ並べた。

図1:入力画像(左)と再構成画像(右)

例えば1は概ね向きが揃っており、また3、5を見ても、向きやスケールが概ね揃っていることが見て取れる。8は歪みが取れている様子が良く分かる。総じて完璧な正規化ではないが、普通のAEでもそこそこ動くという結果は示された。

おわりに

ちょっとVAEから関連ネタが続いているが、実装は楽しいからよし。