HI-VAE(Heterogeneous-Incomple VAE)は現実のデータセットにありがちな連続値と離散値が混ざっていたり欠損値を含んでいるものを扱えるようにしたVAE。
生成モデルVAE(Variational Autoencoder) - sambaiz-net
GitHubにTensorFlow実装が上がっているので論文と合わせて追ってみる。
入力データ
入力データdata.csvと、そのスキーマdata_types.csvが用意されていて、 様々なtypeのデータが含まれる24次元のデータセットであることが分かる。
type,dim,nclass
pos,1,
cat,3,3
cat,7,7
cat,4,4
count,1,
ordinal,11,11
ordinal,11,11
ordinal,11,11
ordinal,11,11
ordinal,11,11
ordinal,11,11
real,1,
real,1,
real,1,
real,1,
real,1,
real,1,
pos,1,
pos,1,
pos,1,
pos,1,
pos,1,
pos,1,
cat,2,2
これに対して、xx%の確率でランダムな次元を欠損値として扱う際に対象とする行と次元を表す Missingxx_y.csvがある。
2,1
3,1
...
29985,24
29998,24
typeごとのデータの扱い
real(実数値)
標準化してencoderに入力し、decoderでは正規分布の平均と分散を 出力し サンプリングしてデータを生成する。
pos(正の実数)
対数を標準化してencoderに入力し、decoderでは正規分布の平均と分散を 出力し サンプリングしたデータをexp()で元のレンジに戻す。
count
対数を取ってencoderに入力し、decoderではポアソン分布の平均λを 出力し サンプリングしてデータを生成する。
cat(カテゴリ)
読み込み時にone hotに変換し以後はそのまま扱う。
cat 2 -> [0. 0. 1. 0. 0. 0. 0.] # one hot
decoderでは各カテゴリのlogitの配列を出力し、 softmax()したカテゴリカル分布からサンプリングしてデータを生成する。
ordinal(順序)
読み込み時にthermometerに変換し以後はそのまま扱う。
ordinal 4 -> [1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0.] # thermometer
decoderでは各カテゴリの閾値Θと、znにおける値を出力し、
Θ_{n-1} < Θ_n
になるようにsoftplus()で正数にしたものを累積する- Θと平均値の差をSigmoid関数に入れてその次元が1になる確率を求める
- 一つ下の次元との差を取ってznが各カテゴリに属する確率を求める
したカテゴリカル分布からサンプリングしてmaskを 生成する。
欠損値の扱い
欠損値は0にすることでDropoutさせる。以後登場する添字^oは欠損していないデータを表し、x~nはxnの欠損値を0にしたものを表す。
encoder
通常のVAEでは入力xのみから単純なガウス分布で潜在変数zを作っていたが、HI-VAEではまず Gumbel-softmaxでノイズを入れて微分できるようにしたカテゴリカル分布sを作り これとxをconcat()してGMM(混合ガウスモデル)でzを作る。
decoder
まずsからzの分布を作っているが、これはELBOの計算のためで生成では使われない。
encodeされたzからyを作り、生成するデータごとのγに分割して、これからtypeごとに対応するパラメータで分布を作りサンプリングして生成する。
cost
ELBOは欠損値を除いた負の再生成誤差からsとzの正則化項を引いたものになる。
参考
Categorical Reparameterization with Gumbel-Softmax [arXiv:1611.01144] – ご注文は機械学習ですか?