機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

MADE: Masked Autoencoder for Distribution Estimationを読んだのでメモ

はじめに

MADE: Masked Autoencoder for Distribution Estimationを読んだのでメモ.flow-basedな生成モデルが面白かったのでその一種であるautoregressive flowも勉強したいと思いとりあえず読んで見た.

お気持ち

この論文ではAutoregressive models(自己回帰モデル)の計算コスト問題に着目している.自己回帰モデルは数式的に扱いやすい形でテストデータ\mathbf{x}に対して正確にp(\mathbf{x})を計算することが可能だが1ピクセルずつ生成していくためニューラルネット以上に計算コストがかかる場合がある.そこでAutoencoder(自己符号化器)を使ってシンプルな形で記述したいというのがこの論文の気持ち.

Masked Autoencoders

ここではD次元の2値データを考える.そのような場合に,基本的な自己符号化器の目的関数を考えると以下のようなクロスエントロピーで表される.

\displaystyle
l(\mathbf{x})=\sum_d^D-x_d\log\hat{x}_d-(1-x_d)\log(1-\hat{x}_d)

ただし,\hat{\mathbf{x}}は再構成されたデータ.自己符号化器の問題点は隠れ層の次元が入力の次元以上になると,データのコピーが起こり完璧に再構成してしまうということ.これはデータ分布を捉えることができていないことを意味しており,上記の対数尤度関数が正確でないことを意味する.すなわち上記の関数を用いて自己符号化器で分布を推定することはできないことを意味している.

そこでここでは自己符号化器に分布を推定する能力を持たせることを考える.そこでまずはデータ分布を以下の形で記述する.

\displaystyle
p(\mathbf{x})=\prod_d^Dp(x_d|\mathbf{x}_{\lt d})

ただし,\mathbf{x}_{\lt d}=[x_1,\dots,x_{d-1}].ここで元々のクロスエントロピーに代入すると,

\displaystyle
-\log p(\mathbf{x})=\sum_d^D-x_d\log p(x_d=1|\mathbf{x}_{\lt d})-(1-x_d)\log p(x_d=0|\mathbf{x}_{\lt d})=l(\mathbf{x})

となる.これはx_dの推定結果が\mathbf{x}_{\lt d}のみに依存すれば自己符号化器がデータの分布を表現することができることを意味している.ちなみに上記のような,前の系列から現在の状態を推定していくようなモデルを自己回帰モデルという.

次に上記のような自己回帰性を持った自己符号化器の構成方法考える.とにかく注意するのはx_dx_{\gt d}と関係を持たないようにすること.すなわち推定結果\hat{x}_dx_d,\dots,x_Dの間にcomputational path(いい日本語が思いつかなかった)を持たないようにする.そうするために,自己符号化器の重みをマスクしてそのようなコネクションの重みを0にしてしまおうというのがアイディア.式で記述すると,

\displaystyle
h(\mathbf{x})=g(\mathbf{b}+(\mathbf{W}\odot\mathbf{M}^\mathbf{W})\mathbf{x}) \\ \displaystyle
\hat{\mathbf{x}}=\mathrm{sigm}(\mathbf{c}+(\mathbf{V}\odot\mathbf{M}^\mathbf{V})h(\mathbf{x}))

となる.\mathbf{W},\mathbf{V}はencoderとdecoderを重み行列で,\mathbf{b},\mathbf{c}はバイアス項.g,\mathrm{sigm}はReLU等の活性化関数とsigmoid関数を表す.また,今回のアイディアの中心である\mathbf{M}はマスクを表す. 自己回帰性を満たす自己符号化器を作るために,まず隠れ層における各ユニットに1からD-1までの整数値mを割り振り,k層目の各ユニットが接続可能な入力のユニット数をm(k)(つまり\lt dを満たす最大の整数)とする.この時,p(x_d|\mathbf{x}_{\lt d})の関係から各重みに対するマスクは以下で与えらえる.

\displaystyle
M_{k,d}^\mathbf{W}=1_{m(k)\geq d}=
\left\{
\begin{array}{}
1 \:\: if\: m(k) \geq d \\
0 \:\: otherwise
\end{array}
\right.

要は現在参照しているユニットkの最大接続数が入力のユニットに割り振られた番号dより大きければ1を,それ以外は0を持つようなマスクを作りますということ.最大接続数が系列におけるインデックスdに相当する,すなわちp(x_d|\mathbf{x}_{\lt m(k)})となっているため,自己回帰の要請を満たすようなマスクになっていることがわかる.(論文ではdecodeする際の\mathbf{M}^\mathbf{V}における定式化も書いているが基本は同じなので割愛.)

マスク\mathbf{M}グラフ理論における隣接行列と同じ性質を持つため,\mathbf{M}^{\mathbf{V},\mathbf{W}}=\mathbf{M}^\mathbf{V}\mathbf{M}^\mathbf{W}のように行列積を取ればM_{d',d}^{\mathbf{V},\mathbf{W}}は入力から出力までのパスの数を表すことになる.このM_{d',d}^{\mathbf{V},\mathbf{W}}を用いれば自己回帰の要請を満たしているかが確認可能で,もしd'\leq dならM_{d',d}^{\mathbf{V},\mathbf{W}}=0となっている必要がある.なので,行列積をように書き下してやれば, \displaystyle
M_{d',d}^{\mathbf{V},\mathbf{W}}=\sum_k^KM_{d',k}^\mathbf{V}M_{k,d}^\mathbf{W}=\sum_k^K1_{d'\gt m(k)}1_{m(k)\geq d}
と表される.そのため,d'\leq dならばd'\gt m(k)m(k)\geq dを同時に満たすことはないため自己回帰の要請を満たしていることが証明される.

このマスクを使った自己符号化器は各ユニットにm(k)を与えてやるだけで構成可能で,この論文における実験では1からD-1までの値を一様にサンプリングすることで決めたらしい.また,自然に多層構造にも拡張ができる(論文にはちゃんと立式してあるがくどくなるので割愛.マスクの条件文をl層とl-1層目での比較に置き換えるのみ).

まとめ

マスク次第でかなり性能にばらつきが出そうだけどうどうだろうか.実験読めば書いてあるかもしれないけど今後何かに使うわけではないので今回はスルーでいいやという感じ.