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

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

Density estimation using Real NVPを読んだのでメモ

はじめに

DENSITY ESTIMATION USING REAL NVPを読んだのでメモ.

前に読んでメモしたNICEの改善手法.なのでNormalizing flowの細かいところやNICEに関わることは以前の記事を参照.

real-valued non-volume preserving(real NVP)

まずnotationがわりに確率変数の変数変換による分布を以下に.

\displaystyle
\log p_X(x)=\log p_Z(f(x))+\log\left|\mathrm{det}\left(\frac{\partial f(x)}{\partial x^T}\right)\right|

Real NVPでは基本的にはNICEで提案されたaffine coupling layerをベースに以下の変数変換に用いる.

\displaystyle
y_{1:d}=x_{1:d},\:y_{d+1:D}=x_{d+1:D}\odot\exp(s(x_{1:d}))+t(x_{1:d})

Dはデータ数を表しており,s,tはscaleとtranslationを表し\mathbb{R}^d\rightarrow\mathbb{R}^{D-d}の関数になっている.\odotアダマール積で定義されている.

上記のようなaffine coupling layerを定義するとヤコビアン

\displaystyle
\frac{\partial y}{\partial x^T}=
\begin{bmatrix}
\mathbb{I}_d & 0 \\
\frac{\partial y_{d+1:D}}{\partial x^T_{1:d}} & \mathrm{diag}(\exp[s(x_{1:d})])
\end{bmatrix}

として計算ができる(amp;と出るのははてなブログの表示上のバグのよう).ただし,\mathrm{diag}(\exp[s(x_{1:d})])は対角成分が\exp[s(x_{1:d})]の対角行列.よって分布の計算に必要なヤコビアン行列式\exp[\sum_js(x_{1:d})_j]として計算される.この論文ではs,tはCNNとして構成する. また,NICEの時と同様に逆変換も以下のように簡単に定義ができる.


x_{1:d}=y_{1:d},\:x_{d+1:D}=(y_{d+1:D}-t(y_{1:d}))\odot\exp(-s(y_{1:d}))

NICEではカップリング層で変換されるデータは片方のみで固定だったが,層ごとに交互に変換するデータを入れ替えることで両方のデータを変換する.層単位で見れば片方の変数は固定なので同様に逆変換をすることができる.

あとは実装する上でマルチスケール化等のモデルに関する工夫をおこなっているが本質とは関係ないので割愛.(午後の眠い時間に読んだせいで読みきれなかったとは言えない)

まとめ

Real NVPは数式的にどうこうというよりも強いモデルを作るためのニューラルネットワーク周りのモデルの組み方に重点をおいている感じでいわゆるビジョン系に多いやってみた論文感が強かった気がする. そういう意味ではreal NVPや関連手法を何かに応用する時にはちゃんと読み込みたいところ.