HI-VAE(Heterogeneous-Incomple VAE)の論文を読んで処理を追う

pythonmachinelearningread_paper

HI-VAE(Heterogeneous-Incomple VAE)は現実のデータセットにありがちな連続値と離散値が混ざっていたり欠損値を含んでいるものを扱えるようにしたVAE。

論文: Alfredo Nazabal, Pablo M. Olmos, Zoubin Ghahramani, Isabel Valera (2018) Handling Incomplete Heterogeneous Data using VAEs

生成モデル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(実数値)

type=realのdecoder分布

標準化してencoderに入力し、decoderでは正規分布の平均と分散を 出力し サンプリングしてデータを生成する

pos(正の実数)

type=posのdecoder分布

対数を標準化してencoderに入力し、decoderでは正規分布の平均と分散を 出力し サンプリングしたデータをexp()で元のレンジに戻す

count

type=countのdecoder分布

対数を取ってencoderに入力し、decoderではポアソン分布の平均λを 出力し サンプリングしてデータを生成する

cat(カテゴリ)

読み込み時にone hotに変換し以後はそのまま扱う。

cat 2 -> [0. 0. 1. 0. 0. 0. 0.] # one hot

type=catのdecoder分布

decoderでは各カテゴリのlogitの配列を出力し、 softmax()したカテゴリカル分布からサンプリングしてデータを生成する

ordinal(順序)

読み込み時にthermometerに変換し以後はそのまま扱う。

ordinal 4 -> [1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0.] # thermometer

type=ordinalのdecoder分布

decoderでは各カテゴリの閾値Θと、znにおける値を出力し

したカテゴリカル分布からサンプリングしてmask生成する

欠損値の扱い

欠損値は0にすることでDropoutさせる。以後登場する添字^oは欠損していないデータを表し、x~nはxnの欠損値を0にしたものを表す。

encoder

encoder

q(s)とq(z|s)

通常のVAEでは入力xのみから単純なガウス分布で潜在変数zを作っていたが、HI-VAEではまず Gumbel-softmaxでノイズを入れて微分できるようにしたカテゴリカル分布sを作り これとxをconcat()してGMM(混合ガウスモデル)でzを作る。

decoder

decoder

p(x,z,s)

まずsからzの分布を作っているが、これはELBOの計算のためで生成では使われない。

encodeされたzからyを作り、生成するデータごとのγに分割して、これからtypeごとに対応するパラメータで分布を作りサンプリングして生成する

cost

ELBO

ELBOは欠損値を除いた負の再生成誤差からsとzの正則化項を引いたものになる。

参考

Categorical Reparameterization with Gumbel-Softmax [arXiv:1611.01144] – ご注文は機械学習ですか?